UNPKG

@holographxyz/holograph-genesis

Version:
278 lines 61.7 kB
{ "address": "0x2694a14ea8D91F4CC314A3dBe8819eaadb7E025E", "abi": [ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "deployedContract", "type": "address" } ], "name": "ContractDeployed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "string", "name": "message", "type": "string" } ], "name": "Message", "type": "event" }, { "inputs": [ { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "address", "name": "newDeployer", "type": "address" }, { "internalType": "bool", "name": "approve", "type": "bool" }, { "internalType": "bytes", "name": "sig1", "type": "bytes" }, { "internalType": "bytes", "name": "sig2", "type": "bytes" } ], "name": "approveDeployer", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "chainId", "type": "uint256" }, { "internalType": "bytes12", "name": "saltHash", "type": "bytes12" }, { "internalType": "bytes20", "name": "secret", "type": "bytes20" }, { "internalType": "bytes", "name": "sourceCode", "type": "bytes" }, { "internalType": "bytes", "name": "initCode", "type": "bytes" } ], "name": "deploy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "getApproveDeployerNonce", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "_messageHash", "type": "bytes32" } ], "name": "getEthSignedMessageHash", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "address", "name": "newDeployer", "type": "address" }, { "internalType": "bool", "name": "approve", "type": "bool" } ], "name": "getMessageHash", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "getVersion", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "deployer", "type": "address" } ], "name": "isApprovedDeployer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "address", "name": "newDeployer", "type": "address" }, { "internalType": "bool", "name": "approve", "type": "bool" }, { "internalType": "bytes", "name": "signature", "type": "bytes" } ], "name": "recoverSigner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "pure", "type": "function" } ], "transactionHash": "0x03e93113ebe490a5d724df517adab1e04bcbe6b5f2e139efdbb31358e566e28f", "receipt": { "to": null, "from": "0xFa893f4c92A09747d112DfD6D6957ddd24F2A1d7", "contractAddress": "0x2694a14ea8D91F4CC314A3dBe8819eaadb7E025E", "transactionIndex": 8, "gasUsed": "1101762", "logsBloom": "0x00000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000008000000000000000004000000000000000000000000004000000000000800000000002000000000100000000000000000000000000000000000000000000000000200000000080000000200000000000000000000000000000000000000000000000000000000000000000000000200000000000000080000000000400000000010000000000000000000000004000000000000000000021000000000000000000000000000010100000000000000000000000000000001000000000000000000000000000000000000000100000", "blockHash": "0x53b46a4a093e054039be25b17a89e4f0f5ac37a9c39479fef9080d05217fb4d5", "transactionHash": "0x03e93113ebe490a5d724df517adab1e04bcbe6b5f2e139efdbb31358e566e28f", "logs": [ { "transactionIndex": 8, "blockNumber": 52519752, "transactionHash": "0x03e93113ebe490a5d724df517adab1e04bcbe6b5f2e139efdbb31358e566e28f", "address": "0x2694a14ea8D91F4CC314A3dBe8819eaadb7E025E", "topics": [ "0x51a7f65c6325882f237d4aeb43228179cfad48b868511d508e24b4437a819137" ], "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000195468652066757475726520697320486f6c6f6772617068696300000000000000", "logIndex": 36, "blockHash": "0x53b46a4a093e054039be25b17a89e4f0f5ac37a9c39479fef9080d05217fb4d5" }, { "transactionIndex": 8, "blockNumber": 52519752, "transactionHash": "0x03e93113ebe490a5d724df517adab1e04bcbe6b5f2e139efdbb31358e566e28f", "address": "0x0000000000000000000000000000000000001010", "topics": [ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", "0x000000000000000000000000fa893f4c92a09747d112dfd6d6957ddd24f2a1d7", "0x00000000000000000000000009385a960a2e0b6b4516d341534da92cb2a50085" ], "data": "0x00000000000000000000000000000000000000000000000000c244167e6227fe000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000100cb8665a4d88a21f9800000000000000000000000000000000000000000000000000a10161df27d80200000000000000000000000000000000000000000000100cb9289e6407044796", "logIndex": 37, "blockHash": "0x53b46a4a093e054039be25b17a89e4f0f5ac37a9c39479fef9080d05217fb4d5" } ], "blockNumber": 52519752, "cumulativeGasUsed": "2122636", "status": 1, "byzantium": true }, "args": [], "numDeployments": 1, "solcInputHash": "56f04415f4dedf4adf5fbfd1b59d5999", "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"deployedContract\",\"type\":\"address\"}],\"name\":\"ContractDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"Message\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newDeployer\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approve\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"sig1\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sig2\",\"type\":\"bytes\"}],\"name\":\"approveDeployer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"bytes12\",\"name\":\"saltHash\",\"type\":\"bytes12\"},{\"internalType\":\"bytes20\",\"name\":\"secret\",\"type\":\"bytes20\"},{\"internalType\":\"bytes\",\"name\":\"sourceCode\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"initCode\",\"type\":\"bytes\"}],\"name\":\"deploy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getApproveDeployerNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_messageHash\",\"type\":\"bytes32\"}],\"name\":\"getEthSignedMessageHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newDeployer\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approve\",\"type\":\"bool\"}],\"name\":\"getMessageHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVersion\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"deployer\",\"type\":\"address\"}],\"name\":\"isApprovedDeployer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newDeployer\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approve\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"recoverSigner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"In the beginning there was a smart contract...\",\"kind\":\"dev\",\"methods\":{\"approveDeployer(uint256,address,bool,bytes,bytes)\":{\"details\":\"Approve or disapprove a deployer using multi-signature verification.\",\"params\":{\"approve\":\"Boolean representing the approval status\",\"newDeployer\":\"The address of the deployer to approve or disapprove\",\"nonce\":\"A unique nonce\",\"sig1\":\"The first signature for multisig\",\"sig2\":\"The second signature for multisig\"}},\"constructor\":{\"details\":\"Sets the initial deployers as approved upon contract creation.\"},\"deploy(uint256,bytes12,bytes20,bytes,bytes)\":{\"details\":\"Deploy a contract using the EIP-1014 (create2) opcode for deterministic addresses.\",\"params\":{\"chainId\":\"The chain on which to deploy\",\"initCode\":\"The initialization code for the contract\",\"saltHash\":\"A unique salt for contract creation\",\"secret\":\"A secret part of the salt\",\"sourceCode\":\"The bytecode of the contract to deploy\"}},\"getApproveDeployerNonce()\":{\"details\":\"Returns the current nonce for deployer approvals.\",\"returns\":{\"_0\":\"uint256 representing the current nonce\"}},\"getEthSignedMessageHash(bytes32)\":{\"details\":\"Recreates the Ethereum signed message hash from the plain message hash.\",\"params\":{\"_messageHash\":\"The hash of the original message\"},\"returns\":{\"_0\":\"bytes32 Ethereum signed message hash\"}},\"getMessageHash(uint256,address,bool)\":{\"details\":\"Generates a hash of the message containing nonce, deployer address, and approval status.\",\"params\":{\"approve\":\"Approval status in the message\",\"newDeployer\":\"Address of the deployer in the message\",\"nonce\":\"Nonce used in the message\"},\"returns\":{\"_0\":\"bytes32 Ethereum signed message hash\"}},\"getVersion()\":{\"details\":\"Returns the version number of the Genesis contract\",\"returns\":{\"_0\":\"uint32 representing the version number\"}},\"isApprovedDeployer(address)\":{\"details\":\"Check if an address is an approved deployer.\",\"params\":{\"deployer\":\"Address to check\"},\"returns\":{\"_0\":\"bool representing approval status\"}},\"recoverSigner(uint256,address,bool,bytes)\":{\"details\":\"Recovers the signer from the signature.\",\"params\":{\"approve\":\"Approval status in the message\",\"newDeployer\":\"Address of the deployer in the message\",\"nonce\":\"Nonce used in the message\",\"signature\":\"The signature to recover\"},\"returns\":{\"_0\":\"address of the signer\"}}},\"title\":\"HOLOGRAPH GENESIS\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/HolographGenesis.sol\":\"HolographGenesis\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"contracts/HolographGenesis.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n/*\\n\\n \\u250c\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2510\\n \\u2502 HOLOGRAPH \\u2502\\n \\u2514\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2518\\n\\u2554\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2557\\n\\u2551 \\u2551\\n\\u2551 / ^ \\\\ \\u2551\\n\\u2551 ~~*~~ \\u00b8 \\u2551\\n\\u2551 [ '<>:<>' ] \\u2502\\u2591\\u2591\\u2591 \\u2551\\n\\u2551 \\u2554\\u2557 _/\\\"\\\\_ \\u2554\\u2563 \\u2551\\n\\u2551 \\u250c\\u2500\\u256c\\u256c\\u2500\\u2510 \\\"\\\"\\\" \\u250c\\u2500\\u256c\\u256c\\u2500\\u2510 \\u2551\\n\\u2551 \\u250c\\u2500\\u252c\\u2518 \\u2560\\u2563 \\u2514\\u252c\\u2500\\u2510 \\\\_/ \\u250c\\u2500\\u252c\\u2518 \\u2560\\u2563 \\u2514\\u252c\\u2500\\u2510 \\u2551\\n\\u2551 \\u250c\\u2500\\u252c\\u2518 \\u2502 \\u2560\\u2563 \\u2502 \\u2514\\u252c\\u2500\\u2510 \\u250c\\u2500\\u252c\\u2518 \\u2502 \\u2560\\u2563 \\u2502 \\u2514\\u252c\\u2500\\u2510 \\u2551\\n\\u2551 \\u250c\\u2500\\u252c\\u2518 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2514\\u252c\\u2500\\u2510 \\u250c\\u2500\\u252c\\u2518 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2514\\u252c\\u2500\\u2510 \\u2551\\n\\u2551 \\u250c\\u2500\\u252c\\u2518 \\u2502 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2502 \\u2514\\u252c\\u2510 \\u250c\\u252c\\u2518 \\u2502 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2502 \\u2514\\u252c\\u2500\\u2510 \\u2551\\n\\u2560\\u252c\\u2518 \\u2502 \\u2502 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2502 \\u2502\\u2514\\u00a4\\u2518\\u2502 \\u2502 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2502 \\u2502 \\u2514\\u252c\\u2563\\n\\u2551\\u2502 \\u2502 \\u2502 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2502 \\u2502 \\u2502 \\u2502 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2502 \\u2502 \\u2502\\u2551\\n\\u2560\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u256c\\u256c\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u256c\\u256c\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2563\\n\\u2560\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u256c\\u256c\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u256c\\u256c\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2563\\n\\u2551 \\u2560\\u2563 \\u2560\\u2563 \\u2551\\n\\u2551 \\u2560\\u2563 \\u2560\\u2563 \\u2551\\n\\u2551 , \\u2560\\u2563 , ,' * \\u2560\\u2563 \\u2551\\n\\u2551~~~~~^~~~~~~~~\\u250c\\u256c\\u256c\\u2510~~~^~~~~~~~~^^~~~~~~~~^~~\\u250c\\u256c\\u256c\\u2510~~~~~~~^~~~~~~\\u2551\\n\\u255a\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2569\\u2569\\u2569\\u2569\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2569\\u2569\\u2569\\u2569\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u255d\\n - one protocol, one bridge = infinite possibilities -\\n\\n\\n ***************************************************************\\n\\n DISCLAIMER: U.S Patent Pending\\n\\n LICENSE: Holograph Limited Public License (H-LPL)\\n\\n https://holograph.xyz/licenses/h-lpl/1.0.0\\n\\n This license governs use of the accompanying software. If you\\n use the software, you accept this license. If you do not accept\\n the license, you are not permitted to use the software.\\n\\n 1. Definitions\\n\\n The terms \\\"reproduce,\\\" \\\"reproduction,\\\" \\\"derivative works,\\\" and\\n \\\"distribution\\\" have the same meaning here as under U.S.\\n copyright law. A \\\"contribution\\\" is the original software, or\\n any additions or changes to the software. A \\\"contributor\\\" is\\n any person that distributes its contribution under this\\n license. \\\"Licensed patents\\\" are a contributor\\u2019s patent claims\\n that read directly on its contribution.\\n\\n 2. Grant of Rights\\n\\n A) Copyright Grant- Subject to the terms of this license,\\n including the license conditions and limitations in sections 3\\n and 4, each contributor grants you a non-exclusive, worldwide,\\n royalty-free copyright license to reproduce its contribution,\\n prepare derivative works of its contribution, and distribute\\n its contribution or any derivative works that you create.\\n B) Patent Grant- Subject to the terms of this license,\\n including the license conditions and limitations in section 3,\\n each contributor grants you a non-exclusive, worldwide,\\n royalty-free license under its licensed patents to make, have\\n made, use, sell, offer for sale, import, and/or otherwise\\n dispose of its contribution in the software or derivative works\\n of the contribution in the software.\\n\\n 3. Conditions and Limitations\\n\\n A) No Trademark License- This license does not grant you rights\\n to use any contributors\\u2019 name, logo, or trademarks.\\n B) If you bring a patent claim against any contributor over\\n patents that you claim are infringed by the software, your\\n patent license from such contributor is terminated with\\n immediate effect.\\n C) If you distribute any portion of the software, you must\\n retain all copyright, patent, trademark, and attribution\\n notices that are present in the software.\\n D) If you distribute any portion of the software in source code\\n form, you may do so only under this license by including a\\n complete copy of this license with your distribution. If you\\n distribute any portion of the software in compiled or object\\n code form, you may only do so under a license that complies\\n with this license.\\n E) The software is licensed \\u201cas-is.\\u201d You bear all risks of\\n using it. The contributors give no express warranties,\\n guarantees, or conditions. You may have additional consumer\\n rights under your local laws which this license cannot change.\\n To the extent permitted under your local laws, the contributors\\n exclude all implied warranties, including those of\\n merchantability, fitness for a particular purpose and\\n non-infringement.\\n\\n 4. (F) Platform Limitation- The licenses granted in sections\\n 2.A & 2.B extend only to the software or derivative works that\\n you create that run on a Holograph system product.\\n\\n ***************************************************************\\n\\n*/\\n\\npragma solidity 0.8.17;\\n\\nimport \\\"./interface/InitializableInterface.sol\\\";\\n\\n/**\\n * @title HOLOGRAPH GENESIS\\n * @dev In the beginning there was a smart contract...\\n */\\ncontract HolographGenesis {\\n uint32 private immutable _version;\\n\\n // Nonce to prevent replay attacks on deployer approvals\\n uint256 private _approveDeployerNonce;\\n\\n // Immutable addresses of the initial deployers\\n address private immutable deployer1 = 0xBB566182f35B9E5Ae04dB02a5450CC156d2f89c1;\\n address private immutable deployer2 = 0x22ED36947DDd1ae317F7816c410D3c0c58Bb9b90;\\n address private immutable deployer3 = 0xFfCA0d6986099FbDb3b6AD9b6aa5DF5ed1d44f0C;\\n address private immutable deployer4 = 0xDF9013a9Af763b181EF8acFC0e3229494004e001;\\n address private immutable deployer5 = 0x00Ac9Fd50C63f176B49F05FfedA324bD68C7cD69;\\n\\n // Mapping of addresses that are approved deployers\\n mapping(address => bool) private _approvedDeployers;\\n\\n // Events\\n event Message(string message);\\n event ContractDeployed(address deployedContract);\\n\\n // Modifier to restrict function calls to approved deployers\\n modifier onlyDeployer() {\\n require(_approvedDeployers[msg.sender], \\\"HOLOGRAPH: deployer not approved\\\");\\n _;\\n }\\n\\n /**\\n * @dev Sets the initial deployers as approved upon contract creation.\\n */\\n constructor() {\\n _version = 2;\\n\\n // Set the immutable deployers as approved\\n _approvedDeployers[deployer1] = true;\\n _approvedDeployers[deployer2] = true;\\n _approvedDeployers[deployer3] = true;\\n _approvedDeployers[deployer4] = true;\\n _approvedDeployers[deployer5] = true;\\n\\n emit Message(\\\"The future is Holographic\\\");\\n }\\n\\n /**\\n * @dev Deploy a contract using the EIP-1014 (create2) opcode for deterministic addresses.\\n * @param chainId The chain on which to deploy\\n * @param saltHash A unique salt for contract creation\\n * @param secret A secret part of the salt\\n * @param sourceCode The bytecode of the contract to deploy\\n * @param initCode The initialization code for the contract\\n */\\n function deploy(\\n uint256 chainId,\\n bytes12 saltHash,\\n bytes20 secret,\\n bytes memory sourceCode,\\n bytes memory initCode\\n ) external onlyDeployer {\\n require(chainId == block.chainid, \\\"HOLOGRAPH: incorrect chain id\\\");\\n bytes32 salt = bytes32(abi.encodePacked(secret, saltHash));\\n address contractAddress = address(\\n uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), address(this), salt, keccak256(sourceCode)))))\\n );\\n require(!_isContract(contractAddress), \\\"HOLOGRAPH: already deployed\\\");\\n assembly {\\n contractAddress := create2(0, add(sourceCode, 0x20), mload(sourceCode), salt)\\n }\\n require(_isContract(contractAddress), \\\"HOLOGRAPH: deployment failed\\\");\\n require(\\n InitializableInterface(contractAddress).init(initCode) == InitializableInterface.init.selector,\\n \\\"HOLOGRAPH: initialization failed\\\"\\n );\\n\\n emit ContractDeployed(contractAddress);\\n }\\n\\n /**\\n * @dev Check if an address is an approved deployer.\\n * @param deployer Address to check\\n * @return bool representing approval status\\n */\\n function isApprovedDeployer(address deployer) external view returns (bool) {\\n return _approvedDeployers[deployer];\\n }\\n\\n /**\\n * @dev Internal function to determine if an address is a deployed contract.\\n * @param contractAddress The address to check\\n * @return bool representing if the address is a contract\\n */\\n function _isContract(address contractAddress) internal view returns (bool) {\\n bytes32 codehash;\\n assembly {\\n codehash := extcodehash(contractAddress)\\n }\\n return (codehash != 0x0 && codehash != 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);\\n }\\n\\n /**\\n * @dev Approve or disapprove a deployer using multi-signature verification.\\n * @param nonce A unique nonce\\n * @param newDeployer The address of the deployer to approve or disapprove\\n * @param approve Boolean representing the approval status\\n * @param sig1 The first signature for multisig\\n * @param sig2 The second signature for multisig\\n */\\n function approveDeployer(\\n uint256 nonce,\\n address newDeployer,\\n bool approve,\\n bytes memory sig1,\\n bytes memory sig2\\n ) external onlyDeployer {\\n require(nonce > _approveDeployerNonce, \\\"HOLOGRAPH: invalid nonce\\\");\\n _approveDeployerNonce = nonce; // Update the nonce\\n\\n // Recover signers\\n address signer1 = recoverSigner(nonce, newDeployer, approve, sig1);\\n address signer2 = recoverSigner(nonce, newDeployer, approve, sig2);\\n\\n // Check that both signers are approved deployers\\n require(_approvedDeployers[signer1], \\\"HOLOGRAPH: signer 1 not approved\\\");\\n require(_approvedDeployers[signer2], \\\"HOLOGRAPH: signer 2 not approved\\\");\\n\\n // Ensure signatures come from two different deployers\\n require(signer1 != signer2, \\\"HOLOGRAPH: signatures must be from different deployers\\\");\\n\\n // All checks passed, update the deployer approval status\\n _approvedDeployers[newDeployer] = approve;\\n\\n emit Message(approve ? \\\"HOLOGRAPH: deployer approved\\\" : \\\"HOLOGRAPH: deployer disapproved\\\");\\n }\\n\\n /**\\n * @dev Generates a hash of the message containing nonce, deployer address, and approval status.\\n * @param nonce Nonce used in the message\\n * @param newDeployer Address of the deployer in the message\\n * @param approve Approval status in the message\\n * @return bytes32 Ethereum signed message hash\\n */\\n function getMessageHash(\\n uint256 nonce,\\n address newDeployer,\\n bool approve\\n ) public pure returns (bytes32) {\\n return keccak256(abi.encodePacked(nonce, newDeployer, approve));\\n }\\n\\n /**\\n * @dev Recreates the Ethereum signed message hash from the plain message hash.\\n * @param _messageHash The hash of the original message\\n * @return bytes32 Ethereum signed message hash\\n */\\n function getEthSignedMessageHash(bytes32 _messageHash) public pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", _messageHash));\\n }\\n\\n /**\\n * @dev Recovers the signer from the signature.\\n * @param nonce Nonce used in the message\\n * @param newDeployer Address of the deployer in the message\\n * @param approve Approval status in the message\\n * @param signature The signature to recover\\n * @return address of the signer\\n */\\n function recoverSigner(\\n uint256 nonce,\\n address newDeployer,\\n bool approve,\\n bytes memory signature\\n ) public pure returns (address) {\\n bytes32 messageHash = getMessageHash(nonce, newDeployer, approve);\\n bytes32 prefixedHash = getEthSignedMessageHash(messageHash);\\n (bytes32 r, bytes32 s, uint8 v) = splitSignature(signature);\\n\\n return ecrecover(prefixedHash, v, r, s);\\n }\\n\\n /**\\n * @dev Splits a signature into its r, s, and v components.\\n * @param sig The signature to split.\\n * @return r The r component of the signature.\\n * @return s The s component of the signature.\\n * @return v The recovery id component of the signature.\\n */\\n function splitSignature(bytes memory sig)\\n internal\\n pure\\n returns (\\n bytes32 r,\\n bytes32 s,\\n uint8 v\\n )\\n {\\n require(sig.length == 65, \\\"Invalid signature length\\\");\\n\\n assembly {\\n // first 32 bytes, after the length prefix\\n r := mload(add(sig, 32))\\n // second 32 bytes\\n s := mload(add(sig, 64))\\n // final byte (first byte of the next 32 bytes)\\n v := byte(0, mload(add(sig, 96)))\\n }\\n }\\n\\n /**\\n * @dev Returns the current nonce for deployer approvals.\\n * @return uint256 representing the current nonce\\n */\\n function getApproveDeployerNonce() external view onlyDeployer returns (uint256) {\\n return _approveDeployerNonce;\\n }\\n\\n /**\\n * @dev Returns the version number of the Genesis contract\\n * @return uint32 representing the version number\\n */\\n function getVersion() external view returns (uint32) {\\n return _version;\\n }\\n}\\n\",\"keccak256\":\"0xf7396534e1cba42b8b876dae9e802557d3348f4f8f92aeadf63156f2eb6e8a5d\",\"license\":\"UNLICENSED\"},\"contracts/interface/InitializableInterface.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n/*\\n\\n \\u250c\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2510\\n \\u2502 HOLOGRAPH \\u2502\\n \\u2514\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2518\\n\\u2554\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2557\\n\\u2551 \\u2551\\n\\u2551 / ^ \\\\ \\u2551\\n\\u2551 ~~*~~ \\u00b8 \\u2551\\n\\u2551 [ '<>:<>' ] \\u2502\\u2591\\u2591\\u2591 \\u2551\\n\\u2551 \\u2554\\u2557 _/\\\"\\\\_ \\u2554\\u2563 \\u2551\\n\\u2551 \\u250c\\u2500\\u256c\\u256c\\u2500\\u2510 \\\"\\\"\\\" \\u250c\\u2500\\u256c\\u256c\\u2500\\u2510 \\u2551\\n\\u2551 \\u250c\\u2500\\u252c\\u2518 \\u2560\\u2563 \\u2514\\u252c\\u2500\\u2510 \\\\_/ \\u250c\\u2500\\u252c\\u2518 \\u2560\\u2563 \\u2514\\u252c\\u2500\\u2510 \\u2551\\n\\u2551 \\u250c\\u2500\\u252c\\u2518 \\u2502 \\u2560\\u2563 \\u2502 \\u2514\\u252c\\u2500\\u2510 \\u250c\\u2500\\u252c\\u2518 \\u2502 \\u2560\\u2563 \\u2502 \\u2514\\u252c\\u2500\\u2510 \\u2551\\n\\u2551 \\u250c\\u2500\\u252c\\u2518 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2514\\u252c\\u2500\\u2510 \\u250c\\u2500\\u252c\\u2518 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2514\\u252c\\u2500\\u2510 \\u2551\\n\\u2551 \\u250c\\u2500\\u252c\\u2518 \\u2502 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2502 \\u2514\\u252c\\u2510 \\u250c\\u252c\\u2518 \\u2502 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2502 \\u2514\\u252c\\u2500\\u2510 \\u2551\\n\\u2560\\u252c\\u2518 \\u2502 \\u2502 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2502 \\u2502\\u2514\\u00a4\\u2518\\u2502 \\u2502 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2502 \\u2502 \\u2514\\u252c\\u2563\\n\\u2551\\u2502 \\u2502 \\u2502 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2502 \\u2502 \\u2502 \\u2502 \\u2502 \\u2502 \\u2560\\u2563 \\u2502 \\u2502 \\u2502 \\u2502 \\u2502\\u2551\\n\\u2560\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u256c\\u256c\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u256c\\u256c\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2550\\u2550\\u2569\\u2563\\n\\u2560\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u256c\\u256c\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u256c\\u256c\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2534\\u2563\\n\\u2551 \\u2560\\u2563 \\u2560\\u2563 \\u2551\\n\\u2551 \\u2560\\u2563 \\u2560\\u2563 \\u2551\\n\\u2551 , \\u2560\\u2563 , ,' * \\u2560\\u2563 \\u2551\\n\\u2551~~~~~^~~~~~~~~\\u250c\\u256c\\u256c\\u2510~~~^~~~~~~~~^^~~~~~~~~^~~\\u250c\\u256c\\u256c\\u2510~~~~~~~^~~~~~~\\u2551\\n\\u255a\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2569\\u2569\\u2569\\u2569\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2569\\u2569\\u2569\\u2569\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u255d\\n - one protocol, one bridge = infinite possibilities -\\n\\n\\n ***************************************************************\\n\\n DISCLAIMER: U.S Patent Pending\\n\\n LICENSE: Holograph Limited Public License (H-LPL)\\n\\n https://holograph.xyz/licenses/h-lpl/1.0.0\\n\\n This license governs use of the accompanying software. If you\\n use the software, you accept this license. If you do not accept\\n the license, you are not permitted to use the software.\\n\\n 1. Definitions\\n\\n The terms \\\"reproduce,\\\" \\\"reproduction,\\\" \\\"derivative works,\\\" and\\n \\\"distribution\\\" have the same meaning here as under U.S.\\n copyright law. A \\\"contribution\\\" is the original software, or\\n any additions or changes to the software. A \\\"contributor\\\" is\\n any person that distributes its contribution under this\\n license. \\\"Licensed patents\\\" are a contributor\\u2019s patent claims\\n that read directly on its contribution.\\n\\n 2. Grant of Rights\\n\\n A) Copyright Grant- Subject to the terms of this license,\\n including the license conditions and limitations in sections 3\\n and 4, each contributor grants you a non-exclusive, worldwide,\\n royalty-free copyright license to reproduce its contribution,\\n prepare derivative works of its contribution, and distribute\\n its contribution or any derivative works that you create.\\n B) Patent Grant- Subject to the terms of this license,\\n including the license conditions and limitations in section 3,\\n each contributor grants you a non-exclusive, worldwide,\\n royalty-free license under its licensed patents to make, have\\n made, use, sell, offer for sale, import, and/or otherwise\\n dispose of its contribution in the software or derivative works\\n of the contribution in the software.\\n\\n 3. Conditions and Limitations\\n\\n A) No Trademark License- This license does not grant you rights\\n to use any contributors\\u2019 name, logo, or trademarks.\\n B) If you bring a patent claim against any contributor over\\n patents that you claim are infringed by the software, your\\n patent license from such contributor is terminated with\\n immediate effect.\\n C) If you distribute any portion of the software, you must\\n retain all copyright, patent, trademark, and attribution\\n notices that are present in the software.\\n D) If you distribute any portion of the software in source code\\n form, you may do so only under this license by including a\\n complete copy of this license with your distribution. If you\\n distribute any portion of the software in compiled or object\\n code form, you may only do so under a license that complies\\n with this license.\\n E) The software is licensed \\u201cas-is.\\u201d You bear all risks of\\n using it. The contributors give no express warranties,\\n guarantees, or conditions. You may have additional consumer\\n rights under your local laws which this license cannot change.\\n To the extent permitted under your local laws, the contributors\\n exclude all implied warranties, including those of\\n merchantability, fitness for a particular purpose and\\n non-infringement.\\n\\n 4. (F) Platform Limitation- The licenses granted in sections\\n 2.A & 2.B extend only to the software or derivative works that\\n you create that run on a Holograph system product.\\n\\n ***************************************************************\\n\\n*/\\n\\npragma solidity 0.8.17;\\n\\n/**\\n * @title Initializable\\n * @author https://github.com/holographxyz\\n * @notice Use init instead of constructor\\n * @dev This allows for use of init function to make one time initializations without the need of a constructor\\n */\\ninterface InitializableInterface {\\n /**\\n * @notice Used internally to initialize the contract instead of through a constructor\\n * @dev This function is called by the deployer/factory when creating a contract\\n * @param initPayload abi encoded payload to use for contract initilaization\\n */\\n function init(bytes memory initPayload) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x3763904cf6e56ab7e724aa9881c6230a7acc686e737e802ea348197b81a50493\",\"license\":\"UNLICENSED\"}},\"version\":1}", "bytecode": "0x61014060405273bb566182f35b9e5ae04db02a5450cc156d2f89c160a0527322ed36947ddd1ae317f7816c410d3c0c58bb9b9060c05273ffca0d6986099fbdb3b6ad9b6aa5df5ed1d44f0c60e05273df9013a9af763b181ef8acfc0e3229494004e0016101005272ac9fd50c63f176b49f05ffeda324bd68c7cd696101205234801561008a57600080fd5b50600260805260a0516001600160a01b039081166000908152600160208190526040808320805460ff19908116841790915560c05185168452818420805482168417905560e0518516845281842080548216841790556101005185168452818420805482168417905561012051909416835291829020805490931617909155517f51a7f65c6325882f237d4aeb43228179cfad48b868511d508e24b4437a819137906101679060208082526019908201527f5468652066757475726520697320486f6c6f6772617068696300000000000000604082015260600190565b60405180910390a160805160a05160c05160e05161010051610120516110f36101ae60003960005050600050506000505060005050600050506000609701526110f36000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063cb33fe541161005b578063cb33fe541461018c578063d288337d1461019f578063dc7faa07146101a7578063fa540801146101f057600080fd5b80630d8e6e2c1461008d57806349aa18fc146100c657806355da4cd0146100db5780636ae675ac14610113575b600080fd5b60405163ffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526020015b60405180910390f35b6100d96100d4366004610dc4565b610251565b005b6100ee6100e9366004610eda565b61068c565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bd565b61017e610121366004610f42565b6040805160208082019590955260609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168382015290151560f81b60548301528051603581840301815260559092019052805191012090565b6040519081526020016100bd565b6100d961019a366004610f7e565b6107cd565b61017e610ba2565b6101e06101b5366004610fb4565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60405190151581526020016100bd565b61017e6101fe366004610fcf565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b3360009081526001602052604090205460ff166102cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f484f4c4f47524150483a206465706c6f796572206e6f7420617070726f76656460448201526064015b60405180910390fd5b468514610338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f484f4c4f47524150483a20696e636f727265637420636861696e20696400000060448201526064016102c6565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000851660208201527fffffffffffffffffffffffff000000000000000000000000000000000000000086166034820152600091016040516020818303038152906040526103a890610fe8565b8351602080860191909120604080517fff00000000000000000000000000000000000000000000000000000000000000818501523060601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602182015260358101859052605580820193909352815180820390930183526075019052805191012090915061043781610c22565b1561049e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f484f4c4f47524150483a20616c7265616479206465706c6f796564000000000060448201526064016102c6565b818451602086016000f590506104b381610c22565b610519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f484f4c4f47524150483a206465706c6f796d656e74206661696c65640000000060448201526064016102c6565b6040517f4ddf47d4000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff831690634ddf47d49061056d908790600401611091565b6020604051808303816000875af115801561058c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b091906110a4565b7fffffffff000000000000000000000000000000000000000000000000000000001614610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f484f4c4f47524150483a20696e697469616c697a6174696f6e206661696c656460448201526064016102c6565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f8ffcdc15a283d706d38281f500270d8b5a656918f555de0913d7455e3e6bc1bf906020015b60405180910390a150505050505050565b604080516020808201879052606086901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168284015284151560f81b6054830152825160358184030181526055830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a333200000000607584015260918084018290528451808503909101815260b1909301909352815191012060009190600080600061073b87610c5c565b60408051600081526020810180835289905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015610796573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519b9a5050505050505050505050565b3360009081526001602052604090205460ff16610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f484f4c4f47524150483a206465706c6f796572206e6f7420617070726f76656460448201526064016102c6565b60005485116108b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f484f4c4f47524150483a20696e76616c6964206e6f6e6365000000000000000060448201526064016102c6565b60008581556108c28686868661068c565b905060006108d28787878661068c565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205490915060ff16610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f484f4c4f47524150483a207369676e65722031206e6f7420617070726f76656460448201526064016102c6565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff166109f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f484f4c4f47524150483a207369676e65722032206e6f7420617070726f76656460448201526064016102c6565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610aae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f484f4c4f47524150483a207369676e617475726573206d75737420626520667260448201527f6f6d20646966666572656e74206465706c6f796572730000000000000000000060648201526084016102c6565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168615151790557f51a7f65c6325882f237d4aeb43228179cfad48b868511d508e24b4437a81913785610b5e576040518060400160405280601f81526020017f484f4c4f47524150483a206465706c6f79657220646973617070726f76656400815250610b95565b6040518060400160405280601c81526020017f484f4c4f47524150483a206465706c6f79657220617070726f766564000000008152505b60405161067b9190611091565b3360009081526001602052604081205460ff16610c1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f484f4c4f47524150483a206465706c6f796572206e6f7420617070726f76656460448201526064016102c6565b5060005490565b6000813f8015801590610c5557507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008060008351604114610ccc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016102c6565b50505060208101516040820151606090920151909260009190911a90565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112610d2a57600080fd5b813567ffffffffffffffff80821115610d4557610d45610cea565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610d8b57610d8b610cea565b81604052838152866020858801011115610da457600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a08688031215610ddc57600080fd5b8535945060208601357fffffffffffffffffffffffff000000000000000000000000000000000000000081168114610e1357600080fd5b935060408601357fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081168114610e4857600080fd5b9250606086013567ffffffffffffffff80821115610e6557600080fd5b610e7189838a01610d19565b93506080880135915080821115610e8757600080fd5b50610e9488828901610d19565b9150509295509295909350565b803573ffffffffffffffffffffffffffffffffffffffff81168114610ec557600080fd5b919050565b80358015158114610ec557600080fd5b60008060008060808587031215610ef057600080fd5b84359350610f0060208601610ea1565b9250610f0e60408601610eca565b9150606085013567ffffffffffffffff811115610f2a57600080fd5b610f3687828801610d19565b91505092959194509250565b600080600060608486031215610f5757600080fd5b83359250610f6760208501610ea1565b9150610f7560408501610eca565b90509250925092565b600080600080600060a08688031215610f9657600080fd5b85359450610fa660208701610ea1565b9350610e4860408701610eca565b600060208284031215610fc657600080fd5b610c5582610ea1565b600060208284031215610fe157600080fd5b5035919050565b80516020808301519190811015611027577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b6000815180845260005b8181101561105357602081850181015186830182015201611037565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610c55602083018461102d565b6000602082840312156110b657600080fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610c5557600080fdfea164736f6c6343000811000a", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063cb33fe541161005b578063cb33fe541461018c578063d288337d1461019f578063dc7faa07146101a7578063fa540801146101f057600080fd5b80630d8e6e2c1461008d57806349aa18fc146100c657806355da4cd0146100db5780636ae675ac14610113575b600080fd5b60405163ffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526020015b60405180910390f35b6100d96100d4366004610dc4565b610251565b005b6100ee6100e9366004610eda565b61068c565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bd565b61017e610121366004610f42565b6040805160208082019590955260609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168382015290151560f81b60548301528051603581840301815260559092019052805191012090565b6040519081526020016100bd565b6100d961019a366004610f7e565b6107cd565b61017e610ba2565b6101e06101b5366004610fb4565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b60405190151581526020016100bd565b61017e6101fe366004610fcf565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b3360009081526001602052604090205460ff166102cf576040517f08c379a0000000000000000000000000000000000