diff --git a/Makefile b/Makefile index 0c2dbf432..554ae443d 100644 --- a/Makefile +++ b/Makefile @@ -151,6 +151,22 @@ deploy-l2-test-erc20: TEST_ERC20_INITIAL_SUPPLY=100000 \ npx ts-node local-deployments-artifacts/deployTestERC20.ts +deploy-l2-evm-opcode-tester: + # WARNING: FOR LOCAL DEV ONLY - DO NOT REUSE THESE KEYS ELSEWHERE + cd contracts/; \ + PRIVATE_KEY=0x1dd171cec7e2995408b5513004e8207fe88d6820aeff0d82463b3e41df251aae \ + RPC_URL=http:\\localhost:8545/ \ + npx ts-node local-deployments-artifacts/deployLondonEvmTestingFramework.ts + +execute-all-opcodes: + # WARNING: FOR LOCAL DEV ONLY - DO NOT REUSE THESE KEYS ELSEWHERE + cd contracts/; \ + OPCODE_TEST_CONTRACT_ADDRESS=0x997FC3aF1F193Cbdc013060076c67A13e218980e \ + NUMBER_OF_RUNS=3 \ + PRIVATE_KEY=0x1dd171cec7e2995408b5513004e8207fe88d6820aeff0d82463b3e41df251aae \ + RPC_URL=http:\\localhost:8545/ \ + npx ts-node local-deployments-artifacts/executeAllOpcodes.ts + fresh-start-l2-blockchain-only: make clean-environment make start-l2-blockchain-only diff --git a/contracts/contracts/test-contracts/ErrorAndDestructionTesting.sol b/contracts/contracts/test-contracts/ErrorAndDestructionTesting.sol new file mode 100644 index 000000000..c90206fd6 --- /dev/null +++ b/contracts/contracts/test-contracts/ErrorAndDestructionTesting.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.19; + +contract ErrorAndDestructionTesting { + function externalRevert() external pure { + revert("OPCODE FD"); + } + + function callmeToSelfDestruct() external { + selfdestruct(payable(address(0))); + } +} diff --git a/contracts/contracts/test-contracts/LondonEvmCodes.yul b/contracts/contracts/test-contracts/LondonEvmCodes.yul new file mode 100644 index 000000000..c2fbfa532 --- /dev/null +++ b/contracts/contracts/test-contracts/LondonEvmCodes.yul @@ -0,0 +1,100 @@ +// This has been compiled on REMIX without the optimization and stored as contracts/local-deployments-artifacts/static-artifacts/LondonEvmCodes.json +// If you copy the bytecode from the verbatim_0i_0o section and open in https://evm.codes you can step through the entire execution. +// Compiler: 0.8.19, no optimizations and London EVM Version + +object "DynamicBytecode" { + code { + datacopy(0x00, dataoffset("runtime"), datasize("runtime")) + return(0x00, datasize("runtime")) + } + + object "runtime" { + code { + switch selector() + case 0xa378ff3e // executeAll() + { + doExternalCallsAndMStore8() + executeOpcodes() + } + + default { + // if the function signature sent does not match any + revert(0, 0) + } + + function doExternalCallsAndMStore8(){ + + // Using a random function on an EOA for all calls other than the embedded staticcall in the verbatim code to the precompile + // - should be a successful call for all. + + let callSelector := 0xfed44325 + + // Load the free memory pointer + let ptr := mload(0x40) + + // Store the selector in memory at the pointer location + mstore(ptr, callSelector) + + // Perform the call + let success := call( + gas(), // Forward all available gas + 0x55, // Random address + 0, // No Ether to transfer + ptr, // Pointer to input data (selector) + 0x04, // Input size (4 bytes for the selector) + 0, // No output data + 0 // No output size + ) + + // Handle the call result + if iszero(success) { + revert(0, 0) // Revert with no message if the call fails + } + + success := callcode( + gas(), // Forward all available gas + 0x55, // Random address + 0, // No Ether to transfer + ptr, // Pointer to input data (selector) + 0x04, // Input size (4 bytes for the selector) + 0, // No output data + 0 // No output size + ) + + // Handle the call result + if iszero(success) { + revert(0, 0) // Revert with no message if the call fails + } + + success := delegatecall( + gas(), // Forward all available gas + 0x55, // Random address + ptr, // Pointer to input data (selector) + 0x04, // Input size (4 bytes for the selector) + 0, // No output data + 0 // No output size + ) + + // Handle the call result + if iszero(success) { + revert(0, 0) // Revert with no message if the call fails + } + + ptr := add(ptr,0x4) + + // Make sure MSTORE8 opcode is called + mstore8(ptr,0x1234567812345678) + } + + function executeOpcodes() { + // Verbatim bytecode to do most of London including the precompile and control flow opcodes: + verbatim_0i_0o(hex"602060206001601f600263ffffffffFA5060006000600042F550600060006000F050600060006000600060006000A460006000600060006000A36000600060006000A2600060006000A160006000A0585059505A50426000556000545060004050415042504350445045504650475048507300000000000000000000000000000000000000003F506000600060003E6000600060007300000000000000000000000000000000000000003C3D507300000000000000000000000000000000000000003B5060016001016001026003036001046001056001066001076001600108600160010960020160030A60010B600810600A11600112600113600114156001166001176001181960161A60011B60011C60011D506000600020303132333450505050503635600060003738604051600081016000600083393A50505050607e50617e0150627e012350637e01234550647e0123456750657e012345678950667e0123456789AB50677e0123456789ABCD50687e0123456789ABCDEF50697e0123456789ABCDEF01506a7e0123456789ABCDEF0123506b7e0123456789ABCDEF012345506c7e0123456789ABCDEF01234567506d7e0123456789ABCDEF0123456789506e7e0123456789ABCDEF0123456789AB506f7e0123456789ABCDEF0123456789ABCD50707e0123456789ABCDEF0123456789ABCDEF50717e0123456789ABCDEF0123456789ABCDEF0150727e0123456789ABCDEF0123456789ABCDEF012350737e0123456789ABCDEF0123456789ABCDEF01234550747e0123456789ABCDEF0123456789ABCDEF0123456750757e0123456789ABCDEF0123456789ABCDEF012345678950767e0123456789ABCDEF0123456789ABCDEF0123456789AB50777e0123456789ABCDEF0123456789ABCDEF0123456789ABCD50787e0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF50797e0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF01507a7e0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123507b7e0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345507c7e0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF01234567507d7e0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789507e0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCD507f0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f5050505050505050505050505050505050") + } + + // Return the function selector: the first 4 bytes of the call data + function selector() -> s { + s := div(calldataload(0), 0x100000000000000000000000000000000000000000000000000000000) + } + } + } +} \ No newline at end of file diff --git a/contracts/contracts/test-contracts/OpcodeTester.sol b/contracts/contracts/test-contracts/OpcodeTester.sol new file mode 100644 index 000000000..6e348b53c --- /dev/null +++ b/contracts/contracts/test-contracts/OpcodeTester.sol @@ -0,0 +1,293 @@ +// SPDX-License-Identifier: AGPL-3.0 +pragma solidity 0.8.19; + +import { ErrorAndDestructionTesting } from "./ErrorAndDestructionTesting.sol"; + +contract OpcodeTester { + mapping(bytes2 => uint256) public opcodeExecutions; + address public yulContract; + bytes32 rollingBlockDetailComputations; + + // The opcodes are logged here for completeness sake even though not used. + // NOTE: For looping we make it 2 bytes instead of one, so the real value is actually missing the 00 from 0x0001 (0x01) etc. + + // 0x00 - 0x0F + bytes2 private constant STOP = 0x0000; + bytes2 private constant ADD = 0x0001; + bytes2 private constant MUL = 0x0002; + bytes2 private constant SUB = 0x0003; + bytes2 private constant DIV = 0x0004; + bytes2 private constant SDIV = 0x0005; + bytes2 private constant MOD = 0x0006; + bytes2 private constant SMOD = 0x0007; + bytes2 private constant ADDMOD = 0x0008; + bytes2 private constant MULMOD = 0x0009; + bytes2 private constant EXP = 0x000A; + bytes2 private constant SIGNEXTEND = 0x000B; + + // 0x10 - 0x1F + bytes2 private constant LT = 0x0010; + bytes2 private constant GT = 0x0011; + bytes2 private constant SLT = 0x0012; + bytes2 private constant SGT = 0x0013; + bytes2 private constant EQ = 0x0014; + bytes2 private constant ISZERO = 0x0015; + bytes2 private constant AND = 0x0016; + bytes2 private constant OR = 0x0017; + bytes2 private constant XOR = 0x0018; + bytes2 private constant NOT = 0x0019; + bytes2 private constant BYTE = 0x001A; + bytes2 private constant SHL = 0x001B; + bytes2 private constant SHR = 0x001C; + bytes2 private constant SAR = 0x001D; + + // 0x20 - 0x2F + bytes2 private constant KECCAK256 = 0x0020; + + // 0x30 - 0x3F + bytes2 private constant ADDRESS = 0x0030; + bytes2 private constant BALANCE = 0x0031; + bytes2 private constant ORIGIN = 0x0032; + bytes2 private constant CALLER = 0x0033; + bytes2 private constant CALLVALUE = 0x0034; + bytes2 private constant CALLDATALOAD = 0x0035; + bytes2 private constant CALLDATASIZE = 0x0036; + bytes2 private constant CALLDATACOPY = 0x0037; + bytes2 private constant CODESIZE = 0x0038; + bytes2 private constant CODECOPY = 0x0039; + bytes2 private constant GASPRICE = 0x003A; + bytes2 private constant EXTCODESIZE = 0x003B; + bytes2 private constant EXTCODECOPY = 0x003C; + bytes2 private constant RETURNDATASIZE = 0x003D; + bytes2 private constant RETURNDATACOPY = 0x003E; + bytes2 private constant EXTCODEHASH = 0x003F; + + // 0x40 - 0x4F + bytes2 private constant BLOCKHASH = 0x0040; + bytes2 private constant COINBASE = 0x0041; + bytes2 private constant TIMESTAMP = 0x0042; + bytes2 private constant NUMBER = 0x0043; + bytes2 private constant DIFFICULTY = 0x0044; + bytes2 private constant GASLIMIT = 0x0045; + bytes2 private constant CHAINID = 0x0046; + bytes2 private constant SELFBALANCE = 0x0047; + bytes2 private constant BASEFEE = 0x0048; + + // 0x50 - 0x5F + bytes2 private constant POP = 0x0050; + bytes2 private constant MLOAD = 0x0051; + bytes2 private constant MSTORE = 0x0052; + bytes2 private constant MSTORE8 = 0x0053; + bytes2 private constant SLOAD = 0x0054; + bytes2 private constant SSTORE = 0x0055; + bytes2 private constant JUMP = 0x0056; + bytes2 private constant JUMPI = 0x0057; + bytes2 private constant PC = 0x0058; + bytes2 private constant MSIZE = 0x0059; + bytes2 private constant GAS = 0x005A; + bytes2 private constant JUMPDEST = 0x005B; + + // 0x60 - 0x7F + bytes2 private constant PUSH1 = 0x0060; + bytes2 private constant PUSH2 = 0x0061; + bytes2 private constant PUSH3 = 0x0062; + bytes2 private constant PUSH4 = 0x0063; + bytes2 private constant PUSH5 = 0x0064; + bytes2 private constant PUSH6 = 0x0065; + bytes2 private constant PUSH7 = 0x0066; + bytes2 private constant PUSH8 = 0x0067; + bytes2 private constant PUSH9 = 0x0068; + bytes2 private constant PUSH10 = 0x0069; + bytes2 private constant PUSH11 = 0x006A; + bytes2 private constant PUSH12 = 0x006B; + bytes2 private constant PUSH13 = 0x006C; + bytes2 private constant PUSH14 = 0x006D; + bytes2 private constant PUSH15 = 0x006E; + bytes2 private constant PUSH16 = 0x006F; + bytes2 private constant PUSH17 = 0x0070; + bytes2 private constant PUSH18 = 0x0071; + bytes2 private constant PUSH19 = 0x0072; + bytes2 private constant PUSH20 = 0x0073; + bytes2 private constant PUSH21 = 0x0074; + bytes2 private constant PUSH22 = 0x0075; + bytes2 private constant PUSH23 = 0x0076; + bytes2 private constant PUSH24 = 0x0077; + bytes2 private constant PUSH25 = 0x0078; + bytes2 private constant PUSH26 = 0x0079; + bytes2 private constant PUSH27 = 0x007A; + bytes2 private constant PUSH28 = 0x007B; + bytes2 private constant PUSH29 = 0x007C; + bytes2 private constant PUSH30 = 0x007D; + bytes2 private constant PUSH31 = 0x007E; + bytes2 private constant PUSH32 = 0x007F; + + // 0x80 - 0x8F + bytes2 private constant DUP1 = 0x0080; + bytes2 private constant DUP2 = 0x0081; + bytes2 private constant DUP3 = 0x0082; + bytes2 private constant DUP4 = 0x0083; + bytes2 private constant DUP5 = 0x0084; + bytes2 private constant DUP6 = 0x0085; + bytes2 private constant DUP7 = 0x0086; + bytes2 private constant DUP8 = 0x0087; + bytes2 private constant DUP9 = 0x0088; + bytes2 private constant DUP10 = 0x0089; + bytes2 private constant DUP11 = 0x008A; + bytes2 private constant DUP12 = 0x008B; + bytes2 private constant DUP13 = 0x008C; + bytes2 private constant DUP14 = 0x008D; + bytes2 private constant DUP15 = 0x008E; + bytes2 private constant DUP16 = 0x008F; + + // 0x90 - 0x9F + bytes2 private constant SWAP1 = 0x0090; + bytes2 private constant SWAP2 = 0x0091; + bytes2 private constant SWAP3 = 0x0092; + bytes2 private constant SWAP4 = 0x0093; + bytes2 private constant SWAP5 = 0x0094; + bytes2 private constant SWAP6 = 0x0095; + bytes2 private constant SWAP7 = 0x0096; + bytes2 private constant SWAP8 = 0x0097; + bytes2 private constant SWAP9 = 0x0098; + bytes2 private constant SWAP10 = 0x0099; + bytes2 private constant SWAP11 = 0x009A; + bytes2 private constant SWAP12 = 0x009B; + bytes2 private constant SWAP13 = 0x009C; + bytes2 private constant SWAP14 = 0x009D; + bytes2 private constant SWAP15 = 0x009E; + bytes2 private constant SWAP16 = 0x009F; + + // 0xA0 - 0xA4 + bytes2 private constant LOG0 = 0x00A0; + bytes2 private constant LOG1 = 0x00A1; + bytes2 private constant LOG2 = 0x00A2; + bytes2 private constant LOG3 = 0x00A3; + bytes2 private constant LOG4 = 0x00A4; + + // 0xF0 - 0xFF + bytes2 private constant CREATE = 0x00F0; + bytes2 private constant CALL = 0x00F1; + bytes2 private constant CALLCODE = 0x00F2; + bytes2 private constant RETURN = 0x00F3; + bytes2 private constant DELEGATECALL = 0x00F4; + bytes2 private constant CREATE2 = 0x00F5; + bytes2 private constant STATICCALL = 0x00FA; + bytes2 private constant REVERT = 0x00FD; + bytes2 private constant INVALID = 0x00FE; + bytes2 private constant SELFDESTRUCT = 0x00FF; + + constructor(address _yulContract) { + yulContract = _yulContract; + } + + function executeAllOpcodes() public payable { + executeExternalCalls(); + + incrementOpcodeExecutions(); + + storeRollingGlobalVariablesToState(); + } + + function executeExternalCalls() private { + ErrorAndDestructionTesting errorAndDestructingContract = new ErrorAndDestructionTesting(); + + bool success; + (success, ) = address(errorAndDestructingContract).call(abi.encodeWithSignature("externalRevert()")); + + // it should fail + if (success) { + revert("Error: externalRevert did not revert"); + } + + (success, ) = address(errorAndDestructingContract).staticcall(abi.encodeWithSignature("externalRevert()")); + + // it should fail + if (success) { + revert("Error: externalRevert did not revert"); + } + + (success, ) = address(errorAndDestructingContract).call(abi.encodeWithSignature("callmeToSelfDestruct()")); + // it should succeed + if (!success) { + revert("Error: revertcallmeToSelfDestruct Failed"); + } + + (success, ) = yulContract.call(abi.encodeWithSignature("executeAll()")); + if (!success) { + revert("executeAll on yulContract Failed"); + } + } + + function incrementOpcodeExecutions() private { + // 0x0000 - 0x000B + for (uint16 i = 0x0000; i <= 0x000B; i += 0x0001) { + opcodeExecutions[bytes2(i)] = opcodeExecutions[bytes2(i)] + 1; + } + + // 0x0010 - 0x001D + for (uint16 i = 0x0010; i <= 0x001D; i += 0x0001) { + opcodeExecutions[bytes2(i)] = opcodeExecutions[bytes2(i)] + 1; + } + + // 0x0020 - 0x000 + opcodeExecutions[KECCAK256] = opcodeExecutions[KECCAK256] + 1; + + // 0x0030 - 0x0048 + for (uint16 i = 0x0030; i <= 0x0048; i += 0x0001) { + opcodeExecutions[bytes2(i)] = opcodeExecutions[bytes2(i)] + 1; + } + + // 0x0050 - 0x005B + for (uint16 i = 0x0050; i <= 0x005B; i += 0x0001) { + opcodeExecutions[bytes2(i)] = opcodeExecutions[bytes2(i)] + 1; + } + + // 0x0060 - 0x009F + for (uint16 i = 0x0060; i <= 0x009F; i += 0x0001) { + opcodeExecutions[bytes2(i)] = opcodeExecutions[bytes2(i)] + 1; + } + + // 0x00A0 - 0x00A4 + for (uint16 i = 0x00A0; i <= 0x00A4; i += 0x0001) { + opcodeExecutions[bytes2(i)] = opcodeExecutions[bytes2(i)] + 1; + } + + // 0x00F0 - 0x00F5 + for (uint16 i = 0x00F0; i <= 0x00F5; i += 0x0001) { + opcodeExecutions[bytes2(i)] = opcodeExecutions[bytes2(i)] + 1; + } + + // 0x00FA + opcodeExecutions[STATICCALL] = opcodeExecutions[STATICCALL] + 1; + + // 0x00FD - 0x00FF + for (uint16 i = 0x00FD; i <= 0x00FF; i += 0x0001) { + opcodeExecutions[bytes2(i)] = opcodeExecutions[bytes2(i)] + 1; + } + } + + function storeRollingGlobalVariablesToState() private { + bytes memory fieldsToHashSection1 = abi.encode( + rollingBlockDetailComputations, + blockhash(block.number - 1), + block.basefee, + block.chainid, + block.coinbase, + block.difficulty + ); + + bytes memory fieldsToHashSection2 = abi.encode( + block.gaslimit, + block.number, + block.difficulty, + block.timestamp, + gasleft() + ); + + bytes memory fieldsToHashSection3 = abi.encode(msg.data, msg.sender, msg.sig, msg.value, tx.gasprice, tx.origin); + + rollingBlockDetailComputations = keccak256( + bytes.concat(bytes.concat(fieldsToHashSection1, fieldsToHashSection2), fieldsToHashSection3) + ); + } +} diff --git a/contracts/local-deployments-artifacts/deployLondonEvmTestingFramework.ts b/contracts/local-deployments-artifacts/deployLondonEvmTestingFramework.ts new file mode 100644 index 000000000..da3ecf6f9 --- /dev/null +++ b/contracts/local-deployments-artifacts/deployLondonEvmTestingFramework.ts @@ -0,0 +1,60 @@ +import { ethers } from "ethers"; +import { abi as londonEvmYulAbi, bytecode as londonEvmYulBytecode } from "./static-artifacts/LondonEvmCodes.json"; +import { abi as opcodeTesterAbi, bytecode as opcodeTesterBytecode } from "./static-artifacts/OpcodeTester.json"; +import { deployContractFromArtifacts } from "../common/helpers/deployments"; + +async function main() { + const provider = new ethers.JsonRpcProvider(process.env.RPC_URL); + const wallet = new ethers.Wallet(process.env.PRIVATE_KEY!, provider); + + console.log(`Deploying London EVM Yul based contract with verbatim bytecode`); + const londonEvmYulAddress = await deployLondonEvmYul(wallet, provider); + + console.log(`Deploying the main OPCODE tester with yul contract at ${londonEvmYulAddress}`); + await deployOpcodeTester(wallet, provider, londonEvmYulAddress); +} + +async function deployLondonEvmYul(wallet: ethers.Wallet, provider: ethers.JsonRpcApiProvider): Promise { + const walletNonce = await wallet.getNonce(); + + const londonEvmYul = await deployContractFromArtifacts(londonEvmYulAbi, londonEvmYulBytecode, wallet, { + nonce: walletNonce, + }); + + const londonEvmYulAddress = await londonEvmYul.getAddress(); + + const chainId = (await provider.getNetwork()).chainId; + + console.log(`londonEvmYulAddress deployed: address=${londonEvmYulAddress} chainId=${chainId}`); + + return londonEvmYulAddress; +} + +async function deployOpcodeTester( + wallet: ethers.Wallet, + provider: ethers.JsonRpcApiProvider, + londonEvmYulAddress: string, +) { + const walletNonce = await wallet.getNonce(); + + const opcodeTester = await deployContractFromArtifacts( + opcodeTesterAbi, + opcodeTesterBytecode, + wallet, + londonEvmYulAddress, + { + nonce: walletNonce, + }, + ); + + const opcodeTesterAddress = await opcodeTester.getAddress(); + + const chainId = (await provider.getNetwork()).chainId; + + console.log(`opcodeTesterAddress deployed: address=${opcodeTesterAddress} chainId=${chainId}`); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/contracts/local-deployments-artifacts/executeAllOpcodes.ts b/contracts/local-deployments-artifacts/executeAllOpcodes.ts new file mode 100644 index 000000000..e688dc157 --- /dev/null +++ b/contracts/local-deployments-artifacts/executeAllOpcodes.ts @@ -0,0 +1,43 @@ +/* + ******************************************************************************************* + 1. Set the RPC_URL + 2. Set the PRIVATE_KEY + 3. Set OPCODE_TEST_CONTRACT_ADDRESS + 4. Set NUMBER_OF_RUNS + ******************************************************************************************* + ******************************************************************************************* + OPCODE_TEST_CONTRACT_ADDRESS=
\ + NUMBER_OF_RUNS= \ + PRIVATE_KEY= \ + RPC_URL= \ + npx ts-node local-deployments-artifacts/executeAllOpcodes.ts + ******************************************************************************************* +*/ + +import { getRequiredEnvVar } from "../common/helpers/environment"; +import { ethers } from "ethers"; +import { abi as opcodeTesterAbi } from "./static-artifacts/OpcodeTester.json"; + +async function main() { + const provider = new ethers.JsonRpcProvider(process.env.RPC_URL); + const wallet = new ethers.Wallet(process.env.PRIVATE_KEY!, provider); + + const opcodeTestContractAddress = getRequiredEnvVar("OPCODE_TEST_CONTRACT_ADDRESS"); + const numberOfRuns = getRequiredEnvVar("NUMBER_OF_RUNS"); + const executionRunCount = parseInt(numberOfRuns); + + // Equivalent of getContractAt + const opcodeTester = new ethers.Contract(opcodeTestContractAddress, opcodeTesterAbi, wallet); + + for (let i = 1; i <= executionRunCount; i++) { + console.log(`Executing all opcodes for runs ${i} of ${executionRunCount}`); + const executeTx = await opcodeTester.executeAllOpcodes({ gasLimit: 5_000_000 }); + const receipt = await executeTx.wait(); + console.log(` - Gas used in run: ${receipt?.gasUsed}`); + } +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/contracts/local-deployments-artifacts/static-artifacts/LondonEvmCodes.json b/contracts/local-deployments-artifacts/static-artifacts/LondonEvmCodes.json new file mode 100644 index 000000000..ea2e66774 --- /dev/null +++ b/contracts/local-deployments-artifacts/static-artifacts/LondonEvmCodes.json @@ -0,0 +1,12 @@ +{ + "contractName": "LondonEvmCodes", + "sourceName": "contracts/test-contracts/LondonEvmCodes.yul", + "abi": [ + { + "payable": true, + "stateMutability": "payable", + "type": "fallback" + } + ], + "bytecode": "0x61047c61001060003961047c6000f3fe610007610452565b63a378ff3e811461001757600080fd5b61001f61002d565b610027610092565b5061047b565b63fed44325604051818152600080600483600060555af18061004e57600080fd5b600080600484600060555af290508061006657600080fd5b60008060048460555af490508061007c57600080fd5b6004820191506712345678123456788253505050565b602060206001601f600263fffffffffa5060006000600042f550600060006000f050600060006000600060006000a460006000600060006000a36000600060006000a2600060006000a160006000a0585059505a50426000556000545060004050415042504350445045504650475048507300000000000000000000000000000000000000003f506000600060003e6000600060007300000000000000000000000000000000000000003c3d507300000000000000000000000000000000000000003b5060016001016001026003036001046001056001066001076001600108600160010960020160030a60010b600810600a11600112600113600114156001166001176001181960161a60011b60011c60011d506000600020303132333450505050503635600060003738604051600081016000600083393a50505050607e50617e0150627e012350637e01234550647e0123456750657e012345678950667e0123456789ab50677e0123456789abcd50687e0123456789abcdef50697e0123456789abcdef01506a7e0123456789abcdef0123506b7e0123456789abcdef012345506c7e0123456789abcdef01234567506d7e0123456789abcdef0123456789506e7e0123456789abcdef0123456789ab506f7e0123456789abcdef0123456789abcd50707e0123456789abcdef0123456789abcdef50717e0123456789abcdef0123456789abcdef0150727e0123456789abcdef0123456789abcdef012350737e0123456789abcdef0123456789abcdef01234550747e0123456789abcdef0123456789abcdef0123456750757e0123456789abcdef0123456789abcdef012345678950767e0123456789abcdef0123456789abcdef0123456789ab50777e0123456789abcdef0123456789abcdef0123456789abcd50787e0123456789abcdef0123456789abcdef0123456789abcdef50797e0123456789abcdef0123456789abcdef0123456789abcdef01507a7e0123456789abcdef0123456789abcdef0123456789abcdef0123507b7e0123456789abcdef0123456789abcdef0123456789abcdef012345507c7e0123456789abcdef0123456789abcdef0123456789abcdef01234567507d7e0123456789abcdef0123456789abcdef0123456789abcdef0123456789507e0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd507f0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f5050505050505050505050505050505050565b60007c010000000000000000000000000000000000000000000000000000000060003504905090565b" +} \ No newline at end of file diff --git a/contracts/local-deployments-artifacts/static-artifacts/OpcodeTester.json b/contracts/local-deployments-artifacts/static-artifacts/OpcodeTester.json new file mode 100644 index 000000000..57c46dffc --- /dev/null +++ b/contracts/local-deployments-artifacts/static-artifacts/OpcodeTester.json @@ -0,0 +1,61 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "OpcodeTester", + "sourceName": "contracts/test-contracts/OpcodeTester.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_yulContract", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "executeAllOpcodes", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes2", + "name": "", + "type": "bytes2" + } + ], + "name": "opcodeExecutions", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "yulContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60806040523480156200001157600080fd5b506040516200183c3803806200183c8339818101604052810190620000379190620000e9565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200011b565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000b18262000084565b9050919050565b620000c381620000a4565b8114620000cf57600080fd5b50565b600081519050620000e381620000b8565b92915050565b6000602082840312156200010257620001016200007f565b5b60006200011284828501620000d2565b91505092915050565b611711806200012b6000396000f3fe6080604052600436106100345760003560e01c8063690696f0146100395780638f0a4cc414610043578063a147ee551461006e575b600080fd5b6100416100ab565b005b34801561004f57600080fd5b506100586100c5565b6040516100659190610f61565b60405180910390f35b34801561007a57600080fd5b5061009560048036038101906100909190610fd9565b6100eb565b6040516100a2919061101f565b60405180910390f35b6100b3610103565b6100bb610614565b6100c3610dde565b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006020528060005260406000206000915090505481565b600060405161011190610f13565b604051809103906000f08015801561012d573d6000803e3d6000fd5b50905060008173ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527fb3907bb9000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516101d991906110ab565b6000604051808303816000865af19150503d8060008114610216576040519150601f19603f3d011682016040523d82523d6000602084013e61021b565b606091505b5050809150508015610262576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102599061111f565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527fb3907bb9000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161030991906110ab565b600060405180830381855afa9150503d8060008114610344576040519150601f19603f3d011682016040523d82523d6000602084013e610349565b606091505b5050809150508015610390576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103879061111f565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527fe32689ab000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161043791906110ab565b6000604051808303816000865af19150503d8060008114610474576040519150601f19603f3d011682016040523d82523d6000602084013e610479565b606091505b505080915050806104bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b69061118b565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527fa378ff3e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161058891906110ab565b6000604051808303816000865af19150503d80600081146105c5576040519150601f19603f3d011682016040523d82523d6000602084013e6105ca565b606091505b50508091505080610610576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610607906111f7565b60405180910390fd5b5050565b60005b601d8161ffff16116106f55760016000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020546106879190611246565b6000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000208190555080806106ed90611288565b915050610617565b506001600080602060f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000205461075b9190611246565b600080602060f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020819055506000603090505b60488161ffff161161089c5760016000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000205461082e9190611246565b6000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002081905550808061089490611288565b9150506107be565b506000605090505b605b8161ffff16116109825760016000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020546109149190611246565b6000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002081905550808061097a90611288565b9150506108a4565b506000606090505b609f8161ffff1611610a685760016000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020546109fa9190611246565b6000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020819055508080610a6090611288565b91505061098a565b50600060a090505b60a48161ffff1611610b4e5760016000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002054610ae09190611246565b6000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020819055508080610b4690611288565b915050610a70565b50600060f090505b60f58161ffff1611610c345760016000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002054610bc69190611246565b6000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020819055508080610c2c90611288565b915050610b56565b50600160008060fa60f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002054610c9a9190611246565b60008060fa60f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002081905550600060fd90505b60ff8161ffff1611610ddb5760016000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002054610d6d9190611246565b6000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020819055508080610dd390611288565b915050610cfd565b50565b6000600254600143610df091906112b2565b4048464144604051602001610e0a96959493929190611320565b60405160208183030381529060405290506000454344425a604051602001610e36959493929190611381565b604051602081830303815290604052905060008036336000357fffffffff0000000000000000000000000000000000000000000000000000000016343a32604051602001610e8a979695949392919061146d565b60405160208183030381529060405290506002548383604051602001610eb19291906114d7565b60405160208183030381529060405282604051602001610ed29291906114d7565b604051602081830303815290604052604051602001610ef2929190611534565b60405160208183030381529060405280519060200120600281905550505050565b6101778061156583390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f4b82610f20565b9050919050565b610f5b81610f40565b82525050565b6000602082019050610f766000830184610f52565b92915050565b600080fd5b60007fffff00000000000000000000000000000000000000000000000000000000000082169050919050565b610fb681610f81565b8114610fc157600080fd5b50565b600081359050610fd381610fad565b92915050565b600060208284031215610fef57610fee610f7c565b5b6000610ffd84828501610fc4565b91505092915050565b6000819050919050565b61101981611006565b82525050565b60006020820190506110346000830184611010565b92915050565b600081519050919050565b600081905092915050565b60005b8381101561106e578082015181840152602081019050611053565b60008484015250505050565b60006110858261103a565b61108f8185611045565b935061109f818560208601611050565b80840191505092915050565b60006110b7828461107a565b915081905092915050565b600082825260208201905092915050565b7f65787465726e616c526576657274204661696c65640000000000000000000000600082015250565b60006111096015836110c2565b9150611114826110d3565b602082019050919050565b60006020820190508181036000830152611138816110fc565b9050919050565b7f63616c6c6d65546f53656c664465737472756374204661696c65640000000000600082015250565b6000611175601b836110c2565b91506111808261113f565b602082019050919050565b600060208201905081810360008301526111a481611168565b9050919050565b7f65786563757465416c6c206f6e2079756c436f6e7472616374204661696c6564600082015250565b60006111e16020836110c2565b91506111ec826111ab565b602082019050919050565b60006020820190508181036000830152611210816111d4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061125182611006565b915061125c83611006565b925082820190508082111561127457611273611217565b5b92915050565b600061ffff82169050919050565b60006112938261127a565b915061ffff82036112a7576112a6611217565b5b600182019050919050565b60006112bd82611006565b91506112c883611006565b92508282039050818111156112e0576112df611217565b5b92915050565b6000819050919050565b6112f9816112e6565b82525050565b600061130a82610f20565b9050919050565b61131a816112ff565b82525050565b600060c08201905061133560008301896112f0565b61134260208301886112f0565b61134f6040830187611010565b61135c6060830186611010565b6113696080830185611311565b61137660a0830184611010565b979650505050505050565b600060a0820190506113966000830188611010565b6113a36020830187611010565b6113b06040830186611010565b6113bd6060830185611010565b6113ca6080830184611010565b9695505050505050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b600061141183856113d4565b935061141e8385846113e5565b611427836113f4565b840190509392505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61146781611432565b82525050565b600060c082019050818103600083015261148881898b611405565b90506114976020830188610f52565b6114a4604083018761145e565b6114b16060830186611010565b6114be6080830185611010565b6114cb60a0830184610f52565b98975050505050505050565b60006114e3828561107a565b91506114ef828461107a565b91508190509392505050565b60006115068261103a565b61151081856113d4565b9350611520818560208601611050565b611529816113f4565b840191505092915050565b600060408201905061154960008301856112f0565b818103602083015261155b81846114fb565b9050939250505056fe608060405234801561001057600080fd5b50610157806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063b3907bb91461003b578063e32689ab14610045575b600080fd5b61004361004f565b005b61004d61008a565b005b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008190610101565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16ff5b600082825260208201905092915050565b7f4f50434f44452046440000000000000000000000000000000000000000000000600082015250565b60006100eb6009836100a4565b91506100f6826100b5565b602082019050919050565b6000602082019050818103600083015261011a816100de565b905091905056fea2646970667358221220115a603bf9ff965c5aa74dbbc65a190a4a073a7f1c3da57101dbe38e391d992264736f6c63430008130033a2646970667358221220e63d8ef27ec8da7d116949ef8faa386498505481265c37405593418f0a63764a64736f6c63430008130033", + "deployedBytecode": "0x6080604052600436106100345760003560e01c8063690696f0146100395780638f0a4cc414610043578063a147ee551461006e575b600080fd5b6100416100ab565b005b34801561004f57600080fd5b506100586100c5565b6040516100659190610f61565b60405180910390f35b34801561007a57600080fd5b5061009560048036038101906100909190610fd9565b6100eb565b6040516100a2919061101f565b60405180910390f35b6100b3610103565b6100bb610614565b6100c3610dde565b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006020528060005260406000206000915090505481565b600060405161011190610f13565b604051809103906000f08015801561012d573d6000803e3d6000fd5b50905060008173ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527fb3907bb9000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516101d991906110ab565b6000604051808303816000865af19150503d8060008114610216576040519150601f19603f3d011682016040523d82523d6000602084013e61021b565b606091505b5050809150508015610262576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102599061111f565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527fb3907bb9000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161030991906110ab565b600060405180830381855afa9150503d8060008114610344576040519150601f19603f3d011682016040523d82523d6000602084013e610349565b606091505b5050809150508015610390576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103879061111f565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527fe32689ab000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161043791906110ab565b6000604051808303816000865af19150503d8060008114610474576040519150601f19603f3d011682016040523d82523d6000602084013e610479565b606091505b505080915050806104bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b69061118b565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527fa378ff3e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161058891906110ab565b6000604051808303816000865af19150503d80600081146105c5576040519150601f19603f3d011682016040523d82523d6000602084013e6105ca565b606091505b50508091505080610610576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610607906111f7565b60405180910390fd5b5050565b60005b601d8161ffff16116106f55760016000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020546106879190611246565b6000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000208190555080806106ed90611288565b915050610617565b506001600080602060f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000205461075b9190611246565b600080602060f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020819055506000603090505b60488161ffff161161089c5760016000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000205461082e9190611246565b6000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002081905550808061089490611288565b9150506107be565b506000605090505b605b8161ffff16116109825760016000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020546109149190611246565b6000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002081905550808061097a90611288565b9150506108a4565b506000606090505b609f8161ffff1611610a685760016000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020546109fa9190611246565b6000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020819055508080610a6090611288565b91505061098a565b50600060a090505b60a48161ffff1611610b4e5760016000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002054610ae09190611246565b6000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020819055508080610b4690611288565b915050610a70565b50600060f090505b60f58161ffff1611610c345760016000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002054610bc69190611246565b6000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020819055508080610c2c90611288565b915050610b56565b50600160008060fa60f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002054610c9a9190611246565b60008060fa60f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002081905550600060fd90505b60ff8161ffff1611610ddb5760016000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002054610d6d9190611246565b6000808360f01b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020819055508080610dd390611288565b915050610cfd565b50565b6000600254600143610df091906112b2565b4048464144604051602001610e0a96959493929190611320565b60405160208183030381529060405290506000454344425a604051602001610e36959493929190611381565b604051602081830303815290604052905060008036336000357fffffffff0000000000000000000000000000000000000000000000000000000016343a32604051602001610e8a979695949392919061146d565b60405160208183030381529060405290506002548383604051602001610eb19291906114d7565b60405160208183030381529060405282604051602001610ed29291906114d7565b604051602081830303815290604052604051602001610ef2929190611534565b60405160208183030381529060405280519060200120600281905550505050565b6101778061156583390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f4b82610f20565b9050919050565b610f5b81610f40565b82525050565b6000602082019050610f766000830184610f52565b92915050565b600080fd5b60007fffff00000000000000000000000000000000000000000000000000000000000082169050919050565b610fb681610f81565b8114610fc157600080fd5b50565b600081359050610fd381610fad565b92915050565b600060208284031215610fef57610fee610f7c565b5b6000610ffd84828501610fc4565b91505092915050565b6000819050919050565b61101981611006565b82525050565b60006020820190506110346000830184611010565b92915050565b600081519050919050565b600081905092915050565b60005b8381101561106e578082015181840152602081019050611053565b60008484015250505050565b60006110858261103a565b61108f8185611045565b935061109f818560208601611050565b80840191505092915050565b60006110b7828461107a565b915081905092915050565b600082825260208201905092915050565b7f65787465726e616c526576657274204661696c65640000000000000000000000600082015250565b60006111096015836110c2565b9150611114826110d3565b602082019050919050565b60006020820190508181036000830152611138816110fc565b9050919050565b7f63616c6c6d65546f53656c664465737472756374204661696c65640000000000600082015250565b6000611175601b836110c2565b91506111808261113f565b602082019050919050565b600060208201905081810360008301526111a481611168565b9050919050565b7f65786563757465416c6c206f6e2079756c436f6e7472616374204661696c6564600082015250565b60006111e16020836110c2565b91506111ec826111ab565b602082019050919050565b60006020820190508181036000830152611210816111d4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061125182611006565b915061125c83611006565b925082820190508082111561127457611273611217565b5b92915050565b600061ffff82169050919050565b60006112938261127a565b915061ffff82036112a7576112a6611217565b5b600182019050919050565b60006112bd82611006565b91506112c883611006565b92508282039050818111156112e0576112df611217565b5b92915050565b6000819050919050565b6112f9816112e6565b82525050565b600061130a82610f20565b9050919050565b61131a816112ff565b82525050565b600060c08201905061133560008301896112f0565b61134260208301886112f0565b61134f6040830187611010565b61135c6060830186611010565b6113696080830185611311565b61137660a0830184611010565b979650505050505050565b600060a0820190506113966000830188611010565b6113a36020830187611010565b6113b06040830186611010565b6113bd6060830185611010565b6113ca6080830184611010565b9695505050505050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b600061141183856113d4565b935061141e8385846113e5565b611427836113f4565b840190509392505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61146781611432565b82525050565b600060c082019050818103600083015261148881898b611405565b90506114976020830188610f52565b6114a4604083018761145e565b6114b16060830186611010565b6114be6080830185611010565b6114cb60a0830184610f52565b98975050505050505050565b60006114e3828561107a565b91506114ef828461107a565b91508190509392505050565b60006115068261103a565b61151081856113d4565b9350611520818560208601611050565b611529816113f4565b840191505092915050565b600060408201905061154960008301856112f0565b818103602083015261155b81846114fb565b9050939250505056fe608060405234801561001057600080fd5b50610157806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063b3907bb91461003b578063e32689ab14610045575b600080fd5b61004361004f565b005b61004d61008a565b005b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161008190610101565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16ff5b600082825260208201905092915050565b7f4f50434f44452046440000000000000000000000000000000000000000000000600082015250565b60006100eb6009836100a4565b91506100f6826100b5565b602082019050919050565b6000602082019050818103600083015261011a816100de565b905091905056fea2646970667358221220115a603bf9ff965c5aa74dbbc65a190a4a073a7f1c3da57101dbe38e391d992264736f6c63430008130033a2646970667358221220e63d8ef27ec8da7d116949ef8faa386498505481265c37405593418f0a63764a64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +}