# OVM vs. EVM Incompatibilities > This is a Work in Progress... > Learn more about the OVM here: https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52 ## Contract Size There is a 24KB deployed contract size limit in Ethereum, and the same contract size limit exists for your contracts in L2. However, because we must transpile your contracts before deploying them to L2, and we currently increase the size of your contracts by 15-30%. This means your contracts (deployed bytecode) are limited to being under ~18kb in size. This is a fundamental limitation that is already fairly optimized. ## Solidity Versions We support Solidity versions 0.5, 0.6 and 0.7 https://www.npmjs.com/package/@eth-optimism/solc ## CHAINID Our chain id when you are running a local L2 chain is 420 (using https://github.com/ethereum-optimism/optimism-integration). On Kovan, our chainid is 69. On mainnet, our chain id is 10. ## Unsupported Opcodes - `GASPRICE` -- Not supported yet. - `BLOCKHASH` -- These are manipulatable and usually used as a bad source of randomness, so we'll ban for now. Down the line, we can expose historic L1 blockhashes for this purpose, but not a high priority for us (and still a bad idea for randomness even on L1!). - `ORIGIN` -- Not supported. * `CALLCODE` -- This opcode was a failed implementation of `DELEGATECALL`. Deprecated, extremely low priority to support. * `SELFDESTRUCT` - This opcode is currently unsupported, and we also will not be able to handle it's default functionality to send all ETH of self destructed contract to a designated address * `COINBASE` - (since we don't have inflation in L2) * `DIFFICULTY` -- since there is no sense of difficulty in L2. An analogous value in L2 is actually the MEVA price, but it's not so analogous that transpiling would make any sense. ## TIMESTAMP and BLOCKNUMBER - `BLOCKNUMBER` will return the "Latest L1 Block Number" - where it corresponds to the last L1 Block number that a rollup batch was posted in. This will also lag between 1-10 minutes behind the current L1 block number. - `TIMESTAMP` similarly returns the "Latest L1 Timestamp". This will lag between 1-10 minutes of the current L1 timestamp. Block number and timestamp will likely be guaranteed to be updated every 5 minutes. One can rely on the assumption that the sequencer can delay transactions for up to 15 minutes. ## RETURNDATASIZE and RETURNDATACOPY in asm Using `RETURNDATASIZE` or `RETURNDATACOPY` in user asm isn't guaranteed to work. If any of the opcodes replaced by the OVM compiler (full list here:https://github.com/ethereum-optimism/solidity/blob/2c5462e86cf089d63ddd2e5e0b2e01da9b7a9b07/libsolidity/codegen/CompilerContext.cpp#L167-L248) is between the `CALL` you originally made and your use of `RETURNDATACOPY` or `RETURNDATASIZE` then this will cause issues. For example: ``` assembly { call(...) let x := returndatasize() } ``` will work. But if you do ``` assembly { call(...) let y := address() let x := returndatasize() } ``` then that will not work because `address` is transpiled into a call to `ovmADDRESS` which changes `returndatasize` ## Known Bugs Let us know if you need something fixed that we haven't prioritized! We can re-prioritize :). Find any more bugs? Hop in our [Discord](https://discordapp.com/invite/jrnFEvq) or [create a Github Issue](https://github.com/ethereum-optimism/optimism-monorepo/issues).