From a1ea68a1802140f89b13251dbebb0dfa79eb6c30 Mon Sep 17 00:00:00 2001 From: Ice Bear Date: Wed, 15 May 2024 22:04:52 +0300 Subject: [PATCH 1/3] Chores: new deployment on holesky --- .../holesky/middleware/ERC20Middleware.json | 24 +- .../middleware/ERC20PermitMiddleware.json | 30 +- .../middleware/ERC20RebaseMiddleware.json | 40 +- .../ERC20RebasePermitMiddleware.json | 36 +- geodefi/abis/holesky/package/Portal.json | 74 +- .../holesky/package/WithdrawalContract.json | 1710 ---------------- .../holesky/package/WithdrawalPackage.json | 1741 +++++++++++++++++ geodefi/abis/holesky/token/gETH.json | 116 +- 8 files changed, 1917 insertions(+), 1854 deletions(-) delete mode 100644 geodefi/abis/holesky/package/WithdrawalContract.json create mode 100644 geodefi/abis/holesky/package/WithdrawalPackage.json diff --git a/geodefi/abis/holesky/middleware/ERC20Middleware.json b/geodefi/abis/holesky/middleware/ERC20Middleware.json index 79b7d6f..aa81570 100644 --- a/geodefi/abis/holesky/middleware/ERC20Middleware.json +++ b/geodefi/abis/holesky/middleware/ERC20Middleware.json @@ -1,5 +1,5 @@ { - "address": "0x1242479a6Ba9a7Db0fEB1eFBc37AC442b1Ba8a06", + "address": "0xA20947854aA75ec6C0C195C59327D9d3df2128C4", "abi": [ { "inputs": [], @@ -400,32 +400,32 @@ "type": "function" } ], - "transactionHash": "0x34c86833a4d9deccbad560a7f387144910997b95f1f48f87f98641d505cd5978", + "transactionHash": "0x91d4a4830b1b45e2e284ad8bd8fd4f0fe556d02583740a5c06a39b9932e35e1a", "receipt": { "to": null, "from": "0x7B6fA217a374826FCa50dccB87041AE0e34Ba1f5", - "contractAddress": "0x1242479a6Ba9a7Db0fEB1eFBc37AC442b1Ba8a06", + "contractAddress": "0xA20947854aA75ec6C0C195C59327D9d3df2128C4", "transactionIndex": 1, "gasUsed": "968669", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000100000000000000000000000000000004000000000000000000000000000000000", - "blockHash": "0x5daf012d75fae3877d06f9290c5588e5093b8d2b87bbc72b55f4b61dc35535ef", - "transactionHash": "0x34c86833a4d9deccbad560a7f387144910997b95f1f48f87f98641d505cd5978", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000100000000000", + "blockHash": "0x7bcec9b4961da980a4b9ccb741502b89a013450ecc8412ad6c3913392bff32f9", + "transactionHash": "0x91d4a4830b1b45e2e284ad8bd8fd4f0fe556d02583740a5c06a39b9932e35e1a", "logs": [ { "transactionIndex": 1, - "blockNumber": 852080, - "transactionHash": "0x34c86833a4d9deccbad560a7f387144910997b95f1f48f87f98641d505cd5978", - "address": "0x1242479a6Ba9a7Db0fEB1eFBc37AC442b1Ba8a06", + "blockNumber": 1550554, + "transactionHash": "0x91d4a4830b1b45e2e284ad8bd8fd4f0fe556d02583740a5c06a39b9932e35e1a", + "address": "0xA20947854aA75ec6C0C195C59327D9d3df2128C4", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", "logIndex": 0, - "blockHash": "0x5daf012d75fae3877d06f9290c5588e5093b8d2b87bbc72b55f4b61dc35535ef" + "blockHash": "0x7bcec9b4961da980a4b9ccb741502b89a013450ecc8412ad6c3913392bff32f9" } ], - "blockNumber": 852080, - "cumulativeGasUsed": "989669", + "blockNumber": 1550554, + "cumulativeGasUsed": "990133", "status": 1, "byzantium": true }, diff --git a/geodefi/abis/holesky/middleware/ERC20PermitMiddleware.json b/geodefi/abis/holesky/middleware/ERC20PermitMiddleware.json index 649095f..ae0bc23 100644 --- a/geodefi/abis/holesky/middleware/ERC20PermitMiddleware.json +++ b/geodefi/abis/holesky/middleware/ERC20PermitMiddleware.json @@ -1,5 +1,5 @@ { - "address": "0x54A579dedEBca9089Dc8f26C5230fC76bEFC0fda", + "address": "0x06D568EA6ED820e09F367969078316Dc55bbC3d3", "abi": [ { "inputs": [], @@ -594,32 +594,32 @@ "type": "function" } ], - "transactionHash": "0xe9118e5bbc7ef31482bcf9fc786fdfd9ffb501762118b06beaa09409806c9c6b", + "transactionHash": "0x94481f73441102b8f62f1103580b3426d4f362bb89f2315788d79ecac95fa71d", "receipt": { "to": null, "from": "0x7B6fA217a374826FCa50dccB87041AE0e34Ba1f5", - "contractAddress": "0x54A579dedEBca9089Dc8f26C5230fC76bEFC0fda", - "transactionIndex": 1, + "contractAddress": "0x06D568EA6ED820e09F367969078316Dc55bbC3d3", + "transactionIndex": 3, "gasUsed": "1412423", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000004000000000000000000000000000000000000000000000000000002002000000000000000000000000000", - "blockHash": "0xcbdb43ee13073eb27cdc6feb0082ae084a7a9e48035ddf840b4a8237a595dee3", - "transactionHash": "0xe9118e5bbc7ef31482bcf9fc786fdfd9ffb501762118b06beaa09409806c9c6b", + "logsBloom": "0x00000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x12a23322805f0b0bd3c414203e9f0beeed443fc9210282d7fd4ed017c9cb182f", + "transactionHash": "0x94481f73441102b8f62f1103580b3426d4f362bb89f2315788d79ecac95fa71d", "logs": [ { - "transactionIndex": 1, - "blockNumber": 852081, - "transactionHash": "0xe9118e5bbc7ef31482bcf9fc786fdfd9ffb501762118b06beaa09409806c9c6b", - "address": "0x54A579dedEBca9089Dc8f26C5230fC76bEFC0fda", + "transactionIndex": 3, + "blockNumber": 1550555, + "transactionHash": "0x94481f73441102b8f62f1103580b3426d4f362bb89f2315788d79ecac95fa71d", + "address": "0x06D568EA6ED820e09F367969078316Dc55bbC3d3", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", - "logIndex": 0, - "blockHash": "0xcbdb43ee13073eb27cdc6feb0082ae084a7a9e48035ddf840b4a8237a595dee3" + "logIndex": 4, + "blockHash": "0x12a23322805f0b0bd3c414203e9f0beeed443fc9210282d7fd4ed017c9cb182f" } ], - "blockNumber": 852081, - "cumulativeGasUsed": "1433423", + "blockNumber": 1550555, + "cumulativeGasUsed": "2565136", "status": 1, "byzantium": true }, diff --git a/geodefi/abis/holesky/middleware/ERC20RebaseMiddleware.json b/geodefi/abis/holesky/middleware/ERC20RebaseMiddleware.json index e889702..4f416fb 100644 --- a/geodefi/abis/holesky/middleware/ERC20RebaseMiddleware.json +++ b/geodefi/abis/holesky/middleware/ERC20RebaseMiddleware.json @@ -1,5 +1,5 @@ { - "address": "0x4f60997B891557692200ac1963363394D5000122", + "address": "0x4FA20582298fA9eFB060dE216c61A1c5f8931513", "abi": [ { "inputs": [], @@ -400,41 +400,41 @@ "type": "function" } ], - "transactionHash": "0x71e4aa8163d2a2d195a0ac4aa2d5061d03b1500f24ad46f5b86d75e51aeca80f", + "transactionHash": "0xd7abe3cd20bc91dc12e7dc32d858e80d4bc6ff20247fb9e1aa7127722293fe39", "receipt": { "to": null, "from": "0x7B6fA217a374826FCa50dccB87041AE0e34Ba1f5", - "contractAddress": "0x4f60997B891557692200ac1963363394D5000122", - "transactionIndex": 2, - "gasUsed": "1070845", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x21fbf8e861471b28bf8d8193c75b105e52b9417078ab635983ee718752103bd6", - "transactionHash": "0x71e4aa8163d2a2d195a0ac4aa2d5061d03b1500f24ad46f5b86d75e51aeca80f", + "contractAddress": "0x4FA20582298fA9eFB060dE216c61A1c5f8931513", + "transactionIndex": 36, + "gasUsed": "1070833", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000004000001000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x2a87c1c804b23e3bd24a1ace8fb59b6b37d2f63ae5dd095b7364c272eac4941d", + "transactionHash": "0xd7abe3cd20bc91dc12e7dc32d858e80d4bc6ff20247fb9e1aa7127722293fe39", "logs": [ { - "transactionIndex": 2, - "blockNumber": 852082, - "transactionHash": "0x71e4aa8163d2a2d195a0ac4aa2d5061d03b1500f24ad46f5b86d75e51aeca80f", - "address": "0x4f60997B891557692200ac1963363394D5000122", + "transactionIndex": 36, + "blockNumber": 1550556, + "transactionHash": "0xd7abe3cd20bc91dc12e7dc32d858e80d4bc6ff20247fb9e1aa7127722293fe39", + "address": "0x4FA20582298fA9eFB060dE216c61A1c5f8931513", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", - "logIndex": 0, - "blockHash": "0x21fbf8e861471b28bf8d8193c75b105e52b9417078ab635983ee718752103bd6" + "logIndex": 351, + "blockHash": "0x2a87c1c804b23e3bd24a1ace8fb59b6b37d2f63ae5dd095b7364c272eac4941d" } ], - "blockNumber": 852082, - "cumulativeGasUsed": "1112845", + "blockNumber": 1550556, + "cumulativeGasUsed": "22394712", "status": 1, "byzantium": true }, "args": [], "numDeployments": 1, - "solcInputHash": "cfc92d910e56f99740a6d4737a3b72cb", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSpender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ERC1155\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC1155_ID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id_\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gETH_\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pricePerShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract should only be used for user interaction when ERC1155 is not an option.As a known bug, not all Transfer events are logged here. Please listen the underlying ERC1155 for the correct data.differences between ERC20RebaseMiddleware and ERC20Middleware can be seen observed at: -> totalSupply, balanceOf, _update. diffchecker: https://www.diffchecker.com/VQPmW62g/decimals is 18 onlyif erc1155.denominator = 1e18\",\"errors\":{\"ERC20InsufficientAllowance(address,uint256,uint256)\":[{\"details\":\"Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\",\"params\":{\"allowance\":\"Amount of tokens a `spender` is allowed to operate with.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"details\":\"Indicates an error related to the current `balance` of a `sender`. Used in transfers.\",\"params\":{\"balance\":\"Current balance for the interacting account.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC20InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC20InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidSpender(address)\":[{\"details\":\"Indicates a failure with the `spender` to be approved. Used in approvals.\",\"params\":{\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the value of tokens owned by `account`.\"},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\"},\"decimals()\":{\"details\":\"Returns the decimals places of the token.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token.\"},\"totalSupply()\":{\"details\":\"Returns the value of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Same as ERC20Middleware, but balances represent underlying balances, instead of ERC1155 balances. which means it represents the staked ether amount, instead of gETH amount.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/middlewares/ERC20RebaseMiddleware.sol\":\"ERC20RebaseMiddleware\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Storage of the initializable contract.\\n *\\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\\n * when using with upgradeable contracts.\\n *\\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\\n */\\n struct InitializableStorage {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n uint64 _initialized;\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool _initializing;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Initializable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\\n\\n /**\\n * @dev The contract is already initialized.\\n */\\n error InvalidInitialization();\\n\\n /**\\n * @dev The contract is not initializing.\\n */\\n error NotInitializing();\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint64 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\\n * production.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n // Cache values to avoid duplicated sloads\\n bool isTopLevelCall = !$._initializing;\\n uint64 initialized = $._initialized;\\n\\n // Allowed calls:\\n // - initialSetup: the contract is not in the initializing state and no previous version was\\n // initialized\\n // - construction: the contract is initialized at version 1 (no reininitialization) and the\\n // current contract is just being deployed\\n bool initialSetup = initialized == 0 && isTopLevelCall;\\n bool construction = initialized == 1 && address(this).code.length == 0;\\n\\n if (!initialSetup && !construction) {\\n revert InvalidInitialization();\\n }\\n $._initialized = 1;\\n if (isTopLevelCall) {\\n $._initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n $._initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint64 version) {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing || $._initialized >= version) {\\n revert InvalidInitialization();\\n }\\n $._initialized = version;\\n $._initializing = true;\\n _;\\n $._initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n _checkInitializing();\\n _;\\n }\\n\\n /**\\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\\n */\\n function _checkInitializing() internal view virtual {\\n if (!_isInitializing()) {\\n revert NotInitializing();\\n }\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing) {\\n revert InvalidInitialization();\\n }\\n if ($._initialized != type(uint64).max) {\\n $._initialized = type(uint64).max;\\n emit Initialized(type(uint64).max);\\n }\\n }\\n\\n /**\\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n */\\n function _getInitializedVersion() internal view returns (uint64) {\\n return _getInitializableStorage()._initialized;\\n }\\n\\n /**\\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _getInitializableStorage()._initializing;\\n }\\n\\n /**\\n * @dev Returns a pointer to the storage namespace.\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\\n assembly {\\n $.slot := INITIALIZABLE_STORAGE\\n }\\n }\\n}\\n\",\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x72d47aebad24c59f6e78d0c3e827440173419a333fd910a37fa1e532c98f7e4c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard ERC20 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\\n */\\ninterface IERC20Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC20InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC20InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC20InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC20InvalidSpender(address spender);\\n}\\n\\n/**\\n * @dev Standard ERC721 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\\n */\\ninterface IERC721Errors {\\n /**\\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\\n * Used in balance queries.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721InvalidOwner(address owner);\\n\\n /**\\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721NonexistentToken(uint256 tokenId);\\n\\n /**\\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param tokenId Identifier number of a token.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC721InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC721InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC721InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC721InvalidOperator(address operator);\\n}\\n\\n/**\\n * @dev Standard ERC1155 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\\n */\\ninterface IERC1155Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC1155InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC1155InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC1155MissingApprovalForAll(address operator, address owner);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC1155InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC1155InvalidOperator(address operator);\\n\\n /**\\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\\n * Used in batch transfers.\\n * @param idsLength Length of the array of token identifiers\\n * @param valuesLength Length of the array of token amounts\\n */\\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\\n}\\n\",\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\\n */\\ninterface IERC1155 is IERC165 {\\n /**\\n * @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.\\n */\\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n /**\\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\\n * transfers.\\n */\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] values\\n );\\n\\n /**\\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\\n * `approved`.\\n */\\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\\n\\n /**\\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\\n *\\n * If an {URI} event was emitted for `id`, the standard\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\\n * returned by {IERC1155MetadataURI-uri}.\\n */\\n event URI(string value, uint256 indexed id);\\n\\n /**\\n * @dev Returns the value of tokens of token type `id` owned by `account`.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function balanceOf(address account, uint256 id) external view returns (uint256);\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\\n *\\n * Requirements:\\n *\\n * - `accounts` and `ids` must have the same length.\\n */\\n function balanceOfBatch(\\n address[] calldata accounts,\\n uint256[] calldata ids\\n ) external view returns (uint256[] memory);\\n\\n /**\\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\\n *\\n * Emits an {ApprovalForAll} event.\\n *\\n * Requirements:\\n *\\n * - `operator` cannot be the caller.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\\n *\\n * See {setApprovalForAll}.\\n */\\n function isApprovedForAll(address account, address operator) external view returns (bool);\\n\\n /**\\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`.\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155Received} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\\n *\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `values` must have the same length.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external;\\n}\\n\",\"keccak256\":\"0xe64b3445a3f638890af7ad92464cd18f1f202a2f5a7ed42dabf74317bae43303\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/extensions/IERC1155MetadataURI.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC1155} from \\\"../IERC1155.sol\\\";\\n\\n/**\\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\\n */\\ninterface IERC1155MetadataURI is IERC1155 {\\n /**\\n * @dev Returns the URI for token type `id`.\\n *\\n * If the `\\\\{id\\\\}` substring is present in the URI, it must be replaced by\\n * clients with the actual token type ID.\\n */\\n function uri(uint256 id) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xe92b5e199b963d108ad6e06feeede151ba23849e0d064956535489ff967ffe68\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"contracts/globals/macros.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n// no floats in solidity. If needed, PERCENTAGE_DENOMINATOR always represents \\\"1\\\" (100%)\\nuint256 constant PERCENTAGE_DENOMINATOR = 1e10;\\n\\nuint256 constant gETH_DENOMINATOR = 1e18;\\n\",\"keccak256\":\"0x9d699aeaf6da35d188a5495eec188b28a990e09bd04fa7701d28c4ff9afba801\",\"license\":\"MIT\"},\"contracts/helpers/BytesLib.sol\":{\"content\":\"// SPDX-License-Identifier: Unlicense\\n/*\\n * @title Solidity Bytes Arrays Utils\\n * @author Gon\\u00e7alo S\\u00e1 \\n *\\n * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.\\n * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.\\n */\\npragma solidity =0.8.20;\\n\\nlibrary BytesLib {\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n ) internal pure returns (bytes memory) {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(\\n 0x40,\\n and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n )\\n )\\n }\\n\\n return tempBytes;\\n }\\n\\n function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\\n assembly {\\n // Read the first 32 bytes of _preBytes storage, which is the length\\n // of the array. (We don't need to use the offset into the slot\\n // because arrays use the entire slot.)\\n let fslot := sload(_preBytes.slot)\\n // Arrays of 31 bytes or less have an even value in their slot,\\n // while longer arrays have an odd value. The actual length is\\n // the slot divided by two for odd values, and the lowest order\\n // byte divided by two for even values.\\n // If the slot is even, bitwise and the slot with 255 and divide by\\n // two to get the length. If the slot is odd, bitwise and the slot\\n // with -1 and divide by two.\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n let newlength := add(slength, mlength)\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n switch add(lt(slength, 32), lt(newlength, 32))\\n case 2 {\\n // Since the new array still fits in the slot, we just need to\\n // update the contents of the slot.\\n // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\\n sstore(\\n _preBytes.slot,\\n // all the modifications to the slot are inside this\\n // next block\\n add(\\n // we can just add to the slot contents because the\\n // bytes we want to change are the LSBs\\n fslot,\\n add(\\n mul(\\n div(\\n // load the bytes from memory\\n mload(add(_postBytes, 0x20)),\\n // zero all bytes to the right\\n exp(0x100, sub(32, mlength))\\n ),\\n // and now shift left the number of bytes to\\n // leave space for the length in the slot\\n exp(0x100, sub(32, newlength))\\n ),\\n // increase length by the double of the memory\\n // bytes length\\n mul(mlength, 2)\\n )\\n )\\n )\\n }\\n case 1 {\\n // The stored value fits in the slot, but the combined value\\n // will exceed it.\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // The contents of the _postBytes array start 32 bytes into\\n // the structure. Our first read should obtain the `submod`\\n // bytes that can fit into the unused space in the last word\\n // of the stored array. To get this, we read 32 bytes starting\\n // from `submod`, so the data we read overlaps with the array\\n // contents by `submod` bytes. Masking the lowest-order\\n // `submod` bytes allows us to add that value directly to the\\n // stored value.\\n\\n let submod := sub(32, slength)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(\\n sc,\\n add(\\n and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00),\\n and(mload(mc), mask)\\n )\\n )\\n\\n for {\\n mc := add(mc, 0x20)\\n sc := add(sc, 1)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n default {\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n // Start copying to the last used word of the stored array.\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // Copy over the first `submod` bytes of the new data as in\\n // case 1 above.\\n let slengthmod := mod(slength, 32)\\n let mlengthmod := mod(mlength, 32)\\n let submod := sub(32, slengthmod)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(sc, add(sload(sc), and(mload(mc), mask)))\\n\\n for {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n }\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_bytes.length >= _start + 1, \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {\\n require(_bytes.length >= _start + 2, \\\"toUint16_outOfBounds\\\");\\n uint16 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x2), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {\\n require(_bytes.length >= _start + 4, \\\"toUint32_outOfBounds\\\");\\n uint32 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x4), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {\\n require(_bytes.length >= _start + 8, \\\"toUint64_outOfBounds\\\");\\n uint64 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x8), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {\\n require(_bytes.length >= _start + 12, \\\"toUint96_outOfBounds\\\");\\n uint96 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0xc), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {\\n require(_bytes.length >= _start + 16, \\\"toUint128_outOfBounds\\\");\\n uint128 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x10), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {\\n require(_bytes.length >= _start + 32, \\\"toUint256_outOfBounds\\\");\\n uint256 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {\\n require(_bytes.length >= _start + 32, \\\"toBytes32_outOfBounds\\\");\\n bytes32 tempBytes32;\\n\\n assembly {\\n tempBytes32 := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempBytes32;\\n }\\n\\n function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\\n bool success = true;\\n\\n assembly {\\n let length := mload(_preBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(length, mload(_postBytes))\\n case 1 {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n let mc := add(_preBytes, 0x20)\\n let end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n } eq(add(lt(mc, end), cb), 2) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // if any of these checks fails then arrays are not equal\\n if iszero(eq(mload(mc), mload(cc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function equalStorage(\\n bytes storage _preBytes,\\n bytes memory _postBytes\\n ) internal view returns (bool) {\\n bool success = true;\\n\\n assembly {\\n // we know _preBytes_offset is 0\\n let fslot := sload(_preBytes.slot)\\n // Decode the length of the stored array like in concatStorage().\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(slength, mlength)\\n case 1 {\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n if iszero(iszero(slength)) {\\n switch lt(slength, 32)\\n case 1 {\\n // blank the last byte which is the length\\n fslot := mul(div(fslot, 0x100), 0x100)\\n\\n if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\\n // unsuccess:\\n success := 0\\n }\\n }\\n default {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := keccak256(0x0, 0x20)\\n\\n let mc := add(_postBytes, 0x20)\\n let end := add(mc, mlength)\\n\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n for {\\n\\n } eq(add(lt(mc, end), cb), 2) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n if iszero(eq(sload(sc), mload(mc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n}\\n\",\"keccak256\":\"0x4ee3f6ef85baa41794fc1519522f7c135becd0e267980eadc68dd643e52b59c7\",\"license\":\"Unlicense\"},\"contracts/interfaces/IgETH.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IERC1155PausableBurnableSupply} from \\\"./helpers/IERC1155PausableBurnableSupply.sol\\\";\\n\\ninterface IgETH is IERC1155PausableBurnableSupply {\\n function denominator() external view returns (uint256);\\n\\n function isMiddleware(address middleware, uint256 id) external view returns (bool);\\n\\n function setMiddleware(address middleware, uint256 id, bool isSet) external;\\n\\n function isAvoider(address account, uint256 id) external view returns (bool);\\n\\n function avoidMiddlewares(uint256 id, bool isAvoid) external;\\n\\n function pricePerShare(uint256 id) external view returns (uint256);\\n\\n function priceUpdateTimestamp(uint256 id) external view returns (uint256);\\n\\n function setPricePerShare(uint256 price, uint256 id) external;\\n\\n function transferUriSetterRole(address newUriSetter) external;\\n\\n function transferPauserRole(address newPauser) external;\\n\\n function transferMinterRole(address newMinter) external;\\n\\n function transferOracleRole(address newOracle) external;\\n\\n function transferMiddlewareManagerRole(address newMiddlewareManager) external;\\n}\\n\",\"keccak256\":\"0xa093b769e8ba42091d3db8a9e4ddc1be066f4aa92f61ee552983c22a0e9f29d8\",\"license\":\"MIT\"},\"contracts/interfaces/helpers/IERC1155PausableBurnableSupply.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/// @dev IERC1155 inherits IERC165\\nimport {IERC1155} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Errors} from \\\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\\\";\\n\\ninterface IERC1155Burnable is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function burn(address account, uint256 id, uint256 value) external;\\n\\n function burnBatch(address account, uint256[] memory ids, uint256[] memory values) external;\\n}\\n\\ninterface IERC1155Supply is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function totalSupply(uint256 id) external view returns (uint256);\\n\\n function exists(uint256 id) external view returns (bool);\\n}\\n\\ninterface IERC1155PausableBurnableSupply is IERC1155Burnable, IERC1155Supply {\\n function setURI(string memory newuri) external;\\n\\n function pause() external;\\n\\n function unpause() external;\\n\\n function mint(address account, uint256 id, uint256 amount, bytes memory data) external;\\n\\n function mintBatch(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) external;\\n}\\n\",\"keccak256\":\"0x8b0a02fdbc8d54c815d68e122f6869348217b5efd853c8b833c59d2053998ef0\",\"license\":\"MIT\"},\"contracts/interfaces/middlewares/IgETHMiddleware.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\ninterface IgETHMiddleware {\\n function initialize(uint256 id_, address erc1155_, bytes memory data) external;\\n\\n function ERC1155() external view returns (address);\\n\\n function ERC1155_ID() external view returns (uint256);\\n\\n function pricePerShare() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x5b94e7cf38487d607c720d311578fa0b777a75050113b3533b8e4e22fe6ab61c\",\"license\":\"MIT\"},\"contracts/middlewares/ERC20RebaseMiddleware.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n// external - interfaces\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport {IERC20Metadata} from \\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\";\\nimport {IERC20Errors} from \\\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\\\";\\n// external - contracts\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {ContextUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\\\";\\n// internal - globals\\nimport {gETH_DENOMINATOR} from \\\"../globals/macros.sol\\\";\\n// internal - interfaces\\nimport {IgETH} from \\\"../interfaces/IgETH.sol\\\";\\nimport {IgETHMiddleware} from \\\"../interfaces/middlewares/IgETHMiddleware.sol\\\";\\n// internal - libraries\\nimport {BytesLib} from \\\"../helpers/BytesLib.sol\\\";\\n\\n/**\\n * @notice Same as ERC20Middleware, but balances represent underlying balances, instead of ERC1155 balances.\\n * which means it represents the staked ether amount, instead of gETH amount.\\n *\\n * @dev This contract should only be used for user interaction when ERC1155 is not an option.\\n * @dev As a known bug, not all Transfer events are logged here. Please listen the underlying ERC1155 for the correct data.\\n *\\n * @dev differences between ERC20RebaseMiddleware and ERC20Middleware can be seen observed at:\\n * -> totalSupply, balanceOf, _update.\\n *\\n * diffchecker: https://www.diffchecker.com/VQPmW62g/\\n *\\n * @dev decimals is 18 onlyif erc1155.denominator = 1e18\\n */\\ncontract ERC20RebaseMiddleware is\\n Initializable,\\n ContextUpgradeable,\\n IgETHMiddleware,\\n IERC20,\\n IERC20Metadata,\\n IERC20Errors\\n{\\n /// @custom:storage-location erc7201:geode.storage.ERC20RebaseMiddleware\\n struct ERC20RebaseMiddlewareStorage {\\n // mapping(address account => uint256) _balances; -> use ERC1155\\n mapping(address account => mapping(address spender => uint256)) _allowances;\\n // uint256 _totalSupply; -> use ERC1155\\n string _name;\\n string _symbol;\\n IgETH ERC1155;\\n uint256 ERC1155_ID;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"geode.storage.ERC20RebaseMiddleware\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant ERC20RebaseMiddlewareStorageLocation =\\n 0x033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2500;\\n\\n function _getERC20RebaseMiddlewareStorage()\\n private\\n pure\\n returns (ERC20RebaseMiddlewareStorage storage $)\\n {\\n assembly {\\n $.slot := ERC20RebaseMiddlewareStorageLocation\\n }\\n }\\n\\n /// @custom:oz-upgrades-unsafe-allow constructor\\n constructor() {\\n _disableInitializers();\\n }\\n\\n function initialize(\\n uint256 id_,\\n address gETH_,\\n bytes calldata data\\n ) public virtual override initializer {\\n uint256 nameLen = uint256(bytes32(BytesLib.slice(data, 0, 32)));\\n __ERC20RebaseMiddleware_init(\\n id_,\\n gETH_,\\n string(BytesLib.slice(data, 32, nameLen)),\\n string(BytesLib.slice(data, 32 + nameLen, data.length - (32 + nameLen)))\\n );\\n }\\n\\n /**\\n * @dev Sets the values for {name} and {symbol} based on provided data:\\n * * First 32 bytes indicate the lenght of the name, one therefore can find out\\n * * which byte the name ends and symbol starts.\\n */\\n function __ERC20RebaseMiddleware_init(\\n uint256 id_,\\n address gETH_,\\n string memory name_,\\n string memory symbol_\\n ) internal onlyInitializing {\\n __ERC20RebaseMiddleware_init_unchained(id_, gETH_, name_, symbol_);\\n }\\n\\n function __ERC20RebaseMiddleware_init_unchained(\\n uint256 id_,\\n address gETH_,\\n string memory name_,\\n string memory symbol_\\n ) internal onlyInitializing {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n $._name = name_;\\n $._symbol = symbol_;\\n $.ERC1155 = IgETH(gETH_);\\n $.ERC1155_ID = id_;\\n }\\n\\n function name() public view virtual returns (string memory) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $._name;\\n }\\n\\n function symbol() public view virtual returns (string memory) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $._symbol;\\n }\\n\\n function ERC1155() public view virtual override returns (address) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return address($.ERC1155);\\n }\\n\\n function ERC1155_ID() public view virtual override returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $.ERC1155_ID;\\n }\\n\\n function pricePerShare() public view virtual override returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $.ERC1155.pricePerShare($.ERC1155_ID);\\n }\\n\\n function decimals() public view virtual returns (uint8) {\\n return 18;\\n }\\n\\n function totalSupply() public view virtual returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n\\n uint256 id = $.ERC1155_ID;\\n return ($.ERC1155.totalSupply(id) * $.ERC1155.pricePerShare(id)) / gETH_DENOMINATOR;\\n }\\n\\n function balanceOf(address account) public view virtual returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n\\n uint256 id = $.ERC1155_ID;\\n return ($.ERC1155.balanceOf(account, id) * $.ERC1155.pricePerShare(id)) / gETH_DENOMINATOR;\\n }\\n\\n function transfer(address to, uint256 value) public virtual returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, value);\\n return true;\\n }\\n\\n function allowance(address owner, address spender) public view virtual returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $._allowances[owner][spender];\\n }\\n\\n function approve(address spender, uint256 value) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, value);\\n return true;\\n }\\n\\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, value);\\n _transfer(from, to, value);\\n return true;\\n }\\n\\n function _transfer(address from, address to, uint256 value) internal {\\n if (from == address(0)) {\\n revert ERC20InvalidSender(address(0));\\n }\\n if (to == address(0)) {\\n revert ERC20InvalidReceiver(address(0));\\n }\\n _update(from, to, value);\\n }\\n\\n function _update(address from, address to, uint256 value) internal virtual {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n\\n uint256 fromBalance = balanceOf(from);\\n if (fromBalance < value) {\\n revert ERC20InsufficientBalance(from, fromBalance, value);\\n }\\n\\n uint256 id = $.ERC1155_ID;\\n uint256 transferAmount = (value * gETH_DENOMINATOR) / $.ERC1155.pricePerShare(id);\\n $.ERC1155.safeTransferFrom(from, to, id, transferAmount, \\\"\\\");\\n\\n emit Transfer(from, to, value);\\n }\\n\\n function _approve(address owner, address spender, uint256 value) internal {\\n _approve(owner, spender, value, true);\\n }\\n\\n function _approve(\\n address owner,\\n address spender,\\n uint256 value,\\n bool emitEvent\\n ) internal virtual {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n if (owner == address(0)) {\\n revert ERC20InvalidApprover(address(0));\\n }\\n if (spender == address(0)) {\\n revert ERC20InvalidSpender(address(0));\\n }\\n $._allowances[owner][spender] = value;\\n if (emitEvent) {\\n emit Approval(owner, spender, value);\\n }\\n }\\n\\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n if (currentAllowance < value) {\\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\\n }\\n unchecked {\\n _approve(owner, spender, currentAllowance - value, false);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc8b59b888cb81935865b18b53e59d1e479c29c702f7933d33399a662edbcfe64\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5061001961001e565b6100d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561006e5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100cd5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6111ed806100df6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80635c2f8aa01161008c57806399530b061161006657806399530b06146101c9578063a9059cbb146101d1578063dd62ed3e146101e4578063e209b646146101f757600080fd5b80635c2f8aa01461018757806370a08231146101ae57806395d89b41146101c157600080fd5b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461011557806323b872dd1461012b5780632d2554711461013e578063313ce56714610178575b600080fd5b6100dc61020c565b6040516100e99190610ddb565b60405180910390f35b610105610100366004610e45565b6102cf565b60405190151581526020016100e9565b61011d6102e9565b6040519081526020016100e9565b610105610139366004610e6f565b610407565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2503546040516001600160a01b0390911681526020016100e9565b604051601281526020016100e9565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db25045461011d565b61011d6101bc366004610eab565b61042b565b6100dc610550565b61011d61058f565b6101056101df366004610e45565b61061a565b61011d6101f2366004610ecd565b610628565b61020a610205366004610f00565b610660565b005b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db250180546060916000805160206111988339815191529161024b90610f87565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610f87565b80156102c45780601f10610299576101008083540402835291602001916102c4565b820191906000526020600020905b8154815290600101906020018083116102a757829003601f168201915b505050505091505090565b6000336102dd81858561086c565b60019150505b92915050565b600080600080516020611198833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d9190610fc1565b600384015460405163bd85b03960e01b8152600481018590526001600160a01b039091169063bd85b03990602401602060405180830381865afa1580156103c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ec9190610fc1565b6103f69190610ff0565b6104009190611007565b9250505090565b60003361041585828561087e565b6104208585856108e9565b506001949350505050565b600080600080516020611198833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa15801561049b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104bf9190610fc1565b6003840154604051627eeac760e11b81526001600160a01b038881166004830152602482018690529091169062fdd58e90604401602060405180830381865afa158015610510573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105349190610fc1565b61053e9190610ff0565b6105489190611007565b949350505050565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db250280546060916000805160206111988339815191529161024b90610f87565b600080600080516020611198833981519152600381015460048083015460405163f759cc3b60e01b8152918201529192506001600160a01b03169063f759cc3b90602401602060405180830381865afa1580156105f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106149190610fc1565b91505090565b6000336102dd8185856108e9565b6001600160a01b0391821660009081526000805160206111988339815191526020908152604080832093909416825291909152205490565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156106a65750825b905060008267ffffffffffffffff1660011480156106c35750303b155b9050811580156106d1575080155b156106ef5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561071957845460ff60401b1916600160401b1785555b600061075d88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250602091506109489050565b61076690611029565b60001c905061081a8a8a6107b48b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250602092508891506109489050565b6108158c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506107fb92508991506020905061104d565b61080688602061104d565b610810908f611060565b610948565b610a55565b50831561086157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6108798383836001610a69565b505050565b600061088a8484610628565b905060001981146108e357818110156108d457604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b6108e384848484036000610a69565b50505050565b6001600160a01b03831661091357604051634b637e8f60e11b8152600060048201526024016108cb565b6001600160a01b03821661093d5760405163ec442f0560e01b8152600060048201526024016108cb565b610879838383610b4d565b60608161095681601f61104d565b10156109955760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016108cb565b61099f828461104d565b845110156109e35760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b60448201526064016108cb565b606082158015610a025760405191506000825260208201604052610a4c565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610a3b578051835260209283019201610a23565b5050858452601f01601f1916604052505b50949350505050565b610a5d610d13565b6108e384848484610d5e565b6000805160206111988339815191526001600160a01b038516610aa25760405163e602df0560e01b8152600060048201526024016108cb565b6001600160a01b038416610acc57604051634a1406b160e11b8152600060048201526024016108cb565b6001600160a01b038086166000908152602083815260408083209388168352929052208390558115610b4657836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610b3d91815260200190565b60405180910390a35b5050505050565b6000805160206111988339815191526000610b678561042b565b905082811015610ba35760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016108cb565b600482810154600384015460405163f759cc3b60e01b815292830182905290916000916001600160a01b03169063f759cc3b90602401602060405180830381865afa158015610bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1a9190610fc1565b610c2c670de0b6b3a764000087610ff0565b610c369190611007565b6003850154604051637921219560e11b81526001600160a01b038a811660048301528981166024830152604482018690526064820184905260a06084830152600060a483015292935091169063f242432a9060c401600060405180830381600087803b158015610ca557600080fd5b505af1158015610cb9573d6000803e3d6000fd5b50505050856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051610d0291815260200190565b60405180910390a350505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d5c57604051631afcd79f60e31b815260040160405180910390fd5b565b610d66610d13565b6000805160206111988339815191527f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2501610da084826110d7565b5060028101610daf83826110d7565b506003810180546001600160a01b0319166001600160a01b039590951694909417909355505060040155565b600060208083528351808285015260005b81811015610e0857858101830151858201604001528201610dec565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e4057600080fd5b919050565b60008060408385031215610e5857600080fd5b610e6183610e29565b946020939093013593505050565b600080600060608486031215610e8457600080fd5b610e8d84610e29565b9250610e9b60208501610e29565b9150604084013590509250925092565b600060208284031215610ebd57600080fd5b610ec682610e29565b9392505050565b60008060408385031215610ee057600080fd5b610ee983610e29565b9150610ef760208401610e29565b90509250929050565b60008060008060608587031215610f1657600080fd5b84359350610f2660208601610e29565b9250604085013567ffffffffffffffff80821115610f4357600080fd5b818701915087601f830112610f5757600080fd5b813581811115610f6657600080fd5b886020828501011115610f7857600080fd5b95989497505060200194505050565b600181811c90821680610f9b57607f821691505b602082108103610fbb57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215610fd357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176102e3576102e3610fda565b60008261102457634e487b7160e01b600052601260045260246000fd5b500490565b80516020808301519190811015610fbb5760001960209190910360031b1b16919050565b808201808211156102e3576102e3610fda565b818103818111156102e3576102e3610fda565b634e487b7160e01b600052604160045260246000fd5b601f82111561087957600081815260208120601f850160051c810160208610156110b05750805b601f850160051c820191505b818110156110cf578281556001016110bc565b505050505050565b815167ffffffffffffffff8111156110f1576110f1611073565b611105816110ff8454610f87565b84611089565b602080601f83116001811461113a57600084156111225750858301515b600019600386901b1c1916600185901b1785556110cf565b600085815260208120601f198616915b828110156111695788860151825594840194600190910190840161114a565b50858210156111875787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2500a26469706673582212208bedefa35dcfe9dc25806aa513e694b665b63fc148827fcce68a212b0dd16e5d64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80635c2f8aa01161008c57806399530b061161006657806399530b06146101c9578063a9059cbb146101d1578063dd62ed3e146101e4578063e209b646146101f757600080fd5b80635c2f8aa01461018757806370a08231146101ae57806395d89b41146101c157600080fd5b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461011557806323b872dd1461012b5780632d2554711461013e578063313ce56714610178575b600080fd5b6100dc61020c565b6040516100e99190610ddb565b60405180910390f35b610105610100366004610e45565b6102cf565b60405190151581526020016100e9565b61011d6102e9565b6040519081526020016100e9565b610105610139366004610e6f565b610407565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2503546040516001600160a01b0390911681526020016100e9565b604051601281526020016100e9565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db25045461011d565b61011d6101bc366004610eab565b61042b565b6100dc610550565b61011d61058f565b6101056101df366004610e45565b61061a565b61011d6101f2366004610ecd565b610628565b61020a610205366004610f00565b610660565b005b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db250180546060916000805160206111988339815191529161024b90610f87565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610f87565b80156102c45780601f10610299576101008083540402835291602001916102c4565b820191906000526020600020905b8154815290600101906020018083116102a757829003601f168201915b505050505091505090565b6000336102dd81858561086c565b60019150505b92915050565b600080600080516020611198833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d9190610fc1565b600384015460405163bd85b03960e01b8152600481018590526001600160a01b039091169063bd85b03990602401602060405180830381865afa1580156103c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ec9190610fc1565b6103f69190610ff0565b6104009190611007565b9250505090565b60003361041585828561087e565b6104208585856108e9565b506001949350505050565b600080600080516020611198833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa15801561049b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104bf9190610fc1565b6003840154604051627eeac760e11b81526001600160a01b038881166004830152602482018690529091169062fdd58e90604401602060405180830381865afa158015610510573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105349190610fc1565b61053e9190610ff0565b6105489190611007565b949350505050565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db250280546060916000805160206111988339815191529161024b90610f87565b600080600080516020611198833981519152600381015460048083015460405163f759cc3b60e01b8152918201529192506001600160a01b03169063f759cc3b90602401602060405180830381865afa1580156105f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106149190610fc1565b91505090565b6000336102dd8185856108e9565b6001600160a01b0391821660009081526000805160206111988339815191526020908152604080832093909416825291909152205490565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156106a65750825b905060008267ffffffffffffffff1660011480156106c35750303b155b9050811580156106d1575080155b156106ef5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561071957845460ff60401b1916600160401b1785555b600061075d88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250602091506109489050565b61076690611029565b60001c905061081a8a8a6107b48b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250602092508891506109489050565b6108158c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506107fb92508991506020905061104d565b61080688602061104d565b610810908f611060565b610948565b610a55565b50831561086157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6108798383836001610a69565b505050565b600061088a8484610628565b905060001981146108e357818110156108d457604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b6108e384848484036000610a69565b50505050565b6001600160a01b03831661091357604051634b637e8f60e11b8152600060048201526024016108cb565b6001600160a01b03821661093d5760405163ec442f0560e01b8152600060048201526024016108cb565b610879838383610b4d565b60608161095681601f61104d565b10156109955760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016108cb565b61099f828461104d565b845110156109e35760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b60448201526064016108cb565b606082158015610a025760405191506000825260208201604052610a4c565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610a3b578051835260209283019201610a23565b5050858452601f01601f1916604052505b50949350505050565b610a5d610d13565b6108e384848484610d5e565b6000805160206111988339815191526001600160a01b038516610aa25760405163e602df0560e01b8152600060048201526024016108cb565b6001600160a01b038416610acc57604051634a1406b160e11b8152600060048201526024016108cb565b6001600160a01b038086166000908152602083815260408083209388168352929052208390558115610b4657836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610b3d91815260200190565b60405180910390a35b5050505050565b6000805160206111988339815191526000610b678561042b565b905082811015610ba35760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016108cb565b600482810154600384015460405163f759cc3b60e01b815292830182905290916000916001600160a01b03169063f759cc3b90602401602060405180830381865afa158015610bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1a9190610fc1565b610c2c670de0b6b3a764000087610ff0565b610c369190611007565b6003850154604051637921219560e11b81526001600160a01b038a811660048301528981166024830152604482018690526064820184905260a06084830152600060a483015292935091169063f242432a9060c401600060405180830381600087803b158015610ca557600080fd5b505af1158015610cb9573d6000803e3d6000fd5b50505050856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051610d0291815260200190565b60405180910390a350505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d5c57604051631afcd79f60e31b815260040160405180910390fd5b565b610d66610d13565b6000805160206111988339815191527f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2501610da084826110d7565b5060028101610daf83826110d7565b506003810180546001600160a01b0319166001600160a01b039590951694909417909355505060040155565b600060208083528351808285015260005b81811015610e0857858101830151858201604001528201610dec565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e4057600080fd5b919050565b60008060408385031215610e5857600080fd5b610e6183610e29565b946020939093013593505050565b600080600060608486031215610e8457600080fd5b610e8d84610e29565b9250610e9b60208501610e29565b9150604084013590509250925092565b600060208284031215610ebd57600080fd5b610ec682610e29565b9392505050565b60008060408385031215610ee057600080fd5b610ee983610e29565b9150610ef760208401610e29565b90509250929050565b60008060008060608587031215610f1657600080fd5b84359350610f2660208601610e29565b9250604085013567ffffffffffffffff80821115610f4357600080fd5b818701915087601f830112610f5757600080fd5b813581811115610f6657600080fd5b886020828501011115610f7857600080fd5b95989497505060200194505050565b600181811c90821680610f9b57607f821691505b602082108103610fbb57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215610fd357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176102e3576102e3610fda565b60008261102457634e487b7160e01b600052601260045260246000fd5b500490565b80516020808301519190811015610fbb5760001960209190910360031b1b16919050565b808201808211156102e3576102e3610fda565b818103818111156102e3576102e3610fda565b634e487b7160e01b600052604160045260246000fd5b601f82111561087957600081815260208120601f850160051c810160208610156110b05750805b601f850160051c820191505b818110156110cf578281556001016110bc565b505050505050565b815167ffffffffffffffff8111156110f1576110f1611073565b611105816110ff8454610f87565b84611089565b602080601f83116001811461113a57600084156111225750858301515b600019600386901b1c1916600185901b1785556110cf565b600085815260208120601f198616915b828110156111695788860151825594840194600190910190840161114a565b50858210156111875787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2500a26469706673582212208bedefa35dcfe9dc25806aa513e694b665b63fc148827fcce68a212b0dd16e5d64736f6c63430008140033", + "solcInputHash": "983f26216548ae9c38be8d3a1167f02e", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSpender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ERC1155\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC1155_ID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id_\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gETH_\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pricePerShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract should only be used for user interaction when ERC1155 is not an option.As a known bug, not all Transfer events are logged here. Please listen the underlying ERC1155 for the correct data.differences between ERC20RebaseMiddleware and ERC20Middleware can be seen observed at: -> totalSupply, balanceOf, _update. diffchecker: https://www.diffchecker.com/VQPmW62g/decimals is 18 onlyif erc1155.denominator = 1e18\",\"errors\":{\"ERC20InsufficientAllowance(address,uint256,uint256)\":[{\"details\":\"Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\",\"params\":{\"allowance\":\"Amount of tokens a `spender` is allowed to operate with.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"details\":\"Indicates an error related to the current `balance` of a `sender`. Used in transfers.\",\"params\":{\"balance\":\"Current balance for the interacting account.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC20InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC20InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidSpender(address)\":[{\"details\":\"Indicates a failure with the `spender` to be approved. Used in approvals.\",\"params\":{\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the value of tokens owned by `account`.\"},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\"},\"decimals()\":{\"details\":\"Returns the decimals places of the token.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token.\"},\"totalSupply()\":{\"details\":\"Returns the value of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Same as ERC20Middleware, but balances represent underlying balances, instead of ERC1155 balances. which means it represents the staked ether amount, instead of gETH amount.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/middlewares/ERC20RebaseMiddleware.sol\":\"ERC20RebaseMiddleware\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Storage of the initializable contract.\\n *\\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\\n * when using with upgradeable contracts.\\n *\\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\\n */\\n struct InitializableStorage {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n uint64 _initialized;\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool _initializing;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Initializable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\\n\\n /**\\n * @dev The contract is already initialized.\\n */\\n error InvalidInitialization();\\n\\n /**\\n * @dev The contract is not initializing.\\n */\\n error NotInitializing();\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint64 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\\n * production.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n // Cache values to avoid duplicated sloads\\n bool isTopLevelCall = !$._initializing;\\n uint64 initialized = $._initialized;\\n\\n // Allowed calls:\\n // - initialSetup: the contract is not in the initializing state and no previous version was\\n // initialized\\n // - construction: the contract is initialized at version 1 (no reininitialization) and the\\n // current contract is just being deployed\\n bool initialSetup = initialized == 0 && isTopLevelCall;\\n bool construction = initialized == 1 && address(this).code.length == 0;\\n\\n if (!initialSetup && !construction) {\\n revert InvalidInitialization();\\n }\\n $._initialized = 1;\\n if (isTopLevelCall) {\\n $._initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n $._initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint64 version) {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing || $._initialized >= version) {\\n revert InvalidInitialization();\\n }\\n $._initialized = version;\\n $._initializing = true;\\n _;\\n $._initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n _checkInitializing();\\n _;\\n }\\n\\n /**\\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\\n */\\n function _checkInitializing() internal view virtual {\\n if (!_isInitializing()) {\\n revert NotInitializing();\\n }\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing) {\\n revert InvalidInitialization();\\n }\\n if ($._initialized != type(uint64).max) {\\n $._initialized = type(uint64).max;\\n emit Initialized(type(uint64).max);\\n }\\n }\\n\\n /**\\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n */\\n function _getInitializedVersion() internal view returns (uint64) {\\n return _getInitializableStorage()._initialized;\\n }\\n\\n /**\\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _getInitializableStorage()._initializing;\\n }\\n\\n /**\\n * @dev Returns a pointer to the storage namespace.\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\\n assembly {\\n $.slot := INITIALIZABLE_STORAGE\\n }\\n }\\n}\\n\",\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x72d47aebad24c59f6e78d0c3e827440173419a333fd910a37fa1e532c98f7e4c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard ERC20 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\\n */\\ninterface IERC20Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC20InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC20InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC20InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC20InvalidSpender(address spender);\\n}\\n\\n/**\\n * @dev Standard ERC721 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\\n */\\ninterface IERC721Errors {\\n /**\\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\\n * Used in balance queries.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721InvalidOwner(address owner);\\n\\n /**\\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721NonexistentToken(uint256 tokenId);\\n\\n /**\\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param tokenId Identifier number of a token.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC721InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC721InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC721InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC721InvalidOperator(address operator);\\n}\\n\\n/**\\n * @dev Standard ERC1155 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\\n */\\ninterface IERC1155Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC1155InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC1155InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC1155MissingApprovalForAll(address operator, address owner);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC1155InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC1155InvalidOperator(address operator);\\n\\n /**\\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\\n * Used in batch transfers.\\n * @param idsLength Length of the array of token identifiers\\n * @param valuesLength Length of the array of token amounts\\n */\\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\\n}\\n\",\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\\n */\\ninterface IERC1155 is IERC165 {\\n /**\\n * @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.\\n */\\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n /**\\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\\n * transfers.\\n */\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] values\\n );\\n\\n /**\\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\\n * `approved`.\\n */\\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\\n\\n /**\\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\\n *\\n * If an {URI} event was emitted for `id`, the standard\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\\n * returned by {IERC1155MetadataURI-uri}.\\n */\\n event URI(string value, uint256 indexed id);\\n\\n /**\\n * @dev Returns the value of tokens of token type `id` owned by `account`.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function balanceOf(address account, uint256 id) external view returns (uint256);\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\\n *\\n * Requirements:\\n *\\n * - `accounts` and `ids` must have the same length.\\n */\\n function balanceOfBatch(\\n address[] calldata accounts,\\n uint256[] calldata ids\\n ) external view returns (uint256[] memory);\\n\\n /**\\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\\n *\\n * Emits an {ApprovalForAll} event.\\n *\\n * Requirements:\\n *\\n * - `operator` cannot be the caller.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\\n *\\n * See {setApprovalForAll}.\\n */\\n function isApprovedForAll(address account, address operator) external view returns (bool);\\n\\n /**\\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`.\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155Received} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\\n *\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `values` must have the same length.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external;\\n}\\n\",\"keccak256\":\"0xe64b3445a3f638890af7ad92464cd18f1f202a2f5a7ed42dabf74317bae43303\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/extensions/IERC1155MetadataURI.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC1155} from \\\"../IERC1155.sol\\\";\\n\\n/**\\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\\n */\\ninterface IERC1155MetadataURI is IERC1155 {\\n /**\\n * @dev Returns the URI for token type `id`.\\n *\\n * If the `\\\\{id\\\\}` substring is present in the URI, it must be replaced by\\n * clients with the actual token type ID.\\n */\\n function uri(uint256 id) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xe92b5e199b963d108ad6e06feeede151ba23849e0d064956535489ff967ffe68\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"contracts/globals/macros.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n// no floats in solidity. If needed, PERCENTAGE_DENOMINATOR always represents \\\"1\\\" (100%)\\nuint256 constant PERCENTAGE_DENOMINATOR = 1e10;\\n\\nuint256 constant gETH_DENOMINATOR = 1e18;\\n\",\"keccak256\":\"0xdcbe1faa8712a653a87f4e185afb598388c2bbe62a750989df57afeac2848168\",\"license\":\"BUSL-1.1\"},\"contracts/helpers/BytesLib.sol\":{\"content\":\"// SPDX-License-Identifier: Unlicense\\n/*\\n * @title Solidity Bytes Arrays Utils\\n * @author Gon\\u00e7alo S\\u00e1 \\n *\\n * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.\\n * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.\\n */\\npragma solidity =0.8.20;\\n\\nlibrary BytesLib {\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n ) internal pure returns (bytes memory) {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(\\n 0x40,\\n and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n )\\n )\\n }\\n\\n return tempBytes;\\n }\\n\\n function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\\n assembly {\\n // Read the first 32 bytes of _preBytes storage, which is the length\\n // of the array. (We don't need to use the offset into the slot\\n // because arrays use the entire slot.)\\n let fslot := sload(_preBytes.slot)\\n // Arrays of 31 bytes or less have an even value in their slot,\\n // while longer arrays have an odd value. The actual length is\\n // the slot divided by two for odd values, and the lowest order\\n // byte divided by two for even values.\\n // If the slot is even, bitwise and the slot with 255 and divide by\\n // two to get the length. If the slot is odd, bitwise and the slot\\n // with -1 and divide by two.\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n let newlength := add(slength, mlength)\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n switch add(lt(slength, 32), lt(newlength, 32))\\n case 2 {\\n // Since the new array still fits in the slot, we just need to\\n // update the contents of the slot.\\n // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\\n sstore(\\n _preBytes.slot,\\n // all the modifications to the slot are inside this\\n // next block\\n add(\\n // we can just add to the slot contents because the\\n // bytes we want to change are the LSBs\\n fslot,\\n add(\\n mul(\\n div(\\n // load the bytes from memory\\n mload(add(_postBytes, 0x20)),\\n // zero all bytes to the right\\n exp(0x100, sub(32, mlength))\\n ),\\n // and now shift left the number of bytes to\\n // leave space for the length in the slot\\n exp(0x100, sub(32, newlength))\\n ),\\n // increase length by the double of the memory\\n // bytes length\\n mul(mlength, 2)\\n )\\n )\\n )\\n }\\n case 1 {\\n // The stored value fits in the slot, but the combined value\\n // will exceed it.\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // The contents of the _postBytes array start 32 bytes into\\n // the structure. Our first read should obtain the `submod`\\n // bytes that can fit into the unused space in the last word\\n // of the stored array. To get this, we read 32 bytes starting\\n // from `submod`, so the data we read overlaps with the array\\n // contents by `submod` bytes. Masking the lowest-order\\n // `submod` bytes allows us to add that value directly to the\\n // stored value.\\n\\n let submod := sub(32, slength)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(\\n sc,\\n add(\\n and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00),\\n and(mload(mc), mask)\\n )\\n )\\n\\n for {\\n mc := add(mc, 0x20)\\n sc := add(sc, 1)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n default {\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n // Start copying to the last used word of the stored array.\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // Copy over the first `submod` bytes of the new data as in\\n // case 1 above.\\n let slengthmod := mod(slength, 32)\\n let mlengthmod := mod(mlength, 32)\\n let submod := sub(32, slengthmod)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(sc, add(sload(sc), and(mload(mc), mask)))\\n\\n for {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n }\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_bytes.length >= _start + 1, \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {\\n require(_bytes.length >= _start + 2, \\\"toUint16_outOfBounds\\\");\\n uint16 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x2), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {\\n require(_bytes.length >= _start + 4, \\\"toUint32_outOfBounds\\\");\\n uint32 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x4), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {\\n require(_bytes.length >= _start + 8, \\\"toUint64_outOfBounds\\\");\\n uint64 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x8), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {\\n require(_bytes.length >= _start + 12, \\\"toUint96_outOfBounds\\\");\\n uint96 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0xc), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {\\n require(_bytes.length >= _start + 16, \\\"toUint128_outOfBounds\\\");\\n uint128 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x10), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {\\n require(_bytes.length >= _start + 32, \\\"toUint256_outOfBounds\\\");\\n uint256 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {\\n require(_bytes.length >= _start + 32, \\\"toBytes32_outOfBounds\\\");\\n bytes32 tempBytes32;\\n\\n assembly {\\n tempBytes32 := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempBytes32;\\n }\\n\\n function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\\n bool success = true;\\n\\n assembly {\\n let length := mload(_preBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(length, mload(_postBytes))\\n case 1 {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n let mc := add(_preBytes, 0x20)\\n let end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n } eq(add(lt(mc, end), cb), 2) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // if any of these checks fails then arrays are not equal\\n if iszero(eq(mload(mc), mload(cc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function equalStorage(\\n bytes storage _preBytes,\\n bytes memory _postBytes\\n ) internal view returns (bool) {\\n bool success = true;\\n\\n assembly {\\n // we know _preBytes_offset is 0\\n let fslot := sload(_preBytes.slot)\\n // Decode the length of the stored array like in concatStorage().\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(slength, mlength)\\n case 1 {\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n if iszero(iszero(slength)) {\\n switch lt(slength, 32)\\n case 1 {\\n // blank the last byte which is the length\\n fslot := mul(div(fslot, 0x100), 0x100)\\n\\n if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\\n // unsuccess:\\n success := 0\\n }\\n }\\n default {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := keccak256(0x0, 0x20)\\n\\n let mc := add(_postBytes, 0x20)\\n let end := add(mc, mlength)\\n\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n for {\\n\\n } eq(add(lt(mc, end), cb), 2) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n if iszero(eq(sload(sc), mload(mc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n}\\n\",\"keccak256\":\"0x4ee3f6ef85baa41794fc1519522f7c135becd0e267980eadc68dd643e52b59c7\",\"license\":\"Unlicense\"},\"contracts/interfaces/IgETH.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IERC1155PausableBurnableSupply} from \\\"./helpers/IERC1155PausableBurnableSupply.sol\\\";\\n\\ninterface IgETH is IERC1155PausableBurnableSupply {\\n function denominator() external view returns (uint256);\\n\\n function isMiddleware(address middleware, uint256 id) external view returns (bool);\\n\\n function setMiddleware(address middleware, uint256 id, bool isSet) external;\\n\\n function isAvoider(address account, uint256 id) external view returns (bool);\\n\\n function avoidMiddlewares(uint256 id, bool isAvoid) external;\\n\\n function pricePerShare(uint256 id) external view returns (uint256);\\n\\n function priceUpdateTimestamp(uint256 id) external view returns (uint256);\\n\\n function setPricePerShare(uint256 price, uint256 id) external;\\n\\n function transferUriSetterRole(address newUriSetter) external;\\n\\n function transferPauserRole(address newPauser) external;\\n\\n function transferMinterRole(address newMinter) external;\\n\\n function transferOracleRole(address newOracle) external;\\n\\n function transferMiddlewareManagerRole(address newMiddlewareManager) external;\\n}\\n\",\"keccak256\":\"0xa093b769e8ba42091d3db8a9e4ddc1be066f4aa92f61ee552983c22a0e9f29d8\",\"license\":\"MIT\"},\"contracts/interfaces/helpers/IERC1155PausableBurnableSupply.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/// @dev IERC1155 inherits IERC165\\nimport {IERC1155} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Errors} from \\\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\\\";\\n\\ninterface IERC1155Burnable is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function burn(address account, uint256 id, uint256 value) external;\\n\\n function burnBatch(address account, uint256[] memory ids, uint256[] memory values) external;\\n}\\n\\ninterface IERC1155Supply is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function totalSupply(uint256 id) external view returns (uint256);\\n\\n function exists(uint256 id) external view returns (bool);\\n}\\n\\ninterface IERC1155PausableBurnableSupply is IERC1155Burnable, IERC1155Supply {\\n function setURI(string memory newuri) external;\\n\\n function pause() external;\\n\\n function unpause() external;\\n\\n function mint(address account, uint256 id, uint256 amount, bytes memory data) external;\\n\\n function mintBatch(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) external;\\n}\\n\",\"keccak256\":\"0x8b0a02fdbc8d54c815d68e122f6869348217b5efd853c8b833c59d2053998ef0\",\"license\":\"MIT\"},\"contracts/interfaces/middlewares/IgETHMiddleware.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\ninterface IgETHMiddleware {\\n function initialize(uint256 id_, address erc1155_, bytes memory data) external;\\n\\n function ERC1155() external view returns (address);\\n\\n function ERC1155_ID() external view returns (uint256);\\n\\n function pricePerShare() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x5b94e7cf38487d607c720d311578fa0b777a75050113b3533b8e4e22fe6ab61c\",\"license\":\"MIT\"},\"contracts/middlewares/ERC20RebaseMiddleware.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n// external - interfaces\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport {IERC20Metadata} from \\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\";\\nimport {IERC20Errors} from \\\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\\\";\\n// external - contracts\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {ContextUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\\\";\\n// internal - globals\\nimport {gETH_DENOMINATOR} from \\\"../globals/macros.sol\\\";\\n// internal - interfaces\\nimport {IgETH} from \\\"../interfaces/IgETH.sol\\\";\\nimport {IgETHMiddleware} from \\\"../interfaces/middlewares/IgETHMiddleware.sol\\\";\\n// internal - libraries\\nimport {BytesLib} from \\\"../helpers/BytesLib.sol\\\";\\n\\n/**\\n * @notice Same as ERC20Middleware, but balances represent underlying balances, instead of ERC1155 balances.\\n * which means it represents the staked ether amount, instead of gETH amount.\\n *\\n * @dev This contract should only be used for user interaction when ERC1155 is not an option.\\n * @dev As a known bug, not all Transfer events are logged here. Please listen the underlying ERC1155 for the correct data.\\n *\\n * @dev differences between ERC20RebaseMiddleware and ERC20Middleware can be seen observed at:\\n * -> totalSupply, balanceOf, _update.\\n *\\n * diffchecker: https://www.diffchecker.com/VQPmW62g/\\n *\\n * @dev decimals is 18 onlyif erc1155.denominator = 1e18\\n */\\ncontract ERC20RebaseMiddleware is\\n Initializable,\\n ContextUpgradeable,\\n IgETHMiddleware,\\n IERC20,\\n IERC20Metadata,\\n IERC20Errors\\n{\\n /// @custom:storage-location erc7201:geode.storage.ERC20RebaseMiddleware\\n struct ERC20RebaseMiddlewareStorage {\\n // mapping(address account => uint256) _balances; -> use ERC1155\\n mapping(address account => mapping(address spender => uint256)) _allowances;\\n // uint256 _totalSupply; -> use ERC1155\\n string _name;\\n string _symbol;\\n IgETH ERC1155;\\n uint256 ERC1155_ID;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"geode.storage.ERC20RebaseMiddleware\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant ERC20RebaseMiddlewareStorageLocation =\\n 0x033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2500;\\n\\n function _getERC20RebaseMiddlewareStorage()\\n private\\n pure\\n returns (ERC20RebaseMiddlewareStorage storage $)\\n {\\n assembly {\\n $.slot := ERC20RebaseMiddlewareStorageLocation\\n }\\n }\\n\\n /// @custom:oz-upgrades-unsafe-allow constructor\\n constructor() {\\n _disableInitializers();\\n }\\n\\n function initialize(\\n uint256 id_,\\n address gETH_,\\n bytes calldata data\\n ) public virtual override initializer {\\n uint256 nameLen = uint256(bytes32(BytesLib.slice(data, 0, 32)));\\n __ERC20RebaseMiddleware_init(\\n id_,\\n gETH_,\\n string(BytesLib.slice(data, 32, nameLen)),\\n string(BytesLib.slice(data, 32 + nameLen, data.length - (32 + nameLen)))\\n );\\n }\\n\\n /**\\n * @dev Sets the values for {name} and {symbol} based on provided data:\\n * * First 32 bytes indicate the lenght of the name, one therefore can find out\\n * * which byte the name ends and symbol starts.\\n */\\n function __ERC20RebaseMiddleware_init(\\n uint256 id_,\\n address gETH_,\\n string memory name_,\\n string memory symbol_\\n ) internal onlyInitializing {\\n __ERC20RebaseMiddleware_init_unchained(id_, gETH_, name_, symbol_);\\n }\\n\\n function __ERC20RebaseMiddleware_init_unchained(\\n uint256 id_,\\n address gETH_,\\n string memory name_,\\n string memory symbol_\\n ) internal onlyInitializing {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n $._name = name_;\\n $._symbol = symbol_;\\n $.ERC1155 = IgETH(gETH_);\\n $.ERC1155_ID = id_;\\n }\\n\\n function name() public view virtual returns (string memory) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $._name;\\n }\\n\\n function symbol() public view virtual returns (string memory) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $._symbol;\\n }\\n\\n function ERC1155() public view virtual override returns (address) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return address($.ERC1155);\\n }\\n\\n function ERC1155_ID() public view virtual override returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $.ERC1155_ID;\\n }\\n\\n function pricePerShare() public view virtual override returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $.ERC1155.pricePerShare($.ERC1155_ID);\\n }\\n\\n function decimals() public view virtual returns (uint8) {\\n return 18;\\n }\\n\\n function totalSupply() public view virtual returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n\\n uint256 id = $.ERC1155_ID;\\n return ($.ERC1155.totalSupply(id) * $.ERC1155.pricePerShare(id)) / gETH_DENOMINATOR;\\n }\\n\\n function balanceOf(address account) public view virtual returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n\\n uint256 id = $.ERC1155_ID;\\n return ($.ERC1155.balanceOf(account, id) * $.ERC1155.pricePerShare(id)) / gETH_DENOMINATOR;\\n }\\n\\n function transfer(address to, uint256 value) public virtual returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, value);\\n return true;\\n }\\n\\n function allowance(address owner, address spender) public view virtual returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $._allowances[owner][spender];\\n }\\n\\n function approve(address spender, uint256 value) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, value);\\n return true;\\n }\\n\\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, value);\\n _transfer(from, to, value);\\n return true;\\n }\\n\\n function _transfer(address from, address to, uint256 value) internal {\\n if (from == address(0)) {\\n revert ERC20InvalidSender(address(0));\\n }\\n if (to == address(0)) {\\n revert ERC20InvalidReceiver(address(0));\\n }\\n _update(from, to, value);\\n }\\n\\n function _update(address from, address to, uint256 value) internal virtual {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n\\n uint256 fromBalance = balanceOf(from);\\n if (fromBalance < value) {\\n revert ERC20InsufficientBalance(from, fromBalance, value);\\n }\\n\\n uint256 id = $.ERC1155_ID;\\n uint256 transferAmount = (value * gETH_DENOMINATOR) / $.ERC1155.pricePerShare(id);\\n $.ERC1155.safeTransferFrom(from, to, id, transferAmount, \\\"\\\");\\n\\n emit Transfer(from, to, value);\\n }\\n\\n function _approve(address owner, address spender, uint256 value) internal {\\n _approve(owner, spender, value, true);\\n }\\n\\n function _approve(\\n address owner,\\n address spender,\\n uint256 value,\\n bool emitEvent\\n ) internal virtual {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n if (owner == address(0)) {\\n revert ERC20InvalidApprover(address(0));\\n }\\n if (spender == address(0)) {\\n revert ERC20InvalidSpender(address(0));\\n }\\n $._allowances[owner][spender] = value;\\n if (emitEvent) {\\n emit Approval(owner, spender, value);\\n }\\n }\\n\\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n if (currentAllowance < value) {\\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\\n }\\n unchecked {\\n _approve(owner, spender, currentAllowance - value, false);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc8b59b888cb81935865b18b53e59d1e479c29c702f7933d33399a662edbcfe64\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5061001961001e565b6100d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561006e5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100cd5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6111ed806100df6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80635c2f8aa01161008c57806399530b061161006657806399530b06146101c9578063a9059cbb146101d1578063dd62ed3e146101e4578063e209b646146101f757600080fd5b80635c2f8aa01461018757806370a08231146101ae57806395d89b41146101c157600080fd5b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461011557806323b872dd1461012b5780632d2554711461013e578063313ce56714610178575b600080fd5b6100dc61020c565b6040516100e99190610ddb565b60405180910390f35b610105610100366004610e45565b6102cf565b60405190151581526020016100e9565b61011d6102e9565b6040519081526020016100e9565b610105610139366004610e6f565b610407565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2503546040516001600160a01b0390911681526020016100e9565b604051601281526020016100e9565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db25045461011d565b61011d6101bc366004610eab565b61042b565b6100dc610550565b61011d61058f565b6101056101df366004610e45565b61061a565b61011d6101f2366004610ecd565b610628565b61020a610205366004610f00565b610660565b005b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db250180546060916000805160206111988339815191529161024b90610f87565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610f87565b80156102c45780601f10610299576101008083540402835291602001916102c4565b820191906000526020600020905b8154815290600101906020018083116102a757829003601f168201915b505050505091505090565b6000336102dd81858561086c565b60019150505b92915050565b600080600080516020611198833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d9190610fc1565b600384015460405163bd85b03960e01b8152600481018590526001600160a01b039091169063bd85b03990602401602060405180830381865afa1580156103c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ec9190610fc1565b6103f69190610ff0565b6104009190611007565b9250505090565b60003361041585828561087e565b6104208585856108e9565b506001949350505050565b600080600080516020611198833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa15801561049b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104bf9190610fc1565b6003840154604051627eeac760e11b81526001600160a01b038881166004830152602482018690529091169062fdd58e90604401602060405180830381865afa158015610510573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105349190610fc1565b61053e9190610ff0565b6105489190611007565b949350505050565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db250280546060916000805160206111988339815191529161024b90610f87565b600080600080516020611198833981519152600381015460048083015460405163f759cc3b60e01b8152918201529192506001600160a01b03169063f759cc3b90602401602060405180830381865afa1580156105f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106149190610fc1565b91505090565b6000336102dd8185856108e9565b6001600160a01b0391821660009081526000805160206111988339815191526020908152604080832093909416825291909152205490565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156106a65750825b905060008267ffffffffffffffff1660011480156106c35750303b155b9050811580156106d1575080155b156106ef5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561071957845460ff60401b1916600160401b1785555b600061075d88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250602091506109489050565b61076690611029565b60001c905061081a8a8a6107b48b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250602092508891506109489050565b6108158c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506107fb92508991506020905061104d565b61080688602061104d565b610810908f611060565b610948565b610a55565b50831561086157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6108798383836001610a69565b505050565b600061088a8484610628565b905060001981146108e357818110156108d457604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b6108e384848484036000610a69565b50505050565b6001600160a01b03831661091357604051634b637e8f60e11b8152600060048201526024016108cb565b6001600160a01b03821661093d5760405163ec442f0560e01b8152600060048201526024016108cb565b610879838383610b4d565b60608161095681601f61104d565b10156109955760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016108cb565b61099f828461104d565b845110156109e35760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b60448201526064016108cb565b606082158015610a025760405191506000825260208201604052610a4c565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610a3b578051835260209283019201610a23565b5050858452601f01601f1916604052505b50949350505050565b610a5d610d13565b6108e384848484610d5e565b6000805160206111988339815191526001600160a01b038516610aa25760405163e602df0560e01b8152600060048201526024016108cb565b6001600160a01b038416610acc57604051634a1406b160e11b8152600060048201526024016108cb565b6001600160a01b038086166000908152602083815260408083209388168352929052208390558115610b4657836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610b3d91815260200190565b60405180910390a35b5050505050565b6000805160206111988339815191526000610b678561042b565b905082811015610ba35760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016108cb565b600482810154600384015460405163f759cc3b60e01b815292830182905290916000916001600160a01b03169063f759cc3b90602401602060405180830381865afa158015610bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1a9190610fc1565b610c2c670de0b6b3a764000087610ff0565b610c369190611007565b6003850154604051637921219560e11b81526001600160a01b038a811660048301528981166024830152604482018690526064820184905260a06084830152600060a483015292935091169063f242432a9060c401600060405180830381600087803b158015610ca557600080fd5b505af1158015610cb9573d6000803e3d6000fd5b50505050856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051610d0291815260200190565b60405180910390a350505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d5c57604051631afcd79f60e31b815260040160405180910390fd5b565b610d66610d13565b6000805160206111988339815191527f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2501610da084826110d7565b5060028101610daf83826110d7565b506003810180546001600160a01b0319166001600160a01b039590951694909417909355505060040155565b600060208083528351808285015260005b81811015610e0857858101830151858201604001528201610dec565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e4057600080fd5b919050565b60008060408385031215610e5857600080fd5b610e6183610e29565b946020939093013593505050565b600080600060608486031215610e8457600080fd5b610e8d84610e29565b9250610e9b60208501610e29565b9150604084013590509250925092565b600060208284031215610ebd57600080fd5b610ec682610e29565b9392505050565b60008060408385031215610ee057600080fd5b610ee983610e29565b9150610ef760208401610e29565b90509250929050565b60008060008060608587031215610f1657600080fd5b84359350610f2660208601610e29565b9250604085013567ffffffffffffffff80821115610f4357600080fd5b818701915087601f830112610f5757600080fd5b813581811115610f6657600080fd5b886020828501011115610f7857600080fd5b95989497505060200194505050565b600181811c90821680610f9b57607f821691505b602082108103610fbb57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215610fd357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176102e3576102e3610fda565b60008261102457634e487b7160e01b600052601260045260246000fd5b500490565b80516020808301519190811015610fbb5760001960209190910360031b1b16919050565b808201808211156102e3576102e3610fda565b818103818111156102e3576102e3610fda565b634e487b7160e01b600052604160045260246000fd5b601f82111561087957600081815260208120601f850160051c810160208610156110b05750805b601f850160051c820191505b818110156110cf578281556001016110bc565b505050505050565b815167ffffffffffffffff8111156110f1576110f1611073565b611105816110ff8454610f87565b84611089565b602080601f83116001811461113a57600084156111225750858301515b600019600386901b1c1916600185901b1785556110cf565b600085815260208120601f198616915b828110156111695788860151825594840194600190910190840161114a565b50858210156111875787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2500a264697066735822122080f5f7b8b1b077600057a7118b522addc86a695fc8bb42d36c8bdb7a98dfbffd64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80635c2f8aa01161008c57806399530b061161006657806399530b06146101c9578063a9059cbb146101d1578063dd62ed3e146101e4578063e209b646146101f757600080fd5b80635c2f8aa01461018757806370a08231146101ae57806395d89b41146101c157600080fd5b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461011557806323b872dd1461012b5780632d2554711461013e578063313ce56714610178575b600080fd5b6100dc61020c565b6040516100e99190610ddb565b60405180910390f35b610105610100366004610e45565b6102cf565b60405190151581526020016100e9565b61011d6102e9565b6040519081526020016100e9565b610105610139366004610e6f565b610407565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2503546040516001600160a01b0390911681526020016100e9565b604051601281526020016100e9565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db25045461011d565b61011d6101bc366004610eab565b61042b565b6100dc610550565b61011d61058f565b6101056101df366004610e45565b61061a565b61011d6101f2366004610ecd565b610628565b61020a610205366004610f00565b610660565b005b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db250180546060916000805160206111988339815191529161024b90610f87565b80601f016020809104026020016040519081016040528092919081815260200182805461027790610f87565b80156102c45780601f10610299576101008083540402835291602001916102c4565b820191906000526020600020905b8154815290600101906020018083116102a757829003601f168201915b505050505091505090565b6000336102dd81858561086c565b60019150505b92915050565b600080600080516020611198833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d9190610fc1565b600384015460405163bd85b03960e01b8152600481018590526001600160a01b039091169063bd85b03990602401602060405180830381865afa1580156103c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ec9190610fc1565b6103f69190610ff0565b6104009190611007565b9250505090565b60003361041585828561087e565b6104208585856108e9565b506001949350505050565b600080600080516020611198833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa15801561049b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104bf9190610fc1565b6003840154604051627eeac760e11b81526001600160a01b038881166004830152602482018690529091169062fdd58e90604401602060405180830381865afa158015610510573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105349190610fc1565b61053e9190610ff0565b6105489190611007565b949350505050565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db250280546060916000805160206111988339815191529161024b90610f87565b600080600080516020611198833981519152600381015460048083015460405163f759cc3b60e01b8152918201529192506001600160a01b03169063f759cc3b90602401602060405180830381865afa1580156105f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106149190610fc1565b91505090565b6000336102dd8185856108e9565b6001600160a01b0391821660009081526000805160206111988339815191526020908152604080832093909416825291909152205490565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156106a65750825b905060008267ffffffffffffffff1660011480156106c35750303b155b9050811580156106d1575080155b156106ef5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561071957845460ff60401b1916600160401b1785555b600061075d88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250602091506109489050565b61076690611029565b60001c905061081a8a8a6107b48b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250602092508891506109489050565b6108158c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506107fb92508991506020905061104d565b61080688602061104d565b610810908f611060565b610948565b610a55565b50831561086157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6108798383836001610a69565b505050565b600061088a8484610628565b905060001981146108e357818110156108d457604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b6108e384848484036000610a69565b50505050565b6001600160a01b03831661091357604051634b637e8f60e11b8152600060048201526024016108cb565b6001600160a01b03821661093d5760405163ec442f0560e01b8152600060048201526024016108cb565b610879838383610b4d565b60608161095681601f61104d565b10156109955760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016108cb565b61099f828461104d565b845110156109e35760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b60448201526064016108cb565b606082158015610a025760405191506000825260208201604052610a4c565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610a3b578051835260209283019201610a23565b5050858452601f01601f1916604052505b50949350505050565b610a5d610d13565b6108e384848484610d5e565b6000805160206111988339815191526001600160a01b038516610aa25760405163e602df0560e01b8152600060048201526024016108cb565b6001600160a01b038416610acc57604051634a1406b160e11b8152600060048201526024016108cb565b6001600160a01b038086166000908152602083815260408083209388168352929052208390558115610b4657836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610b3d91815260200190565b60405180910390a35b5050505050565b6000805160206111988339815191526000610b678561042b565b905082811015610ba35760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016108cb565b600482810154600384015460405163f759cc3b60e01b815292830182905290916000916001600160a01b03169063f759cc3b90602401602060405180830381865afa158015610bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1a9190610fc1565b610c2c670de0b6b3a764000087610ff0565b610c369190611007565b6003850154604051637921219560e11b81526001600160a01b038a811660048301528981166024830152604482018690526064820184905260a06084830152600060a483015292935091169063f242432a9060c401600060405180830381600087803b158015610ca557600080fd5b505af1158015610cb9573d6000803e3d6000fd5b50505050856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051610d0291815260200190565b60405180910390a350505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d5c57604051631afcd79f60e31b815260040160405180910390fd5b565b610d66610d13565b6000805160206111988339815191527f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2501610da084826110d7565b5060028101610daf83826110d7565b506003810180546001600160a01b0319166001600160a01b039590951694909417909355505060040155565b600060208083528351808285015260005b81811015610e0857858101830151858201604001528201610dec565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e4057600080fd5b919050565b60008060408385031215610e5857600080fd5b610e6183610e29565b946020939093013593505050565b600080600060608486031215610e8457600080fd5b610e8d84610e29565b9250610e9b60208501610e29565b9150604084013590509250925092565b600060208284031215610ebd57600080fd5b610ec682610e29565b9392505050565b60008060408385031215610ee057600080fd5b610ee983610e29565b9150610ef760208401610e29565b90509250929050565b60008060008060608587031215610f1657600080fd5b84359350610f2660208601610e29565b9250604085013567ffffffffffffffff80821115610f4357600080fd5b818701915087601f830112610f5757600080fd5b813581811115610f6657600080fd5b886020828501011115610f7857600080fd5b95989497505060200194505050565b600181811c90821680610f9b57607f821691505b602082108103610fbb57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215610fd357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176102e3576102e3610fda565b60008261102457634e487b7160e01b600052601260045260246000fd5b500490565b80516020808301519190811015610fbb5760001960209190910360031b1b16919050565b808201808211156102e3576102e3610fda565b818103818111156102e3576102e3610fda565b634e487b7160e01b600052604160045260246000fd5b601f82111561087957600081815260208120601f850160051c810160208610156110b05750805b601f850160051c820191505b818110156110cf578281556001016110bc565b505050505050565b815167ffffffffffffffff8111156110f1576110f1611073565b611105816110ff8454610f87565b84611089565b602080601f83116001811461113a57600084156111225750858301515b600019600386901b1c1916600185901b1785556110cf565b600085815260208120601f198616915b828110156111695788860151825594840194600190910190840161114a565b50858210156111875787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2500a264697066735822122080f5f7b8b1b077600057a7118b522addc86a695fc8bb42d36c8bdb7a98dfbffd64736f6c63430008140033", "devdoc": { "details": "This contract should only be used for user interaction when ERC1155 is not an option.As a known bug, not all Transfer events are logged here. Please listen the underlying ERC1155 for the correct data.differences between ERC20RebaseMiddleware and ERC20Middleware can be seen observed at: -> totalSupply, balanceOf, _update. diffchecker: https://www.diffchecker.com/VQPmW62g/decimals is 18 onlyif erc1155.denominator = 1e18", "errors": { diff --git a/geodefi/abis/holesky/middleware/ERC20RebasePermitMiddleware.json b/geodefi/abis/holesky/middleware/ERC20RebasePermitMiddleware.json index abda400..59e52d6 100644 --- a/geodefi/abis/holesky/middleware/ERC20RebasePermitMiddleware.json +++ b/geodefi/abis/holesky/middleware/ERC20RebasePermitMiddleware.json @@ -1,5 +1,5 @@ { - "address": "0xC15407D19b33F09954EdDeb3B4d90033884E3002", + "address": "0x39984D58957c57fD712D08e9274B99855b1bE625", "abi": [ { "inputs": [], @@ -594,41 +594,41 @@ "type": "function" } ], - "transactionHash": "0xbe781f2bd71fb2209061d0d37f31e2b38ef6fd55f3532698c7deee4e0cde29a3", + "transactionHash": "0x41135d7a3e0ee459d27dfed7f61d8593e947fa7a3ce819aa8a9f6531e1e1694b", "receipt": { "to": null, "from": "0x7B6fA217a374826FCa50dccB87041AE0e34Ba1f5", - "contractAddress": "0xC15407D19b33F09954EdDeb3B4d90033884E3002", - "transactionIndex": 0, + "contractAddress": "0x39984D58957c57fD712D08e9274B99855b1bE625", + "transactionIndex": 1, "gasUsed": "1514591", - "logsBloom": "0x00000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x92993617bf9455109d907d464ab3472e8ddab42d56593b61997f376c75c2fed9", - "transactionHash": "0xbe781f2bd71fb2209061d0d37f31e2b38ef6fd55f3532698c7deee4e0cde29a3", + "logsBloom": "0x00000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x520e0c009c9dac05ff963973b9b668a87fb40974602f631a2d7d6ff420fd7cc3", + "transactionHash": "0x41135d7a3e0ee459d27dfed7f61d8593e947fa7a3ce819aa8a9f6531e1e1694b", "logs": [ { - "transactionIndex": 0, - "blockNumber": 852083, - "transactionHash": "0xbe781f2bd71fb2209061d0d37f31e2b38ef6fd55f3532698c7deee4e0cde29a3", - "address": "0xC15407D19b33F09954EdDeb3B4d90033884E3002", + "transactionIndex": 1, + "blockNumber": 1550557, + "transactionHash": "0x41135d7a3e0ee459d27dfed7f61d8593e947fa7a3ce819aa8a9f6531e1e1694b", + "address": "0x39984D58957c57fD712D08e9274B99855b1bE625", "topics": [ "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" ], "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", "logIndex": 0, - "blockHash": "0x92993617bf9455109d907d464ab3472e8ddab42d56593b61997f376c75c2fed9" + "blockHash": "0x520e0c009c9dac05ff963973b9b668a87fb40974602f631a2d7d6ff420fd7cc3" } ], - "blockNumber": 852083, - "cumulativeGasUsed": "1514591", + "blockNumber": 1550557, + "cumulativeGasUsed": "1536055", "status": 1, "byzantium": true }, "args": [], "numDeployments": 1, - "solcInputHash": "cfc92d910e56f99740a6d4737a3b72cb", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSpender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC2612ExpiredSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC2612InvalidSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"currentNonce\",\"type\":\"uint256\"}],\"name\":\"InvalidAccountNonce\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC1155\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC1155_ID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id_\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gETH_\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pricePerShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"differences between ERC20RebasePermitMiddleware and Openzeppelin's implementation of ERC20PermitUpgradable is: -> using ERC20Middleware instead of ERC20Upgradeable -> added initializeImplementation of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in https://eips.ethereum.org/EIPS/eip-2612[ERC-2612]. Adds the {permit} method, which can be used to change an account's ERC-20 allowance (see {IERC20-allowance}) by presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't need to send a transaction, and thus is not required to hold Ether at all.\",\"errors\":{\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"ERC20InsufficientAllowance(address,uint256,uint256)\":[{\"details\":\"Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\",\"params\":{\"allowance\":\"Amount of tokens a `spender` is allowed to operate with.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"details\":\"Indicates an error related to the current `balance` of a `sender`. Used in transfers.\",\"params\":{\"balance\":\"Current balance for the interacting account.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC20InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC20InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidSpender(address)\":[{\"details\":\"Indicates a failure with the `spender` to be approved. Used in approvals.\",\"params\":{\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC2612ExpiredSignature(uint256)\":[{\"details\":\"Permit deadline has expired.\"}],\"ERC2612InvalidSigner(address,address)\":[{\"details\":\"Mismatched signature.\"}],\"InvalidAccountNonce(address,uint256)\":[{\"details\":\"The nonce used for an `account` is not the expected current nonce.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"EIP712DomainChanged()\":{\"details\":\"MAY be emitted to signal that the domain could have changed.\"},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\"},\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the value of tokens owned by `account`.\"},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\"},\"decimals()\":{\"details\":\"Returns the decimals places of the token.\"},\"eip712Domain()\":{\"details\":\"See {IERC-5267}.\"},\"initialize(uint256,address,bytes)\":{\"details\":\"Sets the values for {name} and {symbol}.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"Returns the current nonce for `owner`. This value must be included whenever a signature is generated for {permit}. Every successful call to {permit} increases ``owner``'s nonce by one. This prevents a signature from being used multiple times.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Sets `value` as the allowance of `spender` over ``owner``'s tokens, given ``owner``'s signed approval. IMPORTANT: The same issues {IERC20-approve} has related to transaction ordering also apply here. Emits an {Approval} event. Requirements: - `spender` cannot be the zero address. - `deadline` must be a timestamp in the future. - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` over the EIP712-formatted function arguments. - the signature must use ``owner``'s current nonce (see {nonces}). For more information on the signature format, see the https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP section]. CAUTION: See Security Considerations above.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token.\"},\"totalSupply()\":{\"details\":\"Returns the value of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/middlewares/ERC20RebasePermitMiddleware.sol\":\"ERC20RebasePermitMiddleware\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Storage of the initializable contract.\\n *\\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\\n * when using with upgradeable contracts.\\n *\\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\\n */\\n struct InitializableStorage {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n uint64 _initialized;\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool _initializing;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Initializable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\\n\\n /**\\n * @dev The contract is already initialized.\\n */\\n error InvalidInitialization();\\n\\n /**\\n * @dev The contract is not initializing.\\n */\\n error NotInitializing();\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint64 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\\n * production.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n // Cache values to avoid duplicated sloads\\n bool isTopLevelCall = !$._initializing;\\n uint64 initialized = $._initialized;\\n\\n // Allowed calls:\\n // - initialSetup: the contract is not in the initializing state and no previous version was\\n // initialized\\n // - construction: the contract is initialized at version 1 (no reininitialization) and the\\n // current contract is just being deployed\\n bool initialSetup = initialized == 0 && isTopLevelCall;\\n bool construction = initialized == 1 && address(this).code.length == 0;\\n\\n if (!initialSetup && !construction) {\\n revert InvalidInitialization();\\n }\\n $._initialized = 1;\\n if (isTopLevelCall) {\\n $._initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n $._initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint64 version) {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing || $._initialized >= version) {\\n revert InvalidInitialization();\\n }\\n $._initialized = version;\\n $._initializing = true;\\n _;\\n $._initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n _checkInitializing();\\n _;\\n }\\n\\n /**\\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\\n */\\n function _checkInitializing() internal view virtual {\\n if (!_isInitializing()) {\\n revert NotInitializing();\\n }\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing) {\\n revert InvalidInitialization();\\n }\\n if ($._initialized != type(uint64).max) {\\n $._initialized = type(uint64).max;\\n emit Initialized(type(uint64).max);\\n }\\n }\\n\\n /**\\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n */\\n function _getInitializedVersion() internal view returns (uint64) {\\n return _getInitializableStorage()._initialized;\\n }\\n\\n /**\\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _getInitializableStorage()._initializing;\\n }\\n\\n /**\\n * @dev Returns a pointer to the storage namespace.\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\\n assembly {\\n $.slot := INITIALIZABLE_STORAGE\\n }\\n }\\n}\\n\",\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x72d47aebad24c59f6e78d0c3e827440173419a333fd910a37fa1e532c98f7e4c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/NoncesUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Nonces.sol)\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides tracking nonces for addresses. Nonces will only increment.\\n */\\nabstract contract NoncesUpgradeable is Initializable {\\n /**\\n * @dev The nonce used for an `account` is not the expected current nonce.\\n */\\n error InvalidAccountNonce(address account, uint256 currentNonce);\\n\\n /// @custom:storage-location erc7201:openzeppelin.storage.Nonces\\n struct NoncesStorage {\\n mapping(address account => uint256) _nonces;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Nonces\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant NoncesStorageLocation = 0x5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb00;\\n\\n function _getNoncesStorage() private pure returns (NoncesStorage storage $) {\\n assembly {\\n $.slot := NoncesStorageLocation\\n }\\n }\\n\\n function __Nonces_init() internal onlyInitializing {\\n }\\n\\n function __Nonces_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev Returns the next unused nonce for an address.\\n */\\n function nonces(address owner) public view virtual returns (uint256) {\\n NoncesStorage storage $ = _getNoncesStorage();\\n return $._nonces[owner];\\n }\\n\\n /**\\n * @dev Consumes a nonce.\\n *\\n * Returns the current value and increments nonce.\\n */\\n function _useNonce(address owner) internal virtual returns (uint256) {\\n NoncesStorage storage $ = _getNoncesStorage();\\n // For each account, the nonce has an initial value of 0, can only be incremented by one, and cannot be\\n // decremented or reset. This guarantees that the nonce never overflows.\\n unchecked {\\n // It is important to do x++ and not ++x here.\\n return $._nonces[owner]++;\\n }\\n }\\n\\n /**\\n * @dev Same as {_useNonce} but checking that `nonce` is the next valid for `owner`.\\n */\\n function _useCheckedNonce(address owner, uint256 nonce) internal virtual {\\n uint256 current = _useNonce(owner);\\n if (nonce != current) {\\n revert InvalidAccountNonce(owner, current);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x778f4a1546a1c6c726ecc8e2348a2789690fb8f26e12bd9d89537669167b79a4\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {MessageHashUtils} from \\\"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\\\";\\nimport {IERC5267} from \\\"@openzeppelin/contracts/interfaces/IERC5267.sol\\\";\\nimport {Initializable} from \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose\\n * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract\\n * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to\\n * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\\n * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the\\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\\n */\\nabstract contract EIP712Upgradeable is Initializable, IERC5267 {\\n bytes32 private constant TYPE_HASH =\\n keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n\\n /// @custom:storage-location erc7201:openzeppelin.storage.EIP712\\n struct EIP712Storage {\\n /// @custom:oz-renamed-from _HASHED_NAME\\n bytes32 _hashedName;\\n /// @custom:oz-renamed-from _HASHED_VERSION\\n bytes32 _hashedVersion;\\n\\n string _name;\\n string _version;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.EIP712\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;\\n\\n function _getEIP712Storage() private pure returns (EIP712Storage storage $) {\\n assembly {\\n $.slot := EIP712StorageLocation\\n }\\n }\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n function __EIP712_init(string memory name, string memory version) internal onlyInitializing {\\n __EIP712_init_unchained(name, version);\\n }\\n\\n function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {\\n EIP712Storage storage $ = _getEIP712Storage();\\n $._name = name;\\n $._version = version;\\n\\n // Reset prior values in storage if upgrading\\n $._hashedName = 0;\\n $._hashedVersion = 0;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n return _buildDomainSeparator();\\n }\\n\\n function _buildDomainSeparator() private view returns (bytes32) {\\n return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n\\n /**\\n * @dev See {IERC-5267}.\\n */\\n function eip712Domain()\\n public\\n view\\n virtual\\n returns (\\n bytes1 fields,\\n string memory name,\\n string memory version,\\n uint256 chainId,\\n address verifyingContract,\\n bytes32 salt,\\n uint256[] memory extensions\\n )\\n {\\n EIP712Storage storage $ = _getEIP712Storage();\\n // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized\\n // and the EIP712 domain is not reliable, as it will be missing name and version.\\n require($._hashedName == 0 && $._hashedVersion == 0, \\\"EIP712: Uninitialized\\\");\\n\\n return (\\n hex\\\"0f\\\", // 01111\\n _EIP712Name(),\\n _EIP712Version(),\\n block.chainid,\\n address(this),\\n bytes32(0),\\n new uint256[](0)\\n );\\n }\\n\\n /**\\n * @dev The name parameter for the EIP712 domain.\\n *\\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n * are a concern.\\n */\\n function _EIP712Name() internal view virtual returns (string memory) {\\n EIP712Storage storage $ = _getEIP712Storage();\\n return $._name;\\n }\\n\\n /**\\n * @dev The version parameter for the EIP712 domain.\\n *\\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n * are a concern.\\n */\\n function _EIP712Version() internal view virtual returns (string memory) {\\n EIP712Storage storage $ = _getEIP712Storage();\\n return $._version;\\n }\\n\\n /**\\n * @dev The hash of the name parameter for the EIP712 domain.\\n *\\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.\\n */\\n function _EIP712NameHash() internal view returns (bytes32) {\\n EIP712Storage storage $ = _getEIP712Storage();\\n string memory name = _EIP712Name();\\n if (bytes(name).length > 0) {\\n return keccak256(bytes(name));\\n } else {\\n // If the name is empty, the contract may have been upgraded without initializing the new storage.\\n // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design.\\n bytes32 hashedName = $._hashedName;\\n if (hashedName != 0) {\\n return hashedName;\\n } else {\\n return keccak256(\\\"\\\");\\n }\\n }\\n }\\n\\n /**\\n * @dev The hash of the version parameter for the EIP712 domain.\\n *\\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.\\n */\\n function _EIP712VersionHash() internal view returns (bytes32) {\\n EIP712Storage storage $ = _getEIP712Storage();\\n string memory version = _EIP712Version();\\n if (bytes(version).length > 0) {\\n return keccak256(bytes(version));\\n } else {\\n // If the version is empty, the contract may have been upgraded without initializing the new storage.\\n // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design.\\n bytes32 hashedVersion = $._hashedVersion;\\n if (hashedVersion != 0) {\\n return hashedVersion;\\n } else {\\n return keccak256(\\\"\\\");\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x85462422a22578744581e012e9aa0a391958cb360288b0b63f29bf0431d70327\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC5267.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)\\n\\npragma solidity ^0.8.20;\\n\\ninterface IERC5267 {\\n /**\\n * @dev MAY be emitted to signal that the domain could have changed.\\n */\\n event EIP712DomainChanged();\\n\\n /**\\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\\n * signature.\\n */\\n function eip712Domain()\\n external\\n view\\n returns (\\n bytes1 fields,\\n string memory name,\\n string memory version,\\n uint256 chainId,\\n address verifyingContract,\\n bytes32 salt,\\n uint256[] memory extensions\\n );\\n}\\n\",\"keccak256\":\"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard ERC20 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\\n */\\ninterface IERC20Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC20InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC20InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC20InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC20InvalidSpender(address spender);\\n}\\n\\n/**\\n * @dev Standard ERC721 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\\n */\\ninterface IERC721Errors {\\n /**\\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\\n * Used in balance queries.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721InvalidOwner(address owner);\\n\\n /**\\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721NonexistentToken(uint256 tokenId);\\n\\n /**\\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param tokenId Identifier number of a token.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC721InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC721InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC721InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC721InvalidOperator(address operator);\\n}\\n\\n/**\\n * @dev Standard ERC1155 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\\n */\\ninterface IERC1155Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC1155InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC1155InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC1155MissingApprovalForAll(address operator, address owner);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC1155InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC1155InvalidOperator(address operator);\\n\\n /**\\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\\n * Used in batch transfers.\\n * @param idsLength Length of the array of token identifiers\\n * @param valuesLength Length of the array of token amounts\\n */\\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\\n}\\n\",\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\\n */\\ninterface IERC1155 is IERC165 {\\n /**\\n * @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.\\n */\\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n /**\\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\\n * transfers.\\n */\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] values\\n );\\n\\n /**\\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\\n * `approved`.\\n */\\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\\n\\n /**\\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\\n *\\n * If an {URI} event was emitted for `id`, the standard\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\\n * returned by {IERC1155MetadataURI-uri}.\\n */\\n event URI(string value, uint256 indexed id);\\n\\n /**\\n * @dev Returns the value of tokens of token type `id` owned by `account`.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function balanceOf(address account, uint256 id) external view returns (uint256);\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\\n *\\n * Requirements:\\n *\\n * - `accounts` and `ids` must have the same length.\\n */\\n function balanceOfBatch(\\n address[] calldata accounts,\\n uint256[] calldata ids\\n ) external view returns (uint256[] memory);\\n\\n /**\\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\\n *\\n * Emits an {ApprovalForAll} event.\\n *\\n * Requirements:\\n *\\n * - `operator` cannot be the caller.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\\n *\\n * See {setApprovalForAll}.\\n */\\n function isApprovedForAll(address account, address operator) external view returns (bool);\\n\\n /**\\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`.\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155Received} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\\n *\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `values` must have the same length.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external;\\n}\\n\",\"keccak256\":\"0xe64b3445a3f638890af7ad92464cd18f1f202a2f5a7ed42dabf74317bae43303\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/extensions/IERC1155MetadataURI.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC1155} from \\\"../IERC1155.sol\\\";\\n\\n/**\\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\\n */\\ninterface IERC1155MetadataURI is IERC1155 {\\n /**\\n * @dev Returns the URI for token type `id`.\\n *\\n * If the `\\\\{id\\\\}` substring is present in the URI, it must be replaced by\\n * clients with the actual token type ID.\\n */\\n function uri(uint256 id) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xe92b5e199b963d108ad6e06feeede151ba23849e0d064956535489ff967ffe68\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * ==== Security Considerations\\n *\\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\\n * generally recommended is:\\n *\\n * ```solidity\\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\\n * doThing(..., value);\\n * }\\n *\\n * function doThing(..., uint256 value) public {\\n * token.safeTransferFrom(msg.sender, address(this), value);\\n * ...\\n * }\\n * ```\\n *\\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\\n * {SafeERC20-safeTransferFrom}).\\n *\\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\\n * contracts should have entry points that don't rely on permit.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n *\\n * CAUTION: See Security Considerations above.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Math} from \\\"./math/Math.sol\\\";\\nimport {SignedMath} from \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant HEX_DIGITS = \\\"0123456789abcdef\\\";\\n uint8 private constant ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev The `value` string doesn't fit in the specified `length`.\\n */\\n error StringsInsufficientHexLength(uint256 value, uint256 length);\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toStringSigned(int256 value) internal pure returns (string memory) {\\n return string.concat(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value)));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n uint256 localValue = value;\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = HEX_DIGITS[localValue & 0xf];\\n localValue >>= 4;\\n }\\n if (localValue != 0) {\\n revert StringsInsufficientHexLength(value, length);\\n }\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\\n * representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS\\n }\\n\\n /**\\n * @dev The signature derives the `address(0)`.\\n */\\n error ECDSAInvalidSignature();\\n\\n /**\\n * @dev The signature has an invalid length.\\n */\\n error ECDSAInvalidSignatureLength(uint256 length);\\n\\n /**\\n * @dev The signature has an S value that is in the upper half order.\\n */\\n error ECDSAInvalidSignatureS(bytes32 s);\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\\n * return address(0) without also returning an error description. Errors are documented using an enum (error type)\\n * and a bytes32 providing additional information about the error.\\n *\\n * If no error is returned, then the address can be used for verification purposes.\\n *\\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\\n _throwError(error, errorArg);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n */\\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) {\\n unchecked {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n // We do not check for an overflow here since the shift operation results in 0 or 1.\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n */\\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\\n _throwError(error, errorArg);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError, bytes32) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS, s);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature, bytes32(0));\\n }\\n\\n return (signer, RecoverError.NoError, bytes32(0));\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\\n _throwError(error, errorArg);\\n return recovered;\\n }\\n\\n /**\\n * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\\n */\\n function _throwError(RecoverError error, bytes32 errorArg) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert ECDSAInvalidSignature();\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert ECDSAInvalidSignatureLength(uint256(errorArg));\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert ECDSAInvalidSignatureS(errorArg);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MessageHashUtils.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Strings} from \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\\n *\\n * The library provides methods for generating a hash of a message that conforms to the\\n * https://eips.ethereum.org/EIPS/eip-191[EIP 191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\\n * specifications.\\n */\\nlibrary MessageHashUtils {\\n /**\\n * @dev Returns the keccak256 digest of an EIP-191 signed data with version\\n * `0x45` (`personal_sign` messages).\\n *\\n * The digest is calculated by prefixing a bytes32 `messageHash` with\\n * `\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\"` and hashing the result. It corresponds with the\\n * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.\\n *\\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\\n * keccak256, although any bytes32 value can be safely used because the final digest will\\n * be re-hashed.\\n *\\n * See {ECDSA-recover}.\\n */\\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\") // 32 is the bytes-length of messageHash\\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\\n }\\n }\\n\\n /**\\n * @dev Returns the keccak256 digest of an EIP-191 signed data with version\\n * `0x45` (`personal_sign` messages).\\n *\\n * The digest is calculated by prefixing an arbitrary `message` with\\n * `\\\"\\\\x19Ethereum Signed Message:\\\\n\\\" + len(message)` and hashing the result. It corresponds with the\\n * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.\\n *\\n * See {ECDSA-recover}.\\n */\\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\\n return\\n keccak256(bytes.concat(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", bytes(Strings.toString(message.length)), message));\\n }\\n\\n /**\\n * @dev Returns the keccak256 digest of an EIP-191 signed data with version\\n * `0x00` (data with intended validator).\\n *\\n * The digest is calculated by prefixing an arbitrary `data` with `\\\"\\\\x19\\\\x00\\\"` and the intended\\n * `validator` address. Then hashing the result.\\n *\\n * See {ECDSA-recover}.\\n */\\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(hex\\\"19_00\\\", validator, data));\\n }\\n\\n /**\\n * @dev Returns the keccak256 digest of an EIP-712 typed data (EIP-191 version `0x01`).\\n *\\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\\n * `\\\\x19\\\\x01` and hashing the result. It corresponds to the hash signed by the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\\n *\\n * See {ECDSA-recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40)\\n mstore(ptr, hex\\\"19_01\\\")\\n mstore(add(ptr, 0x02), domainSeparator)\\n mstore(add(ptr, 0x22), structHash)\\n digest := keccak256(ptr, 0x42)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Muldiv operation overflow.\\n */\\n error MathOverflowedMulDiv();\\n\\n enum Rounding {\\n Floor, // Toward negative infinity\\n Ceil, // Toward positive infinity\\n Trunc, // Toward zero\\n Expand // Away from zero\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds towards infinity instead\\n * of rounding towards zero.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (b == 0) {\\n // Guarantee the same behavior as in a regular Solidity division.\\n return a / b;\\n }\\n\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n * denominator == 0.\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n * Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0 = x * y; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n if (denominator <= prod1) {\\n revert MathOverflowedMulDiv();\\n }\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n uint256 twos = denominator & (0 - denominator);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\\n // works in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n * towards zero.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n */\\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n return uint8(rounding) % 2 == 1;\\n }\\n}\\n\",\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72\",\"license\":\"MIT\"},\"contracts/globals/macros.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n// no floats in solidity. If needed, PERCENTAGE_DENOMINATOR always represents \\\"1\\\" (100%)\\nuint256 constant PERCENTAGE_DENOMINATOR = 1e10;\\n\\nuint256 constant gETH_DENOMINATOR = 1e18;\\n\",\"keccak256\":\"0x9d699aeaf6da35d188a5495eec188b28a990e09bd04fa7701d28c4ff9afba801\",\"license\":\"MIT\"},\"contracts/helpers/BytesLib.sol\":{\"content\":\"// SPDX-License-Identifier: Unlicense\\n/*\\n * @title Solidity Bytes Arrays Utils\\n * @author Gon\\u00e7alo S\\u00e1 \\n *\\n * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.\\n * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.\\n */\\npragma solidity =0.8.20;\\n\\nlibrary BytesLib {\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n ) internal pure returns (bytes memory) {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(\\n 0x40,\\n and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n )\\n )\\n }\\n\\n return tempBytes;\\n }\\n\\n function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\\n assembly {\\n // Read the first 32 bytes of _preBytes storage, which is the length\\n // of the array. (We don't need to use the offset into the slot\\n // because arrays use the entire slot.)\\n let fslot := sload(_preBytes.slot)\\n // Arrays of 31 bytes or less have an even value in their slot,\\n // while longer arrays have an odd value. The actual length is\\n // the slot divided by two for odd values, and the lowest order\\n // byte divided by two for even values.\\n // If the slot is even, bitwise and the slot with 255 and divide by\\n // two to get the length. If the slot is odd, bitwise and the slot\\n // with -1 and divide by two.\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n let newlength := add(slength, mlength)\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n switch add(lt(slength, 32), lt(newlength, 32))\\n case 2 {\\n // Since the new array still fits in the slot, we just need to\\n // update the contents of the slot.\\n // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\\n sstore(\\n _preBytes.slot,\\n // all the modifications to the slot are inside this\\n // next block\\n add(\\n // we can just add to the slot contents because the\\n // bytes we want to change are the LSBs\\n fslot,\\n add(\\n mul(\\n div(\\n // load the bytes from memory\\n mload(add(_postBytes, 0x20)),\\n // zero all bytes to the right\\n exp(0x100, sub(32, mlength))\\n ),\\n // and now shift left the number of bytes to\\n // leave space for the length in the slot\\n exp(0x100, sub(32, newlength))\\n ),\\n // increase length by the double of the memory\\n // bytes length\\n mul(mlength, 2)\\n )\\n )\\n )\\n }\\n case 1 {\\n // The stored value fits in the slot, but the combined value\\n // will exceed it.\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // The contents of the _postBytes array start 32 bytes into\\n // the structure. Our first read should obtain the `submod`\\n // bytes that can fit into the unused space in the last word\\n // of the stored array. To get this, we read 32 bytes starting\\n // from `submod`, so the data we read overlaps with the array\\n // contents by `submod` bytes. Masking the lowest-order\\n // `submod` bytes allows us to add that value directly to the\\n // stored value.\\n\\n let submod := sub(32, slength)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(\\n sc,\\n add(\\n and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00),\\n and(mload(mc), mask)\\n )\\n )\\n\\n for {\\n mc := add(mc, 0x20)\\n sc := add(sc, 1)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n default {\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n // Start copying to the last used word of the stored array.\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // Copy over the first `submod` bytes of the new data as in\\n // case 1 above.\\n let slengthmod := mod(slength, 32)\\n let mlengthmod := mod(mlength, 32)\\n let submod := sub(32, slengthmod)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(sc, add(sload(sc), and(mload(mc), mask)))\\n\\n for {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n }\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_bytes.length >= _start + 1, \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {\\n require(_bytes.length >= _start + 2, \\\"toUint16_outOfBounds\\\");\\n uint16 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x2), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {\\n require(_bytes.length >= _start + 4, \\\"toUint32_outOfBounds\\\");\\n uint32 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x4), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {\\n require(_bytes.length >= _start + 8, \\\"toUint64_outOfBounds\\\");\\n uint64 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x8), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {\\n require(_bytes.length >= _start + 12, \\\"toUint96_outOfBounds\\\");\\n uint96 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0xc), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {\\n require(_bytes.length >= _start + 16, \\\"toUint128_outOfBounds\\\");\\n uint128 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x10), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {\\n require(_bytes.length >= _start + 32, \\\"toUint256_outOfBounds\\\");\\n uint256 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {\\n require(_bytes.length >= _start + 32, \\\"toBytes32_outOfBounds\\\");\\n bytes32 tempBytes32;\\n\\n assembly {\\n tempBytes32 := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempBytes32;\\n }\\n\\n function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\\n bool success = true;\\n\\n assembly {\\n let length := mload(_preBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(length, mload(_postBytes))\\n case 1 {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n let mc := add(_preBytes, 0x20)\\n let end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n } eq(add(lt(mc, end), cb), 2) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // if any of these checks fails then arrays are not equal\\n if iszero(eq(mload(mc), mload(cc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function equalStorage(\\n bytes storage _preBytes,\\n bytes memory _postBytes\\n ) internal view returns (bool) {\\n bool success = true;\\n\\n assembly {\\n // we know _preBytes_offset is 0\\n let fslot := sload(_preBytes.slot)\\n // Decode the length of the stored array like in concatStorage().\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(slength, mlength)\\n case 1 {\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n if iszero(iszero(slength)) {\\n switch lt(slength, 32)\\n case 1 {\\n // blank the last byte which is the length\\n fslot := mul(div(fslot, 0x100), 0x100)\\n\\n if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\\n // unsuccess:\\n success := 0\\n }\\n }\\n default {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := keccak256(0x0, 0x20)\\n\\n let mc := add(_postBytes, 0x20)\\n let end := add(mc, mlength)\\n\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n for {\\n\\n } eq(add(lt(mc, end), cb), 2) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n if iszero(eq(sload(sc), mload(mc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n}\\n\",\"keccak256\":\"0x4ee3f6ef85baa41794fc1519522f7c135becd0e267980eadc68dd643e52b59c7\",\"license\":\"Unlicense\"},\"contracts/interfaces/IgETH.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IERC1155PausableBurnableSupply} from \\\"./helpers/IERC1155PausableBurnableSupply.sol\\\";\\n\\ninterface IgETH is IERC1155PausableBurnableSupply {\\n function denominator() external view returns (uint256);\\n\\n function isMiddleware(address middleware, uint256 id) external view returns (bool);\\n\\n function setMiddleware(address middleware, uint256 id, bool isSet) external;\\n\\n function isAvoider(address account, uint256 id) external view returns (bool);\\n\\n function avoidMiddlewares(uint256 id, bool isAvoid) external;\\n\\n function pricePerShare(uint256 id) external view returns (uint256);\\n\\n function priceUpdateTimestamp(uint256 id) external view returns (uint256);\\n\\n function setPricePerShare(uint256 price, uint256 id) external;\\n\\n function transferUriSetterRole(address newUriSetter) external;\\n\\n function transferPauserRole(address newPauser) external;\\n\\n function transferMinterRole(address newMinter) external;\\n\\n function transferOracleRole(address newOracle) external;\\n\\n function transferMiddlewareManagerRole(address newMiddlewareManager) external;\\n}\\n\",\"keccak256\":\"0xa093b769e8ba42091d3db8a9e4ddc1be066f4aa92f61ee552983c22a0e9f29d8\",\"license\":\"MIT\"},\"contracts/interfaces/helpers/IERC1155PausableBurnableSupply.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/// @dev IERC1155 inherits IERC165\\nimport {IERC1155} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Errors} from \\\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\\\";\\n\\ninterface IERC1155Burnable is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function burn(address account, uint256 id, uint256 value) external;\\n\\n function burnBatch(address account, uint256[] memory ids, uint256[] memory values) external;\\n}\\n\\ninterface IERC1155Supply is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function totalSupply(uint256 id) external view returns (uint256);\\n\\n function exists(uint256 id) external view returns (bool);\\n}\\n\\ninterface IERC1155PausableBurnableSupply is IERC1155Burnable, IERC1155Supply {\\n function setURI(string memory newuri) external;\\n\\n function pause() external;\\n\\n function unpause() external;\\n\\n function mint(address account, uint256 id, uint256 amount, bytes memory data) external;\\n\\n function mintBatch(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) external;\\n}\\n\",\"keccak256\":\"0x8b0a02fdbc8d54c815d68e122f6869348217b5efd853c8b833c59d2053998ef0\",\"license\":\"MIT\"},\"contracts/interfaces/middlewares/IgETHMiddleware.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\ninterface IgETHMiddleware {\\n function initialize(uint256 id_, address erc1155_, bytes memory data) external;\\n\\n function ERC1155() external view returns (address);\\n\\n function ERC1155_ID() external view returns (uint256);\\n\\n function pricePerShare() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x5b94e7cf38487d607c720d311578fa0b777a75050113b3533b8e4e22fe6ab61c\",\"license\":\"MIT\"},\"contracts/middlewares/ERC20RebaseMiddleware.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n// external - interfaces\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport {IERC20Metadata} from \\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\";\\nimport {IERC20Errors} from \\\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\\\";\\n// external - contracts\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {ContextUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\\\";\\n// internal - globals\\nimport {gETH_DENOMINATOR} from \\\"../globals/macros.sol\\\";\\n// internal - interfaces\\nimport {IgETH} from \\\"../interfaces/IgETH.sol\\\";\\nimport {IgETHMiddleware} from \\\"../interfaces/middlewares/IgETHMiddleware.sol\\\";\\n// internal - libraries\\nimport {BytesLib} from \\\"../helpers/BytesLib.sol\\\";\\n\\n/**\\n * @notice Same as ERC20Middleware, but balances represent underlying balances, instead of ERC1155 balances.\\n * which means it represents the staked ether amount, instead of gETH amount.\\n *\\n * @dev This contract should only be used for user interaction when ERC1155 is not an option.\\n * @dev As a known bug, not all Transfer events are logged here. Please listen the underlying ERC1155 for the correct data.\\n *\\n * @dev differences between ERC20RebaseMiddleware and ERC20Middleware can be seen observed at:\\n * -> totalSupply, balanceOf, _update.\\n *\\n * diffchecker: https://www.diffchecker.com/VQPmW62g/\\n *\\n * @dev decimals is 18 onlyif erc1155.denominator = 1e18\\n */\\ncontract ERC20RebaseMiddleware is\\n Initializable,\\n ContextUpgradeable,\\n IgETHMiddleware,\\n IERC20,\\n IERC20Metadata,\\n IERC20Errors\\n{\\n /// @custom:storage-location erc7201:geode.storage.ERC20RebaseMiddleware\\n struct ERC20RebaseMiddlewareStorage {\\n // mapping(address account => uint256) _balances; -> use ERC1155\\n mapping(address account => mapping(address spender => uint256)) _allowances;\\n // uint256 _totalSupply; -> use ERC1155\\n string _name;\\n string _symbol;\\n IgETH ERC1155;\\n uint256 ERC1155_ID;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"geode.storage.ERC20RebaseMiddleware\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant ERC20RebaseMiddlewareStorageLocation =\\n 0x033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2500;\\n\\n function _getERC20RebaseMiddlewareStorage()\\n private\\n pure\\n returns (ERC20RebaseMiddlewareStorage storage $)\\n {\\n assembly {\\n $.slot := ERC20RebaseMiddlewareStorageLocation\\n }\\n }\\n\\n /// @custom:oz-upgrades-unsafe-allow constructor\\n constructor() {\\n _disableInitializers();\\n }\\n\\n function initialize(\\n uint256 id_,\\n address gETH_,\\n bytes calldata data\\n ) public virtual override initializer {\\n uint256 nameLen = uint256(bytes32(BytesLib.slice(data, 0, 32)));\\n __ERC20RebaseMiddleware_init(\\n id_,\\n gETH_,\\n string(BytesLib.slice(data, 32, nameLen)),\\n string(BytesLib.slice(data, 32 + nameLen, data.length - (32 + nameLen)))\\n );\\n }\\n\\n /**\\n * @dev Sets the values for {name} and {symbol} based on provided data:\\n * * First 32 bytes indicate the lenght of the name, one therefore can find out\\n * * which byte the name ends and symbol starts.\\n */\\n function __ERC20RebaseMiddleware_init(\\n uint256 id_,\\n address gETH_,\\n string memory name_,\\n string memory symbol_\\n ) internal onlyInitializing {\\n __ERC20RebaseMiddleware_init_unchained(id_, gETH_, name_, symbol_);\\n }\\n\\n function __ERC20RebaseMiddleware_init_unchained(\\n uint256 id_,\\n address gETH_,\\n string memory name_,\\n string memory symbol_\\n ) internal onlyInitializing {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n $._name = name_;\\n $._symbol = symbol_;\\n $.ERC1155 = IgETH(gETH_);\\n $.ERC1155_ID = id_;\\n }\\n\\n function name() public view virtual returns (string memory) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $._name;\\n }\\n\\n function symbol() public view virtual returns (string memory) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $._symbol;\\n }\\n\\n function ERC1155() public view virtual override returns (address) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return address($.ERC1155);\\n }\\n\\n function ERC1155_ID() public view virtual override returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $.ERC1155_ID;\\n }\\n\\n function pricePerShare() public view virtual override returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $.ERC1155.pricePerShare($.ERC1155_ID);\\n }\\n\\n function decimals() public view virtual returns (uint8) {\\n return 18;\\n }\\n\\n function totalSupply() public view virtual returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n\\n uint256 id = $.ERC1155_ID;\\n return ($.ERC1155.totalSupply(id) * $.ERC1155.pricePerShare(id)) / gETH_DENOMINATOR;\\n }\\n\\n function balanceOf(address account) public view virtual returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n\\n uint256 id = $.ERC1155_ID;\\n return ($.ERC1155.balanceOf(account, id) * $.ERC1155.pricePerShare(id)) / gETH_DENOMINATOR;\\n }\\n\\n function transfer(address to, uint256 value) public virtual returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, value);\\n return true;\\n }\\n\\n function allowance(address owner, address spender) public view virtual returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $._allowances[owner][spender];\\n }\\n\\n function approve(address spender, uint256 value) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, value);\\n return true;\\n }\\n\\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, value);\\n _transfer(from, to, value);\\n return true;\\n }\\n\\n function _transfer(address from, address to, uint256 value) internal {\\n if (from == address(0)) {\\n revert ERC20InvalidSender(address(0));\\n }\\n if (to == address(0)) {\\n revert ERC20InvalidReceiver(address(0));\\n }\\n _update(from, to, value);\\n }\\n\\n function _update(address from, address to, uint256 value) internal virtual {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n\\n uint256 fromBalance = balanceOf(from);\\n if (fromBalance < value) {\\n revert ERC20InsufficientBalance(from, fromBalance, value);\\n }\\n\\n uint256 id = $.ERC1155_ID;\\n uint256 transferAmount = (value * gETH_DENOMINATOR) / $.ERC1155.pricePerShare(id);\\n $.ERC1155.safeTransferFrom(from, to, id, transferAmount, \\\"\\\");\\n\\n emit Transfer(from, to, value);\\n }\\n\\n function _approve(address owner, address spender, uint256 value) internal {\\n _approve(owner, spender, value, true);\\n }\\n\\n function _approve(\\n address owner,\\n address spender,\\n uint256 value,\\n bool emitEvent\\n ) internal virtual {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n if (owner == address(0)) {\\n revert ERC20InvalidApprover(address(0));\\n }\\n if (spender == address(0)) {\\n revert ERC20InvalidSpender(address(0));\\n }\\n $._allowances[owner][spender] = value;\\n if (emitEvent) {\\n emit Approval(owner, spender, value);\\n }\\n }\\n\\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n if (currentAllowance < value) {\\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\\n }\\n unchecked {\\n _approve(owner, spender, currentAllowance - value, false);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc8b59b888cb81935865b18b53e59d1e479c29c702f7933d33399a662edbcfe64\",\"license\":\"MIT\"},\"contracts/middlewares/ERC20RebasePermitMiddleware.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Permit.sol)\\n\\npragma solidity ^0.8.20;\\n\\n// external - interfaces\\nimport {IERC20Permit} from \\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\\\";\\n// external - libraries\\nimport {ECDSA} from \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\n// external - contracts\\nimport {EIP712Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol\\\";\\nimport {NoncesUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/NoncesUpgradeable.sol\\\";\\n// internal - libraries\\nimport {BytesLib} from \\\"../helpers/BytesLib.sol\\\";\\n// internal - contracts\\nimport {ERC20RebaseMiddleware} from \\\"./ERC20RebaseMiddleware.sol\\\";\\n\\n/**\\n * @dev differences between ERC20RebasePermitMiddleware and Openzeppelin's implementation of ERC20PermitUpgradable is:\\n * -> using ERC20Middleware instead of ERC20Upgradeable\\n * -> added initialize\\n *\\n * @dev Implementation of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[ERC-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC-20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ncontract ERC20RebasePermitMiddleware is\\n ERC20RebaseMiddleware,\\n IERC20Permit,\\n EIP712Upgradeable,\\n NoncesUpgradeable\\n{\\n bytes32 private constant PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n /**\\n * @dev Permit deadline has expired.\\n */\\n error ERC2612ExpiredSignature(uint256 deadline);\\n\\n /**\\n * @dev Mismatched signature.\\n */\\n error ERC2612InvalidSigner(address signer, address owner);\\n\\n ///@custom:oz-upgrades-unsafe-allow constructor\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n */\\n function initialize(\\n uint256 id_,\\n address gETH_,\\n bytes calldata data\\n ) public virtual override initializer {\\n uint256 nameLen = uint256(bytes32(BytesLib.slice(data, 0, 32)));\\n __ERC20RebasePermitMiddleware_init(\\n id_,\\n gETH_,\\n string(BytesLib.slice(data, 32, nameLen)),\\n string(BytesLib.slice(data, 32 + nameLen, data.length - (32 + nameLen)))\\n );\\n }\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n function __ERC20RebasePermitMiddleware_init(\\n uint256 id_,\\n address gETH_,\\n string memory name_,\\n string memory symbol_\\n ) internal onlyInitializing {\\n __EIP712_init_unchained(name_, \\\"1\\\");\\n __ERC20RebaseMiddleware_init_unchained(id_, gETH_, name_, symbol_);\\n __ERC20RebasePermitMiddleware_init_unchained();\\n }\\n\\n function __ERC20RebasePermitMiddleware_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @inheritdoc IERC20Permit\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual {\\n if (block.timestamp > deadline) {\\n revert ERC2612ExpiredSignature(deadline);\\n }\\n\\n bytes32 structHash = keccak256(\\n abi.encode(PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)\\n );\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n if (signer != owner) {\\n revert ERC2612InvalidSigner(signer, owner);\\n }\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @inheritdoc IERC20Permit\\n */\\n function nonces(\\n address owner\\n ) public view virtual override(IERC20Permit, NoncesUpgradeable) returns (uint256) {\\n return super.nonces(owner);\\n }\\n\\n /**\\n * @inheritdoc IERC20Permit\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n}\\n\",\"keccak256\":\"0x900132a39646f9451f5729c26d343f8080741c2827c034eaed92c1670d784a43\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50610019610026565b610021610026565b6100d8565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d55780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6119f1806100e76000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806399530b061161007157806399530b061461023b578063a9059cbb14610243578063d505accf14610256578063dd62ed3e1461026b578063e209b6461461027e57600080fd5b806370a08231146101f25780637ecebe001461020557806384b0196e1461021857806395d89b411461023357600080fd5b80632d255471116100de5780632d2554711461017a578063313ce567146101b45780633644e515146101c35780635c2f8aa0146101cb57600080fd5b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015157806323b872dd14610167575b600080fd5b610118610291565b60405161012591906114db565b60405180910390f35b61014161013c366004611511565b610354565b6040519015158152602001610125565b61015961036e565b604051908152602001610125565b61014161017536600461153b565b61048c565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2503546040516001600160a01b039091168152602001610125565b60405160128152602001610125565b6101596104b0565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db250454610159565b610159610200366004611577565b6104bf565b610159610213366004611577565b6105e4565b610220610621565b6040516101259796959493929190611592565b6101186106d2565b6101596106f7565b610141610251366004611511565b610782565b610269610264366004611628565b610790565b005b61015961027936600461169b565b6108e9565b61026961028c3660046116ce565b610921565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2501805460609160008051602061197c833981519152916102d090611755565b80601f01602080910402602001604051908101604052809291908181526020018280546102fc90611755565b80156103495780601f1061031e57610100808354040283529160200191610349565b820191906000526020600020905b81548152906001019060200180831161032c57829003601f168201915b505050505091505090565b600033610362818585610b2d565b60019150505b92915050565b60008060008051602061197c833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa1580156103de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610402919061178f565b600384015460405163bd85b03960e01b8152600481018590526001600160a01b039091169063bd85b03990602401602060405180830381865afa15801561044d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610471919061178f565b61047b91906117be565b61048591906117d5565b9250505090565b60003361049a858285610b3f565b6104a5858585610ba5565b506001949350505050565b60006104ba610c04565b905090565b60008060008051602061197c833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa15801561052f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610553919061178f565b6003840154604051627eeac760e11b81526001600160a01b038881166004830152602482018690529091169062fdd58e90604401602060405180830381865afa1580156105a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c8919061178f565b6105d291906117be565b6105dc91906117d5565b949350505050565b6001600160a01b03811660009081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006020526040812054610368565b6000606080828080838160008051602061199c833981519152805490915015801561064e57506001810154155b6106975760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064015b60405180910390fd5b61069f610c0e565b6106a7610c26565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6060600060008051602061197c8339815191525b90508060020180546102d090611755565b60008060008051602061197c833981519152600381015460048083015460405163f759cc3b60e01b8152918201529192506001600160a01b03169063f759cc3b90602401602060405180830381865afa158015610758573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077c919061178f565b91505090565b600033610362818585610ba5565b834211156107b45760405163313c898160e11b81526004810185905260240161068e565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108208c6001600160a01b031660009081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061087b82610c65565b9050600061088b82878787610c92565b9050896001600160a01b0316816001600160a01b0316146108d2576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161068e565b6108dd8a8a8a610b2d565b50505050505050505050565b6001600160a01b03918216600090815260008051602061197c8339815191526020908152604080832093909416825291909152205490565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156109675750825b905060008267ffffffffffffffff1660011480156109845750303b155b905081158015610992575080155b156109b05760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156109da57845460ff60401b1916600160401b1785555b6000610a1e88888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925060209150610cc09050565b610a279061180d565b60001c9050610adb8a8a610a758b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060209250889150610cc09050565b610ad68c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610abc925089915060209050611831565b610ac7886020611831565b610ad1908f611844565b610cc0565b610dcd565b508315610b2257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b610b3a8383836001610e0c565b505050565b6000610b4b84846108e9565b90506000198114610b9f5781811015610b9057604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161068e565b610b9f84848484036000610e0c565b50505050565b6001600160a01b038316610bcf57604051634b637e8f60e11b81526000600482015260240161068e565b6001600160a01b038216610bf95760405163ec442f0560e01b81526000600482015260240161068e565b610b3a838383610ef0565b60006104ba6110b6565b6060600060008051602061199c8339815191526106e6565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103805460609160008051602061199c833981519152916102d090611755565b6000610368610c72610c04565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600080610ca48888888861112a565b925092509250610cb482826111f9565b50909695505050505050565b606081610cce81601f611831565b1015610d0d5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640161068e565b610d178284611831565b84511015610d5b5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640161068e565b606082158015610d7a5760405191506000825260208201604052610dc4565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610db3578051835260209283019201610d9b565b5050858452601f01601f1916604052505b50949350505050565b610dd56112b6565b610df882604051806040016040528060018152602001603160f81b815250611301565b610e0484848484611362565b610b9f6113df565b60008051602061197c8339815191526001600160a01b038516610e455760405163e602df0560e01b81526000600482015260240161068e565b6001600160a01b038416610e6f57604051634a1406b160e11b81526000600482015260240161068e565b6001600160a01b038086166000908152602083815260408083209388168352929052208390558115610ee957836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ee091815260200190565b60405180910390a35b5050505050565b60008051602061197c8339815191526000610f0a856104bf565b905082811015610f465760405163391434e360e21b81526001600160a01b0386166004820152602481018290526044810184905260640161068e565b600482810154600384015460405163f759cc3b60e01b815292830182905290916000916001600160a01b03169063f759cc3b90602401602060405180830381865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd919061178f565b610fcf670de0b6b3a7640000876117be565b610fd991906117d5565b6003850154604051637921219560e11b81526001600160a01b038a811660048301528981166024830152604482018690526064820184905260a06084830152600060a483015292935091169063f242432a9060c401600060405180830381600087803b15801561104857600080fd5b505af115801561105c573d6000803e3d6000fd5b50505050856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516110a591815260200190565b60405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6110e16113e7565b6110e9611451565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561116557506000915060039050826111ef565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156111b9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111e5575060009250600191508290506111ef565b9250600091508190505b9450945094915050565b600082600381111561120d5761120d611857565b03611216575050565b600182600381111561122a5761122a611857565b036112485760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561125c5761125c611857565b0361127d5760405163fce698f760e01b81526004810182905260240161068e565b600382600381111561129157611291611857565b036112b2576040516335e2f38360e21b81526004810182905260240161068e565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166112ff57604051631afcd79f60e31b815260040160405180910390fd5b565b6113096112b6565b60008051602061199c8339815191527fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10261134384826118bb565b506003810161135283826118bb565b5060008082556001909101555050565b61136a6112b6565b60008051602061197c8339815191527f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db25016113a484826118bb565b50600281016113b383826118bb565b506003810180546001600160a01b0319166001600160a01b039590951694909417909355505060040155565b6112ff6112b6565b600060008051602061199c83398151915281611401610c0e565b80519091501561141957805160209091012092915050565b81548015611428579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b600060008051602061199c8339815191528161146b610c26565b80519091501561148357805160209091012092915050565b60018201548015611428579392505050565b6000815180845260005b818110156114bb5760208185018101518683018201520161149f565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006114ee6020830184611495565b9392505050565b80356001600160a01b038116811461150c57600080fd5b919050565b6000806040838503121561152457600080fd5b61152d836114f5565b946020939093013593505050565b60008060006060848603121561155057600080fd5b611559846114f5565b9250611567602085016114f5565b9150604084013590509250925092565b60006020828403121561158957600080fd5b6114ee826114f5565b60ff60f81b881681526000602060e0818401526115b260e084018a611495565b83810360408501526115c4818a611495565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015611616578351835292840192918401916001016115fa565b50909c9b505050505050505050505050565b600080600080600080600060e0888a03121561164357600080fd5b61164c886114f5565b965061165a602089016114f5565b95506040880135945060608801359350608088013560ff8116811461167e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156116ae57600080fd5b6116b7836114f5565b91506116c5602084016114f5565b90509250929050565b600080600080606085870312156116e457600080fd5b843593506116f4602086016114f5565b9250604085013567ffffffffffffffff8082111561171157600080fd5b818701915087601f83011261172557600080fd5b81358181111561173457600080fd5b88602082850101111561174657600080fd5b95989497505060200194505050565b600181811c9082168061176957607f821691505b60208210810361178957634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156117a157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610368576103686117a8565b6000826117f257634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b805160208083015191908110156117895760001960209190910360031b1b16919050565b80820180821115610368576103686117a8565b81810381811115610368576103686117a8565b634e487b7160e01b600052602160045260246000fd5b601f821115610b3a57600081815260208120601f850160051c810160208610156118945750805b601f850160051c820191505b818110156118b3578281556001016118a0565b505050505050565b815167ffffffffffffffff8111156118d5576118d56117f7565b6118e9816118e38454611755565b8461186d565b602080601f83116001811461191e57600084156119065750858301515b600019600386901b1c1916600185901b1785556118b3565b600085815260208120601f198616915b8281101561194d5788860151825594840194600190910190840161192e565b508582101561196b5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2500a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100a26469706673582212202c919c3c39555171bc248af6caf32708917ece79f8ffd79dbf6cb12735e6648f64736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806399530b061161007157806399530b061461023b578063a9059cbb14610243578063d505accf14610256578063dd62ed3e1461026b578063e209b6461461027e57600080fd5b806370a08231146101f25780637ecebe001461020557806384b0196e1461021857806395d89b411461023357600080fd5b80632d255471116100de5780632d2554711461017a578063313ce567146101b45780633644e515146101c35780635c2f8aa0146101cb57600080fd5b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015157806323b872dd14610167575b600080fd5b610118610291565b60405161012591906114db565b60405180910390f35b61014161013c366004611511565b610354565b6040519015158152602001610125565b61015961036e565b604051908152602001610125565b61014161017536600461153b565b61048c565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2503546040516001600160a01b039091168152602001610125565b60405160128152602001610125565b6101596104b0565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db250454610159565b610159610200366004611577565b6104bf565b610159610213366004611577565b6105e4565b610220610621565b6040516101259796959493929190611592565b6101186106d2565b6101596106f7565b610141610251366004611511565b610782565b610269610264366004611628565b610790565b005b61015961027936600461169b565b6108e9565b61026961028c3660046116ce565b610921565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2501805460609160008051602061197c833981519152916102d090611755565b80601f01602080910402602001604051908101604052809291908181526020018280546102fc90611755565b80156103495780601f1061031e57610100808354040283529160200191610349565b820191906000526020600020905b81548152906001019060200180831161032c57829003601f168201915b505050505091505090565b600033610362818585610b2d565b60019150505b92915050565b60008060008051602061197c833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa1580156103de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610402919061178f565b600384015460405163bd85b03960e01b8152600481018590526001600160a01b039091169063bd85b03990602401602060405180830381865afa15801561044d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610471919061178f565b61047b91906117be565b61048591906117d5565b9250505090565b60003361049a858285610b3f565b6104a5858585610ba5565b506001949350505050565b60006104ba610c04565b905090565b60008060008051602061197c833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa15801561052f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610553919061178f565b6003840154604051627eeac760e11b81526001600160a01b038881166004830152602482018690529091169062fdd58e90604401602060405180830381865afa1580156105a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c8919061178f565b6105d291906117be565b6105dc91906117d5565b949350505050565b6001600160a01b03811660009081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006020526040812054610368565b6000606080828080838160008051602061199c833981519152805490915015801561064e57506001810154155b6106975760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064015b60405180910390fd5b61069f610c0e565b6106a7610c26565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6060600060008051602061197c8339815191525b90508060020180546102d090611755565b60008060008051602061197c833981519152600381015460048083015460405163f759cc3b60e01b8152918201529192506001600160a01b03169063f759cc3b90602401602060405180830381865afa158015610758573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077c919061178f565b91505090565b600033610362818585610ba5565b834211156107b45760405163313c898160e11b81526004810185905260240161068e565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108208c6001600160a01b031660009081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061087b82610c65565b9050600061088b82878787610c92565b9050896001600160a01b0316816001600160a01b0316146108d2576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161068e565b6108dd8a8a8a610b2d565b50505050505050505050565b6001600160a01b03918216600090815260008051602061197c8339815191526020908152604080832093909416825291909152205490565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156109675750825b905060008267ffffffffffffffff1660011480156109845750303b155b905081158015610992575080155b156109b05760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156109da57845460ff60401b1916600160401b1785555b6000610a1e88888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925060209150610cc09050565b610a279061180d565b60001c9050610adb8a8a610a758b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060209250889150610cc09050565b610ad68c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610abc925089915060209050611831565b610ac7886020611831565b610ad1908f611844565b610cc0565b610dcd565b508315610b2257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b610b3a8383836001610e0c565b505050565b6000610b4b84846108e9565b90506000198114610b9f5781811015610b9057604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161068e565b610b9f84848484036000610e0c565b50505050565b6001600160a01b038316610bcf57604051634b637e8f60e11b81526000600482015260240161068e565b6001600160a01b038216610bf95760405163ec442f0560e01b81526000600482015260240161068e565b610b3a838383610ef0565b60006104ba6110b6565b6060600060008051602061199c8339815191526106e6565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103805460609160008051602061199c833981519152916102d090611755565b6000610368610c72610c04565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600080610ca48888888861112a565b925092509250610cb482826111f9565b50909695505050505050565b606081610cce81601f611831565b1015610d0d5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640161068e565b610d178284611831565b84511015610d5b5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640161068e565b606082158015610d7a5760405191506000825260208201604052610dc4565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610db3578051835260209283019201610d9b565b5050858452601f01601f1916604052505b50949350505050565b610dd56112b6565b610df882604051806040016040528060018152602001603160f81b815250611301565b610e0484848484611362565b610b9f6113df565b60008051602061197c8339815191526001600160a01b038516610e455760405163e602df0560e01b81526000600482015260240161068e565b6001600160a01b038416610e6f57604051634a1406b160e11b81526000600482015260240161068e565b6001600160a01b038086166000908152602083815260408083209388168352929052208390558115610ee957836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ee091815260200190565b60405180910390a35b5050505050565b60008051602061197c8339815191526000610f0a856104bf565b905082811015610f465760405163391434e360e21b81526001600160a01b0386166004820152602481018290526044810184905260640161068e565b600482810154600384015460405163f759cc3b60e01b815292830182905290916000916001600160a01b03169063f759cc3b90602401602060405180830381865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd919061178f565b610fcf670de0b6b3a7640000876117be565b610fd991906117d5565b6003850154604051637921219560e11b81526001600160a01b038a811660048301528981166024830152604482018690526064820184905260a06084830152600060a483015292935091169063f242432a9060c401600060405180830381600087803b15801561104857600080fd5b505af115801561105c573d6000803e3d6000fd5b50505050856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516110a591815260200190565b60405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6110e16113e7565b6110e9611451565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561116557506000915060039050826111ef565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156111b9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111e5575060009250600191508290506111ef565b9250600091508190505b9450945094915050565b600082600381111561120d5761120d611857565b03611216575050565b600182600381111561122a5761122a611857565b036112485760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561125c5761125c611857565b0361127d5760405163fce698f760e01b81526004810182905260240161068e565b600382600381111561129157611291611857565b036112b2576040516335e2f38360e21b81526004810182905260240161068e565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166112ff57604051631afcd79f60e31b815260040160405180910390fd5b565b6113096112b6565b60008051602061199c8339815191527fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10261134384826118bb565b506003810161135283826118bb565b5060008082556001909101555050565b61136a6112b6565b60008051602061197c8339815191527f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db25016113a484826118bb565b50600281016113b383826118bb565b506003810180546001600160a01b0319166001600160a01b039590951694909417909355505060040155565b6112ff6112b6565b600060008051602061199c83398151915281611401610c0e565b80519091501561141957805160209091012092915050565b81548015611428579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b600060008051602061199c8339815191528161146b610c26565b80519091501561148357805160209091012092915050565b60018201548015611428579392505050565b6000815180845260005b818110156114bb5760208185018101518683018201520161149f565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006114ee6020830184611495565b9392505050565b80356001600160a01b038116811461150c57600080fd5b919050565b6000806040838503121561152457600080fd5b61152d836114f5565b946020939093013593505050565b60008060006060848603121561155057600080fd5b611559846114f5565b9250611567602085016114f5565b9150604084013590509250925092565b60006020828403121561158957600080fd5b6114ee826114f5565b60ff60f81b881681526000602060e0818401526115b260e084018a611495565b83810360408501526115c4818a611495565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015611616578351835292840192918401916001016115fa565b50909c9b505050505050505050505050565b600080600080600080600060e0888a03121561164357600080fd5b61164c886114f5565b965061165a602089016114f5565b95506040880135945060608801359350608088013560ff8116811461167e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156116ae57600080fd5b6116b7836114f5565b91506116c5602084016114f5565b90509250929050565b600080600080606085870312156116e457600080fd5b843593506116f4602086016114f5565b9250604085013567ffffffffffffffff8082111561171157600080fd5b818701915087601f83011261172557600080fd5b81358181111561173457600080fd5b88602082850101111561174657600080fd5b95989497505060200194505050565b600181811c9082168061176957607f821691505b60208210810361178957634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156117a157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610368576103686117a8565b6000826117f257634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b805160208083015191908110156117895760001960209190910360031b1b16919050565b80820180821115610368576103686117a8565b81810381811115610368576103686117a8565b634e487b7160e01b600052602160045260246000fd5b601f821115610b3a57600081815260208120601f850160051c810160208610156118945750805b601f850160051c820191505b818110156118b3578281556001016118a0565b505050505050565b815167ffffffffffffffff8111156118d5576118d56117f7565b6118e9816118e38454611755565b8461186d565b602080601f83116001811461191e57600084156119065750858301515b600019600386901b1c1916600185901b1785556118b3565b600085815260208120601f198616915b8281101561194d5788860151825594840194600190910190840161192e565b508582101561196b5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2500a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100a26469706673582212202c919c3c39555171bc248af6caf32708917ece79f8ffd79dbf6cb12735e6648f64736f6c63430008140033", + "solcInputHash": "983f26216548ae9c38be8d3a1167f02e", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSpender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"ERC2612ExpiredSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC2612InvalidSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"currentNonce\",\"type\":\"uint256\"}],\"name\":\"InvalidAccountNonce\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC1155\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC1155_ID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id_\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gETH_\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pricePerShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"differences between ERC20RebasePermitMiddleware and Openzeppelin's implementation of ERC20PermitUpgradable is: -> using ERC20Middleware instead of ERC20Upgradeable -> added initializeImplementation of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in https://eips.ethereum.org/EIPS/eip-2612[ERC-2612]. Adds the {permit} method, which can be used to change an account's ERC-20 allowance (see {IERC20-allowance}) by presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't need to send a transaction, and thus is not required to hold Ether at all.\",\"errors\":{\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"ERC20InsufficientAllowance(address,uint256,uint256)\":[{\"details\":\"Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\",\"params\":{\"allowance\":\"Amount of tokens a `spender` is allowed to operate with.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC20InsufficientBalance(address,uint256,uint256)\":[{\"details\":\"Indicates an error related to the current `balance` of a `sender`. Used in transfers.\",\"params\":{\"balance\":\"Current balance for the interacting account.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC20InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC20InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC20InvalidSpender(address)\":[{\"details\":\"Indicates a failure with the `spender` to be approved. Used in approvals.\",\"params\":{\"spender\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC2612ExpiredSignature(uint256)\":[{\"details\":\"Permit deadline has expired.\"}],\"ERC2612InvalidSigner(address,address)\":[{\"details\":\"Mismatched signature.\"}],\"InvalidAccountNonce(address,uint256)\":[{\"details\":\"The nonce used for an `account` is not the expected current nonce.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"EIP712DomainChanged()\":{\"details\":\"MAY be emitted to signal that the domain could have changed.\"},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\"},\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the value of tokens owned by `account`.\"},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\"},\"decimals()\":{\"details\":\"Returns the decimals places of the token.\"},\"eip712Domain()\":{\"details\":\"See {IERC-5267}.\"},\"initialize(uint256,address,bytes)\":{\"details\":\"Sets the values for {name} and {symbol}.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"Returns the current nonce for `owner`. This value must be included whenever a signature is generated for {permit}. Every successful call to {permit} increases ``owner``'s nonce by one. This prevents a signature from being used multiple times.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Sets `value` as the allowance of `spender` over ``owner``'s tokens, given ``owner``'s signed approval. IMPORTANT: The same issues {IERC20-approve} has related to transaction ordering also apply here. Emits an {Approval} event. Requirements: - `spender` cannot be the zero address. - `deadline` must be a timestamp in the future. - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` over the EIP712-formatted function arguments. - the signature must use ``owner``'s current nonce (see {nonces}). For more information on the signature format, see the https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP section]. CAUTION: See Security Considerations above.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token.\"},\"totalSupply()\":{\"details\":\"Returns the value of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/middlewares/ERC20RebasePermitMiddleware.sol\":\"ERC20RebasePermitMiddleware\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Storage of the initializable contract.\\n *\\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\\n * when using with upgradeable contracts.\\n *\\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\\n */\\n struct InitializableStorage {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n uint64 _initialized;\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool _initializing;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Initializable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\\n\\n /**\\n * @dev The contract is already initialized.\\n */\\n error InvalidInitialization();\\n\\n /**\\n * @dev The contract is not initializing.\\n */\\n error NotInitializing();\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint64 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\\n * production.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n // Cache values to avoid duplicated sloads\\n bool isTopLevelCall = !$._initializing;\\n uint64 initialized = $._initialized;\\n\\n // Allowed calls:\\n // - initialSetup: the contract is not in the initializing state and no previous version was\\n // initialized\\n // - construction: the contract is initialized at version 1 (no reininitialization) and the\\n // current contract is just being deployed\\n bool initialSetup = initialized == 0 && isTopLevelCall;\\n bool construction = initialized == 1 && address(this).code.length == 0;\\n\\n if (!initialSetup && !construction) {\\n revert InvalidInitialization();\\n }\\n $._initialized = 1;\\n if (isTopLevelCall) {\\n $._initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n $._initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint64 version) {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing || $._initialized >= version) {\\n revert InvalidInitialization();\\n }\\n $._initialized = version;\\n $._initializing = true;\\n _;\\n $._initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n _checkInitializing();\\n _;\\n }\\n\\n /**\\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\\n */\\n function _checkInitializing() internal view virtual {\\n if (!_isInitializing()) {\\n revert NotInitializing();\\n }\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing) {\\n revert InvalidInitialization();\\n }\\n if ($._initialized != type(uint64).max) {\\n $._initialized = type(uint64).max;\\n emit Initialized(type(uint64).max);\\n }\\n }\\n\\n /**\\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n */\\n function _getInitializedVersion() internal view returns (uint64) {\\n return _getInitializableStorage()._initialized;\\n }\\n\\n /**\\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _getInitializableStorage()._initializing;\\n }\\n\\n /**\\n * @dev Returns a pointer to the storage namespace.\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\\n assembly {\\n $.slot := INITIALIZABLE_STORAGE\\n }\\n }\\n}\\n\",\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x72d47aebad24c59f6e78d0c3e827440173419a333fd910a37fa1e532c98f7e4c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/NoncesUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Nonces.sol)\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides tracking nonces for addresses. Nonces will only increment.\\n */\\nabstract contract NoncesUpgradeable is Initializable {\\n /**\\n * @dev The nonce used for an `account` is not the expected current nonce.\\n */\\n error InvalidAccountNonce(address account, uint256 currentNonce);\\n\\n /// @custom:storage-location erc7201:openzeppelin.storage.Nonces\\n struct NoncesStorage {\\n mapping(address account => uint256) _nonces;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Nonces\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant NoncesStorageLocation = 0x5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb00;\\n\\n function _getNoncesStorage() private pure returns (NoncesStorage storage $) {\\n assembly {\\n $.slot := NoncesStorageLocation\\n }\\n }\\n\\n function __Nonces_init() internal onlyInitializing {\\n }\\n\\n function __Nonces_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev Returns the next unused nonce for an address.\\n */\\n function nonces(address owner) public view virtual returns (uint256) {\\n NoncesStorage storage $ = _getNoncesStorage();\\n return $._nonces[owner];\\n }\\n\\n /**\\n * @dev Consumes a nonce.\\n *\\n * Returns the current value and increments nonce.\\n */\\n function _useNonce(address owner) internal virtual returns (uint256) {\\n NoncesStorage storage $ = _getNoncesStorage();\\n // For each account, the nonce has an initial value of 0, can only be incremented by one, and cannot be\\n // decremented or reset. This guarantees that the nonce never overflows.\\n unchecked {\\n // It is important to do x++ and not ++x here.\\n return $._nonces[owner]++;\\n }\\n }\\n\\n /**\\n * @dev Same as {_useNonce} but checking that `nonce` is the next valid for `owner`.\\n */\\n function _useCheckedNonce(address owner, uint256 nonce) internal virtual {\\n uint256 current = _useNonce(owner);\\n if (nonce != current) {\\n revert InvalidAccountNonce(owner, current);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x778f4a1546a1c6c726ecc8e2348a2789690fb8f26e12bd9d89537669167b79a4\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {MessageHashUtils} from \\\"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\\\";\\nimport {IERC5267} from \\\"@openzeppelin/contracts/interfaces/IERC5267.sol\\\";\\nimport {Initializable} from \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose\\n * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract\\n * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to\\n * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\\n * separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the\\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\\n */\\nabstract contract EIP712Upgradeable is Initializable, IERC5267 {\\n bytes32 private constant TYPE_HASH =\\n keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n\\n /// @custom:storage-location erc7201:openzeppelin.storage.EIP712\\n struct EIP712Storage {\\n /// @custom:oz-renamed-from _HASHED_NAME\\n bytes32 _hashedName;\\n /// @custom:oz-renamed-from _HASHED_VERSION\\n bytes32 _hashedVersion;\\n\\n string _name;\\n string _version;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.EIP712\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant EIP712StorageLocation = 0xa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100;\\n\\n function _getEIP712Storage() private pure returns (EIP712Storage storage $) {\\n assembly {\\n $.slot := EIP712StorageLocation\\n }\\n }\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n function __EIP712_init(string memory name, string memory version) internal onlyInitializing {\\n __EIP712_init_unchained(name, version);\\n }\\n\\n function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {\\n EIP712Storage storage $ = _getEIP712Storage();\\n $._name = name;\\n $._version = version;\\n\\n // Reset prior values in storage if upgrading\\n $._hashedName = 0;\\n $._hashedVersion = 0;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n return _buildDomainSeparator();\\n }\\n\\n function _buildDomainSeparator() private view returns (bytes32) {\\n return keccak256(abi.encode(TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash(), block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n\\n /**\\n * @dev See {IERC-5267}.\\n */\\n function eip712Domain()\\n public\\n view\\n virtual\\n returns (\\n bytes1 fields,\\n string memory name,\\n string memory version,\\n uint256 chainId,\\n address verifyingContract,\\n bytes32 salt,\\n uint256[] memory extensions\\n )\\n {\\n EIP712Storage storage $ = _getEIP712Storage();\\n // If the hashed name and version in storage are non-zero, the contract hasn't been properly initialized\\n // and the EIP712 domain is not reliable, as it will be missing name and version.\\n require($._hashedName == 0 && $._hashedVersion == 0, \\\"EIP712: Uninitialized\\\");\\n\\n return (\\n hex\\\"0f\\\", // 01111\\n _EIP712Name(),\\n _EIP712Version(),\\n block.chainid,\\n address(this),\\n bytes32(0),\\n new uint256[](0)\\n );\\n }\\n\\n /**\\n * @dev The name parameter for the EIP712 domain.\\n *\\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n * are a concern.\\n */\\n function _EIP712Name() internal view virtual returns (string memory) {\\n EIP712Storage storage $ = _getEIP712Storage();\\n return $._name;\\n }\\n\\n /**\\n * @dev The version parameter for the EIP712 domain.\\n *\\n * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n * are a concern.\\n */\\n function _EIP712Version() internal view virtual returns (string memory) {\\n EIP712Storage storage $ = _getEIP712Storage();\\n return $._version;\\n }\\n\\n /**\\n * @dev The hash of the name parameter for the EIP712 domain.\\n *\\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Name` instead.\\n */\\n function _EIP712NameHash() internal view returns (bytes32) {\\n EIP712Storage storage $ = _getEIP712Storage();\\n string memory name = _EIP712Name();\\n if (bytes(name).length > 0) {\\n return keccak256(bytes(name));\\n } else {\\n // If the name is empty, the contract may have been upgraded without initializing the new storage.\\n // We return the name hash in storage if non-zero, otherwise we assume the name is empty by design.\\n bytes32 hashedName = $._hashedName;\\n if (hashedName != 0) {\\n return hashedName;\\n } else {\\n return keccak256(\\\"\\\");\\n }\\n }\\n }\\n\\n /**\\n * @dev The hash of the version parameter for the EIP712 domain.\\n *\\n * NOTE: In previous versions this function was virtual. In this version you should override `_EIP712Version` instead.\\n */\\n function _EIP712VersionHash() internal view returns (bytes32) {\\n EIP712Storage storage $ = _getEIP712Storage();\\n string memory version = _EIP712Version();\\n if (bytes(version).length > 0) {\\n return keccak256(bytes(version));\\n } else {\\n // If the version is empty, the contract may have been upgraded without initializing the new storage.\\n // We return the version hash in storage if non-zero, otherwise we assume the version is empty by design.\\n bytes32 hashedVersion = $._hashedVersion;\\n if (hashedVersion != 0) {\\n return hashedVersion;\\n } else {\\n return keccak256(\\\"\\\");\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x85462422a22578744581e012e9aa0a391958cb360288b0b63f29bf0431d70327\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC5267.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)\\n\\npragma solidity ^0.8.20;\\n\\ninterface IERC5267 {\\n /**\\n * @dev MAY be emitted to signal that the domain could have changed.\\n */\\n event EIP712DomainChanged();\\n\\n /**\\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\\n * signature.\\n */\\n function eip712Domain()\\n external\\n view\\n returns (\\n bytes1 fields,\\n string memory name,\\n string memory version,\\n uint256 chainId,\\n address verifyingContract,\\n bytes32 salt,\\n uint256[] memory extensions\\n );\\n}\\n\",\"keccak256\":\"0x92aa1df62dc3d33f1656d63bede0923e0df0b706ad4137c8b10b0a8fe549fd92\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard ERC20 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\\n */\\ninterface IERC20Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC20InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC20InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC20InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC20InvalidSpender(address spender);\\n}\\n\\n/**\\n * @dev Standard ERC721 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\\n */\\ninterface IERC721Errors {\\n /**\\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\\n * Used in balance queries.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721InvalidOwner(address owner);\\n\\n /**\\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721NonexistentToken(uint256 tokenId);\\n\\n /**\\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param tokenId Identifier number of a token.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC721InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC721InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC721InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC721InvalidOperator(address operator);\\n}\\n\\n/**\\n * @dev Standard ERC1155 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\\n */\\ninterface IERC1155Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC1155InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC1155InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC1155MissingApprovalForAll(address operator, address owner);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC1155InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC1155InvalidOperator(address operator);\\n\\n /**\\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\\n * Used in batch transfers.\\n * @param idsLength Length of the array of token identifiers\\n * @param valuesLength Length of the array of token amounts\\n */\\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\\n}\\n\",\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\\n */\\ninterface IERC1155 is IERC165 {\\n /**\\n * @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.\\n */\\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n /**\\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\\n * transfers.\\n */\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] values\\n );\\n\\n /**\\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\\n * `approved`.\\n */\\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\\n\\n /**\\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\\n *\\n * If an {URI} event was emitted for `id`, the standard\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\\n * returned by {IERC1155MetadataURI-uri}.\\n */\\n event URI(string value, uint256 indexed id);\\n\\n /**\\n * @dev Returns the value of tokens of token type `id` owned by `account`.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function balanceOf(address account, uint256 id) external view returns (uint256);\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\\n *\\n * Requirements:\\n *\\n * - `accounts` and `ids` must have the same length.\\n */\\n function balanceOfBatch(\\n address[] calldata accounts,\\n uint256[] calldata ids\\n ) external view returns (uint256[] memory);\\n\\n /**\\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\\n *\\n * Emits an {ApprovalForAll} event.\\n *\\n * Requirements:\\n *\\n * - `operator` cannot be the caller.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\\n *\\n * See {setApprovalForAll}.\\n */\\n function isApprovedForAll(address account, address operator) external view returns (bool);\\n\\n /**\\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`.\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155Received} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\\n *\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `values` must have the same length.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external;\\n}\\n\",\"keccak256\":\"0xe64b3445a3f638890af7ad92464cd18f1f202a2f5a7ed42dabf74317bae43303\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/extensions/IERC1155MetadataURI.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC1155} from \\\"../IERC1155.sol\\\";\\n\\n/**\\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\\n */\\ninterface IERC1155MetadataURI is IERC1155 {\\n /**\\n * @dev Returns the URI for token type `id`.\\n *\\n * If the `\\\\{id\\\\}` substring is present in the URI, it must be replaced by\\n * clients with the actual token type ID.\\n */\\n function uri(uint256 id) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xe92b5e199b963d108ad6e06feeede151ba23849e0d064956535489ff967ffe68\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC20} from \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0xaa761817f6cd7892fcf158b3c776b34551cde36f48ff9703d53898bc45a94ea2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * ==== Security Considerations\\n *\\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\\n * generally recommended is:\\n *\\n * ```solidity\\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\\n * doThing(..., value);\\n * }\\n *\\n * function doThing(..., uint256 value) public {\\n * token.safeTransferFrom(msg.sender, address(this), value);\\n * ...\\n * }\\n * ```\\n *\\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\\n * {SafeERC20-safeTransferFrom}).\\n *\\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\\n * contracts should have entry points that don't rely on permit.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n *\\n * CAUTION: See Security Considerations above.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x6008dabfe393240d73d7dd7688033f72740d570aa422254d29a7dce8568f3aff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Math} from \\\"./math/Math.sol\\\";\\nimport {SignedMath} from \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant HEX_DIGITS = \\\"0123456789abcdef\\\";\\n uint8 private constant ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev The `value` string doesn't fit in the specified `length`.\\n */\\n error StringsInsufficientHexLength(uint256 value, uint256 length);\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toStringSigned(int256 value) internal pure returns (string memory) {\\n return string.concat(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value)));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n uint256 localValue = value;\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = HEX_DIGITS[localValue & 0xf];\\n localValue >>= 4;\\n }\\n if (localValue != 0) {\\n revert StringsInsufficientHexLength(value, length);\\n }\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\\n * representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS\\n }\\n\\n /**\\n * @dev The signature derives the `address(0)`.\\n */\\n error ECDSAInvalidSignature();\\n\\n /**\\n * @dev The signature has an invalid length.\\n */\\n error ECDSAInvalidSignatureLength(uint256 length);\\n\\n /**\\n * @dev The signature has an S value that is in the upper half order.\\n */\\n error ECDSAInvalidSignatureS(bytes32 s);\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\\n * return address(0) without also returning an error description. Errors are documented using an enum (error type)\\n * and a bytes32 providing additional information about the error.\\n *\\n * If no error is returned, then the address can be used for verification purposes.\\n *\\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\\n _throwError(error, errorArg);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n */\\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) {\\n unchecked {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n // We do not check for an overflow here since the shift operation results in 0 or 1.\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n */\\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\\n _throwError(error, errorArg);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError, bytes32) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS, s);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature, bytes32(0));\\n }\\n\\n return (signer, RecoverError.NoError, bytes32(0));\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\\n _throwError(error, errorArg);\\n return recovered;\\n }\\n\\n /**\\n * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\\n */\\n function _throwError(RecoverError error, bytes32 errorArg) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert ECDSAInvalidSignature();\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert ECDSAInvalidSignatureLength(uint256(errorArg));\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert ECDSAInvalidSignatureS(errorArg);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xeed0a08b0b091f528356cbc7245891a4c748682d4f6a18055e8e6ca77d12a6cf\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MessageHashUtils.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Strings} from \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\\n *\\n * The library provides methods for generating a hash of a message that conforms to the\\n * https://eips.ethereum.org/EIPS/eip-191[EIP 191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\\n * specifications.\\n */\\nlibrary MessageHashUtils {\\n /**\\n * @dev Returns the keccak256 digest of an EIP-191 signed data with version\\n * `0x45` (`personal_sign` messages).\\n *\\n * The digest is calculated by prefixing a bytes32 `messageHash` with\\n * `\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\"` and hashing the result. It corresponds with the\\n * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.\\n *\\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\\n * keccak256, although any bytes32 value can be safely used because the final digest will\\n * be re-hashed.\\n *\\n * See {ECDSA-recover}.\\n */\\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\") // 32 is the bytes-length of messageHash\\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\\n }\\n }\\n\\n /**\\n * @dev Returns the keccak256 digest of an EIP-191 signed data with version\\n * `0x45` (`personal_sign` messages).\\n *\\n * The digest is calculated by prefixing an arbitrary `message` with\\n * `\\\"\\\\x19Ethereum Signed Message:\\\\n\\\" + len(message)` and hashing the result. It corresponds with the\\n * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.\\n *\\n * See {ECDSA-recover}.\\n */\\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\\n return\\n keccak256(bytes.concat(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", bytes(Strings.toString(message.length)), message));\\n }\\n\\n /**\\n * @dev Returns the keccak256 digest of an EIP-191 signed data with version\\n * `0x00` (data with intended validator).\\n *\\n * The digest is calculated by prefixing an arbitrary `data` with `\\\"\\\\x19\\\\x00\\\"` and the intended\\n * `validator` address. Then hashing the result.\\n *\\n * See {ECDSA-recover}.\\n */\\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(hex\\\"19_00\\\", validator, data));\\n }\\n\\n /**\\n * @dev Returns the keccak256 digest of an EIP-712 typed data (EIP-191 version `0x01`).\\n *\\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\\n * `\\\\x19\\\\x01` and hashing the result. It corresponds to the hash signed by the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\\n *\\n * See {ECDSA-recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40)\\n mstore(ptr, hex\\\"19_01\\\")\\n mstore(add(ptr, 0x02), domainSeparator)\\n mstore(add(ptr, 0x22), structHash)\\n digest := keccak256(ptr, 0x42)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xba333517a3add42cd35fe877656fc3dfcc9de53baa4f3aabbd6d12a92e4ea435\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Muldiv operation overflow.\\n */\\n error MathOverflowedMulDiv();\\n\\n enum Rounding {\\n Floor, // Toward negative infinity\\n Ceil, // Toward positive infinity\\n Trunc, // Toward zero\\n Expand // Away from zero\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds towards infinity instead\\n * of rounding towards zero.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (b == 0) {\\n // Guarantee the same behavior as in a regular Solidity division.\\n return a / b;\\n }\\n\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n * denominator == 0.\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n * Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0 = x * y; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n if (denominator <= prod1) {\\n revert MathOverflowedMulDiv();\\n }\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n uint256 twos = denominator & (0 - denominator);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\\n // works in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n * towards zero.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n */\\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n return uint8(rounding) % 2 == 1;\\n }\\n}\\n\",\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72\",\"license\":\"MIT\"},\"contracts/globals/macros.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n// no floats in solidity. If needed, PERCENTAGE_DENOMINATOR always represents \\\"1\\\" (100%)\\nuint256 constant PERCENTAGE_DENOMINATOR = 1e10;\\n\\nuint256 constant gETH_DENOMINATOR = 1e18;\\n\",\"keccak256\":\"0xdcbe1faa8712a653a87f4e185afb598388c2bbe62a750989df57afeac2848168\",\"license\":\"BUSL-1.1\"},\"contracts/helpers/BytesLib.sol\":{\"content\":\"// SPDX-License-Identifier: Unlicense\\n/*\\n * @title Solidity Bytes Arrays Utils\\n * @author Gon\\u00e7alo S\\u00e1 \\n *\\n * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.\\n * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.\\n */\\npragma solidity =0.8.20;\\n\\nlibrary BytesLib {\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n ) internal pure returns (bytes memory) {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(\\n 0x40,\\n and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n )\\n )\\n }\\n\\n return tempBytes;\\n }\\n\\n function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\\n assembly {\\n // Read the first 32 bytes of _preBytes storage, which is the length\\n // of the array. (We don't need to use the offset into the slot\\n // because arrays use the entire slot.)\\n let fslot := sload(_preBytes.slot)\\n // Arrays of 31 bytes or less have an even value in their slot,\\n // while longer arrays have an odd value. The actual length is\\n // the slot divided by two for odd values, and the lowest order\\n // byte divided by two for even values.\\n // If the slot is even, bitwise and the slot with 255 and divide by\\n // two to get the length. If the slot is odd, bitwise and the slot\\n // with -1 and divide by two.\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n let newlength := add(slength, mlength)\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n switch add(lt(slength, 32), lt(newlength, 32))\\n case 2 {\\n // Since the new array still fits in the slot, we just need to\\n // update the contents of the slot.\\n // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\\n sstore(\\n _preBytes.slot,\\n // all the modifications to the slot are inside this\\n // next block\\n add(\\n // we can just add to the slot contents because the\\n // bytes we want to change are the LSBs\\n fslot,\\n add(\\n mul(\\n div(\\n // load the bytes from memory\\n mload(add(_postBytes, 0x20)),\\n // zero all bytes to the right\\n exp(0x100, sub(32, mlength))\\n ),\\n // and now shift left the number of bytes to\\n // leave space for the length in the slot\\n exp(0x100, sub(32, newlength))\\n ),\\n // increase length by the double of the memory\\n // bytes length\\n mul(mlength, 2)\\n )\\n )\\n )\\n }\\n case 1 {\\n // The stored value fits in the slot, but the combined value\\n // will exceed it.\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // The contents of the _postBytes array start 32 bytes into\\n // the structure. Our first read should obtain the `submod`\\n // bytes that can fit into the unused space in the last word\\n // of the stored array. To get this, we read 32 bytes starting\\n // from `submod`, so the data we read overlaps with the array\\n // contents by `submod` bytes. Masking the lowest-order\\n // `submod` bytes allows us to add that value directly to the\\n // stored value.\\n\\n let submod := sub(32, slength)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(\\n sc,\\n add(\\n and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00),\\n and(mload(mc), mask)\\n )\\n )\\n\\n for {\\n mc := add(mc, 0x20)\\n sc := add(sc, 1)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n default {\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n // Start copying to the last used word of the stored array.\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // Copy over the first `submod` bytes of the new data as in\\n // case 1 above.\\n let slengthmod := mod(slength, 32)\\n let mlengthmod := mod(mlength, 32)\\n let submod := sub(32, slengthmod)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(sc, add(sload(sc), and(mload(mc), mask)))\\n\\n for {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n }\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_bytes.length >= _start + 1, \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {\\n require(_bytes.length >= _start + 2, \\\"toUint16_outOfBounds\\\");\\n uint16 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x2), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {\\n require(_bytes.length >= _start + 4, \\\"toUint32_outOfBounds\\\");\\n uint32 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x4), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {\\n require(_bytes.length >= _start + 8, \\\"toUint64_outOfBounds\\\");\\n uint64 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x8), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {\\n require(_bytes.length >= _start + 12, \\\"toUint96_outOfBounds\\\");\\n uint96 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0xc), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {\\n require(_bytes.length >= _start + 16, \\\"toUint128_outOfBounds\\\");\\n uint128 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x10), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {\\n require(_bytes.length >= _start + 32, \\\"toUint256_outOfBounds\\\");\\n uint256 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {\\n require(_bytes.length >= _start + 32, \\\"toBytes32_outOfBounds\\\");\\n bytes32 tempBytes32;\\n\\n assembly {\\n tempBytes32 := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempBytes32;\\n }\\n\\n function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\\n bool success = true;\\n\\n assembly {\\n let length := mload(_preBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(length, mload(_postBytes))\\n case 1 {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n let mc := add(_preBytes, 0x20)\\n let end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n } eq(add(lt(mc, end), cb), 2) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // if any of these checks fails then arrays are not equal\\n if iszero(eq(mload(mc), mload(cc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function equalStorage(\\n bytes storage _preBytes,\\n bytes memory _postBytes\\n ) internal view returns (bool) {\\n bool success = true;\\n\\n assembly {\\n // we know _preBytes_offset is 0\\n let fslot := sload(_preBytes.slot)\\n // Decode the length of the stored array like in concatStorage().\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(slength, mlength)\\n case 1 {\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n if iszero(iszero(slength)) {\\n switch lt(slength, 32)\\n case 1 {\\n // blank the last byte which is the length\\n fslot := mul(div(fslot, 0x100), 0x100)\\n\\n if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\\n // unsuccess:\\n success := 0\\n }\\n }\\n default {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := keccak256(0x0, 0x20)\\n\\n let mc := add(_postBytes, 0x20)\\n let end := add(mc, mlength)\\n\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n for {\\n\\n } eq(add(lt(mc, end), cb), 2) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n if iszero(eq(sload(sc), mload(mc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n}\\n\",\"keccak256\":\"0x4ee3f6ef85baa41794fc1519522f7c135becd0e267980eadc68dd643e52b59c7\",\"license\":\"Unlicense\"},\"contracts/interfaces/IgETH.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IERC1155PausableBurnableSupply} from \\\"./helpers/IERC1155PausableBurnableSupply.sol\\\";\\n\\ninterface IgETH is IERC1155PausableBurnableSupply {\\n function denominator() external view returns (uint256);\\n\\n function isMiddleware(address middleware, uint256 id) external view returns (bool);\\n\\n function setMiddleware(address middleware, uint256 id, bool isSet) external;\\n\\n function isAvoider(address account, uint256 id) external view returns (bool);\\n\\n function avoidMiddlewares(uint256 id, bool isAvoid) external;\\n\\n function pricePerShare(uint256 id) external view returns (uint256);\\n\\n function priceUpdateTimestamp(uint256 id) external view returns (uint256);\\n\\n function setPricePerShare(uint256 price, uint256 id) external;\\n\\n function transferUriSetterRole(address newUriSetter) external;\\n\\n function transferPauserRole(address newPauser) external;\\n\\n function transferMinterRole(address newMinter) external;\\n\\n function transferOracleRole(address newOracle) external;\\n\\n function transferMiddlewareManagerRole(address newMiddlewareManager) external;\\n}\\n\",\"keccak256\":\"0xa093b769e8ba42091d3db8a9e4ddc1be066f4aa92f61ee552983c22a0e9f29d8\",\"license\":\"MIT\"},\"contracts/interfaces/helpers/IERC1155PausableBurnableSupply.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/// @dev IERC1155 inherits IERC165\\nimport {IERC1155} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Errors} from \\\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\\\";\\n\\ninterface IERC1155Burnable is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function burn(address account, uint256 id, uint256 value) external;\\n\\n function burnBatch(address account, uint256[] memory ids, uint256[] memory values) external;\\n}\\n\\ninterface IERC1155Supply is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function totalSupply(uint256 id) external view returns (uint256);\\n\\n function exists(uint256 id) external view returns (bool);\\n}\\n\\ninterface IERC1155PausableBurnableSupply is IERC1155Burnable, IERC1155Supply {\\n function setURI(string memory newuri) external;\\n\\n function pause() external;\\n\\n function unpause() external;\\n\\n function mint(address account, uint256 id, uint256 amount, bytes memory data) external;\\n\\n function mintBatch(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) external;\\n}\\n\",\"keccak256\":\"0x8b0a02fdbc8d54c815d68e122f6869348217b5efd853c8b833c59d2053998ef0\",\"license\":\"MIT\"},\"contracts/interfaces/middlewares/IgETHMiddleware.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\ninterface IgETHMiddleware {\\n function initialize(uint256 id_, address erc1155_, bytes memory data) external;\\n\\n function ERC1155() external view returns (address);\\n\\n function ERC1155_ID() external view returns (uint256);\\n\\n function pricePerShare() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x5b94e7cf38487d607c720d311578fa0b777a75050113b3533b8e4e22fe6ab61c\",\"license\":\"MIT\"},\"contracts/middlewares/ERC20RebaseMiddleware.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n// external - interfaces\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport {IERC20Metadata} from \\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\";\\nimport {IERC20Errors} from \\\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\\\";\\n// external - contracts\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {ContextUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\\\";\\n// internal - globals\\nimport {gETH_DENOMINATOR} from \\\"../globals/macros.sol\\\";\\n// internal - interfaces\\nimport {IgETH} from \\\"../interfaces/IgETH.sol\\\";\\nimport {IgETHMiddleware} from \\\"../interfaces/middlewares/IgETHMiddleware.sol\\\";\\n// internal - libraries\\nimport {BytesLib} from \\\"../helpers/BytesLib.sol\\\";\\n\\n/**\\n * @notice Same as ERC20Middleware, but balances represent underlying balances, instead of ERC1155 balances.\\n * which means it represents the staked ether amount, instead of gETH amount.\\n *\\n * @dev This contract should only be used for user interaction when ERC1155 is not an option.\\n * @dev As a known bug, not all Transfer events are logged here. Please listen the underlying ERC1155 for the correct data.\\n *\\n * @dev differences between ERC20RebaseMiddleware and ERC20Middleware can be seen observed at:\\n * -> totalSupply, balanceOf, _update.\\n *\\n * diffchecker: https://www.diffchecker.com/VQPmW62g/\\n *\\n * @dev decimals is 18 onlyif erc1155.denominator = 1e18\\n */\\ncontract ERC20RebaseMiddleware is\\n Initializable,\\n ContextUpgradeable,\\n IgETHMiddleware,\\n IERC20,\\n IERC20Metadata,\\n IERC20Errors\\n{\\n /// @custom:storage-location erc7201:geode.storage.ERC20RebaseMiddleware\\n struct ERC20RebaseMiddlewareStorage {\\n // mapping(address account => uint256) _balances; -> use ERC1155\\n mapping(address account => mapping(address spender => uint256)) _allowances;\\n // uint256 _totalSupply; -> use ERC1155\\n string _name;\\n string _symbol;\\n IgETH ERC1155;\\n uint256 ERC1155_ID;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"geode.storage.ERC20RebaseMiddleware\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant ERC20RebaseMiddlewareStorageLocation =\\n 0x033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2500;\\n\\n function _getERC20RebaseMiddlewareStorage()\\n private\\n pure\\n returns (ERC20RebaseMiddlewareStorage storage $)\\n {\\n assembly {\\n $.slot := ERC20RebaseMiddlewareStorageLocation\\n }\\n }\\n\\n /// @custom:oz-upgrades-unsafe-allow constructor\\n constructor() {\\n _disableInitializers();\\n }\\n\\n function initialize(\\n uint256 id_,\\n address gETH_,\\n bytes calldata data\\n ) public virtual override initializer {\\n uint256 nameLen = uint256(bytes32(BytesLib.slice(data, 0, 32)));\\n __ERC20RebaseMiddleware_init(\\n id_,\\n gETH_,\\n string(BytesLib.slice(data, 32, nameLen)),\\n string(BytesLib.slice(data, 32 + nameLen, data.length - (32 + nameLen)))\\n );\\n }\\n\\n /**\\n * @dev Sets the values for {name} and {symbol} based on provided data:\\n * * First 32 bytes indicate the lenght of the name, one therefore can find out\\n * * which byte the name ends and symbol starts.\\n */\\n function __ERC20RebaseMiddleware_init(\\n uint256 id_,\\n address gETH_,\\n string memory name_,\\n string memory symbol_\\n ) internal onlyInitializing {\\n __ERC20RebaseMiddleware_init_unchained(id_, gETH_, name_, symbol_);\\n }\\n\\n function __ERC20RebaseMiddleware_init_unchained(\\n uint256 id_,\\n address gETH_,\\n string memory name_,\\n string memory symbol_\\n ) internal onlyInitializing {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n $._name = name_;\\n $._symbol = symbol_;\\n $.ERC1155 = IgETH(gETH_);\\n $.ERC1155_ID = id_;\\n }\\n\\n function name() public view virtual returns (string memory) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $._name;\\n }\\n\\n function symbol() public view virtual returns (string memory) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $._symbol;\\n }\\n\\n function ERC1155() public view virtual override returns (address) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return address($.ERC1155);\\n }\\n\\n function ERC1155_ID() public view virtual override returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $.ERC1155_ID;\\n }\\n\\n function pricePerShare() public view virtual override returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $.ERC1155.pricePerShare($.ERC1155_ID);\\n }\\n\\n function decimals() public view virtual returns (uint8) {\\n return 18;\\n }\\n\\n function totalSupply() public view virtual returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n\\n uint256 id = $.ERC1155_ID;\\n return ($.ERC1155.totalSupply(id) * $.ERC1155.pricePerShare(id)) / gETH_DENOMINATOR;\\n }\\n\\n function balanceOf(address account) public view virtual returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n\\n uint256 id = $.ERC1155_ID;\\n return ($.ERC1155.balanceOf(account, id) * $.ERC1155.pricePerShare(id)) / gETH_DENOMINATOR;\\n }\\n\\n function transfer(address to, uint256 value) public virtual returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, value);\\n return true;\\n }\\n\\n function allowance(address owner, address spender) public view virtual returns (uint256) {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n return $._allowances[owner][spender];\\n }\\n\\n function approve(address spender, uint256 value) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, value);\\n return true;\\n }\\n\\n function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, value);\\n _transfer(from, to, value);\\n return true;\\n }\\n\\n function _transfer(address from, address to, uint256 value) internal {\\n if (from == address(0)) {\\n revert ERC20InvalidSender(address(0));\\n }\\n if (to == address(0)) {\\n revert ERC20InvalidReceiver(address(0));\\n }\\n _update(from, to, value);\\n }\\n\\n function _update(address from, address to, uint256 value) internal virtual {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n\\n uint256 fromBalance = balanceOf(from);\\n if (fromBalance < value) {\\n revert ERC20InsufficientBalance(from, fromBalance, value);\\n }\\n\\n uint256 id = $.ERC1155_ID;\\n uint256 transferAmount = (value * gETH_DENOMINATOR) / $.ERC1155.pricePerShare(id);\\n $.ERC1155.safeTransferFrom(from, to, id, transferAmount, \\\"\\\");\\n\\n emit Transfer(from, to, value);\\n }\\n\\n function _approve(address owner, address spender, uint256 value) internal {\\n _approve(owner, spender, value, true);\\n }\\n\\n function _approve(\\n address owner,\\n address spender,\\n uint256 value,\\n bool emitEvent\\n ) internal virtual {\\n ERC20RebaseMiddlewareStorage storage $ = _getERC20RebaseMiddlewareStorage();\\n if (owner == address(0)) {\\n revert ERC20InvalidApprover(address(0));\\n }\\n if (spender == address(0)) {\\n revert ERC20InvalidSpender(address(0));\\n }\\n $._allowances[owner][spender] = value;\\n if (emitEvent) {\\n emit Approval(owner, spender, value);\\n }\\n }\\n\\n function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n if (currentAllowance < value) {\\n revert ERC20InsufficientAllowance(spender, currentAllowance, value);\\n }\\n unchecked {\\n _approve(owner, spender, currentAllowance - value, false);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc8b59b888cb81935865b18b53e59d1e479c29c702f7933d33399a662edbcfe64\",\"license\":\"MIT\"},\"contracts/middlewares/ERC20RebasePermitMiddleware.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Permit.sol)\\n\\npragma solidity ^0.8.20;\\n\\n// external - interfaces\\nimport {IERC20Permit} from \\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\\\";\\n// external - libraries\\nimport {ECDSA} from \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\n// external - contracts\\nimport {EIP712Upgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol\\\";\\nimport {NoncesUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/NoncesUpgradeable.sol\\\";\\n// internal - libraries\\nimport {BytesLib} from \\\"../helpers/BytesLib.sol\\\";\\n// internal - contracts\\nimport {ERC20RebaseMiddleware} from \\\"./ERC20RebaseMiddleware.sol\\\";\\n\\n/**\\n * @dev differences between ERC20RebasePermitMiddleware and Openzeppelin's implementation of ERC20PermitUpgradable is:\\n * -> using ERC20Middleware instead of ERC20Upgradeable\\n * -> added initialize\\n *\\n * @dev Implementation of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[ERC-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC-20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ncontract ERC20RebasePermitMiddleware is\\n ERC20RebaseMiddleware,\\n IERC20Permit,\\n EIP712Upgradeable,\\n NoncesUpgradeable\\n{\\n bytes32 private constant PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n\\n /**\\n * @dev Permit deadline has expired.\\n */\\n error ERC2612ExpiredSignature(uint256 deadline);\\n\\n /**\\n * @dev Mismatched signature.\\n */\\n error ERC2612InvalidSigner(address signer, address owner);\\n\\n ///@custom:oz-upgrades-unsafe-allow constructor\\n constructor() {\\n _disableInitializers();\\n }\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n */\\n function initialize(\\n uint256 id_,\\n address gETH_,\\n bytes calldata data\\n ) public virtual override initializer {\\n uint256 nameLen = uint256(bytes32(BytesLib.slice(data, 0, 32)));\\n __ERC20RebasePermitMiddleware_init(\\n id_,\\n gETH_,\\n string(BytesLib.slice(data, 32, nameLen)),\\n string(BytesLib.slice(data, 32 + nameLen, data.length - (32 + nameLen)))\\n );\\n }\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n function __ERC20RebasePermitMiddleware_init(\\n uint256 id_,\\n address gETH_,\\n string memory name_,\\n string memory symbol_\\n ) internal onlyInitializing {\\n __EIP712_init_unchained(name_, \\\"1\\\");\\n __ERC20RebaseMiddleware_init_unchained(id_, gETH_, name_, symbol_);\\n __ERC20RebasePermitMiddleware_init_unchained();\\n }\\n\\n function __ERC20RebasePermitMiddleware_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @inheritdoc IERC20Permit\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual {\\n if (block.timestamp > deadline) {\\n revert ERC2612ExpiredSignature(deadline);\\n }\\n\\n bytes32 structHash = keccak256(\\n abi.encode(PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)\\n );\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n if (signer != owner) {\\n revert ERC2612InvalidSigner(signer, owner);\\n }\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @inheritdoc IERC20Permit\\n */\\n function nonces(\\n address owner\\n ) public view virtual override(IERC20Permit, NoncesUpgradeable) returns (uint256) {\\n return super.nonces(owner);\\n }\\n\\n /**\\n * @inheritdoc IERC20Permit\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view virtual returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n}\\n\",\"keccak256\":\"0x900132a39646f9451f5729c26d343f8080741c2827c034eaed92c1670d784a43\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50610019610026565b610021610026565b6100d8565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d55780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6119f1806100e76000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806399530b061161007157806399530b061461023b578063a9059cbb14610243578063d505accf14610256578063dd62ed3e1461026b578063e209b6461461027e57600080fd5b806370a08231146101f25780637ecebe001461020557806384b0196e1461021857806395d89b411461023357600080fd5b80632d255471116100de5780632d2554711461017a578063313ce567146101b45780633644e515146101c35780635c2f8aa0146101cb57600080fd5b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015157806323b872dd14610167575b600080fd5b610118610291565b60405161012591906114db565b60405180910390f35b61014161013c366004611511565b610354565b6040519015158152602001610125565b61015961036e565b604051908152602001610125565b61014161017536600461153b565b61048c565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2503546040516001600160a01b039091168152602001610125565b60405160128152602001610125565b6101596104b0565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db250454610159565b610159610200366004611577565b6104bf565b610159610213366004611577565b6105e4565b610220610621565b6040516101259796959493929190611592565b6101186106d2565b6101596106f7565b610141610251366004611511565b610782565b610269610264366004611628565b610790565b005b61015961027936600461169b565b6108e9565b61026961028c3660046116ce565b610921565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2501805460609160008051602061197c833981519152916102d090611755565b80601f01602080910402602001604051908101604052809291908181526020018280546102fc90611755565b80156103495780601f1061031e57610100808354040283529160200191610349565b820191906000526020600020905b81548152906001019060200180831161032c57829003601f168201915b505050505091505090565b600033610362818585610b2d565b60019150505b92915050565b60008060008051602061197c833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa1580156103de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610402919061178f565b600384015460405163bd85b03960e01b8152600481018590526001600160a01b039091169063bd85b03990602401602060405180830381865afa15801561044d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610471919061178f565b61047b91906117be565b61048591906117d5565b9250505090565b60003361049a858285610b3f565b6104a5858585610ba5565b506001949350505050565b60006104ba610c04565b905090565b60008060008051602061197c833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa15801561052f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610553919061178f565b6003840154604051627eeac760e11b81526001600160a01b038881166004830152602482018690529091169062fdd58e90604401602060405180830381865afa1580156105a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c8919061178f565b6105d291906117be565b6105dc91906117d5565b949350505050565b6001600160a01b03811660009081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006020526040812054610368565b6000606080828080838160008051602061199c833981519152805490915015801561064e57506001810154155b6106975760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064015b60405180910390fd5b61069f610c0e565b6106a7610c26565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6060600060008051602061197c8339815191525b90508060020180546102d090611755565b60008060008051602061197c833981519152600381015460048083015460405163f759cc3b60e01b8152918201529192506001600160a01b03169063f759cc3b90602401602060405180830381865afa158015610758573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077c919061178f565b91505090565b600033610362818585610ba5565b834211156107b45760405163313c898160e11b81526004810185905260240161068e565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108208c6001600160a01b031660009081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061087b82610c65565b9050600061088b82878787610c92565b9050896001600160a01b0316816001600160a01b0316146108d2576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161068e565b6108dd8a8a8a610b2d565b50505050505050505050565b6001600160a01b03918216600090815260008051602061197c8339815191526020908152604080832093909416825291909152205490565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156109675750825b905060008267ffffffffffffffff1660011480156109845750303b155b905081158015610992575080155b156109b05760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156109da57845460ff60401b1916600160401b1785555b6000610a1e88888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925060209150610cc09050565b610a279061180d565b60001c9050610adb8a8a610a758b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060209250889150610cc09050565b610ad68c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610abc925089915060209050611831565b610ac7886020611831565b610ad1908f611844565b610cc0565b610dcd565b508315610b2257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b610b3a8383836001610e0c565b505050565b6000610b4b84846108e9565b90506000198114610b9f5781811015610b9057604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161068e565b610b9f84848484036000610e0c565b50505050565b6001600160a01b038316610bcf57604051634b637e8f60e11b81526000600482015260240161068e565b6001600160a01b038216610bf95760405163ec442f0560e01b81526000600482015260240161068e565b610b3a838383610ef0565b60006104ba6110b6565b6060600060008051602061199c8339815191526106e6565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103805460609160008051602061199c833981519152916102d090611755565b6000610368610c72610c04565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600080610ca48888888861112a565b925092509250610cb482826111f9565b50909695505050505050565b606081610cce81601f611831565b1015610d0d5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640161068e565b610d178284611831565b84511015610d5b5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640161068e565b606082158015610d7a5760405191506000825260208201604052610dc4565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610db3578051835260209283019201610d9b565b5050858452601f01601f1916604052505b50949350505050565b610dd56112b6565b610df882604051806040016040528060018152602001603160f81b815250611301565b610e0484848484611362565b610b9f6113df565b60008051602061197c8339815191526001600160a01b038516610e455760405163e602df0560e01b81526000600482015260240161068e565b6001600160a01b038416610e6f57604051634a1406b160e11b81526000600482015260240161068e565b6001600160a01b038086166000908152602083815260408083209388168352929052208390558115610ee957836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ee091815260200190565b60405180910390a35b5050505050565b60008051602061197c8339815191526000610f0a856104bf565b905082811015610f465760405163391434e360e21b81526001600160a01b0386166004820152602481018290526044810184905260640161068e565b600482810154600384015460405163f759cc3b60e01b815292830182905290916000916001600160a01b03169063f759cc3b90602401602060405180830381865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd919061178f565b610fcf670de0b6b3a7640000876117be565b610fd991906117d5565b6003850154604051637921219560e11b81526001600160a01b038a811660048301528981166024830152604482018690526064820184905260a06084830152600060a483015292935091169063f242432a9060c401600060405180830381600087803b15801561104857600080fd5b505af115801561105c573d6000803e3d6000fd5b50505050856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516110a591815260200190565b60405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6110e16113e7565b6110e9611451565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561116557506000915060039050826111ef565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156111b9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111e5575060009250600191508290506111ef565b9250600091508190505b9450945094915050565b600082600381111561120d5761120d611857565b03611216575050565b600182600381111561122a5761122a611857565b036112485760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561125c5761125c611857565b0361127d5760405163fce698f760e01b81526004810182905260240161068e565b600382600381111561129157611291611857565b036112b2576040516335e2f38360e21b81526004810182905260240161068e565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166112ff57604051631afcd79f60e31b815260040160405180910390fd5b565b6113096112b6565b60008051602061199c8339815191527fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10261134384826118bb565b506003810161135283826118bb565b5060008082556001909101555050565b61136a6112b6565b60008051602061197c8339815191527f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db25016113a484826118bb565b50600281016113b383826118bb565b506003810180546001600160a01b0319166001600160a01b039590951694909417909355505060040155565b6112ff6112b6565b600060008051602061199c83398151915281611401610c0e565b80519091501561141957805160209091012092915050565b81548015611428579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b600060008051602061199c8339815191528161146b610c26565b80519091501561148357805160209091012092915050565b60018201548015611428579392505050565b6000815180845260005b818110156114bb5760208185018101518683018201520161149f565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006114ee6020830184611495565b9392505050565b80356001600160a01b038116811461150c57600080fd5b919050565b6000806040838503121561152457600080fd5b61152d836114f5565b946020939093013593505050565b60008060006060848603121561155057600080fd5b611559846114f5565b9250611567602085016114f5565b9150604084013590509250925092565b60006020828403121561158957600080fd5b6114ee826114f5565b60ff60f81b881681526000602060e0818401526115b260e084018a611495565b83810360408501526115c4818a611495565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015611616578351835292840192918401916001016115fa565b50909c9b505050505050505050505050565b600080600080600080600060e0888a03121561164357600080fd5b61164c886114f5565b965061165a602089016114f5565b95506040880135945060608801359350608088013560ff8116811461167e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156116ae57600080fd5b6116b7836114f5565b91506116c5602084016114f5565b90509250929050565b600080600080606085870312156116e457600080fd5b843593506116f4602086016114f5565b9250604085013567ffffffffffffffff8082111561171157600080fd5b818701915087601f83011261172557600080fd5b81358181111561173457600080fd5b88602082850101111561174657600080fd5b95989497505060200194505050565b600181811c9082168061176957607f821691505b60208210810361178957634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156117a157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610368576103686117a8565b6000826117f257634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b805160208083015191908110156117895760001960209190910360031b1b16919050565b80820180821115610368576103686117a8565b81810381811115610368576103686117a8565b634e487b7160e01b600052602160045260246000fd5b601f821115610b3a57600081815260208120601f850160051c810160208610156118945750805b601f850160051c820191505b818110156118b3578281556001016118a0565b505050505050565b815167ffffffffffffffff8111156118d5576118d56117f7565b6118e9816118e38454611755565b8461186d565b602080601f83116001811461191e57600084156119065750858301515b600019600386901b1c1916600185901b1785556118b3565b600085815260208120601f198616915b8281101561194d5788860151825594840194600190910190840161192e565b508582101561196b5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2500a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100a26469706673582212206ccc131d4c8e4644c8e6f30b0a0b270f97ab86f1398675885681bd496aaaf06064736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806399530b061161007157806399530b061461023b578063a9059cbb14610243578063d505accf14610256578063dd62ed3e1461026b578063e209b6461461027e57600080fd5b806370a08231146101f25780637ecebe001461020557806384b0196e1461021857806395d89b411461023357600080fd5b80632d255471116100de5780632d2554711461017a578063313ce567146101b45780633644e515146101c35780635c2f8aa0146101cb57600080fd5b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015157806323b872dd14610167575b600080fd5b610118610291565b60405161012591906114db565b60405180910390f35b61014161013c366004611511565b610354565b6040519015158152602001610125565b61015961036e565b604051908152602001610125565b61014161017536600461153b565b61048c565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2503546040516001600160a01b039091168152602001610125565b60405160128152602001610125565b6101596104b0565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db250454610159565b610159610200366004611577565b6104bf565b610159610213366004611577565b6105e4565b610220610621565b6040516101259796959493929190611592565b6101186106d2565b6101596106f7565b610141610251366004611511565b610782565b610269610264366004611628565b610790565b005b61015961027936600461169b565b6108e9565b61026961028c3660046116ce565b610921565b7f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2501805460609160008051602061197c833981519152916102d090611755565b80601f01602080910402602001604051908101604052809291908181526020018280546102fc90611755565b80156103495780601f1061031e57610100808354040283529160200191610349565b820191906000526020600020905b81548152906001019060200180831161032c57829003601f168201915b505050505091505090565b600033610362818585610b2d565b60019150505b92915050565b60008060008051602061197c833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa1580156103de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610402919061178f565b600384015460405163bd85b03960e01b8152600481018590526001600160a01b039091169063bd85b03990602401602060405180830381865afa15801561044d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610471919061178f565b61047b91906117be565b61048591906117d5565b9250505090565b60003361049a858285610b3f565b6104a5858585610ba5565b506001949350505050565b60006104ba610c04565b905090565b60008060008051602061197c833981519152600481810154600383015460405163f759cc3b60e01b815292830182905292935091670de0b6b3a7640000916001600160a01b039091169063f759cc3b90602401602060405180830381865afa15801561052f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610553919061178f565b6003840154604051627eeac760e11b81526001600160a01b038881166004830152602482018690529091169062fdd58e90604401602060405180830381865afa1580156105a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c8919061178f565b6105d291906117be565b6105dc91906117d5565b949350505050565b6001600160a01b03811660009081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006020526040812054610368565b6000606080828080838160008051602061199c833981519152805490915015801561064e57506001810154155b6106975760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064015b60405180910390fd5b61069f610c0e565b6106a7610c26565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6060600060008051602061197c8339815191525b90508060020180546102d090611755565b60008060008051602061197c833981519152600381015460048083015460405163f759cc3b60e01b8152918201529192506001600160a01b03169063f759cc3b90602401602060405180830381865afa158015610758573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077c919061178f565b91505090565b600033610362818585610ba5565b834211156107b45760405163313c898160e11b81526004810185905260240161068e565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886108208c6001600160a01b031660009081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061087b82610c65565b9050600061088b82878787610c92565b9050896001600160a01b0316816001600160a01b0316146108d2576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161068e565b6108dd8a8a8a610b2d565b50505050505050505050565b6001600160a01b03918216600090815260008051602061197c8339815191526020908152604080832093909416825291909152205490565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156109675750825b905060008267ffffffffffffffff1660011480156109845750303b155b905081158015610992575080155b156109b05760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156109da57845460ff60401b1916600160401b1785555b6000610a1e88888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925060209150610cc09050565b610a279061180d565b60001c9050610adb8a8a610a758b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060209250889150610cc09050565b610ad68c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610abc925089915060209050611831565b610ac7886020611831565b610ad1908f611844565b610cc0565b610dcd565b508315610b2257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b610b3a8383836001610e0c565b505050565b6000610b4b84846108e9565b90506000198114610b9f5781811015610b9057604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161068e565b610b9f84848484036000610e0c565b50505050565b6001600160a01b038316610bcf57604051634b637e8f60e11b81526000600482015260240161068e565b6001600160a01b038216610bf95760405163ec442f0560e01b81526000600482015260240161068e565b610b3a838383610ef0565b60006104ba6110b6565b6060600060008051602061199c8339815191526106e6565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103805460609160008051602061199c833981519152916102d090611755565b6000610368610c72610c04565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600080610ca48888888861112a565b925092509250610cb482826111f9565b50909695505050505050565b606081610cce81601f611831565b1015610d0d5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640161068e565b610d178284611831565b84511015610d5b5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640161068e565b606082158015610d7a5760405191506000825260208201604052610dc4565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610db3578051835260209283019201610d9b565b5050858452601f01601f1916604052505b50949350505050565b610dd56112b6565b610df882604051806040016040528060018152602001603160f81b815250611301565b610e0484848484611362565b610b9f6113df565b60008051602061197c8339815191526001600160a01b038516610e455760405163e602df0560e01b81526000600482015260240161068e565b6001600160a01b038416610e6f57604051634a1406b160e11b81526000600482015260240161068e565b6001600160a01b038086166000908152602083815260408083209388168352929052208390558115610ee957836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ee091815260200190565b60405180910390a35b5050505050565b60008051602061197c8339815191526000610f0a856104bf565b905082811015610f465760405163391434e360e21b81526001600160a01b0386166004820152602481018290526044810184905260640161068e565b600482810154600384015460405163f759cc3b60e01b815292830182905290916000916001600160a01b03169063f759cc3b90602401602060405180830381865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd919061178f565b610fcf670de0b6b3a7640000876117be565b610fd991906117d5565b6003850154604051637921219560e11b81526001600160a01b038a811660048301528981166024830152604482018690526064820184905260a06084830152600060a483015292935091169063f242432a9060c401600060405180830381600087803b15801561104857600080fd5b505af115801561105c573d6000803e3d6000fd5b50505050856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516110a591815260200190565b60405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6110e16113e7565b6110e9611451565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561116557506000915060039050826111ef565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156111b9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111e5575060009250600191508290506111ef565b9250600091508190505b9450945094915050565b600082600381111561120d5761120d611857565b03611216575050565b600182600381111561122a5761122a611857565b036112485760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561125c5761125c611857565b0361127d5760405163fce698f760e01b81526004810182905260240161068e565b600382600381111561129157611291611857565b036112b2576040516335e2f38360e21b81526004810182905260240161068e565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166112ff57604051631afcd79f60e31b815260040160405180910390fd5b565b6113096112b6565b60008051602061199c8339815191527fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10261134384826118bb565b506003810161135283826118bb565b5060008082556001909101555050565b61136a6112b6565b60008051602061197c8339815191527f033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db25016113a484826118bb565b50600281016113b383826118bb565b506003810180546001600160a01b0319166001600160a01b039590951694909417909355505060040155565b6112ff6112b6565b600060008051602061199c83398151915281611401610c0e565b80519091501561141957805160209091012092915050565b81548015611428579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b600060008051602061199c8339815191528161146b610c26565b80519091501561148357805160209091012092915050565b60018201548015611428579392505050565b6000815180845260005b818110156114bb5760208185018101518683018201520161149f565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006114ee6020830184611495565b9392505050565b80356001600160a01b038116811461150c57600080fd5b919050565b6000806040838503121561152457600080fd5b61152d836114f5565b946020939093013593505050565b60008060006060848603121561155057600080fd5b611559846114f5565b9250611567602085016114f5565b9150604084013590509250925092565b60006020828403121561158957600080fd5b6114ee826114f5565b60ff60f81b881681526000602060e0818401526115b260e084018a611495565b83810360408501526115c4818a611495565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015611616578351835292840192918401916001016115fa565b50909c9b505050505050505050505050565b600080600080600080600060e0888a03121561164357600080fd5b61164c886114f5565b965061165a602089016114f5565b95506040880135945060608801359350608088013560ff8116811461167e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156116ae57600080fd5b6116b7836114f5565b91506116c5602084016114f5565b90509250929050565b600080600080606085870312156116e457600080fd5b843593506116f4602086016114f5565b9250604085013567ffffffffffffffff8082111561171157600080fd5b818701915087601f83011261172557600080fd5b81358181111561173457600080fd5b88602082850101111561174657600080fd5b95989497505060200194505050565b600181811c9082168061176957607f821691505b60208210810361178957634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156117a157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610368576103686117a8565b6000826117f257634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b805160208083015191908110156117895760001960209190910360031b1b16919050565b80820180821115610368576103686117a8565b81810381811115610368576103686117a8565b634e487b7160e01b600052602160045260246000fd5b601f821115610b3a57600081815260208120601f850160051c810160208610156118945750805b601f850160051c820191505b818110156118b3578281556001016118a0565b505050505050565b815167ffffffffffffffff8111156118d5576118d56117f7565b6118e9816118e38454611755565b8461186d565b602080601f83116001811461191e57600084156119065750858301515b600019600386901b1c1916600185901b1785556118b3565b600085815260208120601f198616915b8281101561194d5788860151825594840194600190910190840161192e565b508582101561196b5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe033cdebea869703c4621de9e95304f18ae23301f1ffc0c9d2917741e54db2500a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100a26469706673582212206ccc131d4c8e4644c8e6f30b0a0b270f97ab86f1398675885681bd496aaaf06064736f6c63430008140033", "devdoc": { "details": "differences between ERC20RebasePermitMiddleware and Openzeppelin's implementation of ERC20PermitUpgradable is: -> using ERC20Middleware instead of ERC20Upgradeable -> added initializeImplementation of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in https://eips.ethereum.org/EIPS/eip-2612[ERC-2612]. Adds the {permit} method, which can be used to change an account's ERC-20 allowance (see {IERC20-allowance}) by presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't need to send a transaction, and thus is not required to hold Ether at all.", "errors": { diff --git a/geodefi/abis/holesky/package/Portal.json b/geodefi/abis/holesky/package/Portal.json index 82750f2..6b69ccf 100644 --- a/geodefi/abis/holesky/package/Portal.json +++ b/geodefi/abis/holesky/package/Portal.json @@ -1,5 +1,5 @@ { - "address": "0x181C0F3103116Cc02665365c7a5E5574db011D38", + "address": "0xcA69bA533810ee94b7649c57eF8aB22EBbE0bbf7", "abi": [ { "anonymous": false, @@ -254,6 +254,32 @@ "name": "Deposit", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "Exit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "ExitRequest", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -1067,7 +1093,7 @@ "type": "uint256" } ], - "name": "deployLiquidityPool", + "name": "deployLiquidityPackage", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -2189,7 +2215,13 @@ } ], "name": "requestExit", - "outputs": [], + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, @@ -2472,38 +2504,38 @@ "type": "constructor" } ], - "transactionHash": "0x0ab51cb09e7978695457568963197d34eb050c245883538286c8d3389aa9a901", + "transactionHash": "0xc227f7686c44ab775aaec3330fa8ed2475ba3563b3c729ea8aabbaaf628f8391", "receipt": { "to": null, "from": "0x7B6fA217a374826FCa50dccB87041AE0e34Ba1f5", - "contractAddress": "0x181C0F3103116Cc02665365c7a5E5574db011D38", - "transactionIndex": 1, - "gasUsed": "284039", - "logsBloom": "0x00000000001000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000800000000000000002000000000000000000000000000000000000020", - "blockHash": "0x87deab54ec3ede1e2e235209d572416a15e40b354efe9fd6118f163c7d1d5404", - "transactionHash": "0x0ab51cb09e7978695457568963197d34eb050c245883538286c8d3389aa9a901", + "contractAddress": "0xcA69bA533810ee94b7649c57eF8aB22EBbE0bbf7", + "transactionIndex": 2, + "gasUsed": "284027", + "logsBloom": "0x00000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000400000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000001000000000000000000000000000020000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x7e79602b576b806d65009335d06fd09fe9f48b39cc195f357e00297b12dc8666", + "transactionHash": "0xc227f7686c44ab775aaec3330fa8ed2475ba3563b3c729ea8aabbaaf628f8391", "logs": [ { - "transactionIndex": 1, - "blockNumber": 852077, - "transactionHash": "0x0ab51cb09e7978695457568963197d34eb050c245883538286c8d3389aa9a901", - "address": "0x181C0F3103116Cc02665365c7a5E5574db011D38", + "transactionIndex": 2, + "blockNumber": 1550551, + "transactionHash": "0xc227f7686c44ab775aaec3330fa8ed2475ba3563b3c729ea8aabbaaf628f8391", + "address": "0xcA69bA533810ee94b7649c57eF8aB22EBbE0bbf7", "topics": [ "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", - "0x000000000000000000000000274c9f7f5f753ca0d3286b5f34f9d994bd2db14f" + "0x000000000000000000000000224158f6fc0d0034aae8b09d2d29fa6434fadaed" ], "data": "0x", - "logIndex": 0, - "blockHash": "0x87deab54ec3ede1e2e235209d572416a15e40b354efe9fd6118f163c7d1d5404" + "logIndex": 3, + "blockHash": "0x7e79602b576b806d65009335d06fd09fe9f48b39cc195f357e00297b12dc8666" } ], - "blockNumber": 852077, - "cumulativeGasUsed": "305039", + "blockNumber": 1550551, + "cumulativeGasUsed": "503035", "status": 1, "byzantium": true }, "args": [ - "0x274c9F7F5F753Ca0D3286B5F34f9D994Bd2dB14F", + "0x224158f6fc0d0034AaE8B09d2d29fA6434FADaeD", "0x" ], "numDeployments": 1, @@ -2511,7 +2543,7 @@ "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the upgradeable proxy with an initial implementation specified by `_logic`. If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x608060405260405161084e38038061084e83398101604081905261002291610349565b61004d60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610417565b600080516020610807833981519152146100695761006961043c565b6100758282600061007c565b50506104a1565b610085836100b2565b6000825111806100925750805b156100ad576100ab83836100f260201b6100291760201c565b505b505050565b6100bb8161011e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606101178383604051806060016040528060278152602001610827602791396101de565b9392505050565b610131816102bc60201b6100551760201c565b6101985760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b806101bd60008051602061080783398151915260001b6102cb60201b6100711760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606001600160a01b0384163b6102465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161018f565b600080856001600160a01b0316856040516102619190610452565b600060405180830381855af49150503d806000811461029c576040519150601f19603f3d011682016040523d82523d6000602084013e6102a1565b606091505b5090925090506102b28282866102ce565b9695505050505050565b6001600160a01b03163b151590565b90565b606083156102dd575081610117565b8251156102ed5782518084602001fd5b8160405162461bcd60e51b815260040161018f919061046e565b634e487b7160e01b600052604160045260246000fd5b60005b83811015610338578181015183820152602001610320565b838111156100ab5750506000910152565b6000806040838503121561035c57600080fd5b82516001600160a01b038116811461037357600080fd5b60208401519092506001600160401b038082111561039057600080fd5b818501915085601f8301126103a457600080fd5b8151818111156103b6576103b6610307565b604051601f8201601f19908116603f011681019083821181831017156103de576103de610307565b816040528281528860208487010111156103f757600080fd5b61040883602083016020880161031d565b80955050505050509250929050565b60008282101561043757634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b6000825161046481846020870161031d565b9190910192915050565b602081526000825180602084015261048d81604085016020870161031d565b601f01601f19169190910160400192915050565b610357806104b06000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", "deployedBytecode": "0x60806040523661001357610011610017565b005b6100115b610027610022610074565b6100b9565b565b606061004e83836040518060600160405280602781526020016102fb602791396100dd565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b90565b60006100b47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156100d8573d6000f35b3d6000fd5b606073ffffffffffffffffffffffffffffffffffffffff84163b610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516101b0919061028d565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b509150915061020082828661020a565b9695505050505050565b6060831561021957508161004e565b8251156102295782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f91906102a9565b60005b83811015610278578181015183820152602001610260565b83811115610287576000848401525b50505050565b6000825161029f81846020870161025d565b9190910192915050565b60208152600082518060208401526102c881604085016020870161025d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201e3c9348ed6dd2f363e89451207bd8df182bc878dc80d47166301a510c8801e964736f6c634300080a0033", - "implementation": "0x274c9F7F5F753Ca0D3286B5F34f9D994Bd2dB14F", + "implementation": "0x224158f6fc0d0034AaE8B09d2d29fA6434FADaeD", "devdoc": { "details": "This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.", "kind": "dev", diff --git a/geodefi/abis/holesky/package/WithdrawalContract.json b/geodefi/abis/holesky/package/WithdrawalContract.json deleted file mode 100644 index 93e0efd..0000000 --- a/geodefi/abis/holesky/package/WithdrawalContract.json +++ /dev/null @@ -1,1710 +0,0 @@ -{ - "address": "0xC6650024e96c7E458a3a1b225Df7c3504143B111", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_gETHPos", - "type": "address" - }, - { - "internalType": "address", - "name": "_portalPos", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "target", - "type": "address" - } - ], - "name": "AddressEmptyCode", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "ERC1967InvalidImplementation", - "type": "error" - }, - { - "inputs": [], - "name": "ERC1967NonPayable", - "type": "error" - }, - { - "inputs": [], - "name": "EnforcedPause", - "type": "error" - }, - { - "inputs": [], - "name": "ExpectedPause", - "type": "error" - }, - { - "inputs": [], - "name": "FailedInnerCall", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidInitialization", - "type": "error" - }, - { - "inputs": [], - "name": "NotInitializing", - "type": "error" - }, - { - "inputs": [], - "name": "ReentrancyGuardReentrantCall", - "type": "error" - }, - { - "inputs": [], - "name": "UUPSUnauthorizedCallContext", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "slot", - "type": "bytes32" - } - ], - "name": "UUPSUnsupportedProxiableUUID", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "ID", - "type": "uint256" - } - ], - "name": "Approved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "version", - "type": "uint256" - } - ], - "name": "ContractVersionSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "ID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "CONTROLLER", - "type": "address" - } - ], - "name": "ControllerChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "claim", - "type": "uint256" - } - ], - "name": "Dequeue", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "Enqueue", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "fulfillAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "claimableETH", - "type": "uint256" - } - ], - "name": "Fulfill", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint64", - "name": "version", - "type": "uint64" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "threshold", - "type": "uint256" - } - ], - "name": "NewExitThreshold", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "senate", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "expiry", - "type": "uint256" - } - ], - "name": "NewSenate", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "TYPE", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "ID", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "CONTROLLER", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "Proposed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "oldOwner", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "RequestTransfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Unpaused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - }, - { - "inputs": [], - "name": "GeodeParams", - "outputs": [ - { - "internalType": "address", - "name": "governance", - "type": "address" - }, - { - "internalType": "address", - "name": "senate", - "type": "address" - }, - { - "internalType": "address", - "name": "approvedUpgrade", - "type": "address" - }, - { - "internalType": "uint256", - "name": "senateExpiry", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "packageType", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "QueueParams", - "outputs": [ - { - "internalType": "uint256", - "name": "requested", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "realized", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "realizedEtherBalance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "realizedPrice", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "fulfilled", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "fulfilledEtherBalance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "commonPoll", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "UPGRADE_INTERFACE_VERSION", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "WithdrawalParams", - "outputs": [ - { - "internalType": "address", - "name": "gETH", - "type": "address" - }, - { - "internalType": "address", - "name": "portal", - "type": "address" - }, - { - "internalType": "uint256", - "name": "poolId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "exitThreshold", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gatheredInfrastructureFees", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_type", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "allIdsByType", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_type", - "type": "uint256" - } - ], - "name": "allIdsByTypeLength", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "name": "approveProposal", - "outputs": [ - { - "internalType": "address", - "name": "_controller", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_type", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_name", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - } - ], - "name": "canFinalizeExit", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "address", - "name": "newCONTROLLER", - "type": "address" - } - ], - "name": "changeIdCONTROLLER", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newSenate", - "type": "address" - } - ], - "name": "changeSenate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "claimInfrastructureFees", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "dequeue", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "indexes", - "type": "uint256[]" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "dequeueBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "size", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "enqueue", - "outputs": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "sizes", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "pubkeys", - "type": "bytes[]" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "enqueueBatch", - "outputs": [ - { - "internalType": "uint256[]", - "name": "indexes", - "type": "uint256[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "fulfill", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[]", - "name": "indexes", - "type": "uint256[]" - } - ], - "name": "fulfillBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "fulfillable", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "internalType": "uint256", - "name": "_type", - "type": "uint256" - } - ], - "name": "generateId", - "outputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "getContractVersion", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGovernance", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_id", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "_param", - "type": "bytes32" - } - ], - "name": "getKey", - "outputs": [ - { - "internalType": "bytes32", - "name": "key", - "type": "bytes32" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "getPoolId", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "name": "getProposal", - "outputs": [ - { - "components": [ - { - "internalType": "address", - "name": "CONTROLLER", - "type": "address" - }, - { - "internalType": "uint256", - "name": "TYPE", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "NAME", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "internalType": "struct Proposal", - "name": "proposal", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getProposedVersion", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRequest", - "outputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "trigger", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "size", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "fulfilled", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "claimableEther", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - } - ], - "name": "getValidatorData", - "outputs": [ - { - "internalType": "uint256", - "name": "beaconBalance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "withdrawnBalance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "poll", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "poolId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "poolOwner", - "type": "address" - }, - { - "internalType": "bytes", - "name": "versionName", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "isolationMode", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes[]", - "name": "data", - "type": "bytes[]" - } - ], - "name": "multicall", - "outputs": [ - { - "internalType": "bytes[]", - "name": "results", - "type": "bytes[]" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "name": "onERC1155BatchReceived", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "name": "onERC1155Received", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes[]", - "name": "pubkeys", - "type": "bytes[]" - }, - { - "internalType": "uint256[]", - "name": "beaconBalances", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "withdrawnBalances", - "type": "uint256[]" - }, - { - "internalType": "bytes32[][]", - "name": "balanceProofs", - "type": "bytes32[][]" - }, - { - "internalType": "uint256", - "name": "price", - "type": "uint256" - }, - { - "internalType": "bytes32[]", - "name": "priceProof", - "type": "bytes32[]" - } - ], - "name": "processValidators", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_CONTROLLER", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_TYPE", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_NAME", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "duration", - "type": "uint256" - } - ], - "name": "propose", - "outputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "proxiableUUID", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pullUpgrade", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "key", - "type": "bytes32" - } - ], - "name": "readAddress", - "outputs": [ - { - "internalType": "address", - "name": "data", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "key", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "readAddressArray", - "outputs": [ - { - "internalType": "address", - "name": "data", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "key", - "type": "bytes32" - } - ], - "name": "readBytes", - "outputs": [ - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "key", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "readBytesArray", - "outputs": [ - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "key", - "type": "bytes32" - } - ], - "name": "readUint", - "outputs": [ - { - "internalType": "uint256", - "name": "data", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "key", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "readUintArray", - "outputs": [ - { - "internalType": "uint256", - "name": "data", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newSenate", - "type": "address" - } - ], - "name": "rescueSenate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "newThreshold", - "type": "uint256" - } - ], - "name": "setExitThreshold", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferRequest", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "unpause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "pubkey", - "type": "bytes" - } - ], - "name": "validatorThreshold", - "outputs": [ - { - "internalType": "uint256", - "name": "threshold", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "transactionHash": "0x8da49d1146659a89454f2af1a5e35a1a52443863b8c53dcd96031d9cc56cc7b8", - "receipt": { - "to": null, - "from": "0x7B6fA217a374826FCa50dccB87041AE0e34Ba1f5", - "contractAddress": "0xC6650024e96c7E458a3a1b225Df7c3504143B111", - "transactionIndex": 1, - "gasUsed": "3692086", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000040000000000000000", - "blockHash": "0xbb831f31f8dc75754197aeec49c0101dfa3bed34779a248eda02b1462a0c6d7b", - "transactionHash": "0x8da49d1146659a89454f2af1a5e35a1a52443863b8c53dcd96031d9cc56cc7b8", - "logs": [ - { - "transactionIndex": 1, - "blockNumber": 852079, - "transactionHash": "0x8da49d1146659a89454f2af1a5e35a1a52443863b8c53dcd96031d9cc56cc7b8", - "address": "0xC6650024e96c7E458a3a1b225Df7c3504143B111", - "topics": [ - "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" - ], - "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", - "logIndex": 0, - "blockHash": "0xbb831f31f8dc75754197aeec49c0101dfa3bed34779a248eda02b1462a0c6d7b" - } - ], - "blockNumber": 852079, - "cumulativeGasUsed": "3713086", - "status": 1, - "byzantium": true - }, - "args": [ - "0xaA970005F693Ae459e0ee107c63b546E8ff51d5d", - "0x181C0F3103116Cc02665365c7a5E5574db011D38" - ], - "numDeployments": 1, - "solcInputHash": "cfc92d910e56f99740a6d4737a3b72cb", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_gETHPos\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_portalPos\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"slot\",\"type\":\"bytes32\"}],\"name\":\"UUPSUnsupportedProxiableUUID\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"ID\",\"type\":\"uint256\"}],\"name\":\"Approved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"ContractVersionSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"CONTROLLER\",\"type\":\"address\"}],\"name\":\"ControllerChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claim\",\"type\":\"uint256\"}],\"name\":\"Dequeue\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"Enqueue\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fulfillAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimableETH\",\"type\":\"uint256\"}],\"name\":\"Fulfill\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"name\":\"NewExitThreshold\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"senate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"}],\"name\":\"NewSenate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"TYPE\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"ID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"CONTROLLER\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"Proposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"RequestTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"GeodeParams\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"governance\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"senate\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"approvedUpgrade\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"senateExpiry\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"packageType\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"QueueParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"realized\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"realizedEtherBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"realizedPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fulfilled\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fulfilledEtherBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commonPoll\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPGRADE_INTERFACE_VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WithdrawalParams\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"gETH\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"portal\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"poolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"exitThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gatheredInfrastructureFees\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_type\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"allIdsByType\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_type\",\"type\":\"uint256\"}],\"name\":\"allIdsByTypeLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"approveProposal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_controller\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_type\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_name\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"pubkey\",\"type\":\"bytes\"}],\"name\":\"canFinalizeExit\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newCONTROLLER\",\"type\":\"address\"}],\"name\":\"changeIdCONTROLLER\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newSenate\",\"type\":\"address\"}],\"name\":\"changeSenate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimInfrastructureFees\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"dequeue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"indexes\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"dequeueBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"pubkey\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"enqueue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"sizes\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"pubkeys\",\"type\":\"bytes[]\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"enqueueBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"indexes\",\"type\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"fulfill\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"indexes\",\"type\":\"uint256[]\"}],\"name\":\"fulfillBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"fulfillable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_type\",\"type\":\"uint256\"}],\"name\":\"generateId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getContractVersion\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGovernance\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_param\",\"type\":\"bytes32\"}],\"name\":\"getKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPoolId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"CONTROLLER\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"TYPE\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"NAME\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"internalType\":\"struct Proposal\",\"name\":\"proposal\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProposedVersion\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRequest\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"trigger\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fulfilled\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimableEther\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"pubkey\",\"type\":\"bytes\"}],\"name\":\"getValidatorData\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"beaconBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawnBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"poll\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"poolId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"poolOwner\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"versionName\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isolationMode\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"pubkeys\",\"type\":\"bytes[]\"},{\"internalType\":\"uint256[]\",\"name\":\"beaconBalances\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"withdrawnBalances\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes32[][]\",\"name\":\"balanceProofs\",\"type\":\"bytes32[][]\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"priceProof\",\"type\":\"bytes32[]\"}],\"name\":\"processValidators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_CONTROLLER\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_TYPE\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_NAME\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"propose\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pullUpgrade\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"readAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"data\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"readAddressArray\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"data\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"readBytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"readBytesArray\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"readUint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"data\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"readUintArray\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"data\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newSenate\",\"type\":\"address\"}],\"name\":\"rescueSenate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newThreshold\",\"type\":\"uint256\"}],\"name\":\"setExitThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"pubkey\",\"type\":\"bytes\"}],\"name\":\"validatorThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"ERC1967InvalidImplementation(address)\":[{\"details\":\"The `implementation` of the proxy is invalid.\"}],\"ERC1967NonPayable()\":[{\"details\":\"An upgrade function sees `msg.value > 0` that may be lost.\"}],\"EnforcedPause()\":[{\"details\":\"The operation failed because the contract is paused.\"}],\"ExpectedPause()\":[{\"details\":\"The operation failed because the contract is not paused.\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"UUPSUnauthorizedCallContext()\":[{\"details\":\"The call is from an unauthorized context.\"}],\"UUPSUnsupportedProxiableUUID(bytes32)\":[{\"details\":\"The storage `slot` is unsupported as a UUID.\"}]},\"events\":{\"ContractVersionSet(uint256)\":{\"custom:section\":\"** EVENTS **\"},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"NewExitThreshold(uint256)\":{\"custom:section\":\"** EVENTS **\"},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"GeodeParams()\":{\"custom:section\":\"** GETTER FUNCTIONS **\",\"custom:visibility\":\"-> view-external\"},\"WithdrawalParams()\":{\"custom:section\":\"** GETTER FUNCTIONS **\",\"custom:visibility\":\"-> view-external\"},\"allIdsByType(uint256,uint256)\":{\"details\":\"useful for outside reach, shouldn't be used within contracts as a referance\",\"returns\":{\"_0\":\"allIdsByType is an array of IDs of the given TYPE from Datastore, returns a specific index\"}},\"approveProposal(uint256)\":{\"details\":\"handles PACKAGE_TYPE proposals by upgrading the contract immediately.onlySenate is checked inside GML.approveProposal\"},\"canFinalizeExit(bytes)\":{\"custom:visibility\":\"-> view\"},\"changeIdCONTROLLER(uint256,address)\":{\"custom:subsection\":\"** ONLY CONTROLLER **\"},\"claimInfrastructureFees(address)\":{\"custom:subsection\":\"** INFRASTRUCTURE FEE **\",\"details\":\"WM override\"},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"we don't want to provide these package-specific not-changing parameters accross all instances of the packages. So we will store them in the ref implementation contract of the package, and fetch when needed on initialization.\"},\"dequeue(uint256,address)\":{\"custom:visibility\":\"-> external\"},\"enqueue(uint256,bytes,address)\":{\"custom:subsection\":\"** ENQUEUE **\",\"custom:visibility\":\"-> external\"},\"fulfill(uint256)\":{\"custom:visibility\":\"-> external\"},\"fulfillable(uint256)\":{\"custom:visibility\":\"-> view\"},\"generateId(string,uint256)\":{\"details\":\"id is generated by keccak(name, type)\"},\"getProposedVersion()\":{\"details\":\"GeodeModule override\"},\"initialize(uint256,address,bytes,bytes)\":{\"details\":\"While 'data' parameter is not currently used it is a standarized approach on all * GeodePackages have the same function signature on 'initialize'.\"},\"isolationMode()\":{\"details\":\"GeodeModule override\"},\"multicall(bytes[])\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Receives and executes a batch of function calls on this contract.This is necessary for the multistep operations done in this contract: * Enqueue, Process, Fulfill, Dequeue.Using 'functionDelegateCall' so it does not cause any issues when using msg.sender etc.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"processValidators(bytes[],uint256[],uint256[],bytes32[][],uint256,bytes32[])\":{\"custom:section\":\"** PROCESS BALANCES MERKLE UPDATE **\"},\"propose(address,uint256,bytes,uint256)\":{\"custom:subsection\":\"** ONLY GOVERNANCE **\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"pullUpgrade()\":{\"details\":\"IGeodePackage override\"},\"readUintArray(uint256,bytes32,uint256)\":{\"custom:section\":\"** ARRAY GETTER FUNCTIONS **\",\"custom:visibility\":\"-> view-external\"},\"setExitThreshold(uint256)\":{\"custom:subsection\":\"** WITHDRAWAL QUEUE **\",\"details\":\"WM override\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"generateId(string,uint256)\":{\"notice\":\"useful function for string inputs - returns same with the DSML.generateId\"},\"getKey(uint256,bytes32)\":{\"notice\":\"useful view function for string inputs - returns same with the DSML.generateId\"},\"pause()\":{\"notice\":\"pausing the contract activates the isolationMode\"},\"unpause()\":{\"notice\":\"unpausing the contract deactivates the isolationMode\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/packages/WithdrawalContract.sol\":\"WithdrawalContract\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Storage of the initializable contract.\\n *\\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\\n * when using with upgradeable contracts.\\n *\\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\\n */\\n struct InitializableStorage {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n uint64 _initialized;\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool _initializing;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Initializable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\\n\\n /**\\n * @dev The contract is already initialized.\\n */\\n error InvalidInitialization();\\n\\n /**\\n * @dev The contract is not initializing.\\n */\\n error NotInitializing();\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint64 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\\n * production.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n // Cache values to avoid duplicated sloads\\n bool isTopLevelCall = !$._initializing;\\n uint64 initialized = $._initialized;\\n\\n // Allowed calls:\\n // - initialSetup: the contract is not in the initializing state and no previous version was\\n // initialized\\n // - construction: the contract is initialized at version 1 (no reininitialization) and the\\n // current contract is just being deployed\\n bool initialSetup = initialized == 0 && isTopLevelCall;\\n bool construction = initialized == 1 && address(this).code.length == 0;\\n\\n if (!initialSetup && !construction) {\\n revert InvalidInitialization();\\n }\\n $._initialized = 1;\\n if (isTopLevelCall) {\\n $._initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n $._initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint64 version) {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing || $._initialized >= version) {\\n revert InvalidInitialization();\\n }\\n $._initialized = version;\\n $._initializing = true;\\n _;\\n $._initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n _checkInitializing();\\n _;\\n }\\n\\n /**\\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\\n */\\n function _checkInitializing() internal view virtual {\\n if (!_isInitializing()) {\\n revert NotInitializing();\\n }\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing) {\\n revert InvalidInitialization();\\n }\\n if ($._initialized != type(uint64).max) {\\n $._initialized = type(uint64).max;\\n emit Initialized(type(uint64).max);\\n }\\n }\\n\\n /**\\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n */\\n function _getInitializedVersion() internal view returns (uint64) {\\n return _getInitializableStorage()._initialized;\\n }\\n\\n /**\\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _getInitializableStorage()._initializing;\\n }\\n\\n /**\\n * @dev Returns a pointer to the storage namespace.\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\\n assembly {\\n $.slot := INITIALIZABLE_STORAGE\\n }\\n }\\n}\\n\",\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC1822Proxiable} from \\\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\\\";\\nimport {ERC1967Utils} from \\\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\\\";\\nimport {Initializable} from \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)`\\n * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,\\n * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string.\\n * If the getter returns `\\\"5.0.0\\\"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must\\n * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\\n * during an upgrade.\\n */\\n string public constant UPGRADE_INTERFACE_VERSION = \\\"5.0.0\\\";\\n\\n /**\\n * @dev The call is from an unauthorized context.\\n */\\n error UUPSUnauthorizedCallContext();\\n\\n /**\\n * @dev The storage `slot` is unsupported as a UUID.\\n */\\n error UUPSUnsupportedProxiableUUID(bytes32 slot);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n _checkProxy();\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n _checkNotDelegated();\\n _;\\n }\\n\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual notDelegated returns (bytes32) {\\n return ERC1967Utils.IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data);\\n }\\n\\n /**\\n * @dev Reverts if the execution is not performed via delegatecall or the execution\\n * context is not of a proxy with an ERC1967-compliant implementation pointing to self.\\n * See {_onlyProxy}.\\n */\\n function _checkProxy() internal view virtual {\\n if (\\n address(this) == __self || // Must be called through delegatecall\\n ERC1967Utils.getImplementation() != __self // Must be called through an active proxy\\n ) {\\n revert UUPSUnauthorizedCallContext();\\n }\\n }\\n\\n /**\\n * @dev Reverts if the execution is performed via delegatecall.\\n * See {notDelegated}.\\n */\\n function _checkNotDelegated() internal view virtual {\\n if (address(this) != __self) {\\n // Must not be called through delegatecall\\n revert UUPSUnauthorizedCallContext();\\n }\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call.\\n *\\n * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value\\n * is expected to be the implementation slot in ERC1967.\\n *\\n * Emits an {IERC1967-Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) {\\n revert UUPSUnsupportedProxiableUUID(slot);\\n }\\n ERC1967Utils.upgradeToAndCall(newImplementation, data);\\n } catch {\\n // The implementation is not UUPS\\n revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3f13b947637c4969c0644cab4ef399cdc4b67f101463b8775c5a43b118558e53\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC1155/utils/ERC1155HolderUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/utils/ERC1155Holder.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport {ERC165Upgradeable} from \\\"../../../utils/introspection/ERC165Upgradeable.sol\\\";\\nimport {IERC1155Receiver} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\nimport {Initializable} from \\\"../../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Simple implementation of `IERC1155Receiver` that will allow a contract to hold ERC1155 tokens.\\n *\\n * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be\\n * stuck.\\n */\\nabstract contract ERC1155HolderUpgradeable is Initializable, ERC165Upgradeable, IERC1155Receiver {\\n function __ERC1155Holder_init() internal onlyInitializing {\\n }\\n\\n function __ERC1155Holder_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0xd5cd13424ae387f7356676f7b90081cc63af46eac66ef15efeaca6177863eb83\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x72d47aebad24c59f6e78d0c3e827440173419a333fd910a37fa1e532c98f7e4c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {ContextUpgradeable} from \\\"../utils/ContextUpgradeable.sol\\\";\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /// @custom:storage-location erc7201:openzeppelin.storage.Pausable\\n struct PausableStorage {\\n bool _paused;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Pausable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300;\\n\\n function _getPausableStorage() private pure returns (PausableStorage storage $) {\\n assembly {\\n $.slot := PausableStorageLocation\\n }\\n }\\n\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n /**\\n * @dev The operation failed because the contract is paused.\\n */\\n error EnforcedPause();\\n\\n /**\\n * @dev The operation failed because the contract is not paused.\\n */\\n error ExpectedPause();\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal onlyInitializing {\\n PausableStorage storage $ = _getPausableStorage();\\n $._paused = false;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n _requireNotPaused();\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n _requirePaused();\\n _;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n PausableStorage storage $ = _getPausableStorage();\\n return $._paused;\\n }\\n\\n /**\\n * @dev Throws if the contract is paused.\\n */\\n function _requireNotPaused() internal view virtual {\\n if (paused()) {\\n revert EnforcedPause();\\n }\\n }\\n\\n /**\\n * @dev Throws if the contract is not paused.\\n */\\n function _requirePaused() internal view virtual {\\n if (!paused()) {\\n revert ExpectedPause();\\n }\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n PausableStorage storage $ = _getPausableStorage();\\n $._paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n PausableStorage storage $ = _getPausableStorage();\\n $._paused = false;\\n emit Unpaused(_msgSender());\\n }\\n}\\n\",\"keccak256\":\"0x92915b7f7f642c6be3f65bfd1522feb5d5b6ef25f755f4dbb51df32c868f2f97\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant NOT_ENTERED = 1;\\n uint256 private constant ENTERED = 2;\\n\\n /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard\\n struct ReentrancyGuardStorage {\\n uint256 _status;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.ReentrancyGuard\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\\n\\n function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) {\\n assembly {\\n $.slot := ReentrancyGuardStorageLocation\\n }\\n }\\n\\n /**\\n * @dev Unauthorized reentrant call.\\n */\\n error ReentrancyGuardReentrantCall();\\n\\n function __ReentrancyGuard_init() internal onlyInitializing {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\\n $._status = NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\\n // On the first call to nonReentrant, _status will be NOT_ENTERED\\n if ($._status == ENTERED) {\\n revert ReentrancyGuardReentrantCall();\\n }\\n\\n // Any calls to nonReentrant after this point will fail\\n $._status = ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n $._status = NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n * `nonReentrant` function in the call stack.\\n */\\n function _reentrancyGuardEntered() internal view returns (bool) {\\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\\n return $._status == ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0xb44e086e941292cdc7f440de51478493894ef0b1aeccb0c4047445919f667f74\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport {Initializable} from \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n */\\nabstract contract ERC165Upgradeable is Initializable, IERC165 {\\n function __ERC165_init() internal onlyInitializing {\\n }\\n\\n function __ERC165_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xdaba3f7c42c55b2896353f32bd27d4d5f8bae741b3b05d4c53f67abc4dc47ce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard ERC20 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\\n */\\ninterface IERC20Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC20InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC20InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC20InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC20InvalidSpender(address spender);\\n}\\n\\n/**\\n * @dev Standard ERC721 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\\n */\\ninterface IERC721Errors {\\n /**\\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\\n * Used in balance queries.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721InvalidOwner(address owner);\\n\\n /**\\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721NonexistentToken(uint256 tokenId);\\n\\n /**\\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param tokenId Identifier number of a token.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC721InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC721InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC721InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC721InvalidOperator(address operator);\\n}\\n\\n/**\\n * @dev Standard ERC1155 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\\n */\\ninterface IERC1155Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC1155InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC1155InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC1155MissingApprovalForAll(address operator, address owner);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC1155InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC1155InvalidOperator(address operator);\\n\\n /**\\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\\n * Used in batch transfers.\\n * @param idsLength Length of the array of token identifiers\\n * @param valuesLength Length of the array of token amounts\\n */\\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\\n}\\n\",\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IBeacon} from \\\"../beacon/IBeacon.sol\\\";\\nimport {Address} from \\\"../../utils/Address.sol\\\";\\nimport {StorageSlot} from \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n */\\nlibrary ERC1967Utils {\\n // We re-declare ERC-1967 events here because they can't be used directly from IERC1967.\\n // This will be fixed in Solidity 0.8.21. At that point we should remove these events.\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1.\\n */\\n // solhint-disable-next-line private-vars-leading-underscore\\n bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev The `implementation` of the proxy is invalid.\\n */\\n error ERC1967InvalidImplementation(address implementation);\\n\\n /**\\n * @dev The `admin` of the proxy is invalid.\\n */\\n error ERC1967InvalidAdmin(address admin);\\n\\n /**\\n * @dev The `beacon` of the proxy is invalid.\\n */\\n error ERC1967InvalidBeacon(address beacon);\\n\\n /**\\n * @dev An upgrade function sees `msg.value > 0` that may be lost.\\n */\\n error ERC1967NonPayable();\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n if (newImplementation.code.length == 0) {\\n revert ERC1967InvalidImplementation(newImplementation);\\n }\\n StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Performs implementation upgrade with additional setup call if data is nonempty.\\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\\n * to avoid stuck value in the contract.\\n *\\n * Emits an {IERC1967-Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n\\n if (data.length > 0) {\\n Address.functionDelegateCall(newImplementation, data);\\n } else {\\n _checkNonPayable();\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1.\\n */\\n // solhint-disable-next-line private-vars-leading-underscore\\n bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using\\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n if (newAdmin == address(0)) {\\n revert ERC1967InvalidAdmin(address(0));\\n }\\n StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {IERC1967-AdminChanged} event.\\n */\\n function changeAdmin(address newAdmin) internal {\\n emit AdminChanged(getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.beacon\\\" subtracted by 1.\\n */\\n // solhint-disable-next-line private-vars-leading-underscore\\n bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n if (newBeacon.code.length == 0) {\\n revert ERC1967InvalidBeacon(newBeacon);\\n }\\n\\n StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\\n\\n address beaconImplementation = IBeacon(newBeacon).implementation();\\n if (beaconImplementation.code.length == 0) {\\n revert ERC1967InvalidImplementation(beaconImplementation);\\n }\\n }\\n\\n /**\\n * @dev Change the beacon and trigger a setup call if data is nonempty.\\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\\n * to avoid stuck value in the contract.\\n *\\n * Emits an {IERC1967-BeaconUpgraded} event.\\n *\\n * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\\n * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\\n * efficiency.\\n */\\n function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n\\n if (data.length > 0) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n } else {\\n _checkNonPayable();\\n }\\n }\\n\\n /**\\n * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\\n * if an upgrade doesn't perform an initialization call.\\n */\\n function _checkNonPayable() private {\\n if (msg.value > 0) {\\n revert ERC1967NonPayable();\\n }\\n }\\n}\\n\",\"keccak256\":\"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {UpgradeableBeacon} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\\n */\\ninterface IERC1155 is IERC165 {\\n /**\\n * @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.\\n */\\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n /**\\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\\n * transfers.\\n */\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] values\\n );\\n\\n /**\\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\\n * `approved`.\\n */\\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\\n\\n /**\\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\\n *\\n * If an {URI} event was emitted for `id`, the standard\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\\n * returned by {IERC1155MetadataURI-uri}.\\n */\\n event URI(string value, uint256 indexed id);\\n\\n /**\\n * @dev Returns the value of tokens of token type `id` owned by `account`.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function balanceOf(address account, uint256 id) external view returns (uint256);\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\\n *\\n * Requirements:\\n *\\n * - `accounts` and `ids` must have the same length.\\n */\\n function balanceOfBatch(\\n address[] calldata accounts,\\n uint256[] calldata ids\\n ) external view returns (uint256[] memory);\\n\\n /**\\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\\n *\\n * Emits an {ApprovalForAll} event.\\n *\\n * Requirements:\\n *\\n * - `operator` cannot be the caller.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\\n *\\n * See {setApprovalForAll}.\\n */\\n function isApprovedForAll(address account, address operator) external view returns (bool);\\n\\n /**\\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`.\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155Received} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\\n *\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `values` must have the same length.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external;\\n}\\n\",\"keccak256\":\"0xe64b3445a3f638890af7ad92464cd18f1f202a2f5a7ed42dabf74317bae43303\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Interface that must be implemented by smart contracts in order to receive\\n * ERC-1155 token transfers.\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xb69597a63b202e28401128bed6a6d259e8730191274471af7303eafb247881a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/extensions/IERC1155MetadataURI.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC1155} from \\\"../IERC1155.sol\\\";\\n\\n/**\\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\\n */\\ninterface IERC1155MetadataURI is IERC1155 {\\n /**\\n * @dev Returns the URI for token type `id`.\\n *\\n * If the `\\\\{id\\\\}` substring is present in the URI, it must be replaced by\\n * clients with the actual token type ID.\\n */\\n function uri(uint256 id) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xe92b5e199b963d108ad6e06feeede151ba23849e0d064956535489ff967ffe68\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev The ETH balance of the account is not enough to perform the operation.\\n */\\n error AddressInsufficientBalance(address account);\\n\\n /**\\n * @dev There's no code at `target` (it is not a contract).\\n */\\n error AddressEmptyCode(address target);\\n\\n /**\\n * @dev A call to an address target failed. The target may have reverted.\\n */\\n error FailedInnerCall();\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n if (address(this).balance < amount) {\\n revert AddressInsufficientBalance(address(this));\\n }\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n if (!success) {\\n revert FailedInnerCall();\\n }\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason or custom error, it is bubbled\\n * up by this function (like regular Solidity function calls). However, if\\n * the call reverted with no returned reason, this function reverts with a\\n * {FailedInnerCall} error.\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n if (address(this).balance < value) {\\n revert AddressInsufficientBalance(address(this));\\n }\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an\\n * unsuccessful call.\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata\\n ) internal view returns (bytes memory) {\\n if (!success) {\\n _revert(returndata);\\n } else {\\n // only check if target is a contract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n if (returndata.length == 0 && target.code.length == 0) {\\n revert AddressEmptyCode(target);\\n }\\n return returndata;\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n * revert reason or with a default {FailedInnerCall} error.\\n */\\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n if (!success) {\\n _revert(returndata);\\n } else {\\n return returndata;\\n }\\n }\\n\\n /**\\n * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.\\n */\\n function _revert(bytes memory returndata) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert FailedInnerCall();\\n }\\n }\\n}\\n\",\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(newImplementation.code.length > 0);\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the Merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates Merkle trees that are safe\\n * against this attack out of the box.\\n */\\nlibrary MerkleProof {\\n /**\\n *@dev The multiproof provided is not valid.\\n */\\n error MerkleProofInvalidMultiproof();\\n\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {verify}\\n */\\n function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {\\n return processProofCalldata(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Calldata version of {processProof}\\n */\\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n *\\n * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n */\\n function multiProofVerify(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProof(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {multiProofVerify}\\n *\\n * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n */\\n function multiProofVerifyCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n * respectively.\\n *\\n * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n */\\n function processMultiProof(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the Merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 proofLen = proof.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n if (leavesLen + proofLen != totalHashes + 1) {\\n revert MerkleProofInvalidMultiproof();\\n }\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i]\\n ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n if (proofPos != proofLen) {\\n revert MerkleProofInvalidMultiproof();\\n }\\n unchecked {\\n return hashes[totalHashes - 1];\\n }\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Calldata version of {processMultiProof}.\\n *\\n * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n */\\n function processMultiProofCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the Merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 proofLen = proof.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n if (leavesLen + proofLen != totalHashes + 1) {\\n revert MerkleProofInvalidMultiproof();\\n }\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i]\\n ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n if (proofPos != proofLen) {\\n revert MerkleProofInvalidMultiproof();\\n }\\n unchecked {\\n return hashes[totalHashes - 1];\\n }\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Sorts the pair (a, b) and hashes the result.\\n */\\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\\n }\\n\\n /**\\n * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.\\n */\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x6400c4bee15052e043e5d10315135972529bd1c8012f43da494dc6b4f4661058\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"contracts/globals/id_type.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/**\\n * @notice ID_TYPE is an internal library that acts like an ENUM.\\n *\\n * @dev Used within the limited upgradability pattern:\\n *\\n * NONE & GAP: should not be used.\\n *\\n * Dual Governance:\\n * * SENATE: points to a proposal that will update the current SENATE address of a package(or Portal).\\n * * CONTRACT UPGRADE: proposal to change the given contract's implementation. TYPE should be package's TYPE.\\n *\\n * Users:\\n * * OPERATOR: permissionned Node Operators (hosted on Portal).\\n * * POOL: permissionless staking pools (hosted on Portal).\\n *\\n * Packages: (hosted on StakeModuleLib)\\n * * An ID can only point to 1(one) Package version' implementation address at a given point.\\n * * Can be upgraded by a dual governance, via pullUpgrade.\\n * * * Portal's dual governance consists of a Governance Token(governance) and a Senate(senate).\\n * * * A Package's dual governance consists of Portal(governance) and the pool owner(senate).\\n * * Built by utilizing the Modules.\\n * * LiquidityPool and WithdrawalContract are some examples.\\n *\\n * Middlewares: (hosted on StakeModuleLib)\\n * * An ID can point to multiple Middleware version' implementation address at the same time.\\n * * Cannot be upgraded.\\n * * Do not have any guides to build really.\\n * * Currently only gETHMiddlewares\\n *\\n * Limits:\\n * * We simply set limits to separate a group of types from others. Like Packages and Middlewares.\\n *\\n * @dev all LIMIT parameters are exclusive, prevents double usage.\\n */\\nlibrary ID_TYPE {\\n /// @notice TYPE 0: *invalid*\\n uint256 internal constant NONE = 0;\\n\\n /// @notice TYPE 1: Senate\\n uint256 internal constant SENATE = 1;\\n\\n /// --\\n\\n /// @notice TYPE 3: Limit: exclusive, minimum TYPE that will be percieved as a user\\n uint256 internal constant LIMIT_MIN_USER = 3;\\n\\n /// @notice TYPE 4: USER: Permissionned Node Operator\\n uint256 internal constant OPERATOR = 4;\\n\\n /// @notice TYPE 5: USER: Staking Pool\\n uint256 internal constant POOL = 5;\\n\\n /// @notice TYPE 9999: Limit: exclusive, maximum TYPE that will be percieved as a user\\n uint256 internal constant LIMIT_MAX_USER = 9999;\\n\\n /// --\\n\\n /// @notice TYPE 10000: Limit: exclusive, minimum TYPE that will be percieved as a package\\n uint256 internal constant LIMIT_MIN_PACKAGE = 10000;\\n\\n /// @notice TYPE 10001: Package: Portal is also a package\\n uint256 internal constant PACKAGE_PORTAL = 10001;\\n\\n /// @notice TYPE 10011: Package: The Withdrawal Credential Contract\\n uint256 internal constant PACKAGE_WITHDRAWAL_CONTRACT = 10011;\\n\\n /// @notice TYPE 10021: Package: A Liquidity Pool\\n uint256 internal constant PACKAGE_LIQUIDITY_POOL = 10021;\\n\\n /// @notice TYPE 19999: Limit: exclusive, maximum TYPE that will be percieved as a package\\n uint256 internal constant LIMIT_MAX_PACKAGE = 19999;\\n\\n /// --\\n\\n /// @notice TYPE 20000: Limit: exclusive, minimum TYPE that will be percieved as a middleware\\n uint256 internal constant LIMIT_MIN_MIDDLEWARE = 20000;\\n\\n /// @notice TYPE 20011: Middleware: A new gETH interface\\n uint256 internal constant MIDDLEWARE_GETH = 20011;\\n\\n /// @notice TYPE 29999: Limit: exclusive, maximum TYPE that will be percieved as a middleware\\n uint256 internal constant LIMIT_MAX_MIDDLEWARE = 29999;\\n}\\n\",\"keccak256\":\"0x703e579cedf1a96736702958c414562d80fca21ed9f2eac7fe1957905a493493\",\"license\":\"MIT\"},\"contracts/globals/macros.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n// no floats in solidity. If needed, PERCENTAGE_DENOMINATOR always represents \\\"1\\\" (100%)\\nuint256 constant PERCENTAGE_DENOMINATOR = 1e10;\\n\\nuint256 constant gETH_DENOMINATOR = 1e18;\\n\",\"keccak256\":\"0x9d699aeaf6da35d188a5495eec188b28a990e09bd04fa7701d28c4ff9afba801\",\"license\":\"MIT\"},\"contracts/globals/reserved_key_space.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/**\\n * @notice Reserved Key Space for DataStoreModule\\n * * helps preventing potential dev mistakes.\\n * * helps keeping track of them.\\n * * limits keys to bytes32.\\n *\\n * @dev utilize a key with rks.key\\n * @dev keep this list in alphabetical order, per module.\\n * @dev NEVER name your variables something else other than *its string value*.\\n * @dev ! array keys with readUint returns the lenght of the array !\\n */\\nlibrary RESERVED_KEY_SPACE {\\n /**\\n * @dev reserved on GeodeModuleLib\\n */\\n\\n /**\\n * @custom:type address\\n * @custom:definition representing body of an id\\n */\\n bytes32 internal constant CONTROLLER = \\\"CONTROLLER\\\";\\n\\n /**\\n * @custom:type bytes\\n * @custom:definition base of an id\\n */\\n bytes32 internal constant NAME = \\\"NAME\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition identifier for an id, based on ID_TYPEs\\n */\\n bytes32 internal constant TYPE = \\\"TYPE\\\";\\n\\n /**\\n * @dev reserved on StakeModuleLib\\n */\\n\\n /**\\n * @custom:type uint, relational, pool[operator]\\n * @custom:definition number of active validators run by an operator for a pool\\n */\\n bytes32 internal constant activeValidators = \\\"activeValidators\\\";\\n\\n /**\\n * @custom:type uint, relational, pool[operator]\\n * @custom:definition max amount of validators for an operator to run, for a specific pool.\\n */\\n bytes32 internal constant allowance = \\\"allowance\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition special operator that has max allowance, if threshold is hit for the pool\\n */\\n bytes32 internal constant fallbackOperator = \\\"fallbackOperator\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition treshold calculated with given percentage value for fallback operator to be activated\\n */\\n bytes32 internal constant fallbackThreshold = \\\"fallbackThreshold\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition fee of the pool or operator, will be shadowed by priorFee if switching\\n */\\n bytes32 internal constant fee = \\\"fee\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition effective timestamp pointing to the latest delayed fee change\\n */\\n bytes32 internal constant feeSwitch = \\\"feeSwitch\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition the initiation timestamp of a \\\"user\\\" TYPE id\\n */\\n bytes32 internal constant initiated = \\\"initiated\\\";\\n\\n /**\\n * @custom:type address\\n * @custom:definition bound liquidity pool of a pool\\n */\\n bytes32 internal constant liquidityPool = \\\"liquidityPool\\\";\\n\\n /**\\n * @custom:type address\\n * @custom:definition receiver address for yield seperation functionality\\n * * will receive minted gETH to given receiver instead of increasing pricePerShare\\n */\\n bytes32 internal constant yieldReceiver = \\\"yieldReceiver\\\";\\n\\n /**\\n * @custom:type address\\n * @custom:definition hot wallet for pool and operators, automatooor\\n */\\n bytes32 internal constant maintainer = \\\"maintainer\\\";\\n\\n /**\\n * @custom:type address array, direct call returns length\\n * @custom:definition contracts with more than one versions, ex: gETHMiddlewares of a pool\\n */\\n bytes32 internal constant middlewares = \\\"middlewares\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition effective timestamp pointing to the latest delayed validator period change\\n */\\n bytes32 internal constant periodSwitch = \\\"periodSwitch\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition fee that will be effective if fee is currently switching\\n */\\n bytes32 internal constant priorFee = \\\"priorFee\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition period that will be effective if validatorPeriod is currently switching\\n */\\n bytes32 internal constant priorPeriod = \\\"priorPeriod\\\";\\n\\n /**\\n * @custom:type uint, bool\\n * @custom:definition 1(true) if id is a private pool\\n */\\n bytes32 internal constant privatePool = \\\"privatePool\\\";\\n\\n /**\\n * @custom:type uint, relational, pool[operator]\\n * @custom:definition proposed validator count for pool-operator pair.\\n */\\n bytes32 internal constant proposedValidators = \\\"proposedValidators\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition timestamp of the date of the latest imprisonment for an operator\\n */\\n bytes32 internal constant release = \\\"release\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition 32 eth is secured, per proposed-but-not-yet-activated validator\\n */\\n bytes32 internal constant secured = \\\"secured\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition collateral waiting to be staked, in wei\\n */\\n bytes32 internal constant surplus = \\\"surplus\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition sum of all allowances for a pool\\n */\\n\\n bytes32 internal constant totalAllowance = \\\"totalAllowance\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition seconds, time that passes before the expected exit is reached for a validator\\n */\\n bytes32 internal constant validatorPeriod = \\\"validatorPeriod\\\";\\n\\n /**\\n * @custom:type bytes array, direct call returns length\\n * @custom:definition lists all (any state) validators' pubkeys for a pool, or an operator\\n */\\n bytes32 internal constant validators = \\\"validators\\\";\\n\\n /**\\n * @custom:type address\\n * @custom:definition custodian of validator funds for a pool\\n */\\n bytes32 internal constant withdrawalContract = \\\"withdrawalContract\\\";\\n\\n /**\\n * @custom:type bytes\\n * @custom:definition derived from withdrawalContract\\n */\\n bytes32 internal constant withdrawalCredential = \\\"withdrawalCredential\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition size of the internal wallet, which accrues fees etc. in wei\\n */\\n bytes32 internal constant wallet = \\\"wallet\\\";\\n\\n /**\\n * @custom:type address\\n * @custom:definition whitelist contract for the pool\\n */\\n bytes32 internal constant whitelist = \\\"whitelist\\\";\\n\\n /**\\n * @dev reserved on OracleExtensionLib\\n */\\n\\n /**\\n * @custom:type uint, relational, pool[operator]\\n * @custom:definition number of alienated validators run by an operator for a pool\\n */\\n bytes32 internal constant alienValidators = \\\"alienValidators\\\";\\n}\\n\",\"keccak256\":\"0x62ab3086774ad8721fa9e571e663e6444bebe30020075898406ec92ab55146bb\",\"license\":\"MIT\"},\"contracts/globals/validator_state.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/**\\n * @notice VALIDATOR_STATE: keeping track of validators within The Staking Library.\\n */\\nlibrary VALIDATOR_STATE {\\n /// @notice STATE 0: *invalid*\\n uint8 internal constant NONE = 0;\\n\\n /// @notice STATE 1: validator is proposed, 1 ETH is sent from Operator to Deposit Contract.\\n uint8 internal constant PROPOSED = 1;\\n\\n /// @notice STATE 2: proposal was approved, operator used pooled funds, 1 ETH is released back to Operator.\\n uint8 internal constant ACTIVE = 2;\\n\\n /// @notice STATE 3: validator is called to be exited.\\n uint8 internal constant EXIT_REQUESTED = 3;\\n\\n /// @notice STATE 4: validator is fully exited.\\n uint8 internal constant EXITED = 4;\\n\\n /// @notice STATE 69: proposal was malicious(alien). Maybe faulty signatures or probably frontrunning (https://bit.ly/3Tkc6UC)\\n uint8 internal constant ALIENATED = 69;\\n}\\n\",\"keccak256\":\"0xe3b6be931c93e3855d7dc1775870378652699745f7273f601dea102a7ce87546\",\"license\":\"MIT\"},\"contracts/helpers/BytesLib.sol\":{\"content\":\"// SPDX-License-Identifier: Unlicense\\n/*\\n * @title Solidity Bytes Arrays Utils\\n * @author Gon\\u00e7alo S\\u00e1 \\n *\\n * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.\\n * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.\\n */\\npragma solidity =0.8.20;\\n\\nlibrary BytesLib {\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n ) internal pure returns (bytes memory) {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(\\n 0x40,\\n and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n )\\n )\\n }\\n\\n return tempBytes;\\n }\\n\\n function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\\n assembly {\\n // Read the first 32 bytes of _preBytes storage, which is the length\\n // of the array. (We don't need to use the offset into the slot\\n // because arrays use the entire slot.)\\n let fslot := sload(_preBytes.slot)\\n // Arrays of 31 bytes or less have an even value in their slot,\\n // while longer arrays have an odd value. The actual length is\\n // the slot divided by two for odd values, and the lowest order\\n // byte divided by two for even values.\\n // If the slot is even, bitwise and the slot with 255 and divide by\\n // two to get the length. If the slot is odd, bitwise and the slot\\n // with -1 and divide by two.\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n let newlength := add(slength, mlength)\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n switch add(lt(slength, 32), lt(newlength, 32))\\n case 2 {\\n // Since the new array still fits in the slot, we just need to\\n // update the contents of the slot.\\n // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\\n sstore(\\n _preBytes.slot,\\n // all the modifications to the slot are inside this\\n // next block\\n add(\\n // we can just add to the slot contents because the\\n // bytes we want to change are the LSBs\\n fslot,\\n add(\\n mul(\\n div(\\n // load the bytes from memory\\n mload(add(_postBytes, 0x20)),\\n // zero all bytes to the right\\n exp(0x100, sub(32, mlength))\\n ),\\n // and now shift left the number of bytes to\\n // leave space for the length in the slot\\n exp(0x100, sub(32, newlength))\\n ),\\n // increase length by the double of the memory\\n // bytes length\\n mul(mlength, 2)\\n )\\n )\\n )\\n }\\n case 1 {\\n // The stored value fits in the slot, but the combined value\\n // will exceed it.\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // The contents of the _postBytes array start 32 bytes into\\n // the structure. Our first read should obtain the `submod`\\n // bytes that can fit into the unused space in the last word\\n // of the stored array. To get this, we read 32 bytes starting\\n // from `submod`, so the data we read overlaps with the array\\n // contents by `submod` bytes. Masking the lowest-order\\n // `submod` bytes allows us to add that value directly to the\\n // stored value.\\n\\n let submod := sub(32, slength)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(\\n sc,\\n add(\\n and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00),\\n and(mload(mc), mask)\\n )\\n )\\n\\n for {\\n mc := add(mc, 0x20)\\n sc := add(sc, 1)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n default {\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n // Start copying to the last used word of the stored array.\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // Copy over the first `submod` bytes of the new data as in\\n // case 1 above.\\n let slengthmod := mod(slength, 32)\\n let mlengthmod := mod(mlength, 32)\\n let submod := sub(32, slengthmod)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(sc, add(sload(sc), and(mload(mc), mask)))\\n\\n for {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n }\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_bytes.length >= _start + 1, \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {\\n require(_bytes.length >= _start + 2, \\\"toUint16_outOfBounds\\\");\\n uint16 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x2), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {\\n require(_bytes.length >= _start + 4, \\\"toUint32_outOfBounds\\\");\\n uint32 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x4), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {\\n require(_bytes.length >= _start + 8, \\\"toUint64_outOfBounds\\\");\\n uint64 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x8), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {\\n require(_bytes.length >= _start + 12, \\\"toUint96_outOfBounds\\\");\\n uint96 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0xc), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {\\n require(_bytes.length >= _start + 16, \\\"toUint128_outOfBounds\\\");\\n uint128 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x10), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {\\n require(_bytes.length >= _start + 32, \\\"toUint256_outOfBounds\\\");\\n uint256 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {\\n require(_bytes.length >= _start + 32, \\\"toBytes32_outOfBounds\\\");\\n bytes32 tempBytes32;\\n\\n assembly {\\n tempBytes32 := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempBytes32;\\n }\\n\\n function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\\n bool success = true;\\n\\n assembly {\\n let length := mload(_preBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(length, mload(_postBytes))\\n case 1 {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n let mc := add(_preBytes, 0x20)\\n let end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n } eq(add(lt(mc, end), cb), 2) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // if any of these checks fails then arrays are not equal\\n if iszero(eq(mload(mc), mload(cc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function equalStorage(\\n bytes storage _preBytes,\\n bytes memory _postBytes\\n ) internal view returns (bool) {\\n bool success = true;\\n\\n assembly {\\n // we know _preBytes_offset is 0\\n let fslot := sload(_preBytes.slot)\\n // Decode the length of the stored array like in concatStorage().\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(slength, mlength)\\n case 1 {\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n if iszero(iszero(slength)) {\\n switch lt(slength, 32)\\n case 1 {\\n // blank the last byte which is the length\\n fslot := mul(div(fslot, 0x100), 0x100)\\n\\n if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\\n // unsuccess:\\n success := 0\\n }\\n }\\n default {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := keccak256(0x0, 0x20)\\n\\n let mc := add(_postBytes, 0x20)\\n let end := add(mc, mlength)\\n\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n for {\\n\\n } eq(add(lt(mc, end), cb), 2) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n if iszero(eq(sload(sc), mload(mc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n}\\n\",\"keccak256\":\"0x4ee3f6ef85baa41794fc1519522f7c135becd0e267980eadc68dd643e52b59c7\",\"license\":\"Unlicense\"},\"contracts/interfaces/IPortal.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IGeodeModule} from \\\"./modules/IGeodeModule.sol\\\";\\nimport {IStakeModule} from \\\"./modules/IStakeModule.sol\\\";\\n\\ninterface IPortal is IGeodeModule, IStakeModule {\\n function pausegETH() external;\\n\\n function unpausegETH() external;\\n\\n function pushUpgrade(uint256 packageType) external returns (uint256 id);\\n\\n function releasePrisoned(uint256 operatorId) external;\\n}\\n\",\"keccak256\":\"0x012a8ed050ba68838eeb7463b75f32ba8fdf50c9e54e44dd37d4e87ca16ba78c\",\"license\":\"MIT\"},\"contracts/interfaces/IgETH.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IERC1155PausableBurnableSupply} from \\\"./helpers/IERC1155PausableBurnableSupply.sol\\\";\\n\\ninterface IgETH is IERC1155PausableBurnableSupply {\\n function denominator() external view returns (uint256);\\n\\n function isMiddleware(address middleware, uint256 id) external view returns (bool);\\n\\n function setMiddleware(address middleware, uint256 id, bool isSet) external;\\n\\n function isAvoider(address account, uint256 id) external view returns (bool);\\n\\n function avoidMiddlewares(uint256 id, bool isAvoid) external;\\n\\n function pricePerShare(uint256 id) external view returns (uint256);\\n\\n function priceUpdateTimestamp(uint256 id) external view returns (uint256);\\n\\n function setPricePerShare(uint256 price, uint256 id) external;\\n\\n function transferUriSetterRole(address newUriSetter) external;\\n\\n function transferPauserRole(address newPauser) external;\\n\\n function transferMinterRole(address newMinter) external;\\n\\n function transferOracleRole(address newOracle) external;\\n\\n function transferMiddlewareManagerRole(address newMiddlewareManager) external;\\n}\\n\",\"keccak256\":\"0xa093b769e8ba42091d3db8a9e4ddc1be066f4aa92f61ee552983c22a0e9f29d8\",\"license\":\"MIT\"},\"contracts/interfaces/helpers/IDepositContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/** This interface is designed to be compatible with the Vyper version.\\n * @notice This is the Ethereum 2.0 deposit contract interface.\\n * For more information see the Phase 0 specification under https://github.com/ethereum/eth2.0-specs\\n */\\ninterface IDepositContract {\\n /**\\n * @notice Submit a Phase 0 DepositData object.\\n * @param pubkey A BLS12-381 public key.\\n * @param withdrawal_credentials Commitment to a public key for withdrawals.\\n * @param signature A BLS12-381 signature.\\n * @param deposit_data_root The SHA-256 hash of the SSZ-encoded DepositData object.\\n *Used as a protection against malformed input.\\n */\\n function deposit(\\n bytes calldata pubkey,\\n bytes calldata withdrawal_credentials,\\n bytes calldata signature,\\n bytes32 deposit_data_root\\n ) external payable;\\n}\\n\",\"keccak256\":\"0x2db8802f8f888c62b147508e142e15c59775ff75906d09122e810483919bff27\",\"license\":\"MIT\"},\"contracts/interfaces/helpers/IERC1155PausableBurnableSupply.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/// @dev IERC1155 inherits IERC165\\nimport {IERC1155} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Errors} from \\\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\\\";\\n\\ninterface IERC1155Burnable is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function burn(address account, uint256 id, uint256 value) external;\\n\\n function burnBatch(address account, uint256[] memory ids, uint256[] memory values) external;\\n}\\n\\ninterface IERC1155Supply is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function totalSupply(uint256 id) external view returns (uint256);\\n\\n function exists(uint256 id) external view returns (bool);\\n}\\n\\ninterface IERC1155PausableBurnableSupply is IERC1155Burnable, IERC1155Supply {\\n function setURI(string memory newuri) external;\\n\\n function pause() external;\\n\\n function unpause() external;\\n\\n function mint(address account, uint256 id, uint256 amount, bytes memory data) external;\\n\\n function mintBatch(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) external;\\n}\\n\",\"keccak256\":\"0x8b0a02fdbc8d54c815d68e122f6869348217b5efd853c8b833c59d2053998ef0\",\"license\":\"MIT\"},\"contracts/interfaces/modules/IDataStoreModule.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\ninterface IDataStoreModule {\\n function generateId(string calldata _name, uint256 _type) external pure returns (uint256 id);\\n\\n function getKey(uint256 _id, bytes32 _param) external pure returns (bytes32 key);\\n\\n function allIdsByType(uint256 _type, uint256 _index) external view returns (uint256);\\n\\n function allIdsByTypeLength(uint256 _type) external view returns (uint256);\\n\\n function readUint(uint256 id, bytes32 key) external view returns (uint256 data);\\n\\n function readAddress(uint256 id, bytes32 key) external view returns (address data);\\n\\n function readBytes(uint256 id, bytes32 key) external view returns (bytes memory data);\\n\\n function readUintArray(\\n uint256 id,\\n bytes32 key,\\n uint256 index\\n ) external view returns (uint256 data);\\n\\n function readBytesArray(\\n uint256 id,\\n bytes32 key,\\n uint256 index\\n ) external view returns (bytes memory data);\\n\\n function readAddressArray(\\n uint256 id,\\n bytes32 key,\\n uint256 index\\n ) external view returns (address data);\\n}\\n\",\"keccak256\":\"0x3ba6191b4a643bce171bb7dc9b39a55dd0c8c932934429902dec4eb7b6c3df9a\",\"license\":\"MIT\"},\"contracts/interfaces/modules/IGeodeModule.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IDataStoreModule} from \\\"./IDataStoreModule.sol\\\";\\nimport {Proposal} from \\\"../../modules/GeodeModule/structs/utils.sol\\\";\\n\\ninterface IGeodeModule is IDataStoreModule {\\n function isolationMode() external view returns (bool);\\n\\n function GeodeParams()\\n external\\n view\\n returns (\\n address governance,\\n address senate,\\n address approvedUpgrade,\\n uint256 senateExpiry,\\n uint256 packageType\\n );\\n\\n function getGovernance() external view returns (address);\\n\\n function getContractVersion() external view returns (uint256);\\n\\n function getProposal(uint256 id) external view returns (Proposal memory proposal);\\n\\n function propose(\\n address _CONTROLLER,\\n uint256 _TYPE,\\n bytes calldata _NAME,\\n uint256 duration\\n ) external returns (uint256 id);\\n\\n function rescueSenate(address _newSenate) external;\\n\\n function approveProposal(\\n uint256 id\\n ) external returns (address _controller, uint256 _type, bytes memory _name);\\n\\n function changeSenate(address _newSenate) external;\\n\\n function changeIdCONTROLLER(uint256 id, address newCONTROLLER) external;\\n}\\n\",\"keccak256\":\"0x2eb0e5472c00c7d91443f0544ce349129266665dd59f1e4b0598173df1a9d1c5\",\"license\":\"MIT\"},\"contracts/interfaces/modules/IStakeModule.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IDataStoreModule} from \\\"./IDataStoreModule.sol\\\";\\nimport {Validator} from \\\"../../modules/StakeModule/structs/utils.sol\\\";\\n\\ninterface IStakeModule is IDataStoreModule {\\n function pause() external;\\n\\n function unpause() external;\\n\\n function setInfrastructureFee(uint256 _type, uint256 fee) external;\\n\\n function setBeaconDelays(uint256 entry, uint256 exit) external;\\n\\n function setInitiationDeposit(uint256 newInitiationDeposit) external;\\n\\n function StakeParams()\\n external\\n view\\n returns (\\n address gETH,\\n address oraclePosition,\\n uint256 validatorsIndex,\\n uint256 verificationIndex,\\n uint256 monopolyThreshold,\\n uint256 beaconDelayEntry,\\n uint256 beaconDelayExit,\\n uint256 initiationDeposit,\\n uint256 oracleUpdateTimestamp,\\n uint256 dailyPriceIncreaseLimit,\\n uint256 dailyPriceDecreaseLimit\\n );\\n\\n function getValidator(bytes calldata pubkey) external view returns (Validator memory);\\n\\n function getPackageVersion(uint256 _type) external view returns (uint256);\\n\\n function getPriceMerkleRoot() external view returns (bytes32);\\n\\n function getBalancesMerkleRoot() external view returns (bytes32);\\n\\n function isMiddleware(uint256 _type, uint256 _version) external view returns (bool);\\n\\n function getInfrastructureFee(uint256 _type) external view returns (uint256);\\n\\n function initiateOperator(\\n uint256 id,\\n uint256 fee,\\n uint256 validatorPeriod,\\n address maintainer\\n ) external payable;\\n\\n function deployLiquidityPool(uint256 poolId) external;\\n\\n function initiatePool(\\n uint256 fee,\\n uint256 middlewareVersion,\\n address maintainer,\\n bytes calldata NAME,\\n bytes calldata middleware_data,\\n bool[3] calldata config\\n ) external payable returns (uint256 poolId);\\n\\n function setPoolVisibility(uint256 poolId, bool makePrivate) external;\\n\\n function setWhitelist(uint256 poolId, address whitelist) external;\\n\\n function setYieldReceiver(uint256 poolId, address yieldReceiver) external;\\n\\n function changeMaintainer(uint256 id, address newMaintainer) external;\\n\\n function getMaintenanceFee(uint256 id) external view returns (uint256);\\n\\n function switchMaintenanceFee(uint256 id, uint256 newFee) external;\\n\\n function increaseWalletBalance(uint256 id) external payable returns (bool);\\n\\n function decreaseWalletBalance(uint256 id, uint256 value) external returns (bool);\\n\\n function isPrisoned(uint256 operatorId) external view returns (bool);\\n\\n function blameExit(\\n bytes calldata pk,\\n uint256 beaconBalance,\\n uint256 withdrawnBalance,\\n bytes32[] calldata balanceProof\\n ) external;\\n\\n function blameProposal(bytes calldata pk) external;\\n\\n function getValidatorPeriod(uint256 id) external view returns (uint256);\\n\\n function switchValidatorPeriod(uint256 operatorId, uint256 newPeriod) external;\\n\\n function setFallbackOperator(\\n uint256 poolId,\\n uint256 operatorId,\\n uint256 fallbackThreshold\\n ) external;\\n\\n function operatorAllowance(uint256 poolId, uint256 operatorId) external view returns (uint256);\\n\\n function delegate(\\n uint256 poolId,\\n uint256[] calldata operatorIds,\\n uint256[] calldata allowances\\n ) external;\\n\\n function isWhitelisted(uint256 poolId, address staker) external view returns (bool);\\n\\n function isPrivatePool(uint256 poolId) external view returns (bool);\\n\\n function isPriceValid(uint256 poolId) external view returns (bool);\\n\\n function isMintingAllowed(uint256 poolId) external view returns (bool);\\n\\n function deposit(\\n uint256 poolId,\\n uint256 price,\\n bytes32[] calldata priceProof,\\n uint256 mingETH,\\n uint256 deadline,\\n address receiver\\n ) external payable returns (uint256 boughtgETH, uint256 mintedgETH);\\n\\n function canStake(bytes calldata pubkey) external view returns (bool);\\n\\n function proposeStake(\\n uint256 poolId,\\n uint256 operatorId,\\n bytes[] calldata pubkeys,\\n bytes[] calldata signatures1,\\n bytes[] calldata signatures31\\n ) external;\\n\\n function stake(uint256 operatorId, bytes[] calldata pubkeys) external;\\n\\n function requestExit(uint256 poolId, bytes memory pk) external;\\n\\n function finalizeExit(uint256 poolId, bytes memory pk) external;\\n\\n function updateVerificationIndex(\\n uint256 validatorVerificationIndex,\\n bytes[] calldata alienatedPubkeys\\n ) external;\\n\\n function regulateOperators(uint256[] calldata feeThefts, bytes[] calldata proofs) external;\\n\\n function reportBeacon(\\n bytes32 priceMerkleRoot,\\n bytes32 balanceMerkleRoot,\\n uint256 allValidatorsCount\\n ) external;\\n\\n function priceSync(uint256 poolId, uint256 price, bytes32[] calldata priceProof) external;\\n\\n function priceSyncBatch(\\n uint256[] calldata poolIds,\\n uint256[] calldata prices,\\n bytes32[][] calldata priceProofs\\n ) external;\\n}\\n\",\"keccak256\":\"0xc40b5a52176334fe7d2edd7fbd28fc529cf261d8ce3ffa138e0930899d545a03\",\"license\":\"MIT\"},\"contracts/interfaces/modules/IWithdrawalModule.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\ninterface IWithdrawalModule {\\n function pause() external;\\n\\n function unpause() external;\\n\\n function setExitThreshold(uint256 newThreshold) external;\\n\\n function claimInfrastructureFees(address receiver) external returns (bool success);\\n\\n function WithdrawalParams()\\n external\\n view\\n returns (\\n address gETH,\\n address portal,\\n uint256 poolId,\\n uint256 exitThreshold,\\n uint256 gatheredInfrastructureFees\\n );\\n\\n function QueueParams()\\n external\\n view\\n returns (\\n uint256 requested,\\n uint256 realized,\\n uint256 realizedEtherBalance,\\n uint256 realizedPrice,\\n uint256 fulfilled,\\n uint256 fulfilledEtherBalance,\\n uint256 commonPoll\\n );\\n\\n function getRequest(\\n uint256 index\\n )\\n external\\n view\\n returns (\\n address owner,\\n uint256 trigger,\\n uint256 size,\\n uint256 fulfilled,\\n uint256 claimableEther\\n );\\n\\n function getValidatorData(\\n bytes calldata pubkey\\n ) external view returns (uint256 beaconBalance, uint256 withdrawnBalance, uint256 poll);\\n\\n function canFinalizeExit(bytes memory pubkey) external view returns (bool);\\n\\n function validatorThreshold(bytes memory pubkey) external view returns (uint256 threshold);\\n\\n function enqueue(\\n uint256 size,\\n bytes calldata pubkey,\\n address owner\\n ) external returns (uint256 index);\\n\\n function enqueueBatch(\\n uint256[] calldata sizes,\\n bytes[] calldata pubkeys,\\n address owner\\n ) external returns (uint256[] memory indexes);\\n\\n function transferRequest(uint256 index, address newOwner) external;\\n\\n function fulfillable(uint256 index) external view returns (uint256);\\n\\n function fulfill(uint256 index) external;\\n\\n function fulfillBatch(uint256[] calldata indexes) external;\\n\\n function dequeue(uint256 index, address receiver) external;\\n\\n function dequeueBatch(uint256[] calldata indexes, address receiver) external;\\n\\n function processValidators(\\n bytes[] calldata pubkeys,\\n uint256[] calldata beaconBalances,\\n uint256[] calldata withdrawnBalances,\\n bytes32[][] calldata balanceProofs,\\n uint256 price,\\n bytes32[] calldata priceProof\\n ) external;\\n\\n function multicall(bytes[] calldata data) external returns (bytes[] memory results);\\n}\\n\",\"keccak256\":\"0xa2a89742f100d1d5b43bb154834485ab23ec1c5cb54db6129b2ffffe896f5283\",\"license\":\"MIT\"},\"contracts/interfaces/packages/IGeodePackage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IGeodeModule} from \\\"../modules/IGeodeModule.sol\\\";\\nimport {IPortal} from \\\"../IPortal.sol\\\";\\n\\ninterface IGeodePackage is IGeodeModule {\\n function initialize(\\n uint256 poolId,\\n address owner,\\n bytes calldata versionName,\\n bytes memory data\\n ) external;\\n\\n function getPoolId() external view returns (uint256);\\n\\n function getProposedVersion() external view returns (uint256);\\n\\n function pullUpgrade() external;\\n}\\n\",\"keccak256\":\"0x9c854fab873502a768e5903e7f66b6697313f77bea4d5ca200aad8d0c3190ed9\",\"license\":\"MIT\"},\"contracts/interfaces/packages/IWithdrawalContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IWithdrawalModule} from \\\"../modules/IWithdrawalModule.sol\\\";\\nimport {IGeodePackage} from \\\"./IGeodePackage.sol\\\";\\n\\ninterface IWithdrawalContract is IGeodePackage, IWithdrawalModule {}\\n\",\"keccak256\":\"0xc9a03944fbe05f7988bfe60d70bdf4a51041009e8cbf49da9a50cf2a4d3d4e92\",\"license\":\"MIT\"},\"contracts/modules/DataStoreModule/DataStoreModule.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n// external - contracts\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\n// internal - interfaces\\nimport {IDataStoreModule} from \\\"../../interfaces/modules/IDataStoreModule.sol\\\";\\n// internal - structs\\nimport {DataStoreModuleStorage} from \\\"./structs/storage.sol\\\";\\n// internal - libraries\\nimport {DataStoreModuleLib as DSML} from \\\"./libs/DataStoreModuleLib.sol\\\";\\n\\n/**\\n * @title DSM: DataStore Module\\n *\\n * @notice A storage management tool designed to create a safe and scalable storage layout\\n * for upgradable contracts with various types of data classes (users, packages, definitions).\\n *\\n * @dev review: this module delegates its functionality to DSML (DataStoreModuleLib).\\n * DSM or DSML has NO access control.\\n *\\n * @dev There are no additional functionalities implemented apart from the library.\\n *\\n * @dev NO function needs to be overriden when inherited.\\n *\\n * @dev __DataStoreModule_init (or _unchained) call is not necessary when inherited.\\n *\\n * @dev No storage-altering external/public functions are exposed here, only view/pure external functions.\\n *\\n * @author Ice Bear & Crash Bandicoot\\n */\\nabstract contract DataStoreModule is IDataStoreModule, Initializable {\\n using DSML for DataStoreModuleStorage;\\n\\n /**\\n * @custom:section ** VARIABLES **\\n *\\n * @dev Do not add any other variables here. Modules do not have a gap.\\n * Library's main struct has a gap, providing up to 16 storage slots for this module.\\n */\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"geode.storage.DataStoreModule\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant DataStoreModuleStorageLocation =\\n 0xa3ee0f890fa2a50cc11476f86783721ec49c3aba88b83a957fe08235f6485c00;\\n\\n function _getDataStoreModuleStorage() internal pure returns (DataStoreModuleStorage storage $) {\\n assembly {\\n $.slot := DataStoreModuleStorageLocation\\n }\\n }\\n\\n /**\\n * @custom:section ** INITIALIZING **\\n */\\n\\n function __DataStoreModule_init() internal onlyInitializing {}\\n\\n function __DataStoreModule_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @custom:section ** HELPER FUNCTIONS **\\n *\\n * @custom:visibility -> pure-external\\n */\\n\\n /**\\n * @notice useful function for string inputs - returns same with the DSML.generateId\\n * @dev id is generated by keccak(name, type)\\n */\\n function generateId(\\n string calldata _name,\\n uint256 _type\\n ) external pure virtual override returns (uint256 id) {\\n id = uint256(keccak256(abi.encode(_name, _type)));\\n }\\n\\n /**\\n * @notice useful view function for string inputs - returns same with the DSML.generateId\\n */\\n function getKey(\\n uint256 _id,\\n bytes32 _param\\n ) external pure virtual override returns (bytes32 key) {\\n return DSML.getKey(_id, _param);\\n }\\n\\n /**\\n * @custom:section ** DATA GETTER FUNCTIONS **\\n *\\n * @custom:visibility -> view-external\\n */\\n\\n /**\\n * @dev useful for outside reach, shouldn't be used within contracts as a referance\\n * @return allIdsByType is an array of IDs of the given TYPE from Datastore,\\n * returns a specific index\\n */\\n function allIdsByType(\\n uint256 _type,\\n uint256 _index\\n ) external view virtual override returns (uint256) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n return $.allIdsByType[_type][_index];\\n }\\n\\n function allIdsByTypeLength(uint256 _type) external view virtual override returns (uint256) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n return $.allIdsByType[_type].length;\\n }\\n\\n function readUint(uint256 id, bytes32 key) external view virtual override returns (uint256 data) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n data = $.readUint(id, key);\\n }\\n\\n function readAddress(\\n uint256 id,\\n bytes32 key\\n ) external view virtual override returns (address data) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n data = $.readAddress(id, key);\\n }\\n\\n function readBytes(\\n uint256 id,\\n bytes32 key\\n ) external view virtual override returns (bytes memory data) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n data = $.readBytes(id, key);\\n }\\n\\n /**\\n * @custom:section ** ARRAY GETTER FUNCTIONS **\\n *\\n * @custom:visibility -> view-external\\n */\\n\\n function readUintArray(\\n uint256 id,\\n bytes32 key,\\n uint256 index\\n ) external view virtual override returns (uint256 data) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n data = $.readUintArray(id, key, index);\\n }\\n\\n function readBytesArray(\\n uint256 id,\\n bytes32 key,\\n uint256 index\\n ) external view virtual override returns (bytes memory data) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n data = $.readBytesArray(id, key, index);\\n }\\n\\n function readAddressArray(\\n uint256 id,\\n bytes32 key,\\n uint256 index\\n ) external view virtual override returns (address data) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n data = $.readAddressArray(id, key, index);\\n }\\n}\\n\",\"keccak256\":\"0x89696c175fed14370a80be8820b43ba538177e4fbb48bc313309635816968656\",\"license\":\"MIT\"},\"contracts/modules/DataStoreModule/libs/DataStoreModuleLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity =0.8.20;\\n\\n// external - interfaces\\n// external - libraries\\n// external - contracts\\n// internal - globals\\n// internal - interfaces\\nimport {DataStoreModuleStorage} from \\\"../structs/storage.sol\\\";\\n\\n// internal - structs\\n// internal - libraries\\n\\n/**\\n * @title DSML: DataStore Module Library\\n *\\n * @notice A Storage Management Library created for the contracts and modules that inherits DataStoreModule (DSM).\\n * Enables Dynamic Structs with unlimited key space.\\n * Provides an Isolated Storage Layout with IDs and KEYs.\\n * Focusing on upgradable contracts with various data types to create a\\n * * sustainable development environment.\\n * In summary, extra gas cost that would be saved with Storage packing are\\n * * ignored to create dynamic structs.\\n *\\n * @dev Distinct id and key pairs SHOULD return different storage slots. No collisions!\\n * @dev IDs are the representation of an entity with any given key as properties.\\n * @dev review: Reserved TYPEs are defined within globals/id_type.sol\\n * @dev review: For a safer development process, NEVER use the DataStoreModuleStorage with strings. Refer to globals/reserved_key_space.sol\\n *\\n * @dev While it is a good practice for keeping a record;\\n * * TYPE for ID is not mandatory, an ID might not have an explicit type.\\n * * e.g., When a relational data is added with getKey, like allowance, it has a unique ID but no TYPE.\\n * * Thus there are no checks for types or keys.\\n *\\n * @dev readUint(id, arrayName) returns the lenght of array.\\n *\\n * @dev Contracts relying on this library must use DataStoreModuleLib.DataStoreModuleStorage\\n * @dev This is an internal library, requires NO deployment.\\n *\\n * @author Ice Bear & Crash Bandicoot\\n */\\nlibrary DataStoreModuleLib {\\n /**\\n * @custom:section ** HELPERS **\\n *\\n * @custom:visibility -> pure-internal\\n */\\n\\n /**\\n * @notice generalized method of generating an ID\\n *\\n * @dev Some TYPEs may require permissionless creation, allowing anyone to claim any ID;\\n * meaning malicious actors can claim names to mislead people. To prevent this\\n * TYPEs will be considered during ID generation.\\n */\\n function generateId(bytes memory _name, uint256 _type) internal pure returns (uint256 id) {\\n id = uint256(keccak256(abi.encode(_name, _type)));\\n }\\n\\n /**\\n * @notice hash of given ID and a KEY defines the key for the DataStoreModuleStorage\\n * @return key bytes32, hash.\\n **/\\n function getKey(uint256 id, bytes32 param) internal pure returns (bytes32 key) {\\n key = keccak256(abi.encode(id, param));\\n }\\n\\n /**\\n * @custom:section ** DATA GETTERS **\\n *\\n * @custom:visibility -> view-internal\\n */\\n\\n function readUint(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key\\n ) internal view returns (uint256 data) {\\n data = self.uintData[getKey(_id, _key)];\\n }\\n\\n function readBytes(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key\\n ) internal view returns (bytes memory data) {\\n data = self.bytesData[getKey(_id, _key)];\\n }\\n\\n function readAddress(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key\\n ) internal view returns (address data) {\\n data = self.addressData[getKey(_id, _key)];\\n }\\n\\n /**\\n * @custom:section ** ARRAY GETTERS **\\n *\\n * @custom:visibility -> view-internal\\n */\\n\\n function readUintArray(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256 _index\\n ) internal view returns (uint256 data) {\\n data = self.uintData[getKey(_index, getKey(_id, _key))];\\n }\\n\\n function readBytesArray(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256 _index\\n ) internal view returns (bytes memory data) {\\n data = self.bytesData[getKey(_index, getKey(_id, _key))];\\n }\\n\\n function readAddressArray(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256 _index\\n ) internal view returns (address data) {\\n data = self.addressData[getKey(_index, getKey(_id, _key))];\\n }\\n\\n /**\\n * @custom:section ** STATE MODIFYING FUNCTIONS **\\n *\\n * @custom:visibility -> internal\\n */\\n\\n /**\\n * @custom:subsection ** DATA SETTERS **\\n */\\n\\n function writeUint(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256 _data\\n ) internal {\\n self.uintData[getKey(_id, _key)] = _data;\\n }\\n\\n function addUint(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256 _addend\\n ) internal {\\n self.uintData[getKey(_id, _key)] += _addend;\\n }\\n\\n function subUint(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256 _minuend\\n ) internal {\\n self.uintData[getKey(_id, _key)] -= _minuend;\\n }\\n\\n function writeBytes(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n bytes memory _data\\n ) internal {\\n self.bytesData[getKey(_id, _key)] = _data;\\n }\\n\\n function writeAddress(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n address _data\\n ) internal {\\n self.addressData[getKey(_id, _key)] = _data;\\n }\\n\\n /**\\n * @custom:subsection ** ARRAY SETTERS **\\n */\\n\\n function appendUintArray(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256 _data\\n ) internal {\\n bytes32 arrayKey = getKey(_id, _key);\\n self.uintData[getKey(self.uintData[arrayKey]++, arrayKey)] = _data;\\n }\\n\\n function appendBytesArray(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n bytes memory _data\\n ) internal {\\n bytes32 arrayKey = getKey(_id, _key);\\n self.bytesData[getKey(self.uintData[arrayKey]++, arrayKey)] = _data;\\n }\\n\\n function appendAddressArray(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n address _data\\n ) internal {\\n bytes32 arrayKey = getKey(_id, _key);\\n self.addressData[getKey(self.uintData[arrayKey]++, arrayKey)] = _data;\\n }\\n\\n /**\\n * @custom:subsection ** BATCH ARRAY SETTERS **\\n */\\n\\n function appendUintArrayBatch(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256[] memory _data\\n ) internal {\\n bytes32 arrayKey = getKey(_id, _key);\\n uint256 arrayLen = self.uintData[arrayKey];\\n\\n uint256 _dataLen = _data.length;\\n for (uint256 i; i < _dataLen; ) {\\n self.uintData[getKey(arrayLen++, arrayKey)] = _data[i];\\n unchecked {\\n i += 1;\\n }\\n }\\n\\n self.uintData[arrayKey] = arrayLen;\\n }\\n\\n function appendBytesArrayBatch(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n bytes[] memory _data\\n ) internal {\\n bytes32 arrayKey = getKey(_id, _key);\\n uint256 arrayLen = self.uintData[arrayKey];\\n\\n uint256 _dataLen = _data.length;\\n for (uint256 i; i < _dataLen; ) {\\n self.bytesData[getKey(arrayLen++, arrayKey)] = _data[i];\\n unchecked {\\n i += 1;\\n }\\n }\\n\\n self.uintData[arrayKey] = arrayLen;\\n }\\n\\n function appendAddressArrayBatch(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n address[] memory _data\\n ) internal {\\n bytes32 arrayKey = getKey(_id, _key);\\n uint256 arrayLen = self.uintData[arrayKey];\\n\\n uint256 _dataLen = _data.length;\\n for (uint256 i; i < _dataLen; ) {\\n self.addressData[getKey(arrayLen++, arrayKey)] = _data[i];\\n unchecked {\\n i += 1;\\n }\\n }\\n\\n self.uintData[arrayKey] = arrayLen;\\n }\\n}\\n\",\"keccak256\":\"0x5a3b3ca22504164ac53369e1fe1d7d7febb603c672fce147ce1a86b4875fd219\",\"license\":\"MIT\"},\"contracts/modules/DataStoreModule/structs/storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/**\\n * @notice Storage Struct for reading/writing operations for given (id, key) pairs.\\n *\\n * @param allIdsByType type => id[], optional categorization for IDs, can be directly accessed.\\n * @param uintData keccak(id, key) => returns uint256\\n * @param bytesData keccak(id, key) => returns bytes\\n * @param addressData keccak(id, key) => returns address\\n *\\n * @dev any other storage type can be expressed as uint or bytes. E.g., bools are 0/1 as uints.\\n *\\n * @dev normally we would put custom:storage-location erc7201:geode.storage.DataStoreModule\\n * but compiler throws an error... So np for now, just effects dev ex.\\n */\\nstruct DataStoreModuleStorage {\\n mapping(uint256 => uint256[]) allIdsByType;\\n mapping(bytes32 => uint256) uintData;\\n mapping(bytes32 => bytes) bytesData;\\n mapping(bytes32 => address) addressData;\\n}\\n\",\"keccak256\":\"0x10c4430d4d368abd4bd5488b4cf6c942c6e26e58ae52163926cd5daae3e0c77f\",\"license\":\"MIT\"},\"contracts/modules/GeodeModule/GeodeModule.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n// external - library\\nimport {ERC1967Utils} from \\\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\\\";\\n// external - contracts\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\n// internal - globals\\nimport {ID_TYPE} from \\\"../../globals/id_type.sol\\\";\\n// internal - interfaces\\nimport {IGeodeModule} from \\\"../../interfaces/modules/IGeodeModule.sol\\\";\\n// internal - structs\\nimport {DataStoreModuleStorage} from \\\"../DataStoreModule/structs/storage.sol\\\";\\nimport {GeodeModuleStorage} from \\\"./structs/storage.sol\\\";\\nimport {Proposal} from \\\"./structs/utils.sol\\\";\\n// internal - libraries\\nimport {GeodeModuleLib as GML} from \\\"./libs/GeodeModuleLib.sol\\\";\\nimport {DataStoreModuleLib as DSML} from \\\"../DataStoreModule/libs/DataStoreModuleLib.sol\\\";\\n// internal - contracts\\nimport {DataStoreModule} from \\\"../DataStoreModule/DataStoreModule.sol\\\";\\n\\n/**\\n * @title GM: Geode Module\\n *\\n * @notice Base logic for Upgradable Packages:\\n * * Dual Governance with Senate+Governance: Governance proposes, Senate approves.\\n * * Limited Upgradability built on top of UUPS via Dual Governance.\\n *\\n * @dev review: this module delegates its functionality to GML (GeodeModuleLib):\\n * GML has onlyGovernance, onlySenate, onlyController modifiers for access control.\\n *\\n * @dev There is 1 additional functionality implemented apart from the library:\\n * Mutating UUPS pattern to fit Limited Upgradability:\\n * 1. New implementation contract is proposed with its own package type within the limits, refer to globals/id_type.sol.\\n * 2. Proposal is approved by the contract owner, Senate.\\n * 3. approveProposal calls _handleUpgrade which mimics UUPS.upgradeTo:\\n * 3.1. Checks the implementation address with _authorizeUpgrade, also preventing any UUPS upgrades.\\n * 3.2. Upgrades the contract with no function to call afterwards.\\n * 3.3. Sets contract version. Note that it does not increase linearly like one might expect.\\n *\\n * @dev 1 function needs to be overriden when inherited: isolationMode. (also refer to approveProposal)\\n *\\n * @dev __GeodeModule_init (or _unchained) call is NECESSARY when inherited.\\n * However, deployer MUST call initializer after upgradeTo call,\\n * should not call initializer on upgradeToAndCall or new ERC1967Proxy calls.\\n *\\n * @dev This module inherits DataStoreModule.\\n *\\n * @author Ice Bear & Crash Bandicoot\\n */\\nabstract contract GeodeModule is IGeodeModule, UUPSUpgradeable, DataStoreModule {\\n using GML for GeodeModuleStorage;\\n\\n /**\\n * @custom:section ** VARIABLES **\\n *\\n * @dev Do not add any other variables here. Modules do not have a gap.\\n * Library's main struct has a gap, providing up to 16 storage slots for this module.\\n */\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"geode.storage.GeodeModuleStorage\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant GeodeModuleStorageLocation =\\n 0x121584cf2b7b1dee51ceaabc76cdefc72f829ce42dd8cc5282d8e9f009b04200;\\n\\n function _getGeodeModuleStorage() internal pure returns (GeodeModuleStorage storage $) {\\n assembly {\\n $.slot := GeodeModuleStorageLocation\\n }\\n }\\n\\n /**\\n * @custom:section ** EVENTS **\\n */\\n event ContractVersionSet(uint256 version);\\n\\n event ControllerChanged(uint256 indexed ID, address CONTROLLER);\\n event Proposed(uint256 indexed TYPE, uint256 ID, address CONTROLLER, uint256 deadline);\\n event Approved(uint256 ID);\\n event NewSenate(address senate, uint256 expiry);\\n\\n /**\\n * @custom:section ** ABSTRACT FUNCTIONS **\\n */\\n function isolationMode() external view virtual override returns (bool);\\n\\n /**\\n * @custom:section ** INITIALIZING **\\n */\\n\\n function __GeodeModule_init(\\n address governance,\\n address senate,\\n uint256 senateExpiry,\\n uint256 packageType,\\n bytes calldata initVersionName\\n ) internal onlyInitializing {\\n __UUPSUpgradeable_init();\\n __DataStoreModule_init();\\n __GeodeModule_init_unchained(governance, senate, senateExpiry, packageType, initVersionName);\\n }\\n\\n /**\\n * @dev This function uses _getImplementation(), clearly deployer should not call initializer on\\n * upgradeToAndCall or new ERC1967Proxy calls. _getImplementation() returns 0 then.\\n * @dev GOVERNANCE and SENATE set to msg.sender at beginning, cannot propose+approve otherwise.\\n * @dev native approveProposal(public) is not used here. Because it has an _handleUpgrade,\\n * however initialization does not require UUPS.upgradeTo.\\n */\\n function __GeodeModule_init_unchained(\\n address governance,\\n address senate,\\n uint256 senateExpiry,\\n uint256 packageType,\\n bytes calldata initVersionName\\n ) internal onlyInitializing {\\n require(governance != address(0), \\\"GM:governance cannot be zero\\\");\\n require(senate != address(0), \\\"GM:senate cannot be zero\\\");\\n require(senateExpiry > block.timestamp, \\\"GM:low senateExpiry\\\");\\n require(packageType != 0, \\\"GM:packageType cannot be zero\\\");\\n require(initVersionName.length != 0, \\\"GM:initVersionName cannot be empty\\\");\\n\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n $.GOVERNANCE = msg.sender;\\n $.SENATE = msg.sender;\\n\\n $.SENATE_EXPIRY = senateExpiry;\\n $.PACKAGE_TYPE = packageType;\\n\\n DataStoreModuleStorage storage DSMStorage = _getDataStoreModuleStorage();\\n\\n uint256 initVersion = $.propose(\\n DSMStorage,\\n ERC1967Utils.getImplementation(),\\n packageType,\\n initVersionName,\\n 1 days\\n );\\n\\n $.approveProposal(DSMStorage, initVersion);\\n\\n _setContractVersion(DSML.generateId(initVersionName, $.PACKAGE_TYPE));\\n\\n $.GOVERNANCE = governance;\\n $.SENATE = senate;\\n }\\n\\n /**\\n * @custom:section ** LIMITED UUPS VERSION CONTROL **\\n *\\n * @custom:visibility -> internal\\n */\\n\\n /**\\n * @dev required by the OZ UUPS module, improved by the Geode Module.\\n */\\n function _authorizeUpgrade(address proposed_implementation) internal virtual override {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n require(\\n $.isUpgradeAllowed(proposed_implementation, ERC1967Utils.getImplementation()),\\n \\\"GM:not allowed to upgrade\\\"\\n );\\n }\\n\\n function _setContractVersion(uint256 id) internal virtual {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n $.CONTRACT_VERSION = id;\\n emit ContractVersionSet(id);\\n }\\n\\n /**\\n * @dev Would use the public upgradeTo() call, which does _authorizeUpgrade and _upgradeToAndCallUUPS,\\n * but it is external, OZ have not made it public yet.\\n */\\n function _handleUpgrade(address proposed_implementation, uint256 id) internal virtual {\\n UUPSUpgradeable.upgradeToAndCall(proposed_implementation, \\\"\\\");\\n _setContractVersion(id);\\n }\\n\\n /**\\n * @custom:section ** GETTER FUNCTIONS **\\n *\\n * @custom:visibility -> view-external\\n */\\n\\n function GeodeParams()\\n external\\n view\\n virtual\\n override\\n returns (\\n address governance,\\n address senate,\\n address approvedUpgrade,\\n uint256 senateExpiry,\\n uint256 packageType\\n )\\n {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n\\n governance = $.GOVERNANCE;\\n senate = $.SENATE;\\n approvedUpgrade = $.APPROVED_UPGRADE;\\n senateExpiry = $.SENATE_EXPIRY;\\n packageType = $.PACKAGE_TYPE;\\n }\\n\\n function getGovernance() external view virtual override returns (address) {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n return $.GOVERNANCE;\\n }\\n\\n function getContractVersion() public view virtual override returns (uint256) {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n return $.CONTRACT_VERSION;\\n }\\n\\n function getProposal(\\n uint256 id\\n ) external view virtual override returns (Proposal memory proposal) {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n proposal = $.getProposal(id);\\n }\\n\\n /**\\n * @custom:section ** SETTER FUNCTIONS **\\n *\\n * @custom:visibility -> public/external\\n */\\n\\n /**\\n * @custom:subsection ** ONLY GOVERNANCE **\\n *\\n */\\n\\n function propose(\\n address _CONTROLLER,\\n uint256 _TYPE,\\n bytes calldata _NAME,\\n uint256 duration\\n ) public virtual override returns (uint256 id) {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n id = $.propose(_getDataStoreModuleStorage(), _CONTROLLER, _TYPE, _NAME, duration);\\n }\\n\\n function rescueSenate(address _newSenate) external virtual override {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n $.rescueSenate(_newSenate);\\n }\\n\\n /**\\n * @custom:subsection ** ONLY SENATE **\\n */\\n\\n /**\\n * @dev handles PACKAGE_TYPE proposals by upgrading the contract immediately.\\n * @dev onlySenate is checked inside GML.approveProposal\\n */\\n function approveProposal(\\n uint256 id\\n ) public virtual override returns (address _controller, uint256 _type, bytes memory _name) {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n (_controller, _type, _name) = $.approveProposal(_getDataStoreModuleStorage(), id);\\n\\n if (_type == $.PACKAGE_TYPE) {\\n _handleUpgrade(_controller, id);\\n }\\n }\\n\\n function changeSenate(address _newSenate) external virtual override {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n $.changeSenate(_newSenate);\\n }\\n\\n /**\\n * @custom:subsection ** ONLY CONTROLLER **\\n */\\n\\n function changeIdCONTROLLER(uint256 id, address newCONTROLLER) external virtual override {\\n GML.changeIdCONTROLLER(_getDataStoreModuleStorage(), id, newCONTROLLER);\\n }\\n}\\n\",\"keccak256\":\"0xca07d7e4d5a0b3e01a56f4d324934406898de475ee1926b11faca73a3302299d\",\"license\":\"MIT\"},\"contracts/modules/GeodeModule/libs/GeodeModuleLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n// internal - globals\\nimport {ID_TYPE} from \\\"../../../globals/id_type.sol\\\";\\nimport {RESERVED_KEY_SPACE as rks} from \\\"../../../globals/reserved_key_space.sol\\\";\\n// internal - structs\\nimport {DataStoreModuleStorage} from \\\"../../DataStoreModule/structs/storage.sol\\\";\\nimport {GeodeModuleStorage} from \\\"../structs/storage.sol\\\";\\nimport {Proposal} from \\\"../structs/utils.sol\\\";\\n// internal - libraries\\nimport {DataStoreModuleLib as DSML} from \\\"../../DataStoreModule/libs/DataStoreModuleLib.sol\\\";\\n\\n/**\\n * @title GML: Geode Module Library\\n *\\n * @notice Dual Governance & Limited Upgradability:\\n * Administration of the Isolated Storage with a Dual Governance consisting a Governance and a Senate.\\n * Administration of a UUPS contract with Limited Upgradability for Packages like Portal, LiquidityPool.\\n *\\n * @dev review: DataStoreModule for the id based isolated storage logic.\\n * @dev review: Reserved TYPEs are defined within globals/id_type.sol\\n *\\n * @dev SENATE_EXPIRY is not mandatory to utilize. Simply set it to MAX_UINT256 if rescueSenate is not needed.\\n *\\n * @dev There are 3 ways to set a new Senate:\\n * 1. With a proposal TYPE 1. Proposal's controller becomes the new Senate, refreshes the expiry.\\n * 2. Current Senate can call changeSenate, which doesn't change the expiry\\n * 3. As a circuit breaker: If senate is expired, then rescue senate can be called by governance.\\n * @dev Currently, there are no way to set a new Governance.\\n *\\n *\\n * @dev Contracts relying on this library must use GeodeModuleLib.GeodeModuleStorage\\n * @dev This is an external library, requires deployment.\\n *\\n * @author Ice Bear & Crash Bandicoot\\n */\\nlibrary GeodeModuleLib {\\n using DSML for DataStoreModuleStorage;\\n\\n /**\\n * @custom:section ** CONSTANTS **\\n */\\n\\n /// @notice a proposal can have a duration between 1 days to 4 weeks (inclusive)\\n uint32 internal constant MIN_PROPOSAL_DURATION = 1 days;\\n uint32 internal constant MAX_PROPOSAL_DURATION = 4 weeks;\\n\\n /// @notice if expiry is utilized, a senate can be active for a year.\\n /// @dev \\\"MAX\\\" underlines a new senate can be set without expecting an expiry\\n uint32 internal constant MAX_SENATE_PERIOD = 365 days;\\n\\n /**\\n * @custom:section ** EVENTS **\\n */\\n event Proposed(uint256 indexed TYPE, uint256 ID, address CONTROLLER, uint256 deadline);\\n event Approved(uint256 ID);\\n event NewSenate(address senate, uint256 expiry);\\n event ControllerChanged(uint256 indexed ID, address CONTROLLER);\\n\\n /**\\n * @custom:section ** MODIFIERS **\\n */\\n modifier onlyGovernance(GeodeModuleStorage storage self) {\\n require(msg.sender == self.GOVERNANCE, \\\"GML:GOVERNANCE role needed\\\");\\n _;\\n }\\n\\n modifier onlySenate(GeodeModuleStorage storage self) {\\n require(msg.sender == self.SENATE, \\\"GML:SENATE role needed\\\");\\n require(block.timestamp < self.SENATE_EXPIRY, \\\"GML:SENATE expired\\\");\\n _;\\n }\\n\\n modifier onlyController(DataStoreModuleStorage storage DATASTORE, uint256 id) {\\n require(msg.sender == DATASTORE.readAddress(id, rks.CONTROLLER), \\\"GML:CONTROLLER role needed\\\");\\n _;\\n }\\n\\n /**\\n * @custom:section ** LIMITED UUPS VERSION CONTROL **\\n *\\n * @custom:visibility -> view-external\\n */\\n\\n /**\\n * @notice Check if it is allowed to change the package version to given proposedImplementation.\\n * @dev provided for _authorizeUpgrade\\n * @dev currentImplementation should always be UUPS._getImplementation()\\n * @dev currentImplementation or zero as proposedImplementation will return false\\n **/\\n function isUpgradeAllowed(\\n GeodeModuleStorage storage self,\\n address proposedImplementation,\\n address currentImplementation\\n ) external view returns (bool) {\\n return\\n (self.APPROVED_UPGRADE != address(0)) &&\\n (proposedImplementation != currentImplementation) &&\\n (self.APPROVED_UPGRADE == proposedImplementation);\\n }\\n\\n /**\\n * @custom:section ** GETTER FUNCTIONS **\\n *\\n * @custom:visibility -> view-external\\n */\\n\\n function getProposal(\\n GeodeModuleStorage storage self,\\n uint256 id\\n ) external view returns (Proposal memory) {\\n return self.proposals[id];\\n }\\n\\n /**\\n * @custom:section ** SETTER FUNCTIONS **\\n */\\n\\n /**\\n * @custom:subsection ** INTERNAL **\\n *\\n * @custom:visibility -> internal\\n */\\n function _setSenate(\\n GeodeModuleStorage storage self,\\n address _newSenate,\\n uint256 _expiry\\n ) internal {\\n require(_newSenate != address(0), \\\"GML:Senate cannot be zero address\\\");\\n self.SENATE = _newSenate;\\n self.SENATE_EXPIRY = _expiry;\\n\\n emit NewSenate(self.SENATE, self.SENATE_EXPIRY);\\n }\\n\\n /**\\n * @custom:subsection ** ONLY GOVERNANCE **\\n *\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @notice generates a new ID with given TYPE and NAME, proposes it to be owned by a CONTROLLER.\\n * @dev DATASTORE[id] will not be updated until the proposal is approved\\n * @dev Proposals can NEVER be overriden\\n */\\n function propose(\\n GeodeModuleStorage storage self,\\n DataStoreModuleStorage storage DATASTORE,\\n address _CONTROLLER,\\n uint256 _TYPE,\\n bytes calldata _NAME,\\n uint256 duration\\n ) external onlyGovernance(self) returns (uint256 id) {\\n id = DSML.generateId(_NAME, _TYPE);\\n\\n require(self.proposals[id].deadline == 0, \\\"GML:already proposed\\\");\\n require((DATASTORE.readBytes(id, rks.NAME)).length == 0, \\\"GML:ID already exist\\\");\\n require(_CONTROLLER != address(0), \\\"GML:CONTROLLER cannot be ZERO\\\");\\n require((_TYPE != ID_TYPE.NONE) && (_TYPE != ID_TYPE.POOL), \\\"GML:TYPE is NONE or POOL\\\");\\n require(\\n (duration >= MIN_PROPOSAL_DURATION) && (duration <= MAX_PROPOSAL_DURATION),\\n \\\"GML:invalid proposal duration\\\"\\n );\\n\\n uint256 _deadline = block.timestamp + duration;\\n\\n self.proposals[id] = Proposal({\\n CONTROLLER: _CONTROLLER,\\n TYPE: _TYPE,\\n NAME: _NAME,\\n deadline: _deadline\\n });\\n\\n emit Proposed(_TYPE, id, _CONTROLLER, _deadline);\\n }\\n\\n /**\\n * @notice changes Senate in a scenerio where the current Senate acts maliciously!\\n * * We are sure this will not be the case, but creating a method for possible recovery is a must.\\n * @notice Normally, Governance creates Senate Proposals frequently to signal it does not have\\n * * any intent of malicious overtake.\\n * note: If Governance does not send a Senate Proposal \\\"a while\\\" before the SENATE_EXPIRY,\\n * * we recommend users to take their money out.\\n * @dev Obviously, Governance needs to wait for SENATE_EXPIRY.\\n * @dev Refreshes the expiry\\n */\\n function rescueSenate(\\n GeodeModuleStorage storage self,\\n address _newSenate\\n ) external onlyGovernance(self) {\\n require(block.timestamp > self.SENATE_EXPIRY, \\\"GML:cannot rescue yet\\\");\\n\\n _setSenate(self, _newSenate, block.timestamp + MAX_SENATE_PERIOD);\\n }\\n\\n /**\\n * @custom:subsection ** ONLY SENATE **\\n *\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @notice approves a proposal and records given data to DataStore\\n * @notice specific changes for the reserved types (1, 2, 3) are implemented here,\\n * any other addition should take place in Portal, as not related.\\n * Note that GM has additional logic for package type approvals.\\n * @param id given ID proposal that has will be approved by Senate\\n * @dev Senate is not able to approve approved proposals\\n * @dev Senate is not able to approve expired proposals\\n */\\n function approveProposal(\\n GeodeModuleStorage storage self,\\n DataStoreModuleStorage storage DATASTORE,\\n uint256 id\\n ) external onlySenate(self) returns (address _controller, uint256 _type, bytes memory _name) {\\n require(self.proposals[id].deadline > block.timestamp, \\\"GML:not an active proposal\\\");\\n\\n _controller = self.proposals[id].CONTROLLER;\\n _type = self.proposals[id].TYPE;\\n _name = self.proposals[id].NAME;\\n\\n DATASTORE.writeUint(id, rks.TYPE, _type);\\n DATASTORE.writeAddress(id, rks.CONTROLLER, _controller);\\n DATASTORE.writeBytes(id, rks.NAME, _name);\\n DATASTORE.allIdsByType[_type].push(id);\\n\\n if (_type == ID_TYPE.SENATE) {\\n _setSenate(self, _controller, block.timestamp + MAX_SENATE_PERIOD);\\n } else if (_type == self.PACKAGE_TYPE) {\\n self.APPROVED_UPGRADE = _controller;\\n }\\n\\n // important\\n self.proposals[id].deadline = block.timestamp;\\n\\n emit Approved(id);\\n }\\n\\n /**\\n * @notice It is useful to be able to change the Senate's address without changing the expiry.\\n * @dev Does not change the expiry\\n */\\n function changeSenate(\\n GeodeModuleStorage storage self,\\n address _newSenate\\n ) external onlySenate(self) {\\n _setSenate(self, _newSenate, self.SENATE_EXPIRY);\\n }\\n\\n /**\\n * @custom:section ** ONLY CONTROLLER **\\n *\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @notice change the CONTROLLER of an ID\\n * @dev this operation cannot be reverted by the old CONTROLLER!!!\\n * @dev cannot provide address(0), try 0x000000000000000000000000000000000000dEaD\\n */\\n function changeIdCONTROLLER(\\n DataStoreModuleStorage storage DATASTORE,\\n uint256 id,\\n address newCONTROLLER\\n ) external onlyController(DATASTORE, id) {\\n require(newCONTROLLER != address(0), \\\"GML:CONTROLLER cannot be zero\\\");\\n\\n uint256 typeOfId = DATASTORE.readUint(id, rks.TYPE);\\n require(\\n typeOfId > ID_TYPE.LIMIT_MIN_USER && typeOfId < ID_TYPE.LIMIT_MAX_USER,\\n \\\"GML:ID TYPE is not user\\\"\\n );\\n\\n DATASTORE.writeAddress(id, rks.CONTROLLER, newCONTROLLER);\\n\\n emit ControllerChanged(id, newCONTROLLER);\\n }\\n}\\n\",\"keccak256\":\"0x2f288b733c0d4aef8b7a3ffad87c8fe36238940b487a29267d580d4aebc94ac8\",\"license\":\"MIT\"},\"contracts/modules/GeodeModule/structs/storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n// internal - structs\\nimport {Proposal} from \\\"./utils.sol\\\";\\n\\n/**\\n * @notice Storage struct for the Dual Governance logic\\n * @dev Dual Governance allows 2 parties to manage a package with proposals and approvals.\\n * @param GOVERNANCE a community that works to improve the core product and ensures its adoption in the DeFi ecosystem\\n * Suggests updates, such as new operators, contract/package upgrades, a new Senate (without any permission to force them)\\n * @param SENATE An address that protects the users by controlling the state of governance, contract updates and other crucial changes\\n * @param APPROVED_UPGRADE only 1 implementation contract SHOULD be \\\"approved\\\" at any given time.\\n * @param SENATE_EXPIRY refers to the last timestamp that SENATE can continue operating. Might not be utilized. Limited by MAX_SENATE_PERIOD\\n * @param PACKAGE_TYPE every package has a specific TYPE. Defined in globals/id_type.sol\\n * @param CONTRACT_VERSION always refers to the upgrade proposal ID. Does not increase uniformly like one might expect.\\n * @param proposals till approved, proposals are kept separated from the Isolated Storage\\n *\\n * @dev normally we would put custom:storage-location erc7201:geode.storage.GeodeModule\\n * but compiler throws an error... So np for now, just effects dev ex.\\n **/\\nstruct GeodeModuleStorage {\\n address GOVERNANCE;\\n address SENATE;\\n address APPROVED_UPGRADE;\\n uint256 SENATE_EXPIRY;\\n uint256 PACKAGE_TYPE;\\n uint256 CONTRACT_VERSION;\\n mapping(uint256 => Proposal) proposals;\\n}\\n\",\"keccak256\":\"0x37e5de7094ce081a06fa9359807d2039e4e02669ebb1bb5a8851848d4c222c3d\",\"license\":\"MIT\"},\"contracts/modules/GeodeModule/structs/utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/**\\n * @notice Giving the control of a specific ID to proposed CONTROLLER.\\n *\\n * @param TYPE: refer to globals/id_type.sol\\n * @param CONTROLLER: the address that refers to the change that is proposed by given proposal.\\n * * This slot can refer to the controller of an id, a new implementation contract, a new Senate etc.\\n * @param NAME: DataStore generates ID by keccak(name, type)\\n * @param deadline: refers to last timestamp until a proposal expires, limited by MAX_PROPOSAL_DURATION\\n * * Expired proposals cannot be approved by Senate\\n * * Expired proposals cannot be overriden by new proposals\\n **/\\nstruct Proposal {\\n address CONTROLLER;\\n uint256 TYPE;\\n bytes NAME;\\n uint256 deadline;\\n}\\n\",\"keccak256\":\"0xe3ec6ceacdbd2f960316b9c8b0bf930364c3f096fe9bf56849d9b4814c320643\",\"license\":\"MIT\"},\"contracts/modules/StakeModule/libs/DepositContractLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n// internal - interfaces\\nimport {IDepositContract} from \\\"../../../interfaces/helpers/IDepositContract.sol\\\";\\n// internal - libraries\\nimport {BytesLib} from \\\"../../../helpers/BytesLib.sol\\\";\\n\\n/**\\n * @title DCL: Deposit Contract Library\\n *\\n * @notice Includes constants & functions that helps to the deposit process.\\n *\\n * @dev DEPOSIT_CONTRACT is chain specific and should be changed before deployments.\\n *\\n * @dev This is an internal library, requires NO deployment.\\n *\\n * @author Ice Bear & Crash Bandicoot\\n */\\n\\nlibrary DepositContractLib {\\n /**\\n * @custom:section ** CONSTANTS **\\n */\\n\\n IDepositContract internal constant DEPOSIT_CONTRACT =\\n IDepositContract(0x4242424242424242424242424242424242424242);\\n uint256 internal constant PUBKEY_LENGTH = 48;\\n uint256 internal constant SIGNATURE_LENGTH = 96;\\n uint256 internal constant WITHDRAWAL_CREDENTIALS_LENGTH = 32;\\n uint256 internal constant DEPOSIT_AMOUNT = 32 ether;\\n uint256 internal constant DEPOSIT_AMOUNT_PRESTAKE = 1 ether;\\n uint256 internal constant MAX_DEPOSITS_PER_CALL = 50;\\n\\n /**\\n * @custom:section ** FUNCTIONS **\\n */\\n\\n /**\\n * @dev Padding memory array with zeroes up to 64 bytes on the right\\n * @param _b Memory array of size 32 .. 64\\n */\\n function _pad64(bytes memory _b) internal pure returns (bytes memory) {\\n assert(_b.length >= 32 && _b.length <= 64);\\n if (64 == _b.length) return _b;\\n\\n bytes memory zero32 = new bytes(32);\\n assembly {\\n mstore(add(zero32, 0x20), 0)\\n }\\n\\n if (32 == _b.length) return BytesLib.concat(_b, zero32);\\n else return BytesLib.concat(_b, BytesLib.slice(zero32, 0, uint256(64 - _b.length)));\\n }\\n\\n /**\\n * @dev Converting value to little endian bytes and padding up to 32 bytes on the right\\n * @param _value Number less than `2**64` for compatibility reasons\\n */\\n function _toLittleEndian64(uint256 _value) internal pure returns (uint256 result) {\\n result = 0;\\n uint256 temp_value = _value;\\n for (uint256 i; i < 8; ++i) {\\n result = (result << 8) | (temp_value & 0xFF);\\n temp_value >>= 8;\\n }\\n\\n assert(0 == temp_value); // fully converted\\n result <<= (24 * 8);\\n }\\n\\n function _getDepositDataRoot(\\n bytes memory _pubkey,\\n bytes memory _withdrawalCredentials,\\n bytes memory _signature,\\n uint256 _stakeAmount\\n ) internal pure returns (bytes32) {\\n require(_stakeAmount >= 1 ether, \\\"DepositContract: deposit value too low\\\");\\n require(_stakeAmount % 1 gwei == 0, \\\"DepositContract: deposit value not multiple of gwei\\\");\\n\\n uint256 deposit_amount = _stakeAmount / 1 gwei;\\n bytes32 pubkeyRoot = sha256(_pad64(_pubkey));\\n bytes32 signatureRoot = sha256(\\n abi.encodePacked(\\n sha256(BytesLib.slice(_signature, 0, 64)),\\n sha256(_pad64(BytesLib.slice(_signature, 64, SIGNATURE_LENGTH - 64)))\\n )\\n );\\n\\n bytes32 depositDataRoot = sha256(\\n abi.encodePacked(\\n sha256(abi.encodePacked(pubkeyRoot, _withdrawalCredentials)),\\n sha256(abi.encodePacked(_toLittleEndian64(deposit_amount), signatureRoot))\\n )\\n );\\n\\n return depositDataRoot;\\n }\\n\\n /**\\n * @notice converts an address to withdrawal credential, used on validator creation\\n */\\n function addressToWC(address wcAddress) internal pure returns (bytes memory) {\\n uint256 w = 1 << 248;\\n\\n return abi.encodePacked(bytes32(w) | bytes32(uint256(uint160(address(wcAddress)))));\\n }\\n\\n /**\\n * @notice deposit to DEPOSIT_CONTRACT and initiate a validator.\\n */\\n function depositValidator(\\n bytes calldata pubkey,\\n bytes memory withdrawalCredential,\\n bytes memory signature,\\n uint256 amount\\n ) internal {\\n DEPOSIT_CONTRACT.deposit{value: amount}(\\n pubkey,\\n withdrawalCredential,\\n signature,\\n _getDepositDataRoot(pubkey, withdrawalCredential, signature, amount)\\n );\\n }\\n}\\n\",\"keccak256\":\"0x71fa2b28cf5299abb9cfd8d7b8130c84f104b7a74d3ee2d6f5274e2fcc9a7ab2\",\"license\":\"MIT\"},\"contracts/modules/StakeModule/structs/utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/**\\n * @param state state of the validator, refer to globals.sol\\n * @param index representing this validator's placement on the chronological order of the validators proposals\\n * @param createdAt the timestamp pointing the proposal to create a validator with given pubkey.\\n * @param period the latest point in time the operator is allowed to maintain this validator (createdAt + validatorPeriod).\\n * @param poolId needed for withdrawal_credential\\n * @param operatorId needed for staking after allowance\\n * @param poolFee percentage of the rewards that will go to pool's maintainer, locked when the validator is proposed\\n * @param operatorFee percentage of the rewards that will go to operator's maintainer, locked when the validator is proposed\\n * @param infrastructureFee all fees are crucial for the price calculation by the oracle, even if its zero.\\n * @param signature31 BLS12-381 signature for the validator, used when the remaining 31 ETH is sent on validator activation.\\n **/\\nstruct Validator {\\n uint64 state;\\n uint64 index;\\n uint64 createdAt;\\n uint64 period;\\n uint256 poolId;\\n uint256 operatorId;\\n uint256 poolFee;\\n uint256 operatorFee;\\n uint256 infrastructureFee;\\n bytes signature31;\\n}\\n\",\"keccak256\":\"0xbbd41f0da602f5bc6cfd7ff7d4feec259d3266f87c711a5c16070d529da441e6\",\"license\":\"MIT\"},\"contracts/modules/WithdrawalModule/WithdrawalModule.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n// external - libraries\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n// external - contracts\\nimport {ERC1155HolderUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC1155/utils/ERC1155HolderUpgradeable.sol\\\";\\nimport {ReentrancyGuardUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\\\";\\n// internal - interfaces\\nimport {IgETH} from \\\"../../interfaces/IgETH.sol\\\";\\nimport {IPortal} from \\\"../../interfaces/IPortal.sol\\\";\\nimport {IWithdrawalModule} from \\\"../../interfaces/modules/IWithdrawalModule.sol\\\";\\n// internal - structs\\nimport {WithdrawalModuleStorage} from \\\"./structs/storage.sol\\\";\\n// internal - libraries\\nimport {WithdrawalModuleLib as WML} from \\\"./libs/WithdrawalModuleLib.sol\\\";\\n\\n/**\\n * @title WM: Withdrawal Module\\n *\\n * @notice Withdrawal Queue and voluntary exit elections.\\n * * Processing the withdrawals\\n * * Distributing the fees\\n * * Queueing withdrawal requests\\n * * Allowing (Instant Run-off) elections on which validators to exit.\\n * @dev all done while preserving the validator segregation.\\n *\\n * @dev There is 1 additional functionality implemented apart from the library:\\n * * if the price is not valid, user must prove it before processing validators.\\n *\\n * @dev review: this module delegates its functionality to WML (WithdrawalModuleLib).\\n *\\n * @dev 4 functions need to be overriden with access control when inherited:\\n * * pause, unpause, setExitThreshold, claimInfrastructureFees\\n *\\n * @dev __WithdrawalModule_init (or _unchained) call is NECESSARY when inherited.\\n *\\n * note This module does not implement necessary admin checks; or pausability overrides.\\n * * If a package inherits WM, should implement it's own logic around those.\\n *\\n * @author Ice Bear & Crash Bandicoot\\n */\\nabstract contract WithdrawalModule is\\n IWithdrawalModule,\\n ERC1155HolderUpgradeable,\\n ReentrancyGuardUpgradeable,\\n PausableUpgradeable\\n{\\n using WML for WithdrawalModuleStorage;\\n /**\\n * @custom:section ** VARIABLES **\\n *\\n * @dev Do not add any other variables here. Modules do not have a gap.\\n * Library's main struct has a gap, providing up to 16 storage slots for this module.\\n */\\n // keccak256(abi.encode(uint256(keccak256(\\\"geode.storage.WithdrawalModuleStorage\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant WithdrawalModuleStorageLocation =\\n 0x50605cc6f5170f0cdbb610edd2214831ea96f61cd1eba92cf58939f65736af00;\\n\\n function _getWithdrawalModuleStorage() internal pure returns (WithdrawalModuleStorage storage $) {\\n assembly {\\n $.slot := WithdrawalModuleStorageLocation\\n }\\n }\\n\\n /**\\n * @custom:section ** EVENTS **\\n */\\n event NewExitThreshold(uint256 threshold);\\n event Enqueue(uint256 indexed index, address owner);\\n event RequestTransfer(uint256 indexed index, address oldOwner, address newOwner);\\n event Fulfill(uint256 indexed index, uint256 fulfillAmount, uint256 claimableETH);\\n event Dequeue(uint256 indexed index, uint256 claim);\\n\\n /**\\n\\n /**\\n * @custom:section ** ABSTRACT FUNCTIONS **\\n *\\n * @dev these functions MUST be overriden for admin functionality.\\n */\\n\\n function pause() external virtual override;\\n\\n function unpause() external virtual override;\\n\\n function setExitThreshold(uint256 newThreshold) external virtual override;\\n\\n function claimInfrastructureFees(\\n address receiver\\n ) external virtual override returns (bool success);\\n\\n /**\\n * @custom:section ** INITIALIZING **\\n */\\n function __WithdrawalModule_init(\\n address _gETH_position,\\n address _portal_position,\\n uint256 _poolId\\n ) internal onlyInitializing {\\n __ReentrancyGuard_init();\\n __Pausable_init();\\n __ERC1155Holder_init();\\n __WithdrawalModule_init_unchained(_gETH_position, _portal_position, _poolId);\\n }\\n\\n function __WithdrawalModule_init_unchained(\\n address _gETH_position,\\n address _portal_position,\\n uint256 _poolId\\n ) internal onlyInitializing {\\n require(_gETH_position != address(0), \\\"WM:gETH cannot be zero address\\\");\\n require(_portal_position != address(0), \\\"WM:portal cannot be zero address\\\");\\n\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n $.gETH = IgETH(_gETH_position);\\n $.PORTAL = _portal_position;\\n $.POOL_ID = _poolId;\\n $.EXIT_THRESHOLD = WML.MIN_EXIT_THRESHOLD;\\n\\n $.gETH.avoidMiddlewares(_poolId, true);\\n }\\n\\n /**\\n * @custom:section ** GETTER FUNCTIONS **\\n *\\n * @custom:visibility -> view-external\\n */\\n function WithdrawalParams()\\n external\\n view\\n virtual\\n override\\n returns (\\n address gETH,\\n address portal,\\n uint256 poolId,\\n uint256 exitThreshold,\\n uint256 gatheredInfrastructureFees\\n )\\n {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n gETH = address($.gETH);\\n portal = $.PORTAL;\\n poolId = $.POOL_ID;\\n exitThreshold = $.EXIT_THRESHOLD;\\n gatheredInfrastructureFees = $.gatheredInfrastructureFees;\\n }\\n\\n function QueueParams()\\n external\\n view\\n virtual\\n override\\n returns (\\n uint256 requested,\\n uint256 realized,\\n uint256 realizedEtherBalance,\\n uint256 realizedPrice,\\n uint256 fulfilled,\\n uint256 fulfilledEtherBalance,\\n uint256 commonPoll\\n )\\n {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n requested = $.queue.requested;\\n realized = $.queue.realized;\\n realizedEtherBalance = $.queue.realizedEtherBalance;\\n realizedPrice = $.queue.realizedPrice;\\n fulfilled = $.queue.fulfilled;\\n fulfilledEtherBalance = $.queue.fulfilledEtherBalance;\\n commonPoll = $.queue.commonPoll;\\n }\\n\\n function getRequest(\\n uint256 index\\n )\\n external\\n view\\n virtual\\n override\\n returns (\\n address owner,\\n uint256 trigger,\\n uint256 size,\\n uint256 fulfilled,\\n uint256 claimableEther\\n )\\n {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n owner = $.requests[index].owner;\\n trigger = $.requests[index].trigger;\\n size = $.requests[index].size;\\n fulfilled = $.requests[index].fulfilled;\\n claimableEther = $.requests[index].claimableEther;\\n }\\n\\n function getValidatorData(\\n bytes calldata pubkey\\n )\\n external\\n view\\n virtual\\n override\\n returns (uint256 beaconBalance, uint256 withdrawnBalance, uint256 poll)\\n {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n beaconBalance = $.validators[pubkey].beaconBalance;\\n withdrawnBalance = $.validators[pubkey].withdrawnBalance;\\n poll = $.validators[pubkey].poll;\\n }\\n\\n /**\\n * @custom:section ** EARLY EXIT **\\n */\\n\\n /**\\n * @custom:visibility -> view\\n */\\n function canFinalizeExit(bytes calldata pubkey) external view virtual override returns (bool) {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n return $.canFinalizeExit(pubkey);\\n }\\n\\n function validatorThreshold(\\n bytes calldata pubkey\\n ) external view virtual override returns (uint256 threshold) {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n (threshold, ) = $.getValidatorThreshold(pubkey);\\n }\\n\\n /**\\n * @custom:section ** REQUESTS QUEUE **\\n */\\n /**\\n * @custom:subsection ** ENQUEUE **\\n *\\n * @custom:visibility -> external\\n */\\n\\n function enqueue(\\n uint256 size,\\n bytes calldata pubkey,\\n address owner\\n ) external virtual override returns (uint256 index) {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n index = $.enqueue(size, pubkey, owner);\\n }\\n\\n function enqueueBatch(\\n uint256[] calldata sizes,\\n bytes[] calldata pubkeys,\\n address owner\\n ) external virtual override returns (uint256[] memory indexes) {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n indexes = $.enqueueBatch(sizes, pubkeys, owner);\\n }\\n\\n function transferRequest(uint256 index, address newOwner) external virtual override {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n $.transferRequest(index, newOwner);\\n }\\n\\n /**\\n * @custom:subsection ** FULFILL **\\n */\\n\\n /**\\n * @custom:visibility -> view\\n */\\n\\n function fulfillable(uint256 index) external view virtual override returns (uint256) {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n return $.fulfillable(index, $.queue.realized, $.queue.fulfilled);\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n function fulfill(uint256 index) external virtual override {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n $.fulfill(index);\\n }\\n\\n function fulfillBatch(uint256[] calldata indexes) external virtual override {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n $.fulfillBatch(indexes);\\n }\\n\\n /**\\n * @custom:subsection ** DEQUEUE **\\n */\\n /**\\n * @custom:visibility -> external\\n */\\n function dequeue(uint256 index, address receiver) external virtual override {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n $.dequeue(index, receiver);\\n }\\n\\n function dequeueBatch(uint256[] calldata indexes, address receiver) external virtual override {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n $.dequeueBatch(indexes, receiver);\\n }\\n\\n /**\\n * @custom:section ** PROCESS BALANCES MERKLE UPDATE **\\n */\\n function processValidators(\\n bytes[] calldata pubkeys,\\n uint256[] calldata beaconBalances,\\n uint256[] calldata withdrawnBalances,\\n bytes32[][] calldata balanceProofs,\\n uint256 price,\\n bytes32[] calldata priceProof\\n ) external virtual override {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n if (!IPortal($.PORTAL).isPriceValid($.POOL_ID)) {\\n IPortal($.PORTAL).priceSync($.POOL_ID, price, priceProof);\\n }\\n $.processValidators(pubkeys, beaconBalances, withdrawnBalances, balanceProofs);\\n }\\n\\n /**\\n * @custom:section ** MULTICALL **\\n */\\n\\n /**\\n * @dev Receives and executes a batch of function calls on this contract.\\n * @dev This is necessary for the multistep operations done in this contract:\\n * * Enqueue, Process, Fulfill, Dequeue.\\n * @dev Using 'functionDelegateCall' so it does not cause any issues when using msg.sender etc.\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function multicall(\\n bytes[] calldata data\\n ) external virtual override returns (bytes[] memory results) {\\n results = new bytes[](data.length);\\n for (uint256 i; i < data.length; ) {\\n results[i] = Address.functionDelegateCall(address(this), data[i]);\\n\\n unchecked {\\n i += 1;\\n }\\n }\\n return results;\\n }\\n}\\n\",\"keccak256\":\"0x0cba94dc57ffc3fa50883f8dc1a38a240860cb776ebd7c44597194772e2f92ff\",\"license\":\"MIT\"},\"contracts/modules/WithdrawalModule/libs/WithdrawalModuleLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n// external - libraries\\nimport {MerkleProof} from \\\"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\\\";\\n// internal - globals\\nimport {PERCENTAGE_DENOMINATOR, gETH_DENOMINATOR} from \\\"../../../globals/macros.sol\\\";\\nimport {VALIDATOR_STATE} from \\\"../../../globals/validator_state.sol\\\";\\n// internal - interfaces\\nimport {IgETH} from \\\"../../../interfaces/IgETH.sol\\\";\\nimport {IPortal} from \\\"../../../interfaces/IPortal.sol\\\";\\n// internal - structs\\nimport {Queue, Request, ValidatorData} from \\\"../structs/utils.sol\\\";\\nimport {WithdrawalModuleStorage} from \\\"../structs/storage.sol\\\";\\n// internal - libraries\\nimport {DepositContractLib as DCL} from \\\"../../StakeModule/libs/DepositContractLib.sol\\\";\\nimport {Validator} from \\\"../../StakeModule/structs/utils.sol\\\";\\n\\n/**\\n * @title WML: Withdrawal Module Library\\n *\\n * @notice Improved validator withdrawals (and exits), while preserving the validator segregation.\\n *\\n * @notice Intended implementation scope:\\n * 1. Processing the withdrawals (partial and exits).\\n * * `processValidators` function handles any balance changes that is reflected from the Beacon Chain.\\n * * If a validator's balance on the Beacon Chain is ZERO, it exited (forced or voluntary).\\n *\\n * 2. Distributing the fees.\\n * * Pool and Operator fees are distributed whenever the validator is processed.\\n * * Note that if the validator is slashed before being processed, fees can be lost along with the stakers' profit.\\n *\\n * 3. Queueing withdrawal requests.\\n * * Users can request a withdrawal by forfeiting their gETH tokens.\\n * * Requests would be put in a queue (First-In-First-Out).\\n * * As the validators are processed, requests become claimable.\\n * * Users can dequeue partially or fully.\\n *\\n * 4. Allowing (Instant Run-off) elections on which validators to exit.\\n * * While getting into the queue, caller can vote on a validator, increasing it's 'poll'.\\n * * If a validator is not specified, vote goes to 'commonPoll'. It can be used for any validator to top-up the EXIT_THRESHOLD\\n * * If a validator is called for exit but there are remaining votes in it, it is transferred to the commonPoll.\\n * * Note that, elections are basically just stating a preference:\\n * * * Exit of the voted validator does not change the voter's priority in the queue.\\n *\\n * @dev The Queue\\n * Lets say every '-' is representing 1 gETH.\\n * Queue: --- -- ---------- -- --- --- - --- -- ---- ----- - ------- ---- -- -- - - -------- --\\n * There are 20 requests in this queue, adding up to 65 gETH, this is 'requested'.\\n * Every request has a 'size', first request' is 3 gETH , second' is 2 gETH.\\n * Every request has a 'trigger', pointing it's kickoff point. Thus, 3rd request' is 5 gETH.\\n * Let's say, there are 8 ETH processed in the contract, we burn 8 ETH worth of gETH.\\n * Let's say 8 ETH is 4 gETH. Then the first request can exit fully, and second one can exit for 1 gETH.\\n *\\n * @dev This process creates a unique question:\\n * Considering that profit processing, price updates and queue operations are ASYNC,\\n * how can we make sure that we are paying the correct price?\\n * We have determined 3 possible points that we can 'derisk' a Request:\\n * Enqueue -> ProcessValidators -> Dequeue\\n * 1. We derisk the Request when it is enqueued:\\n * * This would cause 2 issues:\\n * * a. Best case, we would prevent the queued Request from profiting while they are in the queue.\\n * * b. Since there is a slashing risk, we cannot promise a fixed Ether amount without knowing what would be the future price.\\n * 2. We derisk the Request when validators are processed, with the latest price for the derivative:\\n * * This is the correct approach as we REALIZE the price at this exact point: by increasing the cumulative claimable gETH.\\n * * However, we would need to insert an 'unbound for loop' through 'realized' Requests, when a 'processValidators' operation is finalized.\\n * * We cannot, nor should, enforce an 'unbound for loop' on requests array.\\n * 3. We derisk the Request when it is dequeued:\\n * * Simply, price changes would have unpredictable effects on the Queue: A request can be claimable now, but might become unclaimable later.\\n * * Derisked Requests that are waiting to be claimed, would hijack the real stakers' APR, while sitting on top of some allocated Ether.\\n * * Unclaimed Requests can prevent the latter requests since there would be no way to keep track of the previous unclaimed requests without enforcing the order.\\n * We do not want to promise vague returns, we do not want for loops over requests array or price checkpoints, we do not want APR hijacking.\\n * Thus, none of these points can be implemented without utilizing a trusted third party, like an Oracle.\\n * However, we want Withdrawal logic to have the minimum Third Party risk as Geode Developers.\\n * As a result, we have came up with a logic that will allow stakers to maintain their profitability without disrupting the 'derisk' moment.\\n * * a. We keep track of an internal price, stating the ratio of the claimable ETH and processed gETH: realizedPrice.\\n * * b. We derisk the Queue on 'processValidators' by increasing the cumulative gETH that can be claimed.\\n * * * We also adjust the realizedPrice considering the pricePerShare of the currently derisked asset amount.\\n * * c. Requests can be fulfilled in respect to the internal price BY ANYONE at any point after they become claimable.\\n * * d. Fulfilled requests, including partially fulfilled ones, can be claimed (ONLY) BY THE OWNER.\\n * Why using an internal Price instead of 'enforcing the PricePerShare' makes sense:\\n * * All Requests, without considering their index, are in the same pool until they are derisked through price processing.\\n * * If all of the claimable requests are fulfilled periodically (via a script etc.), we would expect internal price to be equal to 'PricePerShare'.\\n * * This way, a well maintained pool can prevent APR hijacking by fulfilling neglected Requests, while it is not enforced for all of the pools.\\n * However, this is a gas-heavy process so it might not be needed after every 'processValidators' operation.\\n * Similarly, 'processValidators' is expensive as well, we would advise calling it when there is a dequeue opportunity.\\n * As a conclusion, if all requests are fulfilled immediately after the off-chain calculation signals them being claimable;\\n * None of these approaches will be expensive, nor will disrupt the internal pricing for the latter requests.\\n *\\n * @dev while conducting the price calculations, a part of the balance within this contract should be taken into consideration.\\n * This ETH amount can be calculated as: sum(lambda x: requests[x].withdrawnBalance) - [fulfilledEtherBalance] (todo for the telescope).\\n * Note that, this is because: a price of the derivative is = total ETH / total Supply, and total ETH should include the balance within WC.\\n *\\n * @dev Contracts relying on this library must initialize WithdrawalModuleLib.WithdrawalModuleStorage\\n *\\n * @dev There are 'owner' checks on 'transferRequest', _dequeue (used by dequeue, dequeueBatch).\\n * However, we preferred to not use a modifier for that.\\n *\\n * @dev all parameters related to balance are denominated in gETH; except realizedEtherBalance,fulfilledEtherBalance and claimableEther:\\n * (requested, realized, fulfilled, commonPoll, trigger, size, fulfilled)\\n * @author Ice Bear & Crash Bandicoot\\n */\\nlibrary WithdrawalModuleLib {\\n /**\\n * @custom:section ** CONSTANTS **\\n */\\n /// @notice EXIT_THRESHOLD should be at least 60% and at most 100%\\n uint256 internal constant MIN_EXIT_THRESHOLD = 6e9; // (6 * PERCENTAGE_DENOMINATOR) / 10;\\n // minimum withdrawal request is 0.05 ETH\\n uint256 internal constant MIN_REQUEST_SIZE = 5e16;\\n\\n /**\\n * @custom:section ** EVENTS **\\n */\\n event NewExitThreshold(uint256 threshold);\\n event Enqueue(uint256 indexed index, address owner);\\n event RequestTransfer(uint256 indexed index, address oldOwner, address newOwner);\\n event Fulfill(uint256 indexed index, uint256 fulfillAmount, uint256 claimableETH);\\n event Dequeue(uint256 indexed index, uint256 claim);\\n\\n /**\\n * @custom:section ** HELPER **\\n */\\n\\n function _getPortal(WithdrawalModuleStorage storage self) internal view returns (IPortal) {\\n return IPortal(self.PORTAL);\\n }\\n\\n /**\\n * @custom:section ** EARLY EXIT REQUESTS **\\n */\\n\\n /**\\n * @custom:visibility -> view\\n */\\n /**\\n * @notice checks if given validator is exited, according to the information provided by Balances Merkle Root.\\n * @dev an external view function, just as an helper.\\n */\\n function canFinalizeExit(\\n WithdrawalModuleStorage storage self,\\n bytes calldata pubkey\\n ) external view returns (bool) {\\n if (self.validators[pubkey].beaconBalance != 0) {\\n return false;\\n }\\n\\n Validator memory val = _getPortal(self).getValidator(pubkey);\\n\\n // check pubkey belong to this pool\\n require(val.poolId == self.POOL_ID, \\\"WML:validator for an unknown pool\\\");\\n\\n if (val.state != VALIDATOR_STATE.ACTIVE && val.state != VALIDATOR_STATE.EXIT_REQUESTED) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @custom:visibility -> internal\\n */\\n\\n /**\\n * @notice notifies Portal to change validator state from ACTIVE to EXIT_REQUESTED\\n * @param pubkey public key of the given validator.\\n */\\n function _requestExit(WithdrawalModuleStorage storage self, bytes calldata pubkey) internal {\\n _getPortal(self).requestExit(self.POOL_ID, pubkey);\\n }\\n\\n /**\\n * @notice notifies Portal to change validator state from ACTIVE or EXIT_REQUESTED, to EXITED.\\n * @dev no additional checks are needed as processValidators and PORTAL.finalizeExit has propser checks.\\n * @param pubkey public key of the given validator.\\n */\\n function _finalizeExit(WithdrawalModuleStorage storage self, bytes calldata pubkey) internal {\\n _getPortal(self).finalizeExit(self.POOL_ID, pubkey);\\n }\\n\\n /**\\n * @notice if the poll is above the threshold, calls Portal to request a voluntary exit.\\n * @param pubkey public key of the checked validator.\\n * @param commonPoll cached commonPoll\\n * @dev passing commonPoll around helps on gas on batch TXs.\\n */\\n function _checkAndRequestExit(\\n WithdrawalModuleStorage storage self,\\n bytes calldata pubkey,\\n uint256 commonPoll\\n ) internal returns (uint256) {\\n (uint256 threshold, uint256 beaconBalancePriced) = getValidatorThreshold(self, pubkey);\\n uint256 validatorPoll = self.validators[pubkey].poll;\\n\\n if (commonPoll + validatorPoll > threshold) {\\n // meaning it can request withdrawal\\n\\n if (threshold > validatorPoll) {\\n // If Poll is not enough spend votes from commonPoll.\\n commonPoll -= threshold - validatorPoll;\\n } else if (validatorPoll > beaconBalancePriced) {\\n // If Poll is bigger than needed, move the extra votes instead of spending.\\n commonPoll += validatorPoll - beaconBalancePriced;\\n }\\n\\n _requestExit(self, pubkey);\\n }\\n\\n return commonPoll;\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n /**\\n * @notice allowing EXIT_THRESHOLD to be set by the contract owner.\\n * @param newThreshold as percentage, denominated in PERCENTAGE_DENOMINATOR.\\n * @dev caller should be governed on module contract.\\n */\\n function setExitThreshold(WithdrawalModuleStorage storage self, uint256 newThreshold) external {\\n require(newThreshold >= MIN_EXIT_THRESHOLD, \\\"WML:min threshold is 60%\\\");\\n require(newThreshold <= PERCENTAGE_DENOMINATOR, \\\"WML:max threshold is 100%\\\");\\n\\n self.EXIT_THRESHOLD = newThreshold;\\n emit NewExitThreshold(newThreshold);\\n }\\n\\n /**\\n * @custom:subsection ** VOTE **\\n */\\n\\n /**\\n * @custom:visibility -> view\\n */\\n /**\\n * @notice figuring out the applied exit threshold, as in gETH, for a given validator.\\n * @param pubkey public key of the given validator.\\n */\\n function getValidatorThreshold(\\n WithdrawalModuleStorage storage self,\\n bytes calldata pubkey\\n ) public view returns (uint256 threshold, uint256 beaconBalancePriced) {\\n uint256 price = self.gETH.pricePerShare(self.POOL_ID);\\n beaconBalancePriced = ((self.validators[pubkey].beaconBalance * gETH_DENOMINATOR));\\n threshold = (beaconBalancePriced * self.EXIT_THRESHOLD) / PERCENTAGE_DENOMINATOR / price;\\n beaconBalancePriced = beaconBalancePriced / price;\\n }\\n\\n /**\\n * @custom:visibility -> internal\\n */\\n /**\\n * @notice a validator is chosen to be the next exit by enqueued Request\\n * @param pubkey public key of the voted validator.\\n * @param size specified gETH amount\\n */\\n function _vote(\\n WithdrawalModuleStorage storage self,\\n bytes calldata pubkey,\\n uint256 size\\n ) internal {\\n Validator memory val = _getPortal(self).getValidator(pubkey);\\n\\n require(val.poolId == self.POOL_ID, \\\"WML:vote for an unknown pool\\\");\\n require(val.state == VALIDATOR_STATE.ACTIVE, \\\"WML:voted for inactive validator\\\");\\n\\n self.validators[pubkey].poll += size;\\n }\\n\\n /**\\n * @custom:section ** REQUESTS QUEUE **\\n */\\n\\n /**\\n * @custom:subsection ** ENQUEUE **\\n */\\n /**\\n * @custom:visibility -> internal\\n */\\n /**\\n * @notice internal function to push a new Request into Queue\\n * @param trigger the kickoff point for the Request\\n * @param size specified gETH amount\\n */\\n function _enqueue(\\n WithdrawalModuleStorage storage self,\\n uint256 trigger,\\n uint256 size,\\n address owner\\n ) internal returns (uint256 index) {\\n require(size >= MIN_REQUEST_SIZE, \\\"WML:min 0.05 gETH\\\");\\n require(owner != address(0), \\\"WML:owner cannot be zero address\\\");\\n\\n self.requests.push(\\n Request({owner: owner, trigger: trigger, size: size, fulfilled: 0, claimableEther: 0})\\n );\\n\\n index = self.requests.length - 1;\\n\\n emit Enqueue(index, owner);\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @notice queues a Request into Queue, processes the vote, exits the validator in case of a run-off.\\n * @param pubkey voted validator, vote goes into commonPoll if bytes(0) is given.\\n * @param owner allows caller to directly transfer the Request on creation\\n */\\n function enqueue(\\n WithdrawalModuleStorage storage self,\\n uint256 size,\\n bytes calldata pubkey,\\n address owner\\n ) external returns (uint256 index) {\\n uint256 requestedgETH = self.queue.requested;\\n index = _enqueue(self, requestedgETH, size, owner);\\n\\n if (pubkey.length == 0) {\\n self.queue.commonPoll += size;\\n } else {\\n _vote(self, pubkey, size);\\n }\\n\\n self.queue.requested = requestedgETH + size;\\n\\n self.gETH.safeTransferFrom(msg.sender, address(this), self.POOL_ID, size, \\\"\\\");\\n }\\n\\n /**\\n * @notice enqueue() with batch optimizations\\n * @param sizes array of gETH amount that are sent to enqueue multiple Requests.\\n * @param pubkeys array of voted validators, vote goes into commonPoll if bytes(0) is given.\\n * @param owner the owner for all the Requests being created.\\n */\\n function enqueueBatch(\\n WithdrawalModuleStorage storage self,\\n uint256[] calldata sizes,\\n bytes[] calldata pubkeys,\\n address owner\\n ) external returns (uint256[] memory indexes) {\\n uint256 len = sizes.length;\\n require(len == pubkeys.length, \\\"WML:invalid input length\\\");\\n\\n uint256 commonPoll = self.queue.commonPoll;\\n uint256 requestedgETH = self.queue.requested;\\n uint256 totalSize;\\n\\n indexes = new uint256[](len);\\n for (uint256 i; i < len; ) {\\n indexes[i] = _enqueue(self, requestedgETH, sizes[i], owner);\\n\\n if (pubkeys[i].length == 0) {\\n commonPoll += sizes[i];\\n } else {\\n _vote(self, pubkeys[i], sizes[i]);\\n }\\n requestedgETH = requestedgETH + sizes[i];\\n totalSize += sizes[i];\\n\\n unchecked {\\n i += 1;\\n }\\n }\\n\\n self.queue.commonPoll = commonPoll;\\n self.queue.requested = requestedgETH;\\n\\n self.gETH.safeTransferFrom(msg.sender, address(this), self.POOL_ID, totalSize, \\\"\\\");\\n }\\n\\n /**\\n * @notice transferring the ownership of a Request to a new address\\n * @param index placement of the Request within the requests array.\\n * @param newOwner new address that will be eligible to dequeue a Request.\\n * @dev only current Owner can change the owner\\n */\\n function transferRequest(\\n WithdrawalModuleStorage storage self,\\n uint256 index,\\n address newOwner\\n ) external {\\n address oldOwner = self.requests[index].owner;\\n require(msg.sender == oldOwner, \\\"WML:not owner\\\");\\n require(newOwner != address(0), \\\"WML:cannot transfer to zero address\\\");\\n require(\\n self.requests[index].fulfilled < self.requests[index].size,\\n \\\"WML:cannot transfer fulfilled\\\"\\n );\\n\\n self.requests[index].owner = newOwner;\\n\\n emit RequestTransfer(index, oldOwner, newOwner);\\n }\\n\\n /**\\n * @custom:subsection ** FULFILL **\\n */\\n /**\\n * @custom:visibility -> view\\n */\\n /**\\n * @notice given a request, figure out the fulfillable gETH amount, limited up to its size.\\n * @param index placement of the Request within the requests array.\\n * @param qRealized self.queue.realized, might also be hot value for Batch optimizations\\n * @param qFulfilled self.queue.fulfilled, might also be a hot value for Batch optimizations\\n * @dev taking the previously fulfilled amount into consideration as it is the previously claimed part.\\n */\\n function fulfillable(\\n WithdrawalModuleStorage storage self,\\n uint256 index,\\n uint256 qRealized,\\n uint256 qFulfilled\\n ) public view returns (uint256) {\\n if (qRealized > qFulfilled) {\\n uint256 rTrigger = self.requests[index].trigger;\\n uint256 rSize = self.requests[index].size;\\n uint256 rFulfilled = self.requests[index].fulfilled;\\n\\n uint256 rFloor = rTrigger + rFulfilled;\\n uint256 rCeil = rTrigger + rSize;\\n\\n if (qRealized > rCeil) {\\n return rSize - rFulfilled;\\n } else if (qRealized > rFloor) {\\n return qRealized - rFloor;\\n } else {\\n return 0;\\n }\\n } else {\\n return 0;\\n }\\n }\\n\\n /**\\n * @custom:visibility -> internal\\n */\\n /**\\n * @notice by using the realized part of the size, we fulfill a single request by making use of the internal pricing.\\n * @dev we burn the realized size of the Queue here because we do not want this process to mess with price\\n * * calculations of the oracle.\\n */\\n function _fulfill(WithdrawalModuleStorage storage self, uint256 index) internal {\\n uint256 toFulfill = fulfillable(self, index, self.queue.realized, self.queue.fulfilled);\\n\\n if (toFulfill > 0) {\\n uint256 claimableETH = (toFulfill * self.queue.realizedPrice) / gETH_DENOMINATOR;\\n self.requests[index].claimableEther += claimableETH;\\n self.requests[index].fulfilled += toFulfill;\\n self.queue.fulfilled += toFulfill;\\n self.queue.fulfilledEtherBalance += claimableETH;\\n\\n self.gETH.burn(address(this), self.POOL_ID, toFulfill);\\n\\n emit Fulfill(index, toFulfill, claimableETH);\\n }\\n }\\n\\n /**\\n * @notice _fulfill with Batch optimizations\\n * @param qRealized queue.realized, as a hot value.\\n * @param qFulfilled queue.fulfilled, as a hot value.\\n * @param qPrice queue.realizedPrice, as a hot value.\\n */\\n function _fulfillBatch(\\n WithdrawalModuleStorage storage self,\\n uint256[] calldata indexes,\\n uint256 qRealized,\\n uint256 qFulfilled,\\n uint256 qPrice\\n ) internal {\\n uint256 indexesLen = indexes.length;\\n\\n uint256 oldFulfilled = qFulfilled;\\n uint256 qfulfilledEtherBalance;\\n for (uint256 i; i < indexesLen; ) {\\n uint256 toFulfill = fulfillable(self, indexes[i], qRealized, qFulfilled);\\n if (toFulfill > 0) {\\n uint256 claimableETH = (toFulfill * qPrice) / gETH_DENOMINATOR;\\n self.requests[indexes[i]].claimableEther += claimableETH;\\n self.requests[indexes[i]].fulfilled += toFulfill;\\n qFulfilled += toFulfill;\\n qfulfilledEtherBalance += claimableETH;\\n\\n emit Fulfill(indexes[i], toFulfill, claimableETH);\\n }\\n\\n unchecked {\\n i += 1;\\n }\\n }\\n\\n self.queue.fulfilled = qFulfilled;\\n self.queue.fulfilledEtherBalance += qfulfilledEtherBalance;\\n self.gETH.burn(address(this), self.POOL_ID, qFulfilled - oldFulfilled);\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n function fulfill(WithdrawalModuleStorage storage self, uint256 index) external {\\n _fulfill(self, index);\\n }\\n\\n function fulfillBatch(WithdrawalModuleStorage storage self, uint256[] calldata indexes) external {\\n _fulfillBatch(\\n self,\\n indexes,\\n self.queue.realized,\\n self.queue.fulfilled,\\n self.queue.realizedPrice\\n );\\n }\\n\\n /**\\n * @custom:subsection ** DEQUEUE **\\n */\\n\\n /**\\n * @custom:visibility -> internal\\n */\\n\\n /**\\n * @notice given a Request from the requests array, remove the part that is currently claimable.\\n * @param index placement of the Request within the requests array.\\n * @dev only owner can call this function\\n */\\n function _dequeue(\\n WithdrawalModuleStorage storage self,\\n uint256 index\\n ) internal returns (uint256 claimableETH) {\\n require(msg.sender == self.requests[index].owner, \\\"WML:not owner\\\");\\n\\n claimableETH = self.requests[index].claimableEther;\\n require(claimableETH > 0, \\\"WML:not claimable\\\");\\n\\n self.requests[index].claimableEther = 0;\\n\\n emit Dequeue(index, claimableETH);\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @notice given a Request from the requests array, claim the part that is currently claimable and forward the ether amount to the given receiver.\\n * @param index placement of the Request within the requests array.\\n * @dev only owner can call this function\\n */\\n function dequeue(WithdrawalModuleStorage storage self, uint256 index, address receiver) external {\\n require(receiver != address(0), \\\"WML:receiver cannot be zero address\\\");\\n\\n _fulfill(self, index);\\n uint256 claimableETH = _dequeue(self, index);\\n\\n // send ETH\\n (bool sent, ) = payable(receiver).call{value: claimableETH}(\\\"\\\");\\n require(sent, \\\"WML:Failed to send Ether\\\");\\n }\\n\\n /**\\n * @notice dequeue() with batch optimizations\\n */\\n function dequeueBatch(\\n WithdrawalModuleStorage storage self,\\n uint256[] calldata indexes,\\n address receiver\\n ) external {\\n require(receiver != address(0), \\\"WML:receiver cannot be zero address\\\");\\n\\n _fulfillBatch(\\n self,\\n indexes,\\n self.queue.realized,\\n self.queue.fulfilled,\\n self.queue.realizedPrice\\n );\\n\\n uint256 claimableETH;\\n uint256 indexesLen = indexes.length;\\n for (uint256 i; i < indexesLen; ) {\\n claimableETH += _dequeue(self, indexes[i]);\\n\\n unchecked {\\n i += 1;\\n }\\n }\\n\\n // send ETH\\n (bool sent, ) = payable(receiver).call{value: claimableETH}(\\\"\\\");\\n require(sent, \\\"WML:Failed to send Ether\\\");\\n }\\n\\n /**\\n * @custom:section ** PROCESS BALANCES MERKLE UPDATE **\\n */\\n\\n /**\\n * @custom:visibility -> internal\\n */\\n /**\\n * @notice\\n * @param pubkey public key of the given validator.\\n * @param reportedWithdrawn withdrawn Ether amount according to the fresh Merkle root.\\n * @param processedWithdrawn previously reported withdrawn amount.\\n * @dev cannot overflow since max fee is 10%, if we change fee structure ever, we need to reconsider the math there! \\n * * Note that if a validator is EXITED, we would assume 32 ETH that the pool put is also accounted for.\\n @return extra calculated profit since the last time validator was processed\\n */\\n function _distributeFees(\\n WithdrawalModuleStorage storage self,\\n Validator memory val,\\n uint256 reportedWithdrawn,\\n uint256 processedWithdrawn\\n ) internal returns (uint256 extra) {\\n // reportedWithdrawn > processedWithdrawn checks are done as it should be before calling this function\\n uint256 profit = reportedWithdrawn - processedWithdrawn;\\n\\n uint256 poolProfit = (profit * val.poolFee) / PERCENTAGE_DENOMINATOR;\\n uint256 operatorProfit = (profit * val.operatorFee) / PERCENTAGE_DENOMINATOR;\\n uint256 infrastructureProfit = (profit * val.infrastructureFee) / PERCENTAGE_DENOMINATOR;\\n\\n _getPortal(self).increaseWalletBalance{value: poolProfit}(val.poolId);\\n _getPortal(self).increaseWalletBalance{value: operatorProfit}(val.operatorId);\\n self.gatheredInfrastructureFees += infrastructureProfit;\\n\\n extra = ((profit - poolProfit) - operatorProfit) - infrastructureProfit;\\n }\\n\\n /**\\n * @notice acting like queue is one entity, we sell it some gETH in respect to Oracle price.\\n * * by using the Ether from the latest withdrawals.\\n */\\n function _realizeProcessedEther(\\n WithdrawalModuleStorage storage self,\\n uint256 processedBalance\\n ) internal {\\n uint256 pps = self.gETH.pricePerShare(self.POOL_ID);\\n\\n uint256 processedgETH = ((processedBalance * gETH_DENOMINATOR) / pps);\\n uint256 newPrice = pps;\\n\\n uint256 internalPrice = self.queue.realizedPrice;\\n if (internalPrice > 0) {\\n uint256 claimable = self.queue.realized - self.queue.fulfilled;\\n if (claimable > 0) {\\n newPrice =\\n ((claimable * internalPrice) + (processedBalance * gETH_DENOMINATOR)) /\\n (claimable + processedgETH);\\n }\\n }\\n\\n self.queue.realized += processedgETH;\\n self.queue.realizedEtherBalance += processedBalance;\\n self.queue.realizedPrice = newPrice;\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n /**\\n * @notice main function of this library, processing given information about the provided validators.\\n * @dev not all validators need to be processed all the time, process them as you need.\\n * @dev We do not check if validators should be processed at all.\\n * Because its up to user if they want to pay extra for unnecessary operations.\\n * We should not be charging others extra to save their gas.\\n * @dev It is advised to sort the pks according to the time passed, or remaining, to ensure that\\n * the preferred validators are prioritized in a case\\n * when the subset of given validators are not called for an exit.\\n */\\n function processValidators(\\n WithdrawalModuleStorage storage self,\\n bytes[] calldata pubkeys,\\n uint256[] calldata beaconBalances,\\n uint256[] calldata withdrawnBalances,\\n bytes32[][] calldata balanceProofs\\n ) external {\\n uint256 pkLen = pubkeys.length;\\n require(\\n pkLen == beaconBalances.length &&\\n pkLen == withdrawnBalances.length &&\\n pkLen == balanceProofs.length,\\n \\\"WML:invalid lengths\\\"\\n );\\n\\n Validator[] memory validators = new Validator[](pkLen);\\n\\n {\\n bytes32 balanceMerkleRoot = _getPortal(self).getBalancesMerkleRoot();\\n for (uint256 i; i < pkLen; ) {\\n // fill the validators array while checking the pool id\\n validators[i] = _getPortal(self).getValidator(pubkeys[i]);\\n\\n // check pubkey belong to this pool\\n require(validators[i].poolId == self.POOL_ID, \\\"WML:validator for an unknown pool\\\");\\n\\n // verify balances\\n bytes32 leaf = keccak256(\\n bytes.concat(keccak256(abi.encode(pubkeys[i], beaconBalances[i], withdrawnBalances[i])))\\n );\\n require(\\n MerkleProof.verify(balanceProofs[i], balanceMerkleRoot, leaf),\\n \\\"WML:not all proofs are valid\\\"\\n );\\n\\n unchecked {\\n i += 1;\\n }\\n }\\n }\\n\\n uint256 commonPoll = self.queue.commonPoll;\\n uint256 processed;\\n for (uint256 j; j < pkLen; ) {\\n uint256 oldWitBal = self.validators[pubkeys[j]].withdrawnBalance;\\n\\n self.validators[pubkeys[j]].beaconBalance = beaconBalances[j];\\n self.validators[pubkeys[j]].withdrawnBalance = withdrawnBalances[j];\\n\\n if (beaconBalances[j] == 0) {\\n // exit\\n if (withdrawnBalances[j] > oldWitBal + DCL.DEPOSIT_AMOUNT) {\\n processed += _distributeFees(\\n self,\\n validators[j],\\n withdrawnBalances[j],\\n oldWitBal + DCL.DEPOSIT_AMOUNT\\n );\\n processed += DCL.DEPOSIT_AMOUNT;\\n } else if (withdrawnBalances[j] >= oldWitBal) {\\n processed += withdrawnBalances[j] - oldWitBal;\\n } else {\\n revert(\\\"WML:invalid withdrawn balance\\\");\\n }\\n _finalizeExit(self, pubkeys[j]);\\n } else {\\n // check if should request exit\\n if (withdrawnBalances[j] > oldWitBal) {\\n processed += _distributeFees(self, validators[j], withdrawnBalances[j], oldWitBal);\\n }\\n commonPoll = _checkAndRequestExit(self, pubkeys[j], commonPoll);\\n }\\n\\n unchecked {\\n j += 1;\\n }\\n }\\n self.queue.commonPoll = commonPoll;\\n\\n if (processed > 0) {\\n _realizeProcessedEther(self, processed);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc0556da9f19ba5366395fe27d9373ae41d5cbc33bbbfcc5bd61595d8e2088fc5\",\"license\":\"MIT\"},\"contracts/modules/WithdrawalModule/structs/storage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n// internal - interfaces\\nimport {IgETH} from \\\"../../../interfaces/IgETH.sol\\\";\\n// internal - structs\\nimport {Queue, Request, ValidatorData} from \\\"./utils.sol\\\";\\n\\n/**\\n * @notice Storage struct for the Withdrawal Contract enabling the Queued Withdrawal Requests with instant run-off validator exit elections\\n * @param gETH constant, ERC1155, all Geode Staking Derivatives.\\n * @param PORTAL constant, address of the PORTAL.\\n * @param POOL_ID constant, ID of the pool, also the token ID of represented gETH.\\n * @param EXIT_THRESHOLD variable, current exit threshold that is set by the owner.\\n * @param queue main variables related to Enqueue-Dequeue operations.\\n * @param requests an array of requests\\n * @param validators as pubkey being the key, the related data for the validators of the given pool. Updated on processValidators.\\n *\\n * @dev normally we would put custom:storage-location erc7201:geode.storage.StakeModule\\n * but compiler throws an error... So np for now, just effects dev ex.\\n **/\\nstruct WithdrawalModuleStorage {\\n IgETH gETH;\\n address PORTAL;\\n uint256 POOL_ID;\\n uint256 EXIT_THRESHOLD;\\n uint256 gatheredInfrastructureFees;\\n Queue queue;\\n Request[] requests;\\n mapping(bytes => ValidatorData) validators;\\n}\\n\",\"keccak256\":\"0x6ec62436d58122445d0334a69666d97c4962b7c52da7629da86ed682a43e1f5d\",\"license\":\"MIT\"},\"contracts/modules/WithdrawalModule/structs/utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/**\\n * @param beaconBalance Beacon Chain balance of the validator (current).\\n * @param withdrawnBalance Representing any Ether sent from Beacon Chain to a withdrawal contract (cumulative).\\n * @param poll size of the requests that specifically voted for given validator to exit. as in gETH.\\n **/\\nstruct ValidatorData {\\n uint256 beaconBalance;\\n uint256 withdrawnBalance;\\n uint256 poll;\\n}\\n\\n/**\\n * @param owner the address that can dequeue the request. Ownership can be transferred.\\n * @param trigger cumulative sum of the previous requests, as in gETH.\\n * @param size size of the withdrawal request, as in gETH.\\n * @param fulfilled part of the 'size' that became available after being processed relative to the 'realizedPrice'. as in gETH.\\n * @param claimableEther current ETH amount that can be claimed by the Owner, increased in respect to 'fulfilled' and 'realizedPrice', decreased with dequeue.\\n **/\\nstruct Request {\\n address owner;\\n uint256 trigger;\\n uint256 size;\\n uint256 fulfilled;\\n uint256 claimableEther;\\n}\\n\\n/**\\n * @param requested cumulative size of all requests, as in gETH.\\n * ex: --- ------ ------ - - --- : 20 : there are 6 requests totaling up to 20 gETH.\\n * @param realized cumulative size of gETH that is processed and can be used to fulfill Requests, as in gETH\\n * ex: ----- -- -- - ----- -- : 17 : there are 17 gETH, processed as a response to the withdrawn funds.\\n * @param fulfilled cumulative size of the fulfilled requests, claimed or claimable, as in gETH\\n * ex: --- ----xx ------ x - ooo : 14 : there are 15 gETH being used to fulfill requests,including one that is partially filled. 3 gETH is still claimable.\\n * @param realizedEtherBalance cumulative size of the withdrawn and realized balances. Note that, (realizedEtherBalance * realizedPrice != realized) as price changes constantly.\\n * @param fulfilledEtherBalance cumulative size of the fulfilled requests.\\n * @param realizedPrice current Price of the queue, used when fulfilling a Request, updated with processValidators.\\n * @param commonPoll current size of requests that did not vote on any specific validator, as in gETH.\\n **/\\nstruct Queue {\\n uint256 requested;\\n uint256 realized;\\n uint256 realizedEtherBalance;\\n uint256 realizedPrice;\\n uint256 fulfilled;\\n uint256 fulfilledEtherBalance;\\n uint256 commonPoll;\\n}\\n\",\"keccak256\":\"0x9738a2107e97c20351cb1490e1e6218056dfc1753280b53e9ffaf34c228c85a8\",\"license\":\"MIT\"},\"contracts/packages/WithdrawalContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {ERC1967Utils} from \\\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\\\";\\n// internal - globals\\nimport {ID_TYPE} from \\\"../globals/id_type.sol\\\";\\nimport {RESERVED_KEY_SPACE as rks} from \\\"../globals/reserved_key_space.sol\\\";\\n// internal - interfaces\\nimport {IGeodeModule} from \\\"../interfaces/modules/IGeodeModule.sol\\\";\\nimport {IWithdrawalModule} from \\\"../interfaces/modules/IWithdrawalModule.sol\\\";\\nimport {IWithdrawalContract} from \\\"../interfaces/packages/IWithdrawalContract.sol\\\";\\nimport {IPortal} from \\\"../interfaces/IPortal.sol\\\";\\n// internal - structs\\nimport {GeodeModuleStorage} from \\\"../modules/GeodeModule/structs/storage.sol\\\";\\nimport {WithdrawalModuleStorage} from \\\"../modules/WithdrawalModule/structs/storage.sol\\\";\\n// internal - libraries\\nimport {WithdrawalModuleLib as WML} from \\\"../modules/WithdrawalModule/libs/WithdrawalModuleLib.sol\\\";\\n// internal - contracts\\nimport {GeodeModule} from \\\"../modules/GeodeModule/GeodeModule.sol\\\";\\nimport {WithdrawalModule} from \\\"../modules/WithdrawalModule/WithdrawalModule.sol\\\";\\n\\ncontract WithdrawalContract is IWithdrawalContract, GeodeModule, WithdrawalModule {\\n using WML for WithdrawalModuleStorage;\\n /**\\n * @custom:section ** VARIABLES **\\n * Following immutable parameters are set when the referance library implementation is deployed.\\n * Making necessary data for initialization reachable for all instances of LP package.\\n */\\n /// @notice gETH position\\n address internal immutable gETHPos;\\n /// @notice Portal position\\n address internal immutable portalPos;\\n\\n /**\\n * @custom:section ** MODIFIERS **\\n */\\n\\n modifier onlyOwner() {\\n require(msg.sender == _getGeodeModuleStorage().SENATE, \\\"WCP:sender not owner\\\");\\n _;\\n }\\n\\n /**\\n * @custom:section ** INITIALIZING **\\n */\\n /**\\n * @custom:oz-upgrades-unsafe-allow constructor\\n *\\n * @dev we don't want to provide these package-specific not-changing parameters\\n * accross all instances of the packages.\\n * So we will store them in the ref implementation contract of the package,\\n * and fetch when needed on initialization.\\n */\\n constructor(address _gETHPos, address _portalPos) {\\n require(_gETHPos != address(0), \\\"WCP:_gETHPos cannot be zero\\\");\\n require(_portalPos != address(0), \\\"WCP:_portalPos cannot be zero\\\");\\n\\n gETHPos = _gETHPos;\\n portalPos = _portalPos;\\n\\n _disableInitializers();\\n }\\n\\n /**\\n * @dev While 'data' parameter is not currently used it is a standarized approach on all\\n * * GeodePackages have the same function signature on 'initialize'.\\n */\\n function initialize(\\n uint256 poolId,\\n address poolOwner,\\n bytes calldata versionName,\\n bytes calldata data\\n ) public virtual override initializer {\\n __WithdrawalContract_init(poolId, poolOwner, versionName);\\n }\\n\\n function __WithdrawalContract_init(\\n uint256 poolId,\\n address poolOwner,\\n bytes calldata versionName\\n ) internal onlyInitializing {\\n __GeodeModule_init(\\n portalPos,\\n poolOwner,\\n type(uint256).max,\\n ID_TYPE.PACKAGE_WITHDRAWAL_CONTRACT,\\n versionName\\n );\\n __WithdrawalModule_init(gETHPos, portalPos, poolId);\\n __WithdrawalContract_init_unchained();\\n }\\n\\n function __WithdrawalContract_init_unchained() internal onlyInitializing {}\\n\\n function getPoolId() public view override returns (uint256) {\\n return _getWithdrawalModuleStorage().POOL_ID;\\n }\\n\\n /**\\n * @dev GeodeModule override\\n */\\n function getProposedVersion() public view virtual override returns (uint256) {\\n GeodeModuleStorage storage GMStorage = _getGeodeModuleStorage();\\n\\n return IPortal(GMStorage.GOVERNANCE).getPackageVersion(GMStorage.PACKAGE_TYPE);\\n }\\n\\n /**\\n * @dev GeodeModule override\\n */\\n function isolationMode()\\n external\\n view\\n virtual\\n override(GeodeModule, IGeodeModule)\\n returns (bool)\\n {\\n if (paused()) {\\n return true;\\n }\\n\\n GeodeModuleStorage storage GMStorage = _getGeodeModuleStorage();\\n\\n if (\\n GMStorage.CONTRACT_VERSION !=\\n IPortal(GMStorage.GOVERNANCE).getPackageVersion(GMStorage.PACKAGE_TYPE)\\n ) {\\n return true;\\n }\\n\\n if (GMStorage.APPROVED_UPGRADE != ERC1967Utils.getImplementation()) {\\n return true;\\n }\\n\\n if (\\n IPortal(GMStorage.GOVERNANCE).readAddress(getPoolId(), rks.CONTROLLER) != GMStorage.SENATE\\n ) {\\n return true;\\n }\\n\\n return false;\\n }\\n\\n /**\\n * @custom:section ** ADMIN FUNCTIONS **\\n *\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @custom:subsection ** UPGRADABILITY FUNCTIONS **\\n */\\n\\n /**\\n * @dev IGeodePackage override\\n */\\n function pullUpgrade() external virtual override onlyOwner {\\n GeodeModuleStorage storage GMStorage = _getGeodeModuleStorage();\\n IPortal Portal = IPortal(GMStorage.GOVERNANCE);\\n\\n require(!Portal.isolationMode(), \\\"WCP:Portal is isolated\\\");\\n require(\\n GMStorage.CONTRACT_VERSION != Portal.getPackageVersion(GMStorage.PACKAGE_TYPE),\\n \\\"WCP:no upgrades\\\"\\n );\\n\\n uint256 id = Portal.pushUpgrade(GMStorage.PACKAGE_TYPE);\\n approveProposal(id);\\n }\\n\\n /**\\n * @custom:subsection ** PAUSABILITY FUNCTIONS **\\n */\\n\\n /**\\n * @notice pausing the contract activates the isolationMode\\n */\\n function pause() external virtual override(WithdrawalModule, IWithdrawalModule) onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * @notice unpausing the contract deactivates the isolationMode\\n */\\n function unpause() external virtual override(WithdrawalModule, IWithdrawalModule) onlyOwner {\\n _unpause();\\n }\\n\\n /**\\n * @custom:subsection ** WITHDRAWAL QUEUE **\\n *\\n * @dev WM override\\n */\\n function setExitThreshold(\\n uint256 newThreshold\\n ) external virtual override(WithdrawalModule, IWithdrawalModule) onlyOwner {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n $.setExitThreshold(newThreshold);\\n }\\n\\n /**\\n * @custom:subsection ** INFRASTRUCTURE FEE **\\n *\\n * @dev WM override\\n */\\n function claimInfrastructureFees(\\n address receiver\\n ) external virtual override(WithdrawalModule, IWithdrawalModule) returns (bool success) {\\n require(msg.sender == IPortal(_getGeodeModuleStorage().GOVERNANCE).getGovernance());\\n\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n uint256 claimable = $.gatheredInfrastructureFees;\\n\\n (success, ) = payable(receiver).call{value: claimable}(\\\"\\\");\\n require(success, \\\"WCP:Failed to send ETH\\\");\\n }\\n\\n /**\\n * @notice fallback functions: receive\\n */\\n\\n receive() external payable {}\\n}\\n\",\"keccak256\":\"0xa2311b0d19acc2cc55745f4e98e904659ab3d4177a801c48414c464856cfb1df\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60e0604052306080523480156200001557600080fd5b50604051620043a1380380620043a18339810160408190526200003891620001e2565b6001600160a01b038216620000945760405162461bcd60e51b815260206004820152601b60248201527f5743503a5f67455448506f732063616e6e6f74206265207a65726f000000000060448201526064015b60405180910390fd5b6001600160a01b038116620000ec5760405162461bcd60e51b815260206004820152601d60248201527f5743503a5f706f7274616c506f732063616e6e6f74206265207a65726f00000060448201526064016200008b565b6001600160a01b0380831660a052811660c0526200010962000111565b50506200021a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620001625760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001c25780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b0381168114620001dd57600080fd5b919050565b60008060408385031215620001f657600080fd5b6200020183620001c5565b91506200021160208401620001c5565b90509250929050565b60805160a05160c0516141426200025f60003960008181612638015261268b0152600061266a01526000818161220a01528181612233015261244c01526141426000f3fe6080604052600436106102e85760003560e01c80638650c07211610190578063bf211ed1116100dc578063dca1086111610095578063e72b1d6d1161006f578063e72b1d6d14610a06578063e768887e14610a26578063e78e839714610a46578063f23a6e6114610a6657600080fd5b8063dca10861146109a6578063e02a5208146109c6578063e68e1218146109e657600080fd5b8063bf211ed114610855578063c58343ef1461089d578063c7f758a8146108ef578063d2583aee1461091c578063d99a16c514610966578063dab840c71461098657600080fd5b8063ac144d8b11610149578063ad4ac4c411610123578063ad4ac4c41461078d578063ad8655cb146107db578063aec98863146107fb578063bc197c811461081057600080fd5b8063ac144d8b1461070f578063ac9650d81461072f578063ad3cb1cc1461075c57600080fd5b80638650c072146106565780638794fabc1461066b5780638aa104351461068b57806398951b56146106a05780639934b281146106cf57806399ac48ba146106ef57600080fd5b806356a72dbf1161024f578063722679541161020857806377a3a813116101e257806377a3a813146105c65780637aed42ce146106015780637e5358d1146106215780638456cb591461064157600080fd5b80637226795414610564578063745653de14610591578063753b8807146105a657600080fd5b806356a72dbf146104855780635731bc1d146104a55780635a34bb15146104c55780635c975abb146104e55780635d9e085d1461050a5780636d07e4041461054457600080fd5b8063419754c5116102a1578063419754c5146103d05780634b75642f146103f05780634f1ef286146104105780634f5141e91461042357806352d1902d146104505780635329512b1461046557600080fd5b806301ffc9a7146102f45780631da7159114610329578063289b3c0d1461035757806338fff2d0146103845780633b8ba862146103995780633f4ba83a146103b957600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004613075565b610a92565b60405190151581526020015b60405180910390f35b34801561033557600080fd5b5061034961034436600461309f565b610ac9565b604051908152602001610320565b34801561036357600080fd5b5061036c610adc565b6040516001600160a01b039091168152602001610320565b34801561039057600080fd5b50610349610af7565b3480156103a557600080fd5b506103496103b436600461311e565b610b0a565b3480156103c557600080fd5b506103ce610bb5565b005b3480156103dc57600080fd5b506103146103eb366004613181565b610bfb565b3480156103fc57600080fd5b506103ce61040b36600461319e565b610d42565b6103ce61041e36600461327a565b610df1565b34801561042f57600080fd5b5061044361043e36600461330d565b610e10565b6040516103209190613390565b34801561045c57600080fd5b50610349610ea5565b34801561047157600080fd5b5061036c6104803660046133d4565b610ec2565b34801561049157600080fd5b506103496104a036600461309f565b610ee8565b3480156104b157600080fd5b506103ce6104c0366004613400565b610f0c565b3480156104d157600080fd5b506103496104e0366004613456565b610f8c565b3480156104f157600080fd5b506000805160206140ed8339815191525460ff16610314565b34801561051657600080fd5b5061034961052536600461319e565b60009081526000805160206140ad833981519152602052604090205490565b34801561055057600080fd5b506103ce61055f3660046134a1565b610fc3565b34801561057057600080fd5b5061058461057f36600461309f565b61101e565b6040516103209190613521565b34801561059d57600080fd5b5061034961103a565b3480156105b257600080fd5b506103ce6105c136600461319e565b6110bb565b3480156105d257600080fd5b506105e66105e1366004613534565b611107565b60408051938452602084019290925290820152606001610320565b34801561060d57600080fd5b5061031461061c366004613534565b611193565b34801561062d57600080fd5b5061034961063c36600461319e565b61121d565b34801561064d57600080fd5b506103ce6112bd565b34801561066257600080fd5b506103146112f8565b34801561067757600080fd5b506103ce610686366004613575565b611483565b34801561069757600080fd5b506103496115fc565b3480156106ac57600080fd5b506106c06106bb36600461319e565b611611565b60405161032093929190613671565b3480156106db57600080fd5b506103ce6106ea366004613698565b6116e1565b3480156106fb57600080fd5b5061036c61070a36600461309f565b6117f7565b34801561071b57600080fd5b5061034961072a366004613723565b611813565b34801561073b57600080fd5b5061074f61074a366004613781565b6118ab565b60405161032091906137b6565b34801561076857600080fd5b50610584604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561079957600080fd5b506107a2611994565b604080516001600160a01b039687168152948616602086015292909416918301919091526060820152608081019190915260a001610320565b3480156107e757600080fd5b506103ce6107f6366004613181565b6119db565b34801561080757600080fd5b506103ce611a2f565b34801561081c57600080fd5b5061083c61082b3660046138a1565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610320565b34801561086157600080fd5b5061086a611c4f565b604080516001600160a01b039687168152959094166020860152928401919091526060830152608082015260a001610320565b3480156108a957600080fd5b506108bd6108b836600461319e565b611c95565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610320565b3480156108fb57600080fd5b5061090f61090a36600461319e565b611d8b565b604051610320919061394e565b34801561092857600080fd5b50610931611e4b565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610320565b34801561097257600080fd5b506103ce6109813660046134a1565b611e99565b34801561099257600080fd5b506103ce6109a1366004613181565b611f25565b3480156109b257600080fd5b506103ce6109c1366004613781565b611f79565b3480156109d257600080fd5b506103496109e136600461309f565b611fc1565b3480156109f257600080fd5b50610349610a01366004613534565b612004565b348015610a1257600080fd5b50610349610a213660046133d4565b612096565b348015610a3257600080fd5b50610584610a413660046133d4565b6120b3565b348015610a5257600080fd5b506103ce610a613660046134a1565b6120d0565b348015610a7257600080fd5b5061083c610a8136600461399c565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b1480610ac357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000610ad5838361212b565b9392505050565b600080610ae7612157565b546001600160a01b031692915050565b6000610b0161217b565b60020154905090565b600080610b15612157565b6040516318ffae5d60e21b815290915073Ae0Dd7e8b484d36089571110E9def96F7aD460b3906363feb97490610b699084906000805160206140ad833981519152908c908c908c908c908c90600401613a2d565b602060405180830381865af4158015610b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baa9190613a75565b979650505050505050565b610bbd612157565b600101546001600160a01b03163314610bf15760405162461bcd60e51b8152600401610be890613a8e565b60405180910390fd5b610bf961219f565b565b6000610c05612157565b546040805163289b3c0d60e01b815290516001600160a01b039092169163289b3c0d916004808201926020929091908290030181865afa158015610c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c719190613abc565b6001600160a01b0316336001600160a01b031614610c8e57600080fd5b6000610c9861217b565b6004810154604051919250906001600160a01b038516908290600081818185875af1925050503d8060008114610cea576040519150601f19603f3d011682016040523d82523d6000602084013e610cef565b606091505b50508093505082610d3b5760405162461bcd60e51b81526020600482015260166024820152750ae86a0748cc2d2d8cac840e8de40e6cadcc8408aa8960531b6044820152606401610be8565b5050919050565b610d4a612157565b600101546001600160a01b03163314610d755760405162461bcd60e51b8152600401610be890613a8e565b6000610d7f61217b565b6040516357babf8b60e01b815260048101829052602481018490529091507389f8075802aa602611abC0F3D8ba3C41A18D34f6906357babf8b906044015b60006040518083038186803b158015610dd557600080fd5b505af4158015610de9573d6000803e3d6000fd5b505050505050565b610df96121ff565b610e028261228d565b610e0c828261237f565b5050565b60606000610e1c61217b565b604051630b4d65a760e41b81529091507389f8075802aa602611abC0F3D8ba3C41A18D34f69063b4d65a7090610e609084908b908b908b908b908b90600401613b9c565b600060405180830381865af4158015610e7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610baa9190810190613be5565b6000610eaf612441565b506000805160206140cd83398151915290565b60006000805160206140ad833981519152610edf8186868661248a565b95945050505050565b60006000805160206140ad833981519152610f048185856124c8565b949350505050565b6000610f1661217b565b604051633da28bc160e11b81529091507389f8075802aa602611abC0F3D8ba3C41A18D34f690637b45178290610f56908490889088908890600401613c6a565b60006040518083038186803b158015610f6e57600080fd5b505af4158015610f82573d6000803e3d6000fd5b5050505050505050565b6000838383604051602001610fa393929190613c9d565b60408051601f198184030181529190528051602090910120949350505050565b6040516330b2175760e11b81526000805160206140ad8339815191526004820152602481018390526001600160a01b038216604482015273Ae0Dd7e8b484d36089571110E9def96F7aD460b3906361642eae90606401610dbd565b60606000805160206140ad833981519152610f048185856124f2565b600080611045612157565b8054600480830154604051630eca989d60e11b8152918201529192506001600160a01b031690631d95313a90602401602060405180830381865afa158015611091573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b59190613a75565b91505090565b60006110c561217b565b6040516311aeabff60e31b815260048101829052602481018490529091507389f8075802aa602611abC0F3D8ba3C41A18D34f690638d755ff890604401610dbd565b60008060008061111561217b565b905080600d01868660405161112b929190613cc1565b908152604051908190036020018120549450600d82019061114f9088908890613cc1565b908152602001604051809103902060010154925080600d018686604051611177929190613cc1565b9081526020016040518091039020600201549150509250925092565b60008061119e61217b565b6040516345bece4760e11b81529091507389f8075802aa602611abC0F3D8ba3C41A18D34f690638b7d9c8e906111dc90849088908890600401613cd1565b602060405180830381865af41580156111f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f049190613ceb565b60008061122861217b565b6006810154600982015460405163928b8e4d60e01b81526004810184905260248101879052604481019290925260648201529091507389f8075802aa602611abC0F3D8ba3C41A18D34f69063928b8e4d90608401602060405180830381865af4158015611299573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad59190613a75565b6112c5612157565b600101546001600160a01b031633146112f05760405162461bcd60e51b8152600401610be890613a8e565b610bf96125a4565b60006113136000805160206140ed8339815191525460ff1690565b1561131e5750600190565b6000611328612157565b8054600480830154604051630eca989d60e11b8152918201529192506001600160a01b031690631d95313a90602401602060405180830381865afa158015611374573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113989190613a75565b8160050154146113aa57600191505090565b6113b26125ed565b60028201546001600160a01b039081169116146113d157600191505090565b600181015481546001600160a01b0391821691166399ac48ba6113f2610af7565b6040516001600160e01b031960e084901b16815260048101919091526921a7a72a2927a62622a960b11b6024820152604401602060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114659190613abc565b6001600160a01b03161461147b57600191505090565b600091505090565b600061148d61217b565b60018101546002820154604051630300147560e11b815260048101919091529192506001600160a01b03169063060028ea90602401602060405180830381865afa1580156114df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115039190613ceb565b6115755760018101546002820154604051637e1ece9f60e01b81526001600160a01b0390921691637e1ece9f9161154291889088908890600401613d0d565b600060405180830381600087803b15801561155c57600080fd5b505af1158015611570573d6000803e3d6000fd5b505050505b807389f8075802aa602611abC0F3D8ba3C41A18D34f66311c9522c90918e8e8e8e8e8e8e8e6040518a63ffffffff1660e01b81526004016115be99989796959493929190613d2d565b60006040518083038186803b1580156115d657600080fd5b505af41580156115ea573d6000803e3d6000fd5b50505050505050505050505050505050565b600080611607612157565b6005015492915050565b60008060606000611620612157565b905073Ae0Dd7e8b484d36089571110E9def96F7aD460b3636dc129ae826000805160206140ad8339815191526040516001600160e01b031960e085901b1681526004810192909252602482015260448101889052606401600060405180830381865af4158015611694573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116bc9190810190613e5b565b6004840154929650909450925083036116d9576116d98486612609565b509193909250565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156117265750825b90506000826001600160401b031660011480156117425750303b155b905081158015611750575080155b1561176e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561179857845460ff60401b1916600160401b1785555b6117a48b8b8b8b61262b565b83156117ea57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050565b60006000805160206140ad833981519152610f048185856126be565b60008061181e61217b565b60405163020ec69760e61b81529091507389f8075802aa602611abC0F3D8ba3C41A18D34f6906383b1a5c0906118609084908a908a908a908a90600401613eb4565b602060405180830381865af415801561187d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a19190613a75565b9695505050505050565b6060816001600160401b038111156118c5576118c56131b7565b6040519080825280602002602001820160405280156118f857816020015b60608152602001906001900390816118e35790505b50905060005b8281101561198d576119683085858481811061191c5761191c613eee565b905060200281019061192e9190613f04565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126f292505050565b82828151811061197a5761197a613eee565b60209081029190910101526001016118fe565b5092915050565b6000806000806000806119a5612157565b80546001820154600283015460038401546004909401546001600160a01b039384169b9284169a50921697509195509350915050565b60006119e5612157565b6040516361ac0f7160e11b8152600481018290526001600160a01b038416602482015290915073Ae0Dd7e8b484d36089571110E9def96F7aD460b39063c3581ee290604401610dbd565b611a37612157565b600101546001600160a01b03163314611a625760405162461bcd60e51b8152600401610be890613a8e565b6000611a6c612157565b805460408051634328603960e11b815290519293506001600160a01b03909116918291638650c0729160048083019260209291908290030181865afa158015611ab9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611add9190613ceb565b15611b235760405162461bcd60e51b815260206004820152601660248201527515d0d40e941bdc9d185b081a5cc81a5cdbdb185d195960521b6044820152606401610be8565b600482810154604051630eca989d60e11b8152918201526001600160a01b03821690631d95313a90602401602060405180830381865afa158015611b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8f9190613a75565b826005015403611bd35760405162461bcd60e51b815260206004820152600f60248201526e5743503a6e6f20757067726164657360881b6044820152606401610be8565b60048281015460405163e3099e0960e01b8152918201526000906001600160a01b0383169063e3099e09906024016020604051808303816000875af1158015611c20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c449190613a75565b9050610de981611611565b600080600080600080611c6061217b565b80546001820154600283015460038401546004909401546001600160a01b039384169b92909316995097509195509350915050565b600080600080600080611ca661217b565b905080600c018781548110611cbd57611cbd613eee565b6000918252602090912060059091020154600c820180546001600160a01b0390921697509088908110611cf257611cf2613eee565b906000526020600020906005020160010154945080600c018781548110611d1b57611d1b613eee565b906000526020600020906005020160020154935080600c018781548110611d4457611d44613eee565b906000526020600020906005020160030154925080600c018781548110611d6d57611d6d613eee565b90600052602060002090600502016004015491505091939590929450565b611dbf604051806080016040528060006001600160a01b031681526020016000815260200160608152602001600081525090565b6000611dc9612157565b6040516337a3804160e11b8152600481018290526024810185905290915073Ae0Dd7e8b484d36089571110E9def96F7aD460b390636f47008290604401600060405180830381865af4158015611e23573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ad59190810190613f4a565b600080600080600080600080611e5f61217b565b60058101546006820154600783015460088401546009850154600a860154600b90960154949e939d50919b50995097509195509350915050565b6000611ea361217b565b604051630222d4bb60e11b815260048101829052602481018590526001600160a01b03841660448201529091507389f8075802aa602611abC0F3D8ba3C41A18D34f690630445a976906064015b60006040518083038186803b158015611f0857600080fd5b505af4158015611f1c573d6000803e3d6000fd5b50505050505050565b6000611f2f612157565b6040516307c0451b60e11b8152600481018290526001600160a01b038416602482015290915073Ae0Dd7e8b484d36089571110E9def96F7aD460b390630f808a3690604401610dbd565b6000611f8361217b565b604051634699d87760e11b81529091507389f8075802aa602611abC0F3D8ba3C41A18D34f690638d33b0ee90611ef090849087908790600401613ff6565b60008281526000805160206140ad833981519152602081905260408220805484908110611ff057611ff0613eee565b906000526020600020015491505092915050565b60008061200f61217b565b604051631420eb4b60e21b81529091507389f8075802aa602611abC0F3D8ba3C41A18D34f690635083ad2c9061204d90849088908890600401613cd1565b6040805180830381865af4158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190614010565b50949350505050565b60006000805160206140ad833981519152610edf8186868661275f565b60606000805160206140ad833981519152610edf8186868661278e565b60006120da61217b565b6040516393c8c5e960e01b815260048101829052602481018590526001600160a01b03841660448201529091507389f8075802aa602611abC0F3D8ba3C41A18D34f6906393c8c5e990606401611ef0565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b7f121584cf2b7b1dee51ceaabc76cdefc72f829ce42dd8cc5282d8e9f009b0420090565b7f50605cc6f5170f0cdbb610edd2214831ea96f61cd1eba92cf58939f65736af0090565b6121a7612845565b6000805160206140ed833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061226f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166122636125ed565b6001600160a01b031614155b15610bf95760405163703e46dd60e11b815260040160405180910390fd5b6000612297612157565b905073Ae0Dd7e8b484d36089571110E9def96F7aD460b363b57e6b0b82846122bd6125ed565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039182166024840152166044820152606401602060405180830381865af415801561230f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123339190613ceb565b610e0c5760405162461bcd60e51b815260206004820152601960248201527f474d3a6e6f7420616c6c6f77656420746f2075706772616465000000000000006044820152606401610be8565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156123d9575060408051601f3d908101601f191682019092526123d691810190613a75565b60015b61240157604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610be8565b6000805160206140cd833981519152811461243257604051632a87526960e21b815260048101829052602401610be8565b61243c8383612875565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bf95760405163703e46dd60e11b815260040160405180910390fd5b60008460030160006124a5846124a0888861212b565b61212b565b81526020810191909152604001600020546001600160a01b031695945050505050565b60008360010160006124da858561212b565b81526020019081526020016000205490509392505050565b6060836002016000612504858561212b565b8152602001908152602001600020805461251d90614034565b80601f016020809104026020016040519081016040528092919081815260200182805461254990614034565b80156125965780601f1061256b57610100808354040283529160200191612596565b820191906000526020600020905b81548152906001019060200180831161257957829003601f168201915b505050505090509392505050565b6125ac6128cb565b6000805160206140ed833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336121e1565b6000805160206140cd833981519152546001600160a01b031690565b6126228260405180602001604052806000815250610df1565b610e0c816128fc565b612633612947565b6126657f00000000000000000000000000000000000000000000000000000000000000008460001961271b8686612990565b6126b07f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000866129b6565b6126b86129e1565b50505050565b60008360030160006126d0858561212b565b81526020810191909152604001600020546001600160a01b0316949350505050565b6060600080846001600160a01b03168460405161270f919061406e565b600060405180830381855af49150503d806000811461274a576040519150601f19603f3d011682016040523d82523d6000602084013e61274f565b606091505b5091509150610edf8583836129e9565b6000846001016000612775846124a0888861212b565b8152602001908152602001600020549050949350505050565b60608460020160006127a4846124a0888861212b565b815260200190815260200160002080546127bd90614034565b80601f01602080910402602001604051908101604052809291908181526020018280546127e990614034565b80156128365780601f1061280b57610100808354040283529160200191612836565b820191906000526020600020905b81548152906001019060200180831161281957829003601f168201915b50505050509050949350505050565b6000805160206140ed8339815191525460ff16610bf957604051638dfc202b60e01b815260040160405180910390fd5b61287e82612a3e565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156128c35761243c82826126f2565b610e0c612aa3565b6000805160206140ed8339815191525460ff1615610bf95760405163d93c066560e01b815260040160405180910390fd5b6000612906612157565b600581018390556040518381529091507ffddcded6b4f4730c226821172046b48372d3cd963c159701ae1b7c3bcac541bb9060200160405180910390a15050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610bf957604051631afcd79f60e31b815260040160405180910390fd5b612998612947565b6129a06129e1565b6129a86129e1565b610de9868686868686612ac2565b6129be612947565b6129c6612e4e565b6129ce612e5e565b6129d66129e1565b61243c838383612e6e565b610bf9612947565b6060826129fe576129f982612fc6565b610ad5565b8151158015612a1557506001600160a01b0384163b155b1561198d57604051639996b31560e01b81526001600160a01b0385166004820152602401610be8565b806001600160a01b03163b600003612a7457604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610be8565b6000805160206140cd83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b3415610bf95760405163b398979f60e01b815260040160405180910390fd5b612aca612947565b6001600160a01b038616612b205760405162461bcd60e51b815260206004820152601c60248201527f474d3a676f7665726e616e63652063616e6e6f74206265207a65726f000000006044820152606401610be8565b6001600160a01b038516612b765760405162461bcd60e51b815260206004820152601860248201527f474d3a73656e6174652063616e6e6f74206265207a65726f00000000000000006044820152606401610be8565b428411612bbb5760405162461bcd60e51b8152602060048201526013602482015272474d3a6c6f772073656e61746545787069727960681b6044820152606401610be8565b82600003612c0b5760405162461bcd60e51b815260206004820152601d60248201527f474d3a7061636b616765547970652063616e6e6f74206265207a65726f0000006044820152606401610be8565b6000819003612c675760405162461bcd60e51b815260206004820152602260248201527f474d3a696e697456657273696f6e4e616d652063616e6e6f7420626520656d70604482015261747960f01b6064820152608401610be8565b6000612c71612157565b8054336001600160a01b031991821681178355600183018054909216179055600381018690556004810185905590506000805160206140ad833981519152600073Ae0Dd7e8b484d36089571110E9def96F7aD460b36363feb9748484612cd56125ed565b8a8a8a620151806040518863ffffffff1660e01b8152600401612cfe9796959493929190613a2d565b602060405180830381865af4158015612d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3f9190613a75565b6040516336e094d760e11b815260048101859052602481018490526044810182905290915073Ae0Dd7e8b484d36089571110E9def96F7aD460b390636dc129ae90606401600060405180830381865af4158015612da0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612dc89190810190613e5b565b505050612e16612e1186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506004860154612ff2565b6128fc565b505080546001600160a01b039788166001600160a01b0319918216178255600190910180549690971695169490941790945550505050565b612e56612947565b610bf9613026565b612e66612947565b610bf9613054565b612e76612947565b6001600160a01b038316612ecc5760405162461bcd60e51b815260206004820152601e60248201527f574d3a674554482063616e6e6f74206265207a65726f206164647265737300006044820152606401610be8565b6001600160a01b038216612f225760405162461bcd60e51b815260206004820181905260248201527f574d3a706f7274616c2063616e6e6f74206265207a65726f20616464726573736044820152606401610be8565b6000612f2c61217b565b80546001600160a01b03199081166001600160a01b038781169182178455600180850180549094169188169190911790925560028301859055640165a0bc006003840155604051630492f6e160e01b8152600481018690526024810192909252919250630492f6e190604401600060405180830381600087803b158015612fb257600080fd5b505af1158015610f82573d6000803e3d6000fd5b805115612fd65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50565b6000828260405160200161300792919061408a565b60408051601f1981840301815291905280516020909101209392505050565b61302e612947565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61305c612947565b6000805160206140ed833981519152805460ff19169055565b60006020828403121561308757600080fd5b81356001600160e01b031981168114610ad557600080fd5b600080604083850312156130b257600080fd5b50508035926020909101359150565b6001600160a01b0381168114612fef57600080fd5b60008083601f8401126130e857600080fd5b5081356001600160401b038111156130ff57600080fd5b60208301915083602082850101111561311757600080fd5b9250929050565b60008060008060006080868803121561313657600080fd5b8535613141816130c1565b94506020860135935060408601356001600160401b0381111561316357600080fd5b61316f888289016130d6565b96999598509660600135949350505050565b60006020828403121561319357600080fd5b8135610ad5816130c1565b6000602082840312156131b057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156131f5576131f56131b7565b604052919050565b60006001600160401b03821115613216576132166131b7565b50601f01601f191660200190565b600082601f83011261323557600080fd5b8135613248613243826131fd565b6131cd565b81815284602083860101111561325d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561328d57600080fd5b8235613298816130c1565b915060208301356001600160401b038111156132b357600080fd5b6132bf85828601613224565b9150509250929050565b60008083601f8401126132db57600080fd5b5081356001600160401b038111156132f257600080fd5b6020830191508360208260051b850101111561311757600080fd5b60008060008060006060868803121561332557600080fd5b85356001600160401b038082111561333c57600080fd5b61334889838a016132c9565b9097509550602088013591508082111561336157600080fd5b5061336e888289016132c9565b9094509250506040860135613382816130c1565b809150509295509295909350565b6020808252825182820181905260009190848201906040850190845b818110156133c8578351835292840192918401916001016133ac565b50909695505050505050565b6000806000606084860312156133e957600080fd5b505081359360208301359350604090920135919050565b60008060006040848603121561341557600080fd5b83356001600160401b0381111561342b57600080fd5b613437868287016132c9565b909450925050602084013561344b816130c1565b809150509250925092565b60008060006040848603121561346b57600080fd5b83356001600160401b0381111561348157600080fd5b61348d868287016130d6565b909790965060209590950135949350505050565b600080604083850312156134b457600080fd5b8235915060208301356134c6816130c1565b809150509250929050565b60005b838110156134ec5781810151838201526020016134d4565b50506000910152565b6000815180845261350d8160208601602086016134d1565b601f01601f19169290920160200192915050565b602081526000610ad560208301846134f5565b6000806020838503121561354757600080fd5b82356001600160401b0381111561355d57600080fd5b613569858286016130d6565b90969095509350505050565b600080600080600080600080600080600060c08c8e03121561359657600080fd5b6001600160401b03808d3511156135ac57600080fd5b6135b98e8e358f016132c9565b909c509a5060208d01358110156135cf57600080fd5b6135df8e60208f01358f016132c9565b909a50985060408d01358110156135f557600080fd5b6136058e60408f01358f016132c9565b909850965060608d013581101561361b57600080fd5b61362b8e60608f01358f016132c9565b909650945060808d0135935060a08d013581101561364857600080fd5b506136598d60a08e01358e016132c9565b81935080925050509295989b509295989b9093969950565b60018060a01b0384168152826020820152606060408201526000610edf60608301846134f5565b600080600080600080608087890312156136b157600080fd5b8635955060208701356136c3816130c1565b945060408701356001600160401b03808211156136df57600080fd5b6136eb8a838b016130d6565b9096509450606089013591508082111561370457600080fd5b5061371189828a016130d6565b979a9699509497509295939492505050565b6000806000806060858703121561373957600080fd5b8435935060208501356001600160401b0381111561375657600080fd5b613762878288016130d6565b9094509250506040850135613776816130c1565b939692955090935050565b6000806020838503121561379457600080fd5b82356001600160401b038111156137aa57600080fd5b613569858286016132c9565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561380b57603f198886030184526137f98583516134f5565b945092850192908501906001016137dd565b5092979650505050505050565b60006001600160401b03821115613831576138316131b7565b5060051b60200190565b600082601f83011261384c57600080fd5b8135602061385c61324383613818565b82815260059290921b8401810191818101908684111561387b57600080fd5b8286015b84811015613896578035835291830191830161387f565b509695505050505050565b600080600080600060a086880312156138b957600080fd5b85356138c4816130c1565b945060208601356138d4816130c1565b935060408601356001600160401b03808211156138f057600080fd5b6138fc89838a0161383b565b9450606088013591508082111561391257600080fd5b61391e89838a0161383b565b9350608088013591508082111561393457600080fd5b5061394188828901613224565b9150509295509295909350565b6020815260018060a01b03825116602082015260208201516040820152600060408301516080606084015261398660a08401826134f5565b9050606084015160808401528091505092915050565b600080600080600060a086880312156139b457600080fd5b85356139bf816130c1565b945060208601356139cf816130c1565b9350604086013592506060860135915060808601356001600160401b038111156139f857600080fd5b61394188828901613224565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b87815286602082015260018060a01b038616604082015284606082015260c060808201526000613a6160c083018587613a04565b90508260a083015298975050505050505050565b600060208284031215613a8757600080fd5b5051919050565b6020808252601490820152732ba1a81d39b2b73232b9103737ba1037bbb732b960611b604082015260600190565b600060208284031215613ace57600080fd5b8151610ad5816130c1565b81835260006001600160fb1b03831115613af257600080fd5b8260051b80836020870137939093016020019392505050565b81835260006020808501808196508560051b810191508460005b87811015613b8f5782840389528135601e19883603018112613b4657600080fd5b870185810190356001600160401b03811115613b6157600080fd5b803603821315613b7057600080fd5b613b7b868284613a04565b9a87019a9550505090840190600101613b25565b5091979650505050505050565b868152608060208201526000613bb6608083018789613ad9565b8281036040840152613bc9818688613b0b565b91505060018060a01b0383166060830152979650505050505050565b60006020808385031215613bf857600080fd5b82516001600160401b03811115613c0e57600080fd5b8301601f81018513613c1f57600080fd5b8051613c2d61324382613818565b81815260059190911b82018301908381019087831115613c4c57600080fd5b928401925b82841015610baa57835182529284019290840190613c51565b848152606060208201526000613c84606083018587613ad9565b905060018060a01b038316604083015295945050505050565b604081526000613cb1604083018587613a04565b9050826020830152949350505050565b8183823760009101908152919050565b838152604060208201526000610edf604083018486613a04565b600060208284031215613cfd57600080fd5b81518015158114610ad557600080fd5b8481528360208201526060604082015260006118a1606083018486613ad9565b8981526000602060a081840152613d4860a084018b8d613b0b565b8381036040850152613d5b818a8c613ad9565b90508381036060850152613d7081888a613ad9565b84810360808601528581529050818101600586811b830184018860005b89811015613dfe57858303601f190185528135368c9003601e19018112613db357600080fd5b8b0187810190356001600160401b03811115613dce57600080fd5b80861b3603821315613ddf57600080fd5b613dea858284613ad9565b968901969450505090860190600101613d8d565b505080955050505050509a9950505050505050505050565b600082601f830112613e2757600080fd5b8151613e35613243826131fd565b818152846020838601011115613e4a57600080fd5b610f048260208301602087016134d1565b600080600060608486031215613e7057600080fd5b8351613e7b816130c1565b6020850151604086015191945092506001600160401b03811115613e9e57600080fd5b613eaa86828701613e16565b9150509250925092565b858152846020820152608060408201526000613ed4608083018587613a04565b905060018060a01b03831660608301529695505050505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112613f1b57600080fd5b8301803591506001600160401b03821115613f3557600080fd5b60200191503681900382131561311757600080fd5b600060208284031215613f5c57600080fd5b81516001600160401b0380821115613f7357600080fd5b9083019060808286031215613f8757600080fd5b604051608081018181108382111715613fa257613fa26131b7565b6040528251613fb0816130c1565b815260208381015190820152604083015182811115613fce57600080fd5b613fda87828601613e16565b6040830152506060830151606082015280935050505092915050565b838152604060208201526000610edf604083018486613ad9565b6000806040838503121561402357600080fd5b505080516020909101519092909150565b600181811c9082168061404857607f821691505b60208210810361406857634e487b7160e01b600052602260045260246000fd5b50919050565b600082516140808184602087016134d1565b9190910192915050565b60408152600061409d60408301856134f5565b9050826020830152939250505056fea3ee0f890fa2a50cc11476f86783721ec49c3aba88b83a957fe08235f6485c00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbccd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a2646970667358221220faae29e3483b07ce5c0aad785e638cf163642330a8e6fca4823bf6743d4fa24164736f6c63430008140033", - "deployedBytecode": "0x6080604052600436106102e85760003560e01c80638650c07211610190578063bf211ed1116100dc578063dca1086111610095578063e72b1d6d1161006f578063e72b1d6d14610a06578063e768887e14610a26578063e78e839714610a46578063f23a6e6114610a6657600080fd5b8063dca10861146109a6578063e02a5208146109c6578063e68e1218146109e657600080fd5b8063bf211ed114610855578063c58343ef1461089d578063c7f758a8146108ef578063d2583aee1461091c578063d99a16c514610966578063dab840c71461098657600080fd5b8063ac144d8b11610149578063ad4ac4c411610123578063ad4ac4c41461078d578063ad8655cb146107db578063aec98863146107fb578063bc197c811461081057600080fd5b8063ac144d8b1461070f578063ac9650d81461072f578063ad3cb1cc1461075c57600080fd5b80638650c072146106565780638794fabc1461066b5780638aa104351461068b57806398951b56146106a05780639934b281146106cf57806399ac48ba146106ef57600080fd5b806356a72dbf1161024f578063722679541161020857806377a3a813116101e257806377a3a813146105c65780637aed42ce146106015780637e5358d1146106215780638456cb591461064157600080fd5b80637226795414610564578063745653de14610591578063753b8807146105a657600080fd5b806356a72dbf146104855780635731bc1d146104a55780635a34bb15146104c55780635c975abb146104e55780635d9e085d1461050a5780636d07e4041461054457600080fd5b8063419754c5116102a1578063419754c5146103d05780634b75642f146103f05780634f1ef286146104105780634f5141e91461042357806352d1902d146104505780635329512b1461046557600080fd5b806301ffc9a7146102f45780631da7159114610329578063289b3c0d1461035757806338fff2d0146103845780633b8ba862146103995780633f4ba83a146103b957600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004613075565b610a92565b60405190151581526020015b60405180910390f35b34801561033557600080fd5b5061034961034436600461309f565b610ac9565b604051908152602001610320565b34801561036357600080fd5b5061036c610adc565b6040516001600160a01b039091168152602001610320565b34801561039057600080fd5b50610349610af7565b3480156103a557600080fd5b506103496103b436600461311e565b610b0a565b3480156103c557600080fd5b506103ce610bb5565b005b3480156103dc57600080fd5b506103146103eb366004613181565b610bfb565b3480156103fc57600080fd5b506103ce61040b36600461319e565b610d42565b6103ce61041e36600461327a565b610df1565b34801561042f57600080fd5b5061044361043e36600461330d565b610e10565b6040516103209190613390565b34801561045c57600080fd5b50610349610ea5565b34801561047157600080fd5b5061036c6104803660046133d4565b610ec2565b34801561049157600080fd5b506103496104a036600461309f565b610ee8565b3480156104b157600080fd5b506103ce6104c0366004613400565b610f0c565b3480156104d157600080fd5b506103496104e0366004613456565b610f8c565b3480156104f157600080fd5b506000805160206140ed8339815191525460ff16610314565b34801561051657600080fd5b5061034961052536600461319e565b60009081526000805160206140ad833981519152602052604090205490565b34801561055057600080fd5b506103ce61055f3660046134a1565b610fc3565b34801561057057600080fd5b5061058461057f36600461309f565b61101e565b6040516103209190613521565b34801561059d57600080fd5b5061034961103a565b3480156105b257600080fd5b506103ce6105c136600461319e565b6110bb565b3480156105d257600080fd5b506105e66105e1366004613534565b611107565b60408051938452602084019290925290820152606001610320565b34801561060d57600080fd5b5061031461061c366004613534565b611193565b34801561062d57600080fd5b5061034961063c36600461319e565b61121d565b34801561064d57600080fd5b506103ce6112bd565b34801561066257600080fd5b506103146112f8565b34801561067757600080fd5b506103ce610686366004613575565b611483565b34801561069757600080fd5b506103496115fc565b3480156106ac57600080fd5b506106c06106bb36600461319e565b611611565b60405161032093929190613671565b3480156106db57600080fd5b506103ce6106ea366004613698565b6116e1565b3480156106fb57600080fd5b5061036c61070a36600461309f565b6117f7565b34801561071b57600080fd5b5061034961072a366004613723565b611813565b34801561073b57600080fd5b5061074f61074a366004613781565b6118ab565b60405161032091906137b6565b34801561076857600080fd5b50610584604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561079957600080fd5b506107a2611994565b604080516001600160a01b039687168152948616602086015292909416918301919091526060820152608081019190915260a001610320565b3480156107e757600080fd5b506103ce6107f6366004613181565b6119db565b34801561080757600080fd5b506103ce611a2f565b34801561081c57600080fd5b5061083c61082b3660046138a1565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610320565b34801561086157600080fd5b5061086a611c4f565b604080516001600160a01b039687168152959094166020860152928401919091526060830152608082015260a001610320565b3480156108a957600080fd5b506108bd6108b836600461319e565b611c95565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610320565b3480156108fb57600080fd5b5061090f61090a36600461319e565b611d8b565b604051610320919061394e565b34801561092857600080fd5b50610931611e4b565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610320565b34801561097257600080fd5b506103ce6109813660046134a1565b611e99565b34801561099257600080fd5b506103ce6109a1366004613181565b611f25565b3480156109b257600080fd5b506103ce6109c1366004613781565b611f79565b3480156109d257600080fd5b506103496109e136600461309f565b611fc1565b3480156109f257600080fd5b50610349610a01366004613534565b612004565b348015610a1257600080fd5b50610349610a213660046133d4565b612096565b348015610a3257600080fd5b50610584610a413660046133d4565b6120b3565b348015610a5257600080fd5b506103ce610a613660046134a1565b6120d0565b348015610a7257600080fd5b5061083c610a8136600461399c565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b1480610ac357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000610ad5838361212b565b9392505050565b600080610ae7612157565b546001600160a01b031692915050565b6000610b0161217b565b60020154905090565b600080610b15612157565b6040516318ffae5d60e21b815290915073__$dabd46e1bb7f0d62843614b2ceac53b60c$__906363feb97490610b699084906000805160206140ad833981519152908c908c908c908c908c90600401613a2d565b602060405180830381865af4158015610b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baa9190613a75565b979650505050505050565b610bbd612157565b600101546001600160a01b03163314610bf15760405162461bcd60e51b8152600401610be890613a8e565b60405180910390fd5b610bf961219f565b565b6000610c05612157565b546040805163289b3c0d60e01b815290516001600160a01b039092169163289b3c0d916004808201926020929091908290030181865afa158015610c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c719190613abc565b6001600160a01b0316336001600160a01b031614610c8e57600080fd5b6000610c9861217b565b6004810154604051919250906001600160a01b038516908290600081818185875af1925050503d8060008114610cea576040519150601f19603f3d011682016040523d82523d6000602084013e610cef565b606091505b50508093505082610d3b5760405162461bcd60e51b81526020600482015260166024820152750ae86a0748cc2d2d8cac840e8de40e6cadcc8408aa8960531b6044820152606401610be8565b5050919050565b610d4a612157565b600101546001600160a01b03163314610d755760405162461bcd60e51b8152600401610be890613a8e565b6000610d7f61217b565b6040516357babf8b60e01b8152600481018290526024810184905290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__906357babf8b906044015b60006040518083038186803b158015610dd557600080fd5b505af4158015610de9573d6000803e3d6000fd5b505050505050565b610df96121ff565b610e028261228d565b610e0c828261237f565b5050565b60606000610e1c61217b565b604051630b4d65a760e41b815290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__9063b4d65a7090610e609084908b908b908b908b908b90600401613b9c565b600060405180830381865af4158015610e7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610baa9190810190613be5565b6000610eaf612441565b506000805160206140cd83398151915290565b60006000805160206140ad833981519152610edf8186868661248a565b95945050505050565b60006000805160206140ad833981519152610f048185856124c8565b949350505050565b6000610f1661217b565b604051633da28bc160e11b815290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__90637b45178290610f56908490889088908890600401613c6a565b60006040518083038186803b158015610f6e57600080fd5b505af4158015610f82573d6000803e3d6000fd5b5050505050505050565b6000838383604051602001610fa393929190613c9d565b60408051601f198184030181529190528051602090910120949350505050565b6040516330b2175760e11b81526000805160206140ad8339815191526004820152602481018390526001600160a01b038216604482015273__$dabd46e1bb7f0d62843614b2ceac53b60c$__906361642eae90606401610dbd565b60606000805160206140ad833981519152610f048185856124f2565b600080611045612157565b8054600480830154604051630eca989d60e11b8152918201529192506001600160a01b031690631d95313a90602401602060405180830381865afa158015611091573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b59190613a75565b91505090565b60006110c561217b565b6040516311aeabff60e31b8152600481018290526024810184905290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__90638d755ff890604401610dbd565b60008060008061111561217b565b905080600d01868660405161112b929190613cc1565b908152604051908190036020018120549450600d82019061114f9088908890613cc1565b908152602001604051809103902060010154925080600d018686604051611177929190613cc1565b9081526020016040518091039020600201549150509250925092565b60008061119e61217b565b6040516345bece4760e11b815290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__90638b7d9c8e906111dc90849088908890600401613cd1565b602060405180830381865af41580156111f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f049190613ceb565b60008061122861217b565b6006810154600982015460405163928b8e4d60e01b815260048101849052602481018790526044810192909252606482015290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__9063928b8e4d90608401602060405180830381865af4158015611299573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad59190613a75565b6112c5612157565b600101546001600160a01b031633146112f05760405162461bcd60e51b8152600401610be890613a8e565b610bf96125a4565b60006113136000805160206140ed8339815191525460ff1690565b1561131e5750600190565b6000611328612157565b8054600480830154604051630eca989d60e11b8152918201529192506001600160a01b031690631d95313a90602401602060405180830381865afa158015611374573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113989190613a75565b8160050154146113aa57600191505090565b6113b26125ed565b60028201546001600160a01b039081169116146113d157600191505090565b600181015481546001600160a01b0391821691166399ac48ba6113f2610af7565b6040516001600160e01b031960e084901b16815260048101919091526921a7a72a2927a62622a960b11b6024820152604401602060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114659190613abc565b6001600160a01b03161461147b57600191505090565b600091505090565b600061148d61217b565b60018101546002820154604051630300147560e11b815260048101919091529192506001600160a01b03169063060028ea90602401602060405180830381865afa1580156114df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115039190613ceb565b6115755760018101546002820154604051637e1ece9f60e01b81526001600160a01b0390921691637e1ece9f9161154291889088908890600401613d0d565b600060405180830381600087803b15801561155c57600080fd5b505af1158015611570573d6000803e3d6000fd5b505050505b8073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__6311c9522c90918e8e8e8e8e8e8e8e6040518a63ffffffff1660e01b81526004016115be99989796959493929190613d2d565b60006040518083038186803b1580156115d657600080fd5b505af41580156115ea573d6000803e3d6000fd5b50505050505050505050505050505050565b600080611607612157565b6005015492915050565b60008060606000611620612157565b905073__$dabd46e1bb7f0d62843614b2ceac53b60c$__636dc129ae826000805160206140ad8339815191526040516001600160e01b031960e085901b1681526004810192909252602482015260448101889052606401600060405180830381865af4158015611694573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116bc9190810190613e5b565b6004840154929650909450925083036116d9576116d98486612609565b509193909250565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156117265750825b90506000826001600160401b031660011480156117425750303b155b905081158015611750575080155b1561176e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561179857845460ff60401b1916600160401b1785555b6117a48b8b8b8b61262b565b83156117ea57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050565b60006000805160206140ad833981519152610f048185856126be565b60008061181e61217b565b60405163020ec69760e61b815290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__906383b1a5c0906118609084908a908a908a908a90600401613eb4565b602060405180830381865af415801561187d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a19190613a75565b9695505050505050565b6060816001600160401b038111156118c5576118c56131b7565b6040519080825280602002602001820160405280156118f857816020015b60608152602001906001900390816118e35790505b50905060005b8281101561198d576119683085858481811061191c5761191c613eee565b905060200281019061192e9190613f04565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126f292505050565b82828151811061197a5761197a613eee565b60209081029190910101526001016118fe565b5092915050565b6000806000806000806119a5612157565b80546001820154600283015460038401546004909401546001600160a01b039384169b9284169a50921697509195509350915050565b60006119e5612157565b6040516361ac0f7160e11b8152600481018290526001600160a01b038416602482015290915073__$dabd46e1bb7f0d62843614b2ceac53b60c$__9063c3581ee290604401610dbd565b611a37612157565b600101546001600160a01b03163314611a625760405162461bcd60e51b8152600401610be890613a8e565b6000611a6c612157565b805460408051634328603960e11b815290519293506001600160a01b03909116918291638650c0729160048083019260209291908290030181865afa158015611ab9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611add9190613ceb565b15611b235760405162461bcd60e51b815260206004820152601660248201527515d0d40e941bdc9d185b081a5cc81a5cdbdb185d195960521b6044820152606401610be8565b600482810154604051630eca989d60e11b8152918201526001600160a01b03821690631d95313a90602401602060405180830381865afa158015611b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8f9190613a75565b826005015403611bd35760405162461bcd60e51b815260206004820152600f60248201526e5743503a6e6f20757067726164657360881b6044820152606401610be8565b60048281015460405163e3099e0960e01b8152918201526000906001600160a01b0383169063e3099e09906024016020604051808303816000875af1158015611c20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c449190613a75565b9050610de981611611565b600080600080600080611c6061217b565b80546001820154600283015460038401546004909401546001600160a01b039384169b92909316995097509195509350915050565b600080600080600080611ca661217b565b905080600c018781548110611cbd57611cbd613eee565b6000918252602090912060059091020154600c820180546001600160a01b0390921697509088908110611cf257611cf2613eee565b906000526020600020906005020160010154945080600c018781548110611d1b57611d1b613eee565b906000526020600020906005020160020154935080600c018781548110611d4457611d44613eee565b906000526020600020906005020160030154925080600c018781548110611d6d57611d6d613eee565b90600052602060002090600502016004015491505091939590929450565b611dbf604051806080016040528060006001600160a01b031681526020016000815260200160608152602001600081525090565b6000611dc9612157565b6040516337a3804160e11b8152600481018290526024810185905290915073__$dabd46e1bb7f0d62843614b2ceac53b60c$__90636f47008290604401600060405180830381865af4158015611e23573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ad59190810190613f4a565b600080600080600080600080611e5f61217b565b60058101546006820154600783015460088401546009850154600a860154600b90960154949e939d50919b50995097509195509350915050565b6000611ea361217b565b604051630222d4bb60e11b815260048101829052602481018590526001600160a01b038416604482015290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__90630445a976906064015b60006040518083038186803b158015611f0857600080fd5b505af4158015611f1c573d6000803e3d6000fd5b50505050505050565b6000611f2f612157565b6040516307c0451b60e11b8152600481018290526001600160a01b038416602482015290915073__$dabd46e1bb7f0d62843614b2ceac53b60c$__90630f808a3690604401610dbd565b6000611f8361217b565b604051634699d87760e11b815290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__90638d33b0ee90611ef090849087908790600401613ff6565b60008281526000805160206140ad833981519152602081905260408220805484908110611ff057611ff0613eee565b906000526020600020015491505092915050565b60008061200f61217b565b604051631420eb4b60e21b815290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__90635083ad2c9061204d90849088908890600401613cd1565b6040805180830381865af4158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190614010565b50949350505050565b60006000805160206140ad833981519152610edf8186868661275f565b60606000805160206140ad833981519152610edf8186868661278e565b60006120da61217b565b6040516393c8c5e960e01b815260048101829052602481018590526001600160a01b038416604482015290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__906393c8c5e990606401611ef0565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b7f121584cf2b7b1dee51ceaabc76cdefc72f829ce42dd8cc5282d8e9f009b0420090565b7f50605cc6f5170f0cdbb610edd2214831ea96f61cd1eba92cf58939f65736af0090565b6121a7612845565b6000805160206140ed833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061226f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166122636125ed565b6001600160a01b031614155b15610bf95760405163703e46dd60e11b815260040160405180910390fd5b6000612297612157565b905073__$dabd46e1bb7f0d62843614b2ceac53b60c$__63b57e6b0b82846122bd6125ed565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039182166024840152166044820152606401602060405180830381865af415801561230f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123339190613ceb565b610e0c5760405162461bcd60e51b815260206004820152601960248201527f474d3a6e6f7420616c6c6f77656420746f2075706772616465000000000000006044820152606401610be8565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156123d9575060408051601f3d908101601f191682019092526123d691810190613a75565b60015b61240157604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610be8565b6000805160206140cd833981519152811461243257604051632a87526960e21b815260048101829052602401610be8565b61243c8383612875565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bf95760405163703e46dd60e11b815260040160405180910390fd5b60008460030160006124a5846124a0888861212b565b61212b565b81526020810191909152604001600020546001600160a01b031695945050505050565b60008360010160006124da858561212b565b81526020019081526020016000205490509392505050565b6060836002016000612504858561212b565b8152602001908152602001600020805461251d90614034565b80601f016020809104026020016040519081016040528092919081815260200182805461254990614034565b80156125965780601f1061256b57610100808354040283529160200191612596565b820191906000526020600020905b81548152906001019060200180831161257957829003601f168201915b505050505090509392505050565b6125ac6128cb565b6000805160206140ed833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336121e1565b6000805160206140cd833981519152546001600160a01b031690565b6126228260405180602001604052806000815250610df1565b610e0c816128fc565b612633612947565b6126657f00000000000000000000000000000000000000000000000000000000000000008460001961271b8686612990565b6126b07f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000866129b6565b6126b86129e1565b50505050565b60008360030160006126d0858561212b565b81526020810191909152604001600020546001600160a01b0316949350505050565b6060600080846001600160a01b03168460405161270f919061406e565b600060405180830381855af49150503d806000811461274a576040519150601f19603f3d011682016040523d82523d6000602084013e61274f565b606091505b5091509150610edf8583836129e9565b6000846001016000612775846124a0888861212b565b8152602001908152602001600020549050949350505050565b60608460020160006127a4846124a0888861212b565b815260200190815260200160002080546127bd90614034565b80601f01602080910402602001604051908101604052809291908181526020018280546127e990614034565b80156128365780601f1061280b57610100808354040283529160200191612836565b820191906000526020600020905b81548152906001019060200180831161281957829003601f168201915b50505050509050949350505050565b6000805160206140ed8339815191525460ff16610bf957604051638dfc202b60e01b815260040160405180910390fd5b61287e82612a3e565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156128c35761243c82826126f2565b610e0c612aa3565b6000805160206140ed8339815191525460ff1615610bf95760405163d93c066560e01b815260040160405180910390fd5b6000612906612157565b600581018390556040518381529091507ffddcded6b4f4730c226821172046b48372d3cd963c159701ae1b7c3bcac541bb9060200160405180910390a15050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610bf957604051631afcd79f60e31b815260040160405180910390fd5b612998612947565b6129a06129e1565b6129a86129e1565b610de9868686868686612ac2565b6129be612947565b6129c6612e4e565b6129ce612e5e565b6129d66129e1565b61243c838383612e6e565b610bf9612947565b6060826129fe576129f982612fc6565b610ad5565b8151158015612a1557506001600160a01b0384163b155b1561198d57604051639996b31560e01b81526001600160a01b0385166004820152602401610be8565b806001600160a01b03163b600003612a7457604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610be8565b6000805160206140cd83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b3415610bf95760405163b398979f60e01b815260040160405180910390fd5b612aca612947565b6001600160a01b038616612b205760405162461bcd60e51b815260206004820152601c60248201527f474d3a676f7665726e616e63652063616e6e6f74206265207a65726f000000006044820152606401610be8565b6001600160a01b038516612b765760405162461bcd60e51b815260206004820152601860248201527f474d3a73656e6174652063616e6e6f74206265207a65726f00000000000000006044820152606401610be8565b428411612bbb5760405162461bcd60e51b8152602060048201526013602482015272474d3a6c6f772073656e61746545787069727960681b6044820152606401610be8565b82600003612c0b5760405162461bcd60e51b815260206004820152601d60248201527f474d3a7061636b616765547970652063616e6e6f74206265207a65726f0000006044820152606401610be8565b6000819003612c675760405162461bcd60e51b815260206004820152602260248201527f474d3a696e697456657273696f6e4e616d652063616e6e6f7420626520656d70604482015261747960f01b6064820152608401610be8565b6000612c71612157565b8054336001600160a01b031991821681178355600183018054909216179055600381018690556004810185905590506000805160206140ad833981519152600073__$dabd46e1bb7f0d62843614b2ceac53b60c$__6363feb9748484612cd56125ed565b8a8a8a620151806040518863ffffffff1660e01b8152600401612cfe9796959493929190613a2d565b602060405180830381865af4158015612d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3f9190613a75565b6040516336e094d760e11b815260048101859052602481018490526044810182905290915073__$dabd46e1bb7f0d62843614b2ceac53b60c$__90636dc129ae90606401600060405180830381865af4158015612da0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612dc89190810190613e5b565b505050612e16612e1186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506004860154612ff2565b6128fc565b505080546001600160a01b039788166001600160a01b0319918216178255600190910180549690971695169490941790945550505050565b612e56612947565b610bf9613026565b612e66612947565b610bf9613054565b612e76612947565b6001600160a01b038316612ecc5760405162461bcd60e51b815260206004820152601e60248201527f574d3a674554482063616e6e6f74206265207a65726f206164647265737300006044820152606401610be8565b6001600160a01b038216612f225760405162461bcd60e51b815260206004820181905260248201527f574d3a706f7274616c2063616e6e6f74206265207a65726f20616464726573736044820152606401610be8565b6000612f2c61217b565b80546001600160a01b03199081166001600160a01b038781169182178455600180850180549094169188169190911790925560028301859055640165a0bc006003840155604051630492f6e160e01b8152600481018690526024810192909252919250630492f6e190604401600060405180830381600087803b158015612fb257600080fd5b505af1158015610f82573d6000803e3d6000fd5b805115612fd65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50565b6000828260405160200161300792919061408a565b60408051601f1981840301815291905280516020909101209392505050565b61302e612947565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61305c612947565b6000805160206140ed833981519152805460ff19169055565b60006020828403121561308757600080fd5b81356001600160e01b031981168114610ad557600080fd5b600080604083850312156130b257600080fd5b50508035926020909101359150565b6001600160a01b0381168114612fef57600080fd5b60008083601f8401126130e857600080fd5b5081356001600160401b038111156130ff57600080fd5b60208301915083602082850101111561311757600080fd5b9250929050565b60008060008060006080868803121561313657600080fd5b8535613141816130c1565b94506020860135935060408601356001600160401b0381111561316357600080fd5b61316f888289016130d6565b96999598509660600135949350505050565b60006020828403121561319357600080fd5b8135610ad5816130c1565b6000602082840312156131b057600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156131f5576131f56131b7565b604052919050565b60006001600160401b03821115613216576132166131b7565b50601f01601f191660200190565b600082601f83011261323557600080fd5b8135613248613243826131fd565b6131cd565b81815284602083860101111561325d57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561328d57600080fd5b8235613298816130c1565b915060208301356001600160401b038111156132b357600080fd5b6132bf85828601613224565b9150509250929050565b60008083601f8401126132db57600080fd5b5081356001600160401b038111156132f257600080fd5b6020830191508360208260051b850101111561311757600080fd5b60008060008060006060868803121561332557600080fd5b85356001600160401b038082111561333c57600080fd5b61334889838a016132c9565b9097509550602088013591508082111561336157600080fd5b5061336e888289016132c9565b9094509250506040860135613382816130c1565b809150509295509295909350565b6020808252825182820181905260009190848201906040850190845b818110156133c8578351835292840192918401916001016133ac565b50909695505050505050565b6000806000606084860312156133e957600080fd5b505081359360208301359350604090920135919050565b60008060006040848603121561341557600080fd5b83356001600160401b0381111561342b57600080fd5b613437868287016132c9565b909450925050602084013561344b816130c1565b809150509250925092565b60008060006040848603121561346b57600080fd5b83356001600160401b0381111561348157600080fd5b61348d868287016130d6565b909790965060209590950135949350505050565b600080604083850312156134b457600080fd5b8235915060208301356134c6816130c1565b809150509250929050565b60005b838110156134ec5781810151838201526020016134d4565b50506000910152565b6000815180845261350d8160208601602086016134d1565b601f01601f19169290920160200192915050565b602081526000610ad560208301846134f5565b6000806020838503121561354757600080fd5b82356001600160401b0381111561355d57600080fd5b613569858286016130d6565b90969095509350505050565b600080600080600080600080600080600060c08c8e03121561359657600080fd5b6001600160401b03808d3511156135ac57600080fd5b6135b98e8e358f016132c9565b909c509a5060208d01358110156135cf57600080fd5b6135df8e60208f01358f016132c9565b909a50985060408d01358110156135f557600080fd5b6136058e60408f01358f016132c9565b909850965060608d013581101561361b57600080fd5b61362b8e60608f01358f016132c9565b909650945060808d0135935060a08d013581101561364857600080fd5b506136598d60a08e01358e016132c9565b81935080925050509295989b509295989b9093969950565b60018060a01b0384168152826020820152606060408201526000610edf60608301846134f5565b600080600080600080608087890312156136b157600080fd5b8635955060208701356136c3816130c1565b945060408701356001600160401b03808211156136df57600080fd5b6136eb8a838b016130d6565b9096509450606089013591508082111561370457600080fd5b5061371189828a016130d6565b979a9699509497509295939492505050565b6000806000806060858703121561373957600080fd5b8435935060208501356001600160401b0381111561375657600080fd5b613762878288016130d6565b9094509250506040850135613776816130c1565b939692955090935050565b6000806020838503121561379457600080fd5b82356001600160401b038111156137aa57600080fd5b613569858286016132c9565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561380b57603f198886030184526137f98583516134f5565b945092850192908501906001016137dd565b5092979650505050505050565b60006001600160401b03821115613831576138316131b7565b5060051b60200190565b600082601f83011261384c57600080fd5b8135602061385c61324383613818565b82815260059290921b8401810191818101908684111561387b57600080fd5b8286015b84811015613896578035835291830191830161387f565b509695505050505050565b600080600080600060a086880312156138b957600080fd5b85356138c4816130c1565b945060208601356138d4816130c1565b935060408601356001600160401b03808211156138f057600080fd5b6138fc89838a0161383b565b9450606088013591508082111561391257600080fd5b61391e89838a0161383b565b9350608088013591508082111561393457600080fd5b5061394188828901613224565b9150509295509295909350565b6020815260018060a01b03825116602082015260208201516040820152600060408301516080606084015261398660a08401826134f5565b9050606084015160808401528091505092915050565b600080600080600060a086880312156139b457600080fd5b85356139bf816130c1565b945060208601356139cf816130c1565b9350604086013592506060860135915060808601356001600160401b038111156139f857600080fd5b61394188828901613224565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b87815286602082015260018060a01b038616604082015284606082015260c060808201526000613a6160c083018587613a04565b90508260a083015298975050505050505050565b600060208284031215613a8757600080fd5b5051919050565b6020808252601490820152732ba1a81d39b2b73232b9103737ba1037bbb732b960611b604082015260600190565b600060208284031215613ace57600080fd5b8151610ad5816130c1565b81835260006001600160fb1b03831115613af257600080fd5b8260051b80836020870137939093016020019392505050565b81835260006020808501808196508560051b810191508460005b87811015613b8f5782840389528135601e19883603018112613b4657600080fd5b870185810190356001600160401b03811115613b6157600080fd5b803603821315613b7057600080fd5b613b7b868284613a04565b9a87019a9550505090840190600101613b25565b5091979650505050505050565b868152608060208201526000613bb6608083018789613ad9565b8281036040840152613bc9818688613b0b565b91505060018060a01b0383166060830152979650505050505050565b60006020808385031215613bf857600080fd5b82516001600160401b03811115613c0e57600080fd5b8301601f81018513613c1f57600080fd5b8051613c2d61324382613818565b81815260059190911b82018301908381019087831115613c4c57600080fd5b928401925b82841015610baa57835182529284019290840190613c51565b848152606060208201526000613c84606083018587613ad9565b905060018060a01b038316604083015295945050505050565b604081526000613cb1604083018587613a04565b9050826020830152949350505050565b8183823760009101908152919050565b838152604060208201526000610edf604083018486613a04565b600060208284031215613cfd57600080fd5b81518015158114610ad557600080fd5b8481528360208201526060604082015260006118a1606083018486613ad9565b8981526000602060a081840152613d4860a084018b8d613b0b565b8381036040850152613d5b818a8c613ad9565b90508381036060850152613d7081888a613ad9565b84810360808601528581529050818101600586811b830184018860005b89811015613dfe57858303601f190185528135368c9003601e19018112613db357600080fd5b8b0187810190356001600160401b03811115613dce57600080fd5b80861b3603821315613ddf57600080fd5b613dea858284613ad9565b968901969450505090860190600101613d8d565b505080955050505050509a9950505050505050505050565b600082601f830112613e2757600080fd5b8151613e35613243826131fd565b818152846020838601011115613e4a57600080fd5b610f048260208301602087016134d1565b600080600060608486031215613e7057600080fd5b8351613e7b816130c1565b6020850151604086015191945092506001600160401b03811115613e9e57600080fd5b613eaa86828701613e16565b9150509250925092565b858152846020820152608060408201526000613ed4608083018587613a04565b905060018060a01b03831660608301529695505050505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112613f1b57600080fd5b8301803591506001600160401b03821115613f3557600080fd5b60200191503681900382131561311757600080fd5b600060208284031215613f5c57600080fd5b81516001600160401b0380821115613f7357600080fd5b9083019060808286031215613f8757600080fd5b604051608081018181108382111715613fa257613fa26131b7565b6040528251613fb0816130c1565b815260208381015190820152604083015182811115613fce57600080fd5b613fda87828601613e16565b6040830152506060830151606082015280935050505092915050565b838152604060208201526000610edf604083018486613ad9565b6000806040838503121561402357600080fd5b505080516020909101519092909150565b600181811c9082168061404857607f821691505b60208210810361406857634e487b7160e01b600052602260045260246000fd5b50919050565b600082516140808184602087016134d1565b9190910192915050565b60408152600061409d60408301856134f5565b9050826020830152939250505056fea3ee0f890fa2a50cc11476f86783721ec49c3aba88b83a957fe08235f6485c00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbccd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a2646970667358221220faae29e3483b07ce5c0aad785e638cf163642330a8e6fca4823bf6743d4fa24164736f6c63430008140033", - "libraries": { - "GeodeModuleLib": "0xAe0Dd7e8b484d36089571110E9def96F7aD460b3", - "WithdrawalModuleLib": "0x89f8075802aa602611abC0F3D8ba3C41A18D34f6" - }, - "devdoc": { - "errors": { - "AddressEmptyCode(address)": [ - { - "details": "There's no code at `target` (it is not a contract)." - } - ], - "ERC1967InvalidImplementation(address)": [ - { - "details": "The `implementation` of the proxy is invalid." - } - ], - "ERC1967NonPayable()": [ - { - "details": "An upgrade function sees `msg.value > 0` that may be lost." - } - ], - "EnforcedPause()": [ - { - "details": "The operation failed because the contract is paused." - } - ], - "ExpectedPause()": [ - { - "details": "The operation failed because the contract is not paused." - } - ], - "FailedInnerCall()": [ - { - "details": "A call to an address target failed. The target may have reverted." - } - ], - "InvalidInitialization()": [ - { - "details": "The contract is already initialized." - } - ], - "NotInitializing()": [ - { - "details": "The contract is not initializing." - } - ], - "ReentrancyGuardReentrantCall()": [ - { - "details": "Unauthorized reentrant call." - } - ], - "UUPSUnauthorizedCallContext()": [ - { - "details": "The call is from an unauthorized context." - } - ], - "UUPSUnsupportedProxiableUUID(bytes32)": [ - { - "details": "The storage `slot` is unsupported as a UUID." - } - ] - }, - "events": { - "ContractVersionSet(uint256)": { - "custom:section": "** EVENTS **" - }, - "Initialized(uint64)": { - "details": "Triggered when the contract has been initialized or reinitialized." - }, - "NewExitThreshold(uint256)": { - "custom:section": "** EVENTS **" - }, - "Paused(address)": { - "details": "Emitted when the pause is triggered by `account`." - }, - "Unpaused(address)": { - "details": "Emitted when the pause is lifted by `account`." - }, - "Upgraded(address)": { - "details": "Emitted when the implementation is upgraded." - } - }, - "kind": "dev", - "methods": { - "GeodeParams()": { - "custom:section": "** GETTER FUNCTIONS **", - "custom:visibility": "-> view-external" - }, - "WithdrawalParams()": { - "custom:section": "** GETTER FUNCTIONS **", - "custom:visibility": "-> view-external" - }, - "allIdsByType(uint256,uint256)": { - "details": "useful for outside reach, shouldn't be used within contracts as a referance", - "returns": { - "_0": "allIdsByType is an array of IDs of the given TYPE from Datastore, returns a specific index" - } - }, - "approveProposal(uint256)": { - "details": "handles PACKAGE_TYPE proposals by upgrading the contract immediately.onlySenate is checked inside GML.approveProposal" - }, - "canFinalizeExit(bytes)": { - "custom:visibility": "-> view" - }, - "changeIdCONTROLLER(uint256,address)": { - "custom:subsection": "** ONLY CONTROLLER **" - }, - "claimInfrastructureFees(address)": { - "custom:subsection": "** INFRASTRUCTURE FEE **", - "details": "WM override" - }, - "constructor": { - "custom:oz-upgrades-unsafe-allow": "constructor", - "details": "we don't want to provide these package-specific not-changing parameters accross all instances of the packages. So we will store them in the ref implementation contract of the package, and fetch when needed on initialization." - }, - "dequeue(uint256,address)": { - "custom:visibility": "-> external" - }, - "enqueue(uint256,bytes,address)": { - "custom:subsection": "** ENQUEUE **", - "custom:visibility": "-> external" - }, - "fulfill(uint256)": { - "custom:visibility": "-> external" - }, - "fulfillable(uint256)": { - "custom:visibility": "-> view" - }, - "generateId(string,uint256)": { - "details": "id is generated by keccak(name, type)" - }, - "getProposedVersion()": { - "details": "GeodeModule override" - }, - "initialize(uint256,address,bytes,bytes)": { - "details": "While 'data' parameter is not currently used it is a standarized approach on all * GeodePackages have the same function signature on 'initialize'." - }, - "isolationMode()": { - "details": "GeodeModule override" - }, - "multicall(bytes[])": { - "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", - "details": "Receives and executes a batch of function calls on this contract.This is necessary for the multistep operations done in this contract: * Enqueue, Process, Fulfill, Dequeue.Using 'functionDelegateCall' so it does not cause any issues when using msg.sender etc." - }, - "paused()": { - "details": "Returns true if the contract is paused, and false otherwise." - }, - "processValidators(bytes[],uint256[],uint256[],bytes32[][],uint256,bytes32[])": { - "custom:section": "** PROCESS BALANCES MERKLE UPDATE **" - }, - "propose(address,uint256,bytes,uint256)": { - "custom:subsection": "** ONLY GOVERNANCE **" - }, - "proxiableUUID()": { - "details": "Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier." - }, - "pullUpgrade()": { - "details": "IGeodePackage override" - }, - "readUintArray(uint256,bytes32,uint256)": { - "custom:section": "** ARRAY GETTER FUNCTIONS **", - "custom:visibility": "-> view-external" - }, - "setExitThreshold(uint256)": { - "custom:subsection": "** WITHDRAWAL QUEUE **", - "details": "WM override" - }, - "supportsInterface(bytes4)": { - "details": "See {IERC165-supportsInterface}." - }, - "upgradeToAndCall(address,bytes)": { - "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", - "details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "generateId(string,uint256)": { - "notice": "useful function for string inputs - returns same with the DSML.generateId" - }, - "getKey(uint256,bytes32)": { - "notice": "useful view function for string inputs - returns same with the DSML.generateId" - }, - "pause()": { - "notice": "pausing the contract activates the isolationMode" - }, - "unpause()": { - "notice": "unpausing the contract deactivates the isolationMode" - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/geodefi/abis/holesky/package/WithdrawalPackage.json b/geodefi/abis/holesky/package/WithdrawalPackage.json new file mode 100644 index 0000000..4ef8d73 --- /dev/null +++ b/geodefi/abis/holesky/package/WithdrawalPackage.json @@ -0,0 +1,1741 @@ +{ + "address": "0x818D3F510C1512f951c08e8f32B92832C3a46748", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_gETHPos", + "type": "address" + }, + { + "internalType": "address", + "name": "_portalPos", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "ERC1967InvalidImplementation", + "type": "error" + }, + { + "inputs": [], + "name": "ERC1967NonPayable", + "type": "error" + }, + { + "inputs": [], + "name": "EnforcedPause", + "type": "error" + }, + { + "inputs": [], + "name": "ExpectedPause", + "type": "error" + }, + { + "inputs": [], + "name": "FailedInnerCall", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [], + "name": "ReentrancyGuardReentrantCall", + "type": "error" + }, + { + "inputs": [], + "name": "UUPSUnauthorizedCallContext", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "slot", + "type": "bytes32" + } + ], + "name": "UUPSUnsupportedProxiableUUID", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "ID", + "type": "uint256" + } + ], + "name": "Approved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "ContractVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "ID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "CONTROLLER", + "type": "address" + } + ], + "name": "ControllerChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claim", + "type": "uint256" + } + ], + "name": "Dequeue", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "Enqueue", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "fulfillAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claimableETH", + "type": "uint256" + } + ], + "name": "Fulfill", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ], + "name": "NewExitThreshold", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "senate", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + } + ], + "name": "NewSenate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Processed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "TYPE", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ID", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "CONTROLLER", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "Proposed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "oldOwner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "RequestTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "size", + "type": "uint256" + } + ], + "name": "Vote", + "type": "event" + }, + { + "inputs": [], + "name": "GeodeParams", + "outputs": [ + { + "internalType": "address", + "name": "governance", + "type": "address" + }, + { + "internalType": "address", + "name": "senate", + "type": "address" + }, + { + "internalType": "address", + "name": "approvedUpgrade", + "type": "address" + }, + { + "internalType": "uint256", + "name": "senateExpiry", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "packageType", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "QueueParams", + "outputs": [ + { + "internalType": "uint256", + "name": "requested", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "realized", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "realizedEtherBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "realizedPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fulfilled", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fulfilledEtherBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "commonPoll", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UPGRADE_INTERFACE_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WithdrawalParams", + "outputs": [ + { + "internalType": "address", + "name": "gETH", + "type": "address" + }, + { + "internalType": "address", + "name": "portal", + "type": "address" + }, + { + "internalType": "uint256", + "name": "poolId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gatheredInfrastructureFees", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_type", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "allIdsByType", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_type", + "type": "uint256" + } + ], + "name": "allIdsByTypeLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "approveProposal", + "outputs": [ + { + "internalType": "address", + "name": "_controller", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_type", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_name", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "canFinalizeExit", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "address", + "name": "newCONTROLLER", + "type": "address" + } + ], + "name": "changeIdCONTROLLER", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newSenate", + "type": "address" + } + ], + "name": "changeSenate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "claimInfrastructureFees", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "dequeue", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "indexes", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "dequeueBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "size", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "enqueue", + "outputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "sizes", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "pubkeys", + "type": "bytes[]" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "enqueueBatch", + "outputs": [ + { + "internalType": "uint256[]", + "name": "indexes", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "fulfill", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "indexes", + "type": "uint256[]" + } + ], + "name": "fulfillBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "fulfillable", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_type", + "type": "uint256" + } + ], + "name": "generateId", + "outputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getContractVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getGovernance", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_param", + "type": "bytes32" + } + ], + "name": "getKey", + "outputs": [ + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getPoolId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "getProposal", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "CONTROLLER", + "type": "address" + }, + { + "internalType": "uint256", + "name": "TYPE", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "NAME", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "internalType": "struct Proposal", + "name": "proposal", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProposedVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRequest", + "outputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "trigger", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "size", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "fulfilled", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "claimableEther", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "getValidatorData", + "outputs": [ + { + "internalType": "uint256", + "name": "beaconBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "withdrawnBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "poll", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "poolId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "poolOwner", + "type": "address" + }, + { + "internalType": "bytes", + "name": "versionName", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isolationMode", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "pubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint256[]", + "name": "beaconBalances", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "withdrawnBalances", + "type": "uint256[]" + }, + { + "internalType": "bytes32[][]", + "name": "balanceProofs", + "type": "bytes32[][]" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "priceProof", + "type": "bytes32[]" + } + ], + "name": "processValidators", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_CONTROLLER", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_TYPE", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_NAME", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "propose", + "outputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pullUpgrade", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "readAddress", + "outputs": [ + { + "internalType": "address", + "name": "data", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "readAddressArray", + "outputs": [ + { + "internalType": "address", + "name": "data", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "readBytes", + "outputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "readBytesArray", + "outputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + } + ], + "name": "readUint", + "outputs": [ + { + "internalType": "uint256", + "name": "data", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "key", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "readUintArray", + "outputs": [ + { + "internalType": "uint256", + "name": "data", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newSenate", + "type": "address" + } + ], + "name": "rescueSenate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newThreshold", + "type": "uint256" + } + ], + "name": "setExitThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferRequest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "name": "validatorThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0xa9d006c7efada27855104c7ad05eb72befbff60b47e9d73bc1322f6643e27e3a", + "receipt": { + "to": null, + "from": "0x7B6fA217a374826FCa50dccB87041AE0e34Ba1f5", + "contractAddress": "0x818D3F510C1512f951c08e8f32B92832C3a46748", + "transactionIndex": 8, + "gasUsed": "3691200", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000004000000000000000000000000000000000000000000000000000000000000000000010000000000000000", + "blockHash": "0x361a8d6ec9120a2a8211e74c67cec422f3c6c8acede0444f84c733ce58f55a72", + "transactionHash": "0xa9d006c7efada27855104c7ad05eb72befbff60b47e9d73bc1322f6643e27e3a", + "logs": [ + { + "transactionIndex": 8, + "blockNumber": 1550553, + "transactionHash": "0xa9d006c7efada27855104c7ad05eb72befbff60b47e9d73bc1322f6643e27e3a", + "address": "0x818D3F510C1512f951c08e8f32B92832C3a46748", + "topics": [ + "0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2" + ], + "data": "0x000000000000000000000000000000000000000000000000ffffffffffffffff", + "logIndex": 45, + "blockHash": "0x361a8d6ec9120a2a8211e74c67cec422f3c6c8acede0444f84c733ce58f55a72" + } + ], + "blockNumber": 1550553, + "cumulativeGasUsed": "5807105", + "status": 1, + "byzantium": true + }, + "args": [ + "0xaFE4151bC01770B5D2298555D1cCdaf273bC9D2E", + "0xcA69bA533810ee94b7649c57eF8aB22EBbE0bbf7" + ], + "numDeployments": 1, + "solcInputHash": "e25e6b0dd11e130b0e651c906c66ce16", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_gETHPos\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_portalPos\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"slot\",\"type\":\"bytes32\"}],\"name\":\"UUPSUnsupportedProxiableUUID\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"ID\",\"type\":\"uint256\"}],\"name\":\"Approved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"ContractVersionSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"ID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"CONTROLLER\",\"type\":\"address\"}],\"name\":\"ControllerChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claim\",\"type\":\"uint256\"}],\"name\":\"Dequeue\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"Enqueue\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fulfillAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimableETH\",\"type\":\"uint256\"}],\"name\":\"Fulfill\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"name\":\"NewExitThreshold\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"senate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"}],\"name\":\"NewSenate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Processed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"TYPE\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"ID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"CONTROLLER\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"Proposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"RequestTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"pubkey\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"}],\"name\":\"Vote\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"GeodeParams\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"governance\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"senate\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"approvedUpgrade\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"senateExpiry\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"packageType\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"QueueParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"realized\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"realizedEtherBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"realizedPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fulfilled\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fulfilledEtherBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commonPoll\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPGRADE_INTERFACE_VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WithdrawalParams\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"gETH\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"portal\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"poolId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"exitThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gatheredInfrastructureFees\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_type\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"allIdsByType\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_type\",\"type\":\"uint256\"}],\"name\":\"allIdsByTypeLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"approveProposal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_controller\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_type\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_name\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"pubkey\",\"type\":\"bytes\"}],\"name\":\"canFinalizeExit\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newCONTROLLER\",\"type\":\"address\"}],\"name\":\"changeIdCONTROLLER\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newSenate\",\"type\":\"address\"}],\"name\":\"changeSenate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimInfrastructureFees\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"dequeue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"indexes\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"dequeueBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"pubkey\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"enqueue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"sizes\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"pubkeys\",\"type\":\"bytes[]\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"enqueueBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"indexes\",\"type\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"fulfill\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"indexes\",\"type\":\"uint256[]\"}],\"name\":\"fulfillBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"fulfillable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_type\",\"type\":\"uint256\"}],\"name\":\"generateId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getContractVersion\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGovernance\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_param\",\"type\":\"bytes32\"}],\"name\":\"getKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPoolId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getProposal\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"CONTROLLER\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"TYPE\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"NAME\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"internalType\":\"struct Proposal\",\"name\":\"proposal\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProposedVersion\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRequest\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"trigger\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"size\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fulfilled\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"claimableEther\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"pubkey\",\"type\":\"bytes\"}],\"name\":\"getValidatorData\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"beaconBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawnBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"poll\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"poolId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"poolOwner\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"versionName\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isolationMode\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"pubkeys\",\"type\":\"bytes[]\"},{\"internalType\":\"uint256[]\",\"name\":\"beaconBalances\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"withdrawnBalances\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes32[][]\",\"name\":\"balanceProofs\",\"type\":\"bytes32[][]\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"priceProof\",\"type\":\"bytes32[]\"}],\"name\":\"processValidators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_CONTROLLER\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_TYPE\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_NAME\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"name\":\"propose\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pullUpgrade\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"readAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"data\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"readAddressArray\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"data\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"readBytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"readBytesArray\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"}],\"name\":\"readUint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"data\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"readUintArray\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"data\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newSenate\",\"type\":\"address\"}],\"name\":\"rescueSenate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newThreshold\",\"type\":\"uint256\"}],\"name\":\"setExitThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"pubkey\",\"type\":\"bytes\"}],\"name\":\"validatorThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"ERC1967InvalidImplementation(address)\":[{\"details\":\"The `implementation` of the proxy is invalid.\"}],\"ERC1967NonPayable()\":[{\"details\":\"An upgrade function sees `msg.value > 0` that may be lost.\"}],\"EnforcedPause()\":[{\"details\":\"The operation failed because the contract is paused.\"}],\"ExpectedPause()\":[{\"details\":\"The operation failed because the contract is not paused.\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"UUPSUnauthorizedCallContext()\":[{\"details\":\"The call is from an unauthorized context.\"}],\"UUPSUnsupportedProxiableUUID(bytes32)\":[{\"details\":\"The storage `slot` is unsupported as a UUID.\"}]},\"events\":{\"ContractVersionSet(uint256)\":{\"custom:section\":\"** EVENTS **\"},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"NewExitThreshold(uint256)\":{\"custom:section\":\"** EVENTS **\"},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"GeodeParams()\":{\"custom:section\":\"** GETTER FUNCTIONS **\",\"custom:visibility\":\"-> view-external\"},\"WithdrawalParams()\":{\"custom:section\":\"** GETTER FUNCTIONS **\",\"custom:visibility\":\"-> view-external\"},\"allIdsByType(uint256,uint256)\":{\"details\":\"useful for outside reach, shouldn't be used within contracts as a referance\",\"returns\":{\"_0\":\"allIdsByType is an array of IDs of the given TYPE from Datastore, returns a specific index\"}},\"approveProposal(uint256)\":{\"details\":\"handles PACKAGE_TYPE proposals by upgrading the contract immediately.onlySenate is checked inside GML.approveProposal\"},\"canFinalizeExit(bytes)\":{\"custom:visibility\":\"-> view\"},\"changeIdCONTROLLER(uint256,address)\":{\"custom:subsection\":\"** ONLY CONTROLLER **\"},\"claimInfrastructureFees(address)\":{\"custom:subsection\":\"** INFRASTRUCTURE FEE **\",\"details\":\"WM override\"},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"details\":\"we don't want to provide these package-specific not-changing parameters accross all instances of the packages. So we will store them in the ref implementation contract of the package, and fetch when needed on initialization.\"},\"dequeue(uint256,address)\":{\"custom:visibility\":\"-> external\"},\"enqueue(uint256,bytes,address)\":{\"custom:subsection\":\"** ENQUEUE **\",\"custom:visibility\":\"-> external\"},\"fulfill(uint256)\":{\"custom:visibility\":\"-> external\"},\"fulfillable(uint256)\":{\"custom:visibility\":\"-> view\"},\"generateId(string,uint256)\":{\"details\":\"id is generated by keccak(name, type)\"},\"getProposedVersion()\":{\"details\":\"GeodeModule override\"},\"initialize(uint256,address,bytes,bytes)\":{\"details\":\"While 'data' parameter is not currently used it is a standarized approach on all * GeodePackages have the same function signature on 'initialize'.\"},\"isolationMode()\":{\"details\":\"GeodeModule override\"},\"multicall(bytes[])\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Receives and executes a batch of function calls on this contract.This is necessary for the multistep operations done in this contract: * Enqueue, Process, Fulfill, Dequeue.Using 'functionDelegateCall' so it does not cause any issues when using msg.sender etc.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"processValidators(bytes[],uint256[],uint256[],bytes32[][],uint256,bytes32[])\":{\"custom:section\":\"** PROCESS BALANCES MERKLE UPDATE **\"},\"propose(address,uint256,bytes,uint256)\":{\"custom:subsection\":\"** ONLY GOVERNANCE **\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"pullUpgrade()\":{\"details\":\"IGeodePackage override\"},\"readUintArray(uint256,bytes32,uint256)\":{\"custom:section\":\"** ARRAY GETTER FUNCTIONS **\",\"custom:visibility\":\"-> view-external\"},\"setExitThreshold(uint256)\":{\"custom:subsection\":\"** WITHDRAWAL QUEUE **\",\"details\":\"WM override\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"generateId(string,uint256)\":{\"notice\":\"useful function for string inputs - returns same with the DSML.generateId\"},\"getKey(uint256,bytes32)\":{\"notice\":\"useful view function for string inputs - returns same with the DSML.generateId\"},\"pause()\":{\"notice\":\"pausing the contract activates the isolationMode\"},\"unpause()\":{\"notice\":\"unpausing the contract deactivates the isolationMode\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/packages/WithdrawalPackage.sol\":\"WithdrawalPackage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Storage of the initializable contract.\\n *\\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\\n * when using with upgradeable contracts.\\n *\\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\\n */\\n struct InitializableStorage {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n uint64 _initialized;\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool _initializing;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Initializable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\\n\\n /**\\n * @dev The contract is already initialized.\\n */\\n error InvalidInitialization();\\n\\n /**\\n * @dev The contract is not initializing.\\n */\\n error NotInitializing();\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint64 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts.\\n *\\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\\n * production.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier initializer() {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n // Cache values to avoid duplicated sloads\\n bool isTopLevelCall = !$._initializing;\\n uint64 initialized = $._initialized;\\n\\n // Allowed calls:\\n // - initialSetup: the contract is not in the initializing state and no previous version was\\n // initialized\\n // - construction: the contract is initialized at version 1 (no reininitialization) and the\\n // current contract is just being deployed\\n bool initialSetup = initialized == 0 && isTopLevelCall;\\n bool construction = initialized == 1 && address(this).code.length == 0;\\n\\n if (!initialSetup && !construction) {\\n revert InvalidInitialization();\\n }\\n $._initialized = 1;\\n if (isTopLevelCall) {\\n $._initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n $._initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n * are added through upgrades and that require initialization.\\n *\\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n * cannot be nested. If one is invoked in the context of another, execution will revert.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n *\\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\\n *\\n * Emits an {Initialized} event.\\n */\\n modifier reinitializer(uint64 version) {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing || $._initialized >= version) {\\n revert InvalidInitialization();\\n }\\n $._initialized = version;\\n $._initializing = true;\\n _;\\n $._initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n _checkInitializing();\\n _;\\n }\\n\\n /**\\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\\n */\\n function _checkInitializing() internal view virtual {\\n if (!_isInitializing()) {\\n revert NotInitializing();\\n }\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n *\\n * Emits an {Initialized} event the first time it is successfully executed.\\n */\\n function _disableInitializers() internal virtual {\\n // solhint-disable-next-line var-name-mixedcase\\n InitializableStorage storage $ = _getInitializableStorage();\\n\\n if ($._initializing) {\\n revert InvalidInitialization();\\n }\\n if ($._initialized != type(uint64).max) {\\n $._initialized = type(uint64).max;\\n emit Initialized(type(uint64).max);\\n }\\n }\\n\\n /**\\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n */\\n function _getInitializedVersion() internal view returns (uint64) {\\n return _getInitializableStorage()._initialized;\\n }\\n\\n /**\\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n */\\n function _isInitializing() internal view returns (bool) {\\n return _getInitializableStorage()._initializing;\\n }\\n\\n /**\\n * @dev Returns a pointer to the storage namespace.\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\\n assembly {\\n $.slot := INITIALIZABLE_STORAGE\\n }\\n }\\n}\\n\",\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC1822Proxiable} from \\\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\\\";\\nimport {ERC1967Utils} from \\\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\\\";\\nimport {Initializable} from \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable {\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n address private immutable __self = address(this);\\n\\n /**\\n * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)`\\n * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,\\n * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string.\\n * If the getter returns `\\\"5.0.0\\\"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must\\n * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\\n * during an upgrade.\\n */\\n string public constant UPGRADE_INTERFACE_VERSION = \\\"5.0.0\\\";\\n\\n /**\\n * @dev The call is from an unauthorized context.\\n */\\n error UUPSUnauthorizedCallContext();\\n\\n /**\\n * @dev The storage `slot` is unsupported as a UUID.\\n */\\n error UUPSUnsupportedProxiableUUID(bytes32 slot);\\n\\n /**\\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n * fail.\\n */\\n modifier onlyProxy() {\\n _checkProxy();\\n _;\\n }\\n\\n /**\\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n * callable on the implementing contract but not through proxies.\\n */\\n modifier notDelegated() {\\n _checkNotDelegated();\\n _;\\n }\\n\\n function __UUPSUpgradeable_init() internal onlyInitializing {\\n }\\n\\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n */\\n function proxiableUUID() external view virtual notDelegated returns (bytes32) {\\n return ERC1967Utils.IMPLEMENTATION_SLOT;\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n * encoded in `data`.\\n *\\n * Calls {_authorizeUpgrade}.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\\n _authorizeUpgrade(newImplementation);\\n _upgradeToAndCallUUPS(newImplementation, data);\\n }\\n\\n /**\\n * @dev Reverts if the execution is not performed via delegatecall or the execution\\n * context is not of a proxy with an ERC1967-compliant implementation pointing to self.\\n * See {_onlyProxy}.\\n */\\n function _checkProxy() internal view virtual {\\n if (\\n address(this) == __self || // Must be called through delegatecall\\n ERC1967Utils.getImplementation() != __self // Must be called through an active proxy\\n ) {\\n revert UUPSUnauthorizedCallContext();\\n }\\n }\\n\\n /**\\n * @dev Reverts if the execution is performed via delegatecall.\\n * See {notDelegated}.\\n */\\n function _checkNotDelegated() internal view virtual {\\n if (address(this) != __self) {\\n // Must not be called through delegatecall\\n revert UUPSUnauthorizedCallContext();\\n }\\n }\\n\\n /**\\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n * {upgradeToAndCall}.\\n *\\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n *\\n * ```solidity\\n * function _authorizeUpgrade(address) internal onlyOwner {}\\n * ```\\n */\\n function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n /**\\n * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call.\\n *\\n * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value\\n * is expected to be the implementation slot in ERC1967.\\n *\\n * Emits an {IERC1967-Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) {\\n revert UUPSUnsupportedProxiableUUID(slot);\\n }\\n ERC1967Utils.upgradeToAndCall(newImplementation, data);\\n } catch {\\n // The implementation is not UUPS\\n revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3f13b947637c4969c0644cab4ef399cdc4b67f101463b8775c5a43b118558e53\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC1155/utils/ERC1155HolderUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/utils/ERC1155Holder.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport {ERC165Upgradeable} from \\\"../../../utils/introspection/ERC165Upgradeable.sol\\\";\\nimport {IERC1155Receiver} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\nimport {Initializable} from \\\"../../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Simple implementation of `IERC1155Receiver` that will allow a contract to hold ERC1155 tokens.\\n *\\n * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be\\n * stuck.\\n */\\nabstract contract ERC1155HolderUpgradeable is Initializable, ERC165Upgradeable, IERC1155Receiver {\\n function __ERC1155Holder_init() internal onlyInitializing {\\n }\\n\\n function __ERC1155Holder_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0xd5cd13424ae387f7356676f7b90081cc63af46eac66ef15efeaca6177863eb83\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x72d47aebad24c59f6e78d0c3e827440173419a333fd910a37fa1e532c98f7e4c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {ContextUpgradeable} from \\\"../utils/ContextUpgradeable.sol\\\";\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /// @custom:storage-location erc7201:openzeppelin.storage.Pausable\\n struct PausableStorage {\\n bool _paused;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.Pausable\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300;\\n\\n function _getPausableStorage() private pure returns (PausableStorage storage $) {\\n assembly {\\n $.slot := PausableStorageLocation\\n }\\n }\\n\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n /**\\n * @dev The operation failed because the contract is paused.\\n */\\n error EnforcedPause();\\n\\n /**\\n * @dev The operation failed because the contract is not paused.\\n */\\n error ExpectedPause();\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal onlyInitializing {\\n PausableStorage storage $ = _getPausableStorage();\\n $._paused = false;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n _requireNotPaused();\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n _requirePaused();\\n _;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n PausableStorage storage $ = _getPausableStorage();\\n return $._paused;\\n }\\n\\n /**\\n * @dev Throws if the contract is paused.\\n */\\n function _requireNotPaused() internal view virtual {\\n if (paused()) {\\n revert EnforcedPause();\\n }\\n }\\n\\n /**\\n * @dev Throws if the contract is not paused.\\n */\\n function _requirePaused() internal view virtual {\\n if (!paused()) {\\n revert ExpectedPause();\\n }\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n PausableStorage storage $ = _getPausableStorage();\\n $._paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n PausableStorage storage $ = _getPausableStorage();\\n $._paused = false;\\n emit Unpaused(_msgSender());\\n }\\n}\\n\",\"keccak256\":\"0x92915b7f7f642c6be3f65bfd1522feb5d5b6ef25f755f4dbb51df32c868f2f97\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.20;\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant NOT_ENTERED = 1;\\n uint256 private constant ENTERED = 2;\\n\\n /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard\\n struct ReentrancyGuardStorage {\\n uint256 _status;\\n }\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"openzeppelin.storage.ReentrancyGuard\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;\\n\\n function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) {\\n assembly {\\n $.slot := ReentrancyGuardStorageLocation\\n }\\n }\\n\\n /**\\n * @dev Unauthorized reentrant call.\\n */\\n error ReentrancyGuardReentrantCall();\\n\\n function __ReentrancyGuard_init() internal onlyInitializing {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\\n $._status = NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\\n // On the first call to nonReentrant, _status will be NOT_ENTERED\\n if ($._status == ENTERED) {\\n revert ReentrancyGuardReentrantCall();\\n }\\n\\n // Any calls to nonReentrant after this point will fail\\n $._status = ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n $._status = NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n * `nonReentrant` function in the call stack.\\n */\\n function _reentrancyGuardEntered() internal view returns (bool) {\\n ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage();\\n return $._status == ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0xb44e086e941292cdc7f440de51478493894ef0b1aeccb0c4047445919f667f74\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport {Initializable} from \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n */\\nabstract contract ERC165Upgradeable is Initializable, IERC165 {\\n function __ERC165_init() internal onlyInitializing {\\n }\\n\\n function __ERC165_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xdaba3f7c42c55b2896353f32bd27d4d5f8bae741b3b05d4c53f67abc4dc47ce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard ERC20 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\\n */\\ninterface IERC20Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC20InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC20InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC20InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC20InvalidSpender(address spender);\\n}\\n\\n/**\\n * @dev Standard ERC721 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\\n */\\ninterface IERC721Errors {\\n /**\\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\\n * Used in balance queries.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721InvalidOwner(address owner);\\n\\n /**\\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721NonexistentToken(uint256 tokenId);\\n\\n /**\\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param tokenId Identifier number of a token.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC721InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC721InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC721InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC721InvalidOperator(address operator);\\n}\\n\\n/**\\n * @dev Standard ERC1155 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\\n */\\ninterface IERC1155Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC1155InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC1155InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC1155MissingApprovalForAll(address operator, address owner);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC1155InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC1155InvalidOperator(address operator);\\n\\n /**\\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\\n * Used in batch transfers.\\n * @param idsLength Length of the array of token identifiers\\n * @param valuesLength Length of the array of token amounts\\n */\\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\\n}\\n\",\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IBeacon} from \\\"../beacon/IBeacon.sol\\\";\\nimport {Address} from \\\"../../utils/Address.sol\\\";\\nimport {StorageSlot} from \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n */\\nlibrary ERC1967Utils {\\n // We re-declare ERC-1967 events here because they can't be used directly from IERC1967.\\n // This will be fixed in Solidity 0.8.21. At that point we should remove these events.\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1.\\n */\\n // solhint-disable-next-line private-vars-leading-underscore\\n bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev The `implementation` of the proxy is invalid.\\n */\\n error ERC1967InvalidImplementation(address implementation);\\n\\n /**\\n * @dev The `admin` of the proxy is invalid.\\n */\\n error ERC1967InvalidAdmin(address admin);\\n\\n /**\\n * @dev The `beacon` of the proxy is invalid.\\n */\\n error ERC1967InvalidBeacon(address beacon);\\n\\n /**\\n * @dev An upgrade function sees `msg.value > 0` that may be lost.\\n */\\n error ERC1967NonPayable();\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n if (newImplementation.code.length == 0) {\\n revert ERC1967InvalidImplementation(newImplementation);\\n }\\n StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Performs implementation upgrade with additional setup call if data is nonempty.\\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\\n * to avoid stuck value in the contract.\\n *\\n * Emits an {IERC1967-Upgraded} event.\\n */\\n function upgradeToAndCall(address newImplementation, bytes memory data) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n\\n if (data.length > 0) {\\n Address.functionDelegateCall(newImplementation, data);\\n } else {\\n _checkNonPayable();\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1.\\n */\\n // solhint-disable-next-line private-vars-leading-underscore\\n bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using\\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n if (newAdmin == address(0)) {\\n revert ERC1967InvalidAdmin(address(0));\\n }\\n StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {IERC1967-AdminChanged} event.\\n */\\n function changeAdmin(address newAdmin) internal {\\n emit AdminChanged(getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.beacon\\\" subtracted by 1.\\n */\\n // solhint-disable-next-line private-vars-leading-underscore\\n bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n if (newBeacon.code.length == 0) {\\n revert ERC1967InvalidBeacon(newBeacon);\\n }\\n\\n StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\\n\\n address beaconImplementation = IBeacon(newBeacon).implementation();\\n if (beaconImplementation.code.length == 0) {\\n revert ERC1967InvalidImplementation(beaconImplementation);\\n }\\n }\\n\\n /**\\n * @dev Change the beacon and trigger a setup call if data is nonempty.\\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\\n * to avoid stuck value in the contract.\\n *\\n * Emits an {IERC1967-BeaconUpgraded} event.\\n *\\n * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\\n * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\\n * efficiency.\\n */\\n function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n\\n if (data.length > 0) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n } else {\\n _checkNonPayable();\\n }\\n }\\n\\n /**\\n * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\\n * if an upgrade doesn't perform an initialization call.\\n */\\n function _checkNonPayable() private {\\n if (msg.value > 0) {\\n revert ERC1967NonPayable();\\n }\\n }\\n}\\n\",\"keccak256\":\"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {UpgradeableBeacon} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\\n */\\ninterface IERC1155 is IERC165 {\\n /**\\n * @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.\\n */\\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n /**\\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\\n * transfers.\\n */\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] values\\n );\\n\\n /**\\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\\n * `approved`.\\n */\\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\\n\\n /**\\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\\n *\\n * If an {URI} event was emitted for `id`, the standard\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\\n * returned by {IERC1155MetadataURI-uri}.\\n */\\n event URI(string value, uint256 indexed id);\\n\\n /**\\n * @dev Returns the value of tokens of token type `id` owned by `account`.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function balanceOf(address account, uint256 id) external view returns (uint256);\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\\n *\\n * Requirements:\\n *\\n * - `accounts` and `ids` must have the same length.\\n */\\n function balanceOfBatch(\\n address[] calldata accounts,\\n uint256[] calldata ids\\n ) external view returns (uint256[] memory);\\n\\n /**\\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\\n *\\n * Emits an {ApprovalForAll} event.\\n *\\n * Requirements:\\n *\\n * - `operator` cannot be the caller.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\\n *\\n * See {setApprovalForAll}.\\n */\\n function isApprovedForAll(address account, address operator) external view returns (bool);\\n\\n /**\\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`.\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155Received} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\\n *\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `values` must have the same length.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external;\\n}\\n\",\"keccak256\":\"0xe64b3445a3f638890af7ad92464cd18f1f202a2f5a7ed42dabf74317bae43303\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Interface that must be implemented by smart contracts in order to receive\\n * ERC-1155 token transfers.\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xb69597a63b202e28401128bed6a6d259e8730191274471af7303eafb247881a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/extensions/IERC1155MetadataURI.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC1155} from \\\"../IERC1155.sol\\\";\\n\\n/**\\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\\n */\\ninterface IERC1155MetadataURI is IERC1155 {\\n /**\\n * @dev Returns the URI for token type `id`.\\n *\\n * If the `\\\\{id\\\\}` substring is present in the URI, it must be replaced by\\n * clients with the actual token type ID.\\n */\\n function uri(uint256 id) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xe92b5e199b963d108ad6e06feeede151ba23849e0d064956535489ff967ffe68\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev The ETH balance of the account is not enough to perform the operation.\\n */\\n error AddressInsufficientBalance(address account);\\n\\n /**\\n * @dev There's no code at `target` (it is not a contract).\\n */\\n error AddressEmptyCode(address target);\\n\\n /**\\n * @dev A call to an address target failed. The target may have reverted.\\n */\\n error FailedInnerCall();\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n if (address(this).balance < amount) {\\n revert AddressInsufficientBalance(address(this));\\n }\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n if (!success) {\\n revert FailedInnerCall();\\n }\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason or custom error, it is bubbled\\n * up by this function (like regular Solidity function calls). However, if\\n * the call reverted with no returned reason, this function reverts with a\\n * {FailedInnerCall} error.\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n if (address(this).balance < value) {\\n revert AddressInsufficientBalance(address(this));\\n }\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\\n * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an\\n * unsuccessful call.\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata\\n ) internal view returns (bytes memory) {\\n if (!success) {\\n _revert(returndata);\\n } else {\\n // only check if target is a contract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n if (returndata.length == 0 && target.code.length == 0) {\\n revert AddressEmptyCode(target);\\n }\\n return returndata;\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\\n * revert reason or with a default {FailedInnerCall} error.\\n */\\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\\n if (!success) {\\n _revert(returndata);\\n } else {\\n return returndata;\\n }\\n }\\n\\n /**\\n * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.\\n */\\n function _revert(bytes memory returndata) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert FailedInnerCall();\\n }\\n }\\n}\\n\",\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(newImplementation.code.length > 0);\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The tree and the proofs can be generated using our\\n * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].\\n * You will find a quickstart guide in the readme.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the Merkle tree could be reinterpreted as a leaf value.\\n * OpenZeppelin's JavaScript library generates Merkle trees that are safe\\n * against this attack out of the box.\\n */\\nlibrary MerkleProof {\\n /**\\n *@dev The multiproof provided is not valid.\\n */\\n error MerkleProofInvalidMultiproof();\\n\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {verify}\\n */\\n function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {\\n return processProofCalldata(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Calldata version of {processProof}\\n */\\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by\\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n *\\n * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n */\\n function multiProofVerify(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProof(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {multiProofVerify}\\n *\\n * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n */\\n function multiProofVerifyCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction\\n * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another\\n * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false\\n * respectively.\\n *\\n * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree\\n * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the\\n * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).\\n */\\n function processMultiProof(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the Merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 proofLen = proof.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n if (leavesLen + proofLen != totalHashes + 1) {\\n revert MerkleProofInvalidMultiproof();\\n }\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i]\\n ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n if (proofPos != proofLen) {\\n revert MerkleProofInvalidMultiproof();\\n }\\n unchecked {\\n return hashes[totalHashes - 1];\\n }\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Calldata version of {processMultiProof}.\\n *\\n * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.\\n */\\n function processMultiProofCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the Merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 proofLen = proof.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n if (leavesLen + proofLen != totalHashes + 1) {\\n revert MerkleProofInvalidMultiproof();\\n }\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value from the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i]\\n ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])\\n : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n if (proofPos != proofLen) {\\n revert MerkleProofInvalidMultiproof();\\n }\\n unchecked {\\n return hashes[totalHashes - 1];\\n }\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Sorts the pair (a, b) and hashes the result.\\n */\\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\\n }\\n\\n /**\\n * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.\\n */\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x6400c4bee15052e043e5d10315135972529bd1c8012f43da494dc6b4f4661058\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"contracts/globals/id_type.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n/**\\n * @notice ID_TYPE is an internal library that acts like an ENUM.\\n *\\n * @dev Used within the limited upgradability pattern:\\n *\\n * NONE & GAP: should not be used.\\n *\\n * Dual Governance:\\n * * SENATE: points to a proposal that will update the current SENATE address of a package(or Portal).\\n * * CONTRACT UPGRADE: proposal to change the given contract's implementation. TYPE should be package's TYPE.\\n *\\n * Users:\\n * * OPERATOR: permissionned Node Operators (hosted on Portal).\\n * * POOL: permissionless staking pools (hosted on Portal).\\n *\\n * Packages: (hosted on StakeModuleLib)\\n * * An ID can only point to 1(one) Package version' implementation address at a given point.\\n * * Can be upgraded by a dual governance, via pullUpgrade.\\n * * * Portal's dual governance consists of a Governance Token(governance) and a Senate(senate).\\n * * * A Package's dual governance consists of Portal(governance) and the pool owner(senate).\\n * * Built by utilizing the Modules.\\n * * LiquidityPackage and WithdrawalPackage are some examples.\\n *\\n * Middlewares: (hosted on StakeModuleLib)\\n * * An ID can point to multiple Middleware version' implementation address at the same time.\\n * * Cannot be upgraded.\\n * * Do not have any guides to build really.\\n * * Currently only gETHMiddlewares\\n *\\n * Limits:\\n * * We simply set limits to separate a group of types from others. Like Packages and Middlewares.\\n *\\n * @dev all LIMIT parameters are exclusive, prevents double usage.\\n */\\nlibrary ID_TYPE {\\n /// @notice TYPE 0: *invalid*\\n uint256 internal constant NONE = 0;\\n\\n /// @notice TYPE 1: Senate\\n uint256 internal constant SENATE = 1;\\n\\n /// --\\n\\n /// @notice TYPE 3: Limit: exclusive, minimum TYPE that will be percieved as a user\\n uint256 internal constant LIMIT_MIN_USER = 3;\\n\\n /// @notice TYPE 4: USER: Permissionned Node Operator\\n uint256 internal constant OPERATOR = 4;\\n\\n /// @notice TYPE 5: USER: Staking Pool\\n uint256 internal constant POOL = 5;\\n\\n /// @notice TYPE 9999: Limit: exclusive, maximum TYPE that will be percieved as a user\\n uint256 internal constant LIMIT_MAX_USER = 9999;\\n\\n /// --\\n\\n /// @notice TYPE 10000: Limit: exclusive, minimum TYPE that will be percieved as a package\\n uint256 internal constant LIMIT_MIN_PACKAGE = 10000;\\n\\n /// @notice TYPE 10001: Package: Portal is also a package\\n uint256 internal constant PACKAGE_PORTAL = 10001;\\n\\n /// @notice TYPE 10011: Package: The Withdrawal Contract\\n uint256 internal constant PACKAGE_WITHDRAWAL = 10011;\\n\\n /// @notice TYPE 10021: Package: A Liquidity Pool\\n uint256 internal constant PACKAGE_LIQUIDITY = 10021;\\n\\n /// @notice TYPE 19999: Limit: exclusive, maximum TYPE that will be percieved as a package\\n uint256 internal constant LIMIT_MAX_PACKAGE = 19999;\\n\\n /// --\\n\\n /// @notice TYPE 20000: Limit: exclusive, minimum TYPE that will be percieved as a middleware\\n uint256 internal constant LIMIT_MIN_MIDDLEWARE = 20000;\\n\\n /// @notice TYPE 20011: Middleware: A new gETH interface\\n uint256 internal constant MIDDLEWARE_GETH = 20011;\\n\\n /// @notice TYPE 29999: Limit: exclusive, maximum TYPE that will be percieved as a middleware\\n uint256 internal constant LIMIT_MAX_MIDDLEWARE = 29999;\\n}\\n\",\"keccak256\":\"0x14e68dc40a8b7a3d6737f0a3f7d3154b6debb7e4d92564c54ec82a082cc9df2a\",\"license\":\"BUSL-1.1\"},\"contracts/globals/macros.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n// no floats in solidity. If needed, PERCENTAGE_DENOMINATOR always represents \\\"1\\\" (100%)\\nuint256 constant PERCENTAGE_DENOMINATOR = 1e10;\\n\\nuint256 constant gETH_DENOMINATOR = 1e18;\\n\",\"keccak256\":\"0xdcbe1faa8712a653a87f4e185afb598388c2bbe62a750989df57afeac2848168\",\"license\":\"BUSL-1.1\"},\"contracts/globals/reserved_key_space.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n/**\\n * @notice Reserved Key Space for DataStoreModule\\n * * helps preventing potential dev mistakes.\\n * * helps keeping track of them.\\n * * limits keys to bytes32.\\n *\\n * @dev utilize a key with rks.key\\n * @dev keep this list in alphabetical order, per module.\\n * @dev NEVER name your variables something else other than *its string value*.\\n * @dev ! array keys with readUint returns the lenght of the array !\\n */\\nlibrary RESERVED_KEY_SPACE {\\n /**\\n * @dev reserved on GeodeModuleLib\\n */\\n\\n /**\\n * @custom:type address\\n * @custom:definition representing body of an id\\n */\\n bytes32 internal constant CONTROLLER = \\\"CONTROLLER\\\";\\n\\n /**\\n * @custom:type bytes\\n * @custom:definition base of an id\\n */\\n bytes32 internal constant NAME = \\\"NAME\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition identifier for an id, based on ID_TYPEs\\n */\\n bytes32 internal constant TYPE = \\\"TYPE\\\";\\n\\n /**\\n * @dev reserved on StakeModuleLib\\n */\\n\\n /**\\n * @custom:type uint, relational, pool[operator]\\n * @custom:definition number of active validators run by an operator for a pool\\n */\\n bytes32 internal constant activeValidators = \\\"activeValidators\\\";\\n\\n /**\\n * @custom:type uint, relational, pool[operator]\\n * @custom:definition max amount of validators for an operator to run, for a specific pool.\\n */\\n bytes32 internal constant allowance = \\\"allowance\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition special operator that has max allowance, if threshold is hit for the pool\\n */\\n bytes32 internal constant fallbackOperator = \\\"fallbackOperator\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition treshold calculated with given percentage value for fallback operator to be activated\\n */\\n bytes32 internal constant fallbackThreshold = \\\"fallbackThreshold\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition fee of the pool or operator, will be shadowed by priorFee if switching\\n */\\n bytes32 internal constant fee = \\\"fee\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition effective timestamp pointing to the latest delayed fee change\\n */\\n bytes32 internal constant feeSwitch = \\\"feeSwitch\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition the initiation timestamp of a \\\"user\\\" TYPE id\\n */\\n bytes32 internal constant initiated = \\\"initiated\\\";\\n\\n /**\\n * @custom:type address\\n * @custom:definition bound liquidity package of a staking pool\\n */\\n bytes32 internal constant liquidityPackage = \\\"liquidityPackage\\\";\\n\\n /**\\n * @custom:type address\\n * @custom:definition receiver address for yield seperation functionality\\n * * will receive minted gETH to given receiver instead of increasing pricePerShare\\n */\\n bytes32 internal constant yieldReceiver = \\\"yieldReceiver\\\";\\n\\n /**\\n * @custom:type address\\n * @custom:definition hot wallet for pool and operators, automatooor\\n */\\n bytes32 internal constant maintainer = \\\"maintainer\\\";\\n\\n /**\\n * @custom:type address array, direct call returns length\\n * @custom:definition contracts with more than one versions, ex: gETHMiddlewares of a pool\\n */\\n bytes32 internal constant middlewares = \\\"middlewares\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition effective timestamp pointing to the latest delayed validator period change\\n */\\n bytes32 internal constant periodSwitch = \\\"periodSwitch\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition fee that will be effective if fee is currently switching\\n */\\n bytes32 internal constant priorFee = \\\"priorFee\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition period that will be effective if validatorPeriod is currently switching\\n */\\n bytes32 internal constant priorPeriod = \\\"priorPeriod\\\";\\n\\n /**\\n * @custom:type uint, bool\\n * @custom:definition 1(true) if id is a private pool\\n */\\n bytes32 internal constant privatePool = \\\"privatePool\\\";\\n\\n /**\\n * @custom:type uint, relational, pool[operator]\\n * @custom:definition proposed validator count for pool-operator pair.\\n */\\n bytes32 internal constant proposedValidators = \\\"proposedValidators\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition timestamp of the date of the latest imprisonment for an operator\\n */\\n bytes32 internal constant release = \\\"release\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition 32 eth is secured, per proposed-but-not-yet-activated validator\\n */\\n bytes32 internal constant secured = \\\"secured\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition collateral waiting to be staked, in wei\\n */\\n bytes32 internal constant surplus = \\\"surplus\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition sum of all allowances for a pool\\n */\\n\\n bytes32 internal constant totalAllowance = \\\"totalAllowance\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition seconds, time that passes before the expected exit is reached for a validator\\n */\\n bytes32 internal constant validatorPeriod = \\\"validatorPeriod\\\";\\n\\n /**\\n * @custom:type bytes array, direct call returns length\\n * @custom:definition lists all (any state) validators' pubkeys for a pool, or an operator\\n */\\n bytes32 internal constant validators = \\\"validators\\\";\\n\\n /**\\n * @custom:type address\\n * @custom:definition custodian of validator funds for a pool\\n */\\n bytes32 internal constant withdrawalPackage = \\\"withdrawalPackage\\\";\\n\\n /**\\n * @custom:type bytes\\n * @custom:definition derived from withdrawalPackage address of the pool\\n */\\n bytes32 internal constant withdrawalCredential = \\\"withdrawalCredential\\\";\\n\\n /**\\n * @custom:type uint\\n * @custom:definition size of the internal wallet, which accrues fees etc. in wei\\n */\\n bytes32 internal constant wallet = \\\"wallet\\\";\\n\\n /**\\n * @custom:type address\\n * @custom:definition whitelist contract for the pool\\n */\\n bytes32 internal constant whitelist = \\\"whitelist\\\";\\n\\n /**\\n * @dev reserved on OracleExtensionLib\\n */\\n\\n /**\\n * @custom:type uint, relational, pool[operator]\\n * @custom:definition number of alienated validators run by an operator for a pool\\n */\\n bytes32 internal constant alienValidators = \\\"alienValidators\\\";\\n}\\n\",\"keccak256\":\"0x7444cee1d8a60065e2ef6f64693ee2456484565ef41c2300337c0b997e294726\",\"license\":\"BUSL-1.1\"},\"contracts/globals/validator_state.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n/**\\n * @notice VALIDATOR_STATE: keeping track of validators within The Staking Library.\\n */\\nlibrary VALIDATOR_STATE {\\n /// @notice STATE 0: *invalid*\\n uint8 internal constant NONE = 0;\\n\\n /// @notice STATE 1: validator is proposed, 1 ETH is sent from Operator to Deposit Contract.\\n uint8 internal constant PROPOSED = 1;\\n\\n /// @notice STATE 2: proposal was approved, operator used pooled funds, 1 ETH is released back to Operator.\\n uint8 internal constant ACTIVE = 2;\\n\\n /// @notice STATE 3: validator is called to be exited.\\n uint8 internal constant EXIT_REQUESTED = 3;\\n\\n /// @notice STATE 4: validator is fully exited.\\n uint8 internal constant EXITED = 4;\\n\\n /// @notice STATE 69: proposal was malicious(alien). Maybe faulty signatures or probably frontrunning (https://bit.ly/3Tkc6UC)\\n uint8 internal constant ALIENATED = 69;\\n}\\n\",\"keccak256\":\"0xbba746dcad490d11ebc3a69b334c7284a546902392b565162a45d5b8a53d291d\",\"license\":\"BUSL-1.1\"},\"contracts/helpers/BytesLib.sol\":{\"content\":\"// SPDX-License-Identifier: Unlicense\\n/*\\n * @title Solidity Bytes Arrays Utils\\n * @author Gon\\u00e7alo S\\u00e1 \\n *\\n * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.\\n * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.\\n */\\npragma solidity =0.8.20;\\n\\nlibrary BytesLib {\\n function concat(\\n bytes memory _preBytes,\\n bytes memory _postBytes\\n ) internal pure returns (bytes memory) {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(\\n 0x40,\\n and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n )\\n )\\n }\\n\\n return tempBytes;\\n }\\n\\n function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\\n assembly {\\n // Read the first 32 bytes of _preBytes storage, which is the length\\n // of the array. (We don't need to use the offset into the slot\\n // because arrays use the entire slot.)\\n let fslot := sload(_preBytes.slot)\\n // Arrays of 31 bytes or less have an even value in their slot,\\n // while longer arrays have an odd value. The actual length is\\n // the slot divided by two for odd values, and the lowest order\\n // byte divided by two for even values.\\n // If the slot is even, bitwise and the slot with 255 and divide by\\n // two to get the length. If the slot is odd, bitwise and the slot\\n // with -1 and divide by two.\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n let newlength := add(slength, mlength)\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n switch add(lt(slength, 32), lt(newlength, 32))\\n case 2 {\\n // Since the new array still fits in the slot, we just need to\\n // update the contents of the slot.\\n // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\\n sstore(\\n _preBytes.slot,\\n // all the modifications to the slot are inside this\\n // next block\\n add(\\n // we can just add to the slot contents because the\\n // bytes we want to change are the LSBs\\n fslot,\\n add(\\n mul(\\n div(\\n // load the bytes from memory\\n mload(add(_postBytes, 0x20)),\\n // zero all bytes to the right\\n exp(0x100, sub(32, mlength))\\n ),\\n // and now shift left the number of bytes to\\n // leave space for the length in the slot\\n exp(0x100, sub(32, newlength))\\n ),\\n // increase length by the double of the memory\\n // bytes length\\n mul(mlength, 2)\\n )\\n )\\n )\\n }\\n case 1 {\\n // The stored value fits in the slot, but the combined value\\n // will exceed it.\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // The contents of the _postBytes array start 32 bytes into\\n // the structure. Our first read should obtain the `submod`\\n // bytes that can fit into the unused space in the last word\\n // of the stored array. To get this, we read 32 bytes starting\\n // from `submod`, so the data we read overlaps with the array\\n // contents by `submod` bytes. Masking the lowest-order\\n // `submod` bytes allows us to add that value directly to the\\n // stored value.\\n\\n let submod := sub(32, slength)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(\\n sc,\\n add(\\n and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00),\\n and(mload(mc), mask)\\n )\\n )\\n\\n for {\\n mc := add(mc, 0x20)\\n sc := add(sc, 1)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n default {\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n // Start copying to the last used word of the stored array.\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // Copy over the first `submod` bytes of the new data as in\\n // case 1 above.\\n let slengthmod := mod(slength, 32)\\n let mlengthmod := mod(mlength, 32)\\n let submod := sub(32, slengthmod)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(sc, add(sload(sc), and(mload(mc), mask)))\\n\\n for {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n }\\n }\\n\\n function slice(\\n bytes memory _bytes,\\n uint256 _start,\\n uint256 _length\\n ) internal pure returns (bytes memory) {\\n require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n bytes memory tempBytes;\\n\\n assembly {\\n switch iszero(_length)\\n case 0 {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // The first word of the slice result is potentially a partial\\n // word read from the original array. To read it, we calculate\\n // the length of that partial word and start copying that many\\n // bytes into the array. The first word we copy will start with\\n // data we don't care about, but the last `lengthmod` bytes will\\n // land at the beginning of the contents of the new array. When\\n // we're done copying, we overwrite the full first word with\\n // the actual length of the slice.\\n let lengthmod := and(_length, 31)\\n\\n // The multiplication in the next line is necessary\\n // because when slicing multiples of 32 bytes (lengthmod == 0)\\n // the following copy loop was copying the origin's length\\n // and then ending prematurely not copying everything it should.\\n let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n let end := add(mc, _length)\\n\\n for {\\n // The multiplication in the next line has the same exact purpose\\n // as the one above.\\n let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n mstore(tempBytes, _length)\\n\\n //update free-memory pointer\\n //allocating the array padded to 32 bytes like the compiler does now\\n mstore(0x40, and(add(mc, 31), not(31)))\\n }\\n //if we want a zero-length slice let's just return a zero-length array\\n default {\\n tempBytes := mload(0x40)\\n //zero out the 32 bytes slice we are about to return\\n //we need to do it because Solidity does not garbage collect\\n mstore(tempBytes, 0)\\n\\n mstore(0x40, add(tempBytes, 0x20))\\n }\\n }\\n\\n return tempBytes;\\n }\\n\\n function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n require(_bytes.length >= _start + 1, \\\"toUint8_outOfBounds\\\");\\n uint8 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x1), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {\\n require(_bytes.length >= _start + 2, \\\"toUint16_outOfBounds\\\");\\n uint16 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x2), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {\\n require(_bytes.length >= _start + 4, \\\"toUint32_outOfBounds\\\");\\n uint32 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x4), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {\\n require(_bytes.length >= _start + 8, \\\"toUint64_outOfBounds\\\");\\n uint64 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x8), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {\\n require(_bytes.length >= _start + 12, \\\"toUint96_outOfBounds\\\");\\n uint96 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0xc), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {\\n require(_bytes.length >= _start + 16, \\\"toUint128_outOfBounds\\\");\\n uint128 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x10), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {\\n require(_bytes.length >= _start + 32, \\\"toUint256_outOfBounds\\\");\\n uint256 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {\\n require(_bytes.length >= _start + 32, \\\"toBytes32_outOfBounds\\\");\\n bytes32 tempBytes32;\\n\\n assembly {\\n tempBytes32 := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempBytes32;\\n }\\n\\n function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\\n bool success = true;\\n\\n assembly {\\n let length := mload(_preBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(length, mload(_postBytes))\\n case 1 {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n let mc := add(_preBytes, 0x20)\\n let end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n } eq(add(lt(mc, end), cb), 2) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // if any of these checks fails then arrays are not equal\\n if iszero(eq(mload(mc), mload(cc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function equalStorage(\\n bytes storage _preBytes,\\n bytes memory _postBytes\\n ) internal view returns (bool) {\\n bool success = true;\\n\\n assembly {\\n // we know _preBytes_offset is 0\\n let fslot := sload(_preBytes.slot)\\n // Decode the length of the stored array like in concatStorage().\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(slength, mlength)\\n case 1 {\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n if iszero(iszero(slength)) {\\n switch lt(slength, 32)\\n case 1 {\\n // blank the last byte which is the length\\n fslot := mul(div(fslot, 0x100), 0x100)\\n\\n if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\\n // unsuccess:\\n success := 0\\n }\\n }\\n default {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := keccak256(0x0, 0x20)\\n\\n let mc := add(_postBytes, 0x20)\\n let end := add(mc, mlength)\\n\\n // the next line is the loop condition:\\n // while(uint256(mc < end) + cb == 2)\\n for {\\n\\n } eq(add(lt(mc, end), cb), 2) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n if iszero(eq(sload(sc), mload(mc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n}\\n\",\"keccak256\":\"0x4ee3f6ef85baa41794fc1519522f7c135becd0e267980eadc68dd643e52b59c7\",\"license\":\"Unlicense\"},\"contracts/interfaces/IPortal.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IGeodeModule} from \\\"./modules/IGeodeModule.sol\\\";\\nimport {IStakeModule} from \\\"./modules/IStakeModule.sol\\\";\\n\\ninterface IPortal is IGeodeModule, IStakeModule {\\n function pausegETH() external;\\n\\n function unpausegETH() external;\\n\\n function pushUpgrade(uint256 packageType) external returns (uint256 id);\\n\\n function releasePrisoned(uint256 operatorId) external;\\n}\\n\",\"keccak256\":\"0x012a8ed050ba68838eeb7463b75f32ba8fdf50c9e54e44dd37d4e87ca16ba78c\",\"license\":\"MIT\"},\"contracts/interfaces/IgETH.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IERC1155PausableBurnableSupply} from \\\"./helpers/IERC1155PausableBurnableSupply.sol\\\";\\n\\ninterface IgETH is IERC1155PausableBurnableSupply {\\n function denominator() external view returns (uint256);\\n\\n function isMiddleware(address middleware, uint256 id) external view returns (bool);\\n\\n function setMiddleware(address middleware, uint256 id, bool isSet) external;\\n\\n function isAvoider(address account, uint256 id) external view returns (bool);\\n\\n function avoidMiddlewares(uint256 id, bool isAvoid) external;\\n\\n function pricePerShare(uint256 id) external view returns (uint256);\\n\\n function priceUpdateTimestamp(uint256 id) external view returns (uint256);\\n\\n function setPricePerShare(uint256 price, uint256 id) external;\\n\\n function transferUriSetterRole(address newUriSetter) external;\\n\\n function transferPauserRole(address newPauser) external;\\n\\n function transferMinterRole(address newMinter) external;\\n\\n function transferOracleRole(address newOracle) external;\\n\\n function transferMiddlewareManagerRole(address newMiddlewareManager) external;\\n}\\n\",\"keccak256\":\"0xa093b769e8ba42091d3db8a9e4ddc1be066f4aa92f61ee552983c22a0e9f29d8\",\"license\":\"MIT\"},\"contracts/interfaces/helpers/IDepositContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/** This interface is designed to be compatible with the Vyper version.\\n * @notice This is the Ethereum 2.0 deposit contract interface.\\n * For more information see the Phase 0 specification under https://github.com/ethereum/eth2.0-specs\\n */\\ninterface IDepositContract {\\n /**\\n * @notice Submit a Phase 0 DepositData object.\\n * @param pubkey A BLS12-381 public key.\\n * @param withdrawal_credentials Commitment to a public key for withdrawals.\\n * @param signature A BLS12-381 signature.\\n * @param deposit_data_root The SHA-256 hash of the SSZ-encoded DepositData object.\\n *Used as a protection against malformed input.\\n */\\n function deposit(\\n bytes calldata pubkey,\\n bytes calldata withdrawal_credentials,\\n bytes calldata signature,\\n bytes32 deposit_data_root\\n ) external payable;\\n}\\n\",\"keccak256\":\"0x2db8802f8f888c62b147508e142e15c59775ff75906d09122e810483919bff27\",\"license\":\"MIT\"},\"contracts/interfaces/helpers/IERC1155PausableBurnableSupply.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/// @dev IERC1155 inherits IERC165\\nimport {IERC1155} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Errors} from \\\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\\\";\\n\\ninterface IERC1155Burnable is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function burn(address account, uint256 id, uint256 value) external;\\n\\n function burnBatch(address account, uint256[] memory ids, uint256[] memory values) external;\\n}\\n\\ninterface IERC1155Supply is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function totalSupply(uint256 id) external view returns (uint256);\\n\\n function exists(uint256 id) external view returns (bool);\\n}\\n\\ninterface IERC1155PausableBurnableSupply is IERC1155Burnable, IERC1155Supply {\\n function setURI(string memory newuri) external;\\n\\n function pause() external;\\n\\n function unpause() external;\\n\\n function mint(address account, uint256 id, uint256 amount, bytes memory data) external;\\n\\n function mintBatch(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) external;\\n}\\n\",\"keccak256\":\"0x8b0a02fdbc8d54c815d68e122f6869348217b5efd853c8b833c59d2053998ef0\",\"license\":\"MIT\"},\"contracts/interfaces/modules/IDataStoreModule.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\ninterface IDataStoreModule {\\n function generateId(string calldata _name, uint256 _type) external pure returns (uint256 id);\\n\\n function getKey(uint256 _id, bytes32 _param) external pure returns (bytes32 key);\\n\\n function allIdsByType(uint256 _type, uint256 _index) external view returns (uint256);\\n\\n function allIdsByTypeLength(uint256 _type) external view returns (uint256);\\n\\n function readUint(uint256 id, bytes32 key) external view returns (uint256 data);\\n\\n function readAddress(uint256 id, bytes32 key) external view returns (address data);\\n\\n function readBytes(uint256 id, bytes32 key) external view returns (bytes memory data);\\n\\n function readUintArray(\\n uint256 id,\\n bytes32 key,\\n uint256 index\\n ) external view returns (uint256 data);\\n\\n function readBytesArray(\\n uint256 id,\\n bytes32 key,\\n uint256 index\\n ) external view returns (bytes memory data);\\n\\n function readAddressArray(\\n uint256 id,\\n bytes32 key,\\n uint256 index\\n ) external view returns (address data);\\n}\\n\",\"keccak256\":\"0x3ba6191b4a643bce171bb7dc9b39a55dd0c8c932934429902dec4eb7b6c3df9a\",\"license\":\"MIT\"},\"contracts/interfaces/modules/IGeodeModule.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IDataStoreModule} from \\\"./IDataStoreModule.sol\\\";\\nimport {Proposal} from \\\"../../modules/GeodeModule/structs/utils.sol\\\";\\n\\ninterface IGeodeModule is IDataStoreModule {\\n function isolationMode() external view returns (bool);\\n\\n function GeodeParams()\\n external\\n view\\n returns (\\n address governance,\\n address senate,\\n address approvedUpgrade,\\n uint256 senateExpiry,\\n uint256 packageType\\n );\\n\\n function getGovernance() external view returns (address);\\n\\n function getContractVersion() external view returns (uint256);\\n\\n function getProposal(uint256 id) external view returns (Proposal memory proposal);\\n\\n function propose(\\n address _CONTROLLER,\\n uint256 _TYPE,\\n bytes calldata _NAME,\\n uint256 duration\\n ) external returns (uint256 id);\\n\\n function rescueSenate(address _newSenate) external;\\n\\n function approveProposal(\\n uint256 id\\n ) external returns (address _controller, uint256 _type, bytes memory _name);\\n\\n function changeSenate(address _newSenate) external;\\n\\n function changeIdCONTROLLER(uint256 id, address newCONTROLLER) external;\\n}\\n\",\"keccak256\":\"0x2eb0e5472c00c7d91443f0544ce349129266665dd59f1e4b0598173df1a9d1c5\",\"license\":\"MIT\"},\"contracts/interfaces/modules/IStakeModule.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IDataStoreModule} from \\\"./IDataStoreModule.sol\\\";\\nimport {Validator} from \\\"../../modules/StakeModule/structs/utils.sol\\\";\\n\\ninterface IStakeModule is IDataStoreModule {\\n function pause() external;\\n\\n function unpause() external;\\n\\n function setInfrastructureFee(uint256 _type, uint256 fee) external;\\n\\n function setBeaconDelays(uint256 entry, uint256 exit) external;\\n\\n function setInitiationDeposit(uint256 newInitiationDeposit) external;\\n\\n function StakeParams()\\n external\\n view\\n returns (\\n address gETH,\\n address oraclePosition,\\n uint256 validatorsIndex,\\n uint256 verificationIndex,\\n uint256 monopolyThreshold,\\n uint256 beaconDelayEntry,\\n uint256 beaconDelayExit,\\n uint256 initiationDeposit,\\n uint256 oracleUpdateTimestamp,\\n uint256 dailyPriceIncreaseLimit,\\n uint256 dailyPriceDecreaseLimit\\n );\\n\\n function getValidator(bytes calldata pubkey) external view returns (Validator memory);\\n\\n function getPackageVersion(uint256 _type) external view returns (uint256);\\n\\n function getPriceMerkleRoot() external view returns (bytes32);\\n\\n function getBalancesMerkleRoot() external view returns (bytes32);\\n\\n function isMiddleware(uint256 _type, uint256 _version) external view returns (bool);\\n\\n function getInfrastructureFee(uint256 _type) external view returns (uint256);\\n\\n function initiateOperator(\\n uint256 id,\\n uint256 fee,\\n uint256 validatorPeriod,\\n address maintainer\\n ) external payable;\\n\\n function deployLiquidityPackage(uint256 poolId) external;\\n\\n function initiatePool(\\n uint256 fee,\\n uint256 middlewareVersion,\\n address maintainer,\\n bytes calldata NAME,\\n bytes calldata middleware_data,\\n bool[3] calldata config\\n ) external payable returns (uint256 poolId);\\n\\n function setPoolVisibility(uint256 poolId, bool makePrivate) external;\\n\\n function setWhitelist(uint256 poolId, address whitelist) external;\\n\\n function setYieldReceiver(uint256 poolId, address yieldReceiver) external;\\n\\n function changeMaintainer(uint256 id, address newMaintainer) external;\\n\\n function getMaintenanceFee(uint256 id) external view returns (uint256);\\n\\n function switchMaintenanceFee(uint256 id, uint256 newFee) external;\\n\\n function increaseWalletBalance(uint256 id) external payable returns (bool);\\n\\n function decreaseWalletBalance(uint256 id, uint256 value) external returns (bool);\\n\\n function isPrisoned(uint256 operatorId) external view returns (bool);\\n\\n function blameExit(\\n bytes calldata pk,\\n uint256 beaconBalance,\\n uint256 withdrawnBalance,\\n bytes32[] calldata balanceProof\\n ) external;\\n\\n function blameProposal(bytes calldata pk) external;\\n\\n function getValidatorPeriod(uint256 id) external view returns (uint256);\\n\\n function switchValidatorPeriod(uint256 operatorId, uint256 newPeriod) external;\\n\\n function setFallbackOperator(\\n uint256 poolId,\\n uint256 operatorId,\\n uint256 fallbackThreshold\\n ) external;\\n\\n function operatorAllowance(uint256 poolId, uint256 operatorId) external view returns (uint256);\\n\\n function delegate(\\n uint256 poolId,\\n uint256[] calldata operatorIds,\\n uint256[] calldata allowances\\n ) external;\\n\\n function isWhitelisted(uint256 poolId, address staker) external view returns (bool);\\n\\n function isPrivatePool(uint256 poolId) external view returns (bool);\\n\\n function isPriceValid(uint256 poolId) external view returns (bool);\\n\\n function isMintingAllowed(uint256 poolId) external view returns (bool);\\n\\n function deposit(\\n uint256 poolId,\\n uint256 price,\\n bytes32[] calldata priceProof,\\n uint256 mingETH,\\n uint256 deadline,\\n address receiver\\n ) external payable returns (uint256 boughtgETH, uint256 mintedgETH);\\n\\n function canStake(bytes calldata pubkey) external view returns (bool);\\n\\n function proposeStake(\\n uint256 poolId,\\n uint256 operatorId,\\n bytes[] calldata pubkeys,\\n bytes[] calldata signatures1,\\n bytes[] calldata signatures31\\n ) external;\\n\\n function stake(uint256 operatorId, bytes[] calldata pubkeys) external;\\n\\n function requestExit(uint256 poolId, bytes memory pk) external returns (bool);\\n\\n function finalizeExit(uint256 poolId, bytes memory pk) external;\\n\\n function updateVerificationIndex(\\n uint256 validatorVerificationIndex,\\n bytes[] calldata alienatedPubkeys\\n ) external;\\n\\n function regulateOperators(uint256[] calldata feeThefts, bytes[] calldata proofs) external;\\n\\n function reportBeacon(\\n bytes32 priceMerkleRoot,\\n bytes32 balanceMerkleRoot,\\n uint256 allValidatorsCount\\n ) external;\\n\\n function priceSync(uint256 poolId, uint256 price, bytes32[] calldata priceProof) external;\\n\\n function priceSyncBatch(\\n uint256[] calldata poolIds,\\n uint256[] calldata prices,\\n bytes32[][] calldata priceProofs\\n ) external;\\n}\\n\",\"keccak256\":\"0x102393bdd245b4745032b3d21ba59ba7ee45dfc9fc2b152ee5cd014ab9403370\",\"license\":\"MIT\"},\"contracts/interfaces/modules/IWithdrawalModule.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\ninterface IWithdrawalModule {\\n function pause() external;\\n\\n function unpause() external;\\n\\n function setExitThreshold(uint256 newThreshold) external;\\n\\n function claimInfrastructureFees(address receiver) external returns (bool success);\\n\\n function WithdrawalParams()\\n external\\n view\\n returns (\\n address gETH,\\n address portal,\\n uint256 poolId,\\n uint256 exitThreshold,\\n uint256 gatheredInfrastructureFees\\n );\\n\\n function QueueParams()\\n external\\n view\\n returns (\\n uint256 requested,\\n uint256 realized,\\n uint256 realizedEtherBalance,\\n uint256 realizedPrice,\\n uint256 fulfilled,\\n uint256 fulfilledEtherBalance,\\n uint256 commonPoll\\n );\\n\\n function getRequest(\\n uint256 index\\n )\\n external\\n view\\n returns (\\n address owner,\\n uint256 trigger,\\n uint256 size,\\n uint256 fulfilled,\\n uint256 claimableEther\\n );\\n\\n function getValidatorData(\\n bytes calldata pubkey\\n ) external view returns (uint256 beaconBalance, uint256 withdrawnBalance, uint256 poll);\\n\\n function canFinalizeExit(bytes memory pubkey) external view returns (bool);\\n\\n function validatorThreshold(bytes memory pubkey) external view returns (uint256 threshold);\\n\\n function enqueue(\\n uint256 size,\\n bytes calldata pubkey,\\n address owner\\n ) external returns (uint256 index);\\n\\n function enqueueBatch(\\n uint256[] calldata sizes,\\n bytes[] calldata pubkeys,\\n address owner\\n ) external returns (uint256[] memory indexes);\\n\\n function transferRequest(uint256 index, address newOwner) external;\\n\\n function fulfillable(uint256 index) external view returns (uint256);\\n\\n function fulfill(uint256 index) external;\\n\\n function fulfillBatch(uint256[] calldata indexes) external;\\n\\n function dequeue(uint256 index, address receiver) external;\\n\\n function dequeueBatch(uint256[] calldata indexes, address receiver) external;\\n\\n function processValidators(\\n bytes[] calldata pubkeys,\\n uint256[] calldata beaconBalances,\\n uint256[] calldata withdrawnBalances,\\n bytes32[][] calldata balanceProofs,\\n uint256 price,\\n bytes32[] calldata priceProof\\n ) external;\\n\\n function multicall(bytes[] calldata data) external returns (bytes[] memory results);\\n}\\n\",\"keccak256\":\"0xa2a89742f100d1d5b43bb154834485ab23ec1c5cb54db6129b2ffffe896f5283\",\"license\":\"MIT\"},\"contracts/interfaces/packages/IGeodePackage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IGeodeModule} from \\\"../modules/IGeodeModule.sol\\\";\\nimport {IPortal} from \\\"../IPortal.sol\\\";\\n\\ninterface IGeodePackage is IGeodeModule {\\n function initialize(\\n uint256 poolId,\\n address owner,\\n bytes calldata versionName,\\n bytes memory data\\n ) external;\\n\\n function getPoolId() external view returns (uint256);\\n\\n function getProposedVersion() external view returns (uint256);\\n\\n function pullUpgrade() external;\\n}\\n\",\"keccak256\":\"0x9c854fab873502a768e5903e7f66b6697313f77bea4d5ca200aad8d0c3190ed9\",\"license\":\"MIT\"},\"contracts/interfaces/packages/IWithdrawalPackage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IWithdrawalModule} from \\\"../modules/IWithdrawalModule.sol\\\";\\nimport {IGeodePackage} from \\\"./IGeodePackage.sol\\\";\\n\\ninterface IWithdrawalPackage is IGeodePackage, IWithdrawalModule {}\\n\",\"keccak256\":\"0x64212474a09d3608d8348498fd94fb246bd4d31bc32edc732064e1f04946775d\",\"license\":\"MIT\"},\"contracts/modules/DataStoreModule/DataStoreModule.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n// external - contracts\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\n// internal - interfaces\\nimport {IDataStoreModule} from \\\"../../interfaces/modules/IDataStoreModule.sol\\\";\\n// internal - structs\\nimport {DataStoreModuleStorage} from \\\"./structs/storage.sol\\\";\\n// internal - libraries\\nimport {DataStoreModuleLib as DSML} from \\\"./libs/DataStoreModuleLib.sol\\\";\\n\\n/**\\n * @title DSM: DataStore Module\\n *\\n * @notice A storage management tool designed to create a safe and scalable storage layout\\n * for upgradable contracts with various types of data classes (users, packages, definitions).\\n *\\n * @dev review: this module delegates its functionality to DSML (DataStoreModuleLib).\\n * DSM or DSML has NO access control.\\n *\\n * @dev There are no additional functionalities implemented apart from the library.\\n *\\n * @dev NO function needs to be overriden when inherited.\\n *\\n * @dev __DataStoreModule_init (or _unchained) call is not necessary when inherited.\\n *\\n * @dev No storage-altering external/public functions are exposed here, only view/pure external functions.\\n *\\n * @author Ice Bear & Crash Bandicoot\\n */\\nabstract contract DataStoreModule is IDataStoreModule, Initializable {\\n using DSML for DataStoreModuleStorage;\\n\\n /**\\n * @custom:section ** VARIABLES **\\n *\\n * @dev Do not add any other variables here. Modules do not have a gap.\\n * Library's main struct has a gap, providing up to 16 storage slots for this module.\\n */\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"geode.storage.DataStoreModule\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant DataStoreModuleStorageLocation =\\n 0xa3ee0f890fa2a50cc11476f86783721ec49c3aba88b83a957fe08235f6485c00;\\n\\n function _getDataStoreModuleStorage() internal pure returns (DataStoreModuleStorage storage $) {\\n assembly {\\n $.slot := DataStoreModuleStorageLocation\\n }\\n }\\n\\n /**\\n * @custom:section ** INITIALIZING **\\n */\\n\\n function __DataStoreModule_init() internal onlyInitializing {}\\n\\n function __DataStoreModule_init_unchained() internal onlyInitializing {}\\n\\n /**\\n * @custom:section ** HELPER FUNCTIONS **\\n *\\n * @custom:visibility -> pure-external\\n */\\n\\n /**\\n * @notice useful function for string inputs - returns same with the DSML.generateId\\n * @dev id is generated by keccak(name, type)\\n */\\n function generateId(\\n string calldata _name,\\n uint256 _type\\n ) external pure virtual override returns (uint256 id) {\\n id = uint256(keccak256(abi.encode(_name, _type)));\\n }\\n\\n /**\\n * @notice useful view function for string inputs - returns same with the DSML.generateId\\n */\\n function getKey(\\n uint256 _id,\\n bytes32 _param\\n ) external pure virtual override returns (bytes32 key) {\\n return DSML.getKey(_id, _param);\\n }\\n\\n /**\\n * @custom:section ** DATA GETTER FUNCTIONS **\\n *\\n * @custom:visibility -> view-external\\n */\\n\\n /**\\n * @dev useful for outside reach, shouldn't be used within contracts as a referance\\n * @return allIdsByType is an array of IDs of the given TYPE from Datastore,\\n * returns a specific index\\n */\\n function allIdsByType(\\n uint256 _type,\\n uint256 _index\\n ) external view virtual override returns (uint256) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n return $.allIdsByType[_type][_index];\\n }\\n\\n function allIdsByTypeLength(uint256 _type) external view virtual override returns (uint256) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n return $.allIdsByType[_type].length;\\n }\\n\\n function readUint(uint256 id, bytes32 key) external view virtual override returns (uint256 data) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n data = $.readUint(id, key);\\n }\\n\\n function readAddress(\\n uint256 id,\\n bytes32 key\\n ) external view virtual override returns (address data) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n data = $.readAddress(id, key);\\n }\\n\\n function readBytes(\\n uint256 id,\\n bytes32 key\\n ) external view virtual override returns (bytes memory data) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n data = $.readBytes(id, key);\\n }\\n\\n /**\\n * @custom:section ** ARRAY GETTER FUNCTIONS **\\n *\\n * @custom:visibility -> view-external\\n */\\n\\n function readUintArray(\\n uint256 id,\\n bytes32 key,\\n uint256 index\\n ) external view virtual override returns (uint256 data) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n data = $.readUintArray(id, key, index);\\n }\\n\\n function readBytesArray(\\n uint256 id,\\n bytes32 key,\\n uint256 index\\n ) external view virtual override returns (bytes memory data) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n data = $.readBytesArray(id, key, index);\\n }\\n\\n function readAddressArray(\\n uint256 id,\\n bytes32 key,\\n uint256 index\\n ) external view virtual override returns (address data) {\\n DataStoreModuleStorage storage $ = _getDataStoreModuleStorage();\\n data = $.readAddressArray(id, key, index);\\n }\\n}\\n\",\"keccak256\":\"0x25eb0dd1c0e7484c36320629bac60f346ab3cd138ace7940b296a87a25c10b39\",\"license\":\"BUSL-1.1\"},\"contracts/modules/DataStoreModule/libs/DataStoreModuleLib.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity =0.8.20;\\n\\n// external - interfaces\\n// external - libraries\\n// external - contracts\\n// internal - globals\\n// internal - interfaces\\nimport {DataStoreModuleStorage} from \\\"../structs/storage.sol\\\";\\n\\n// internal - structs\\n// internal - libraries\\n\\n/**\\n * @title DSML: DataStore Module Library\\n *\\n * @notice A Storage Management Library created for the contracts and modules that inherits DataStoreModule (DSM).\\n * Enables Dynamic Structs with unlimited key space.\\n * Provides an Isolated Storage Layout with IDs and KEYs.\\n * Focusing on upgradable contracts with various data types to create a\\n * * sustainable development environment.\\n * In summary, extra gas cost that would be saved with Storage packing are\\n * * ignored to create dynamic structs.\\n *\\n * @dev Distinct id and key pairs SHOULD return different storage slots. No collisions!\\n * @dev IDs are the representation of an entity with any given key as properties.\\n * @dev review: Reserved TYPEs are defined within globals/id_type.sol\\n * @dev review: For a safer development process, NEVER use the DataStoreModuleStorage with strings. Refer to globals/reserved_key_space.sol\\n *\\n * @dev While it is a good practice for keeping a record;\\n * * TYPE for ID is not mandatory, an ID might not have an explicit type.\\n * * e.g., When a relational data is added with getKey, like allowance, it has a unique ID but no TYPE.\\n * * Thus there are no checks for types or keys.\\n *\\n * @dev readUint(id, arrayName) returns the lenght of array.\\n *\\n * @dev Contracts relying on this library must use DataStoreModuleLib.DataStoreModuleStorage\\n * @dev This is an internal library, requires NO deployment.\\n *\\n * @author Ice Bear & Crash Bandicoot\\n */\\nlibrary DataStoreModuleLib {\\n /**\\n * @custom:section ** HELPERS **\\n *\\n * @custom:visibility -> pure-internal\\n */\\n\\n /**\\n * @notice generalized method of generating an ID\\n *\\n * @dev Some TYPEs may require permissionless creation, allowing anyone to claim any ID;\\n * meaning malicious actors can claim names to mislead people. To prevent this\\n * TYPEs will be considered during ID generation.\\n */\\n function generateId(bytes memory _name, uint256 _type) internal pure returns (uint256 id) {\\n id = uint256(keccak256(abi.encode(_name, _type)));\\n }\\n\\n /**\\n * @notice hash of given ID and a KEY defines the key for the DataStoreModuleStorage\\n * @return key bytes32, hash.\\n **/\\n function getKey(uint256 id, bytes32 param) internal pure returns (bytes32 key) {\\n key = keccak256(abi.encode(id, param));\\n }\\n\\n /**\\n * @custom:section ** DATA GETTERS **\\n *\\n * @custom:visibility -> view-internal\\n */\\n\\n function readUint(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key\\n ) internal view returns (uint256 data) {\\n data = self.uintData[getKey(_id, _key)];\\n }\\n\\n function readBytes(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key\\n ) internal view returns (bytes memory data) {\\n data = self.bytesData[getKey(_id, _key)];\\n }\\n\\n function readAddress(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key\\n ) internal view returns (address data) {\\n data = self.addressData[getKey(_id, _key)];\\n }\\n\\n /**\\n * @custom:section ** ARRAY GETTERS **\\n *\\n * @custom:visibility -> view-internal\\n */\\n\\n function readUintArray(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256 _index\\n ) internal view returns (uint256 data) {\\n data = self.uintData[getKey(_index, getKey(_id, _key))];\\n }\\n\\n function readBytesArray(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256 _index\\n ) internal view returns (bytes memory data) {\\n data = self.bytesData[getKey(_index, getKey(_id, _key))];\\n }\\n\\n function readAddressArray(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256 _index\\n ) internal view returns (address data) {\\n data = self.addressData[getKey(_index, getKey(_id, _key))];\\n }\\n\\n /**\\n * @custom:section ** STATE MODIFYING FUNCTIONS **\\n *\\n * @custom:visibility -> internal\\n */\\n\\n /**\\n * @custom:subsection ** DATA SETTERS **\\n */\\n\\n function writeUint(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256 _data\\n ) internal {\\n self.uintData[getKey(_id, _key)] = _data;\\n }\\n\\n function addUint(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256 _addend\\n ) internal {\\n self.uintData[getKey(_id, _key)] += _addend;\\n }\\n\\n function subUint(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256 _minuend\\n ) internal {\\n self.uintData[getKey(_id, _key)] -= _minuend;\\n }\\n\\n function writeBytes(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n bytes memory _data\\n ) internal {\\n self.bytesData[getKey(_id, _key)] = _data;\\n }\\n\\n function writeAddress(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n address _data\\n ) internal {\\n self.addressData[getKey(_id, _key)] = _data;\\n }\\n\\n /**\\n * @custom:subsection ** ARRAY SETTERS **\\n */\\n\\n function appendUintArray(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256 _data\\n ) internal {\\n bytes32 arrayKey = getKey(_id, _key);\\n self.uintData[getKey(self.uintData[arrayKey]++, arrayKey)] = _data;\\n }\\n\\n function appendBytesArray(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n bytes memory _data\\n ) internal {\\n bytes32 arrayKey = getKey(_id, _key);\\n self.bytesData[getKey(self.uintData[arrayKey]++, arrayKey)] = _data;\\n }\\n\\n function appendAddressArray(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n address _data\\n ) internal {\\n bytes32 arrayKey = getKey(_id, _key);\\n self.addressData[getKey(self.uintData[arrayKey]++, arrayKey)] = _data;\\n }\\n\\n /**\\n * @custom:subsection ** BATCH ARRAY SETTERS **\\n */\\n\\n function appendUintArrayBatch(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n uint256[] memory _data\\n ) internal {\\n bytes32 arrayKey = getKey(_id, _key);\\n uint256 arrayLen = self.uintData[arrayKey];\\n\\n uint256 _dataLen = _data.length;\\n for (uint256 i; i < _dataLen; ) {\\n self.uintData[getKey(arrayLen++, arrayKey)] = _data[i];\\n unchecked {\\n i += 1;\\n }\\n }\\n\\n self.uintData[arrayKey] = arrayLen;\\n }\\n\\n function appendBytesArrayBatch(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n bytes[] memory _data\\n ) internal {\\n bytes32 arrayKey = getKey(_id, _key);\\n uint256 arrayLen = self.uintData[arrayKey];\\n\\n uint256 _dataLen = _data.length;\\n for (uint256 i; i < _dataLen; ) {\\n self.bytesData[getKey(arrayLen++, arrayKey)] = _data[i];\\n unchecked {\\n i += 1;\\n }\\n }\\n\\n self.uintData[arrayKey] = arrayLen;\\n }\\n\\n function appendAddressArrayBatch(\\n DataStoreModuleStorage storage self,\\n uint256 _id,\\n bytes32 _key,\\n address[] memory _data\\n ) internal {\\n bytes32 arrayKey = getKey(_id, _key);\\n uint256 arrayLen = self.uintData[arrayKey];\\n\\n uint256 _dataLen = _data.length;\\n for (uint256 i; i < _dataLen; ) {\\n self.addressData[getKey(arrayLen++, arrayKey)] = _data[i];\\n unchecked {\\n i += 1;\\n }\\n }\\n\\n self.uintData[arrayKey] = arrayLen;\\n }\\n}\\n\",\"keccak256\":\"0x51807687607c0b53afa9408b86d3f6523c5869802700624299fddac68fde381c\",\"license\":\"BUSL-1.1\"},\"contracts/modules/DataStoreModule/structs/storage.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n/**\\n * @notice Storage Struct for reading/writing operations for given (id, key) pairs.\\n *\\n * @param allIdsByType type => id[], optional categorization for IDs, can be directly accessed.\\n * @param uintData keccak(id, key) => returns uint256\\n * @param bytesData keccak(id, key) => returns bytes\\n * @param addressData keccak(id, key) => returns address\\n *\\n * @dev any other storage type can be expressed as uint or bytes. E.g., bools are 0/1 as uints.\\n *\\n * @dev normally we would put custom:storage-location erc7201:geode.storage.DataStoreModule\\n * but compiler throws an error... So np for now, just effects dev ex.\\n */\\nstruct DataStoreModuleStorage {\\n mapping(uint256 => uint256[]) allIdsByType;\\n mapping(bytes32 => uint256) uintData;\\n mapping(bytes32 => bytes) bytesData;\\n mapping(bytes32 => address) addressData;\\n}\\n\",\"keccak256\":\"0x75890780f8cc5d9d0b6c84b9647b098d6c1d75083774f77e945fd307fcc10b86\",\"license\":\"BUSL-1.1\"},\"contracts/modules/GeodeModule/GeodeModule.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n// external - library\\nimport {ERC1967Utils} from \\\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\\\";\\n// external - contracts\\nimport {UUPSUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\n// internal - globals\\nimport {ID_TYPE} from \\\"../../globals/id_type.sol\\\";\\n// internal - interfaces\\nimport {IGeodeModule} from \\\"../../interfaces/modules/IGeodeModule.sol\\\";\\n// internal - structs\\nimport {DataStoreModuleStorage} from \\\"../DataStoreModule/structs/storage.sol\\\";\\nimport {GeodeModuleStorage} from \\\"./structs/storage.sol\\\";\\nimport {Proposal} from \\\"./structs/utils.sol\\\";\\n// internal - libraries\\nimport {GeodeModuleLib as GML} from \\\"./libs/GeodeModuleLib.sol\\\";\\nimport {DataStoreModuleLib as DSML} from \\\"../DataStoreModule/libs/DataStoreModuleLib.sol\\\";\\n// internal - contracts\\nimport {DataStoreModule} from \\\"../DataStoreModule/DataStoreModule.sol\\\";\\n\\n/**\\n * @title GM: Geode Module\\n *\\n * @notice Base logic for Upgradable Packages:\\n * * Dual Governance with Senate+Governance: Governance proposes, Senate approves.\\n * * Limited Upgradability built on top of UUPS via Dual Governance.\\n *\\n * @dev review: this module delegates its functionality to GML (GeodeModuleLib):\\n * GML has onlyGovernance, onlySenate, onlyController modifiers for access control.\\n *\\n * @dev There is 1 additional functionality implemented apart from the library:\\n * Mutating UUPS pattern to fit Limited Upgradability:\\n * 1. New implementation contract is proposed with its own package type within the limits, refer to globals/id_type.sol.\\n * 2. Proposal is approved by the contract owner, Senate.\\n * 3. approveProposal calls _handleUpgrade which mimics UUPS.upgradeTo:\\n * 3.1. Checks the implementation address with _authorizeUpgrade, also preventing any UUPS upgrades.\\n * 3.2. Upgrades the contract with no function to call afterwards.\\n * 3.3. Sets contract version. Note that it does not increase linearly like one might expect.\\n *\\n * @dev 1 function needs to be overriden when inherited: isolationMode. (also refer to approveProposal)\\n *\\n * @dev __GeodeModule_init (or _unchained) call is NECESSARY when inherited.\\n * However, deployer MUST call initializer after upgradeTo call,\\n * should not call initializer on upgradeToAndCall or new ERC1967Proxy calls.\\n *\\n * @dev This module inherits DataStoreModule.\\n *\\n * @author Ice Bear & Crash Bandicoot\\n */\\nabstract contract GeodeModule is IGeodeModule, UUPSUpgradeable, DataStoreModule {\\n using GML for GeodeModuleStorage;\\n\\n /**\\n * @custom:section ** VARIABLES **\\n *\\n * @dev Do not add any other variables here. Modules do not have a gap.\\n * Library's main struct has a gap, providing up to 16 storage slots for this module.\\n */\\n\\n // keccak256(abi.encode(uint256(keccak256(\\\"geode.storage.GeodeModuleStorage\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant GeodeModuleStorageLocation =\\n 0x121584cf2b7b1dee51ceaabc76cdefc72f829ce42dd8cc5282d8e9f009b04200;\\n\\n function _getGeodeModuleStorage() internal pure returns (GeodeModuleStorage storage $) {\\n assembly {\\n $.slot := GeodeModuleStorageLocation\\n }\\n }\\n\\n /**\\n * @custom:section ** EVENTS **\\n */\\n event ContractVersionSet(uint256 version);\\n\\n event ControllerChanged(uint256 indexed ID, address CONTROLLER);\\n event Proposed(uint256 indexed TYPE, uint256 ID, address CONTROLLER, uint256 deadline);\\n event Approved(uint256 ID);\\n event NewSenate(address senate, uint256 expiry);\\n\\n /**\\n * @custom:section ** ABSTRACT FUNCTIONS **\\n */\\n function isolationMode() external view virtual override returns (bool);\\n\\n /**\\n * @custom:section ** INITIALIZING **\\n */\\n\\n function __GeodeModule_init(\\n address governance,\\n address senate,\\n uint256 senateExpiry,\\n uint256 packageType,\\n bytes calldata initVersionName\\n ) internal onlyInitializing {\\n __UUPSUpgradeable_init();\\n __DataStoreModule_init();\\n __GeodeModule_init_unchained(governance, senate, senateExpiry, packageType, initVersionName);\\n }\\n\\n /**\\n * @dev This function uses _getImplementation(), clearly deployer should not call initializer on\\n * upgradeToAndCall or new ERC1967Proxy calls. _getImplementation() returns 0 then.\\n * @dev GOVERNANCE and SENATE set to msg.sender at beginning, cannot propose+approve otherwise.\\n * @dev native approveProposal(public) is not used here. Because it has an _handleUpgrade,\\n * however initialization does not require UUPS.upgradeTo.\\n */\\n function __GeodeModule_init_unchained(\\n address governance,\\n address senate,\\n uint256 senateExpiry,\\n uint256 packageType,\\n bytes calldata initVersionName\\n ) internal onlyInitializing {\\n require(governance != address(0), \\\"GM:governance cannot be zero\\\");\\n require(senate != address(0), \\\"GM:senate cannot be zero\\\");\\n require(senateExpiry > block.timestamp, \\\"GM:low senateExpiry\\\");\\n require(packageType != 0, \\\"GM:packageType cannot be zero\\\");\\n require(initVersionName.length != 0, \\\"GM:initVersionName cannot be empty\\\");\\n\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n $.GOVERNANCE = msg.sender;\\n $.SENATE = msg.sender;\\n\\n $.SENATE_EXPIRY = senateExpiry;\\n $.PACKAGE_TYPE = packageType;\\n\\n DataStoreModuleStorage storage DSMStorage = _getDataStoreModuleStorage();\\n\\n uint256 initVersion = $.propose(\\n DSMStorage,\\n ERC1967Utils.getImplementation(),\\n packageType,\\n initVersionName,\\n 1 days\\n );\\n\\n $.approveProposal(DSMStorage, initVersion);\\n\\n _setContractVersion(DSML.generateId(initVersionName, $.PACKAGE_TYPE));\\n\\n $.GOVERNANCE = governance;\\n $.SENATE = senate;\\n }\\n\\n /**\\n * @custom:section ** LIMITED UUPS VERSION CONTROL **\\n *\\n * @custom:visibility -> internal\\n */\\n\\n /**\\n * @dev required by the OZ UUPS module, improved by the Geode Module.\\n */\\n function _authorizeUpgrade(address proposed_implementation) internal virtual override {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n require(\\n $.isUpgradeAllowed(proposed_implementation, ERC1967Utils.getImplementation()),\\n \\\"GM:not allowed to upgrade\\\"\\n );\\n }\\n\\n function _setContractVersion(uint256 id) internal virtual {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n $.CONTRACT_VERSION = id;\\n emit ContractVersionSet(id);\\n }\\n\\n /**\\n * @dev Would use the public upgradeTo() call, which does _authorizeUpgrade and _upgradeToAndCallUUPS,\\n * but it is external, OZ have not made it public yet.\\n */\\n function _handleUpgrade(address proposed_implementation, uint256 id) internal virtual {\\n UUPSUpgradeable.upgradeToAndCall(proposed_implementation, \\\"\\\");\\n _setContractVersion(id);\\n }\\n\\n /**\\n * @custom:section ** GETTER FUNCTIONS **\\n *\\n * @custom:visibility -> view-external\\n */\\n\\n function GeodeParams()\\n external\\n view\\n virtual\\n override\\n returns (\\n address governance,\\n address senate,\\n address approvedUpgrade,\\n uint256 senateExpiry,\\n uint256 packageType\\n )\\n {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n\\n governance = $.GOVERNANCE;\\n senate = $.SENATE;\\n approvedUpgrade = $.APPROVED_UPGRADE;\\n senateExpiry = $.SENATE_EXPIRY;\\n packageType = $.PACKAGE_TYPE;\\n }\\n\\n function getGovernance() external view virtual override returns (address) {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n return $.GOVERNANCE;\\n }\\n\\n function getContractVersion() public view virtual override returns (uint256) {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n return $.CONTRACT_VERSION;\\n }\\n\\n function getProposal(\\n uint256 id\\n ) external view virtual override returns (Proposal memory proposal) {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n proposal = $.getProposal(id);\\n }\\n\\n /**\\n * @custom:section ** SETTER FUNCTIONS **\\n *\\n * @custom:visibility -> public/external\\n */\\n\\n /**\\n * @custom:subsection ** ONLY GOVERNANCE **\\n *\\n */\\n\\n function propose(\\n address _CONTROLLER,\\n uint256 _TYPE,\\n bytes calldata _NAME,\\n uint256 duration\\n ) public virtual override returns (uint256 id) {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n id = $.propose(_getDataStoreModuleStorage(), _CONTROLLER, _TYPE, _NAME, duration);\\n }\\n\\n function rescueSenate(address _newSenate) external virtual override {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n $.rescueSenate(_newSenate);\\n }\\n\\n /**\\n * @custom:subsection ** ONLY SENATE **\\n */\\n\\n /**\\n * @dev handles PACKAGE_TYPE proposals by upgrading the contract immediately.\\n * @dev onlySenate is checked inside GML.approveProposal\\n */\\n function approveProposal(\\n uint256 id\\n ) public virtual override returns (address _controller, uint256 _type, bytes memory _name) {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n (_controller, _type, _name) = $.approveProposal(_getDataStoreModuleStorage(), id);\\n\\n if (_type == $.PACKAGE_TYPE) {\\n _handleUpgrade(_controller, id);\\n }\\n }\\n\\n function changeSenate(address _newSenate) external virtual override {\\n GeodeModuleStorage storage $ = _getGeodeModuleStorage();\\n $.changeSenate(_newSenate);\\n }\\n\\n /**\\n * @custom:subsection ** ONLY CONTROLLER **\\n */\\n\\n function changeIdCONTROLLER(uint256 id, address newCONTROLLER) external virtual override {\\n GML.changeIdCONTROLLER(_getDataStoreModuleStorage(), id, newCONTROLLER);\\n }\\n}\\n\",\"keccak256\":\"0x3bf367a4430addb6eac18d4dd1f58add98e4b5d72a43d51eb585dc59f2f3b43e\",\"license\":\"BUSL-1.1\"},\"contracts/modules/GeodeModule/libs/GeodeModuleLib.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n// internal - globals\\nimport {ID_TYPE} from \\\"../../../globals/id_type.sol\\\";\\nimport {RESERVED_KEY_SPACE as rks} from \\\"../../../globals/reserved_key_space.sol\\\";\\n// internal - structs\\nimport {DataStoreModuleStorage} from \\\"../../DataStoreModule/structs/storage.sol\\\";\\nimport {GeodeModuleStorage} from \\\"../structs/storage.sol\\\";\\nimport {Proposal} from \\\"../structs/utils.sol\\\";\\n// internal - libraries\\nimport {DataStoreModuleLib as DSML} from \\\"../../DataStoreModule/libs/DataStoreModuleLib.sol\\\";\\n\\n/**\\n * @title GML: Geode Module Library\\n *\\n * @notice Dual Governance & Limited Upgradability:\\n * Administration of the Isolated Storage with a Dual Governance consisting a Governance and a Senate.\\n * Administration of a UUPS contract with Limited Upgradability for Packages like Portal, LiquidityPackage.\\n *\\n * @dev review: DataStoreModule for the id based isolated storage logic.\\n * @dev review: Reserved TYPEs are defined within globals/id_type.sol\\n *\\n * @dev SENATE_EXPIRY is not mandatory to utilize. Simply set it to MAX_UINT256 if rescueSenate is not needed.\\n *\\n * @dev There are 3 ways to set a new Senate:\\n * 1. With a proposal TYPE 1. Proposal's controller becomes the new Senate, refreshes the expiry.\\n * 2. Current Senate can call changeSenate, which doesn't change the expiry\\n * 3. As a circuit breaker: If senate is expired, then rescue senate can be called by governance.\\n * @dev Currently, there are no way to set a new Governance.\\n *\\n *\\n * @dev Contracts relying on this library must use GeodeModuleLib.GeodeModuleStorage\\n * @dev This is an external library, requires deployment.\\n *\\n * @author Ice Bear & Crash Bandicoot\\n */\\nlibrary GeodeModuleLib {\\n using DSML for DataStoreModuleStorage;\\n\\n /**\\n * @custom:section ** CONSTANTS **\\n */\\n\\n /// @notice a proposal can have a duration between 1 days to 4 weeks (inclusive)\\n uint32 internal constant MIN_PROPOSAL_DURATION = 1 days;\\n uint32 internal constant MAX_PROPOSAL_DURATION = 4 weeks;\\n\\n /// @notice if expiry is utilized, a senate can be active for a year.\\n /// @dev \\\"MAX\\\" underlines a new senate can be set without expecting an expiry\\n uint32 internal constant MAX_SENATE_PERIOD = 365 days;\\n\\n /**\\n * @custom:section ** EVENTS **\\n */\\n event Proposed(uint256 indexed TYPE, uint256 ID, address CONTROLLER, uint256 deadline);\\n event Approved(uint256 ID);\\n event NewSenate(address senate, uint256 expiry);\\n event ControllerChanged(uint256 indexed ID, address CONTROLLER);\\n\\n /**\\n * @custom:section ** MODIFIERS **\\n */\\n modifier onlyGovernance(GeodeModuleStorage storage self) {\\n require(msg.sender == self.GOVERNANCE, \\\"GML:GOVERNANCE role needed\\\");\\n _;\\n }\\n\\n modifier onlySenate(GeodeModuleStorage storage self) {\\n require(msg.sender == self.SENATE, \\\"GML:SENATE role needed\\\");\\n require(block.timestamp < self.SENATE_EXPIRY, \\\"GML:SENATE expired\\\");\\n _;\\n }\\n\\n modifier onlyController(DataStoreModuleStorage storage DATASTORE, uint256 id) {\\n require(msg.sender == DATASTORE.readAddress(id, rks.CONTROLLER), \\\"GML:CONTROLLER role needed\\\");\\n _;\\n }\\n\\n /**\\n * @custom:section ** LIMITED UUPS VERSION CONTROL **\\n *\\n * @custom:visibility -> view-external\\n */\\n\\n /**\\n * @notice Check if it is allowed to change the package version to given proposedImplementation.\\n * @dev provided for _authorizeUpgrade\\n * @dev currentImplementation should always be UUPS._getImplementation()\\n * @dev currentImplementation or zero as proposedImplementation will return false\\n **/\\n function isUpgradeAllowed(\\n GeodeModuleStorage storage self,\\n address proposedImplementation,\\n address currentImplementation\\n ) external view returns (bool) {\\n return\\n (self.APPROVED_UPGRADE != address(0)) &&\\n (proposedImplementation != currentImplementation) &&\\n (self.APPROVED_UPGRADE == proposedImplementation);\\n }\\n\\n /**\\n * @custom:section ** GETTER FUNCTIONS **\\n *\\n * @custom:visibility -> view-external\\n */\\n\\n function getProposal(\\n GeodeModuleStorage storage self,\\n uint256 id\\n ) external view returns (Proposal memory) {\\n return self.proposals[id];\\n }\\n\\n /**\\n * @custom:section ** SETTER FUNCTIONS **\\n */\\n\\n /**\\n * @custom:subsection ** INTERNAL **\\n *\\n * @custom:visibility -> internal\\n */\\n function _setSenate(\\n GeodeModuleStorage storage self,\\n address _newSenate,\\n uint256 _expiry\\n ) internal {\\n require(_newSenate != address(0), \\\"GML:Senate cannot be zero address\\\");\\n self.SENATE = _newSenate;\\n self.SENATE_EXPIRY = _expiry;\\n\\n emit NewSenate(self.SENATE, self.SENATE_EXPIRY);\\n }\\n\\n /**\\n * @custom:subsection ** ONLY GOVERNANCE **\\n *\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @notice generates a new ID with given TYPE and NAME, proposes it to be owned by a CONTROLLER.\\n * @dev DATASTORE[id] will not be updated until the proposal is approved\\n * @dev Proposals can NEVER be overriden\\n */\\n function propose(\\n GeodeModuleStorage storage self,\\n DataStoreModuleStorage storage DATASTORE,\\n address _CONTROLLER,\\n uint256 _TYPE,\\n bytes calldata _NAME,\\n uint256 duration\\n ) external onlyGovernance(self) returns (uint256 id) {\\n id = DSML.generateId(_NAME, _TYPE);\\n\\n require(self.proposals[id].deadline == 0, \\\"GML:already proposed\\\");\\n require((DATASTORE.readBytes(id, rks.NAME)).length == 0, \\\"GML:ID already exist\\\");\\n require(_CONTROLLER != address(0), \\\"GML:CONTROLLER cannot be ZERO\\\");\\n require((_TYPE != ID_TYPE.NONE) && (_TYPE != ID_TYPE.POOL), \\\"GML:TYPE is NONE or POOL\\\");\\n require(\\n (duration >= MIN_PROPOSAL_DURATION) && (duration <= MAX_PROPOSAL_DURATION),\\n \\\"GML:invalid proposal duration\\\"\\n );\\n\\n uint256 _deadline = block.timestamp + duration;\\n\\n self.proposals[id] = Proposal({\\n CONTROLLER: _CONTROLLER,\\n TYPE: _TYPE,\\n NAME: _NAME,\\n deadline: _deadline\\n });\\n\\n emit Proposed(_TYPE, id, _CONTROLLER, _deadline);\\n }\\n\\n /**\\n * @notice changes Senate in a scenerio where the current Senate acts maliciously!\\n * * We are sure this will not be the case, but creating a method for possible recovery is a must.\\n * @notice Normally, Governance creates Senate Proposals frequently to signal it does not have\\n * * any intent of malicious overtake.\\n * note: If Governance does not send a Senate Proposal \\\"a while\\\" before the SENATE_EXPIRY,\\n * * we recommend users to take their money out.\\n * @dev Obviously, Governance needs to wait for SENATE_EXPIRY.\\n * @dev Refreshes the expiry\\n */\\n function rescueSenate(\\n GeodeModuleStorage storage self,\\n address _newSenate\\n ) external onlyGovernance(self) {\\n require(block.timestamp > self.SENATE_EXPIRY, \\\"GML:cannot rescue yet\\\");\\n\\n _setSenate(self, _newSenate, block.timestamp + MAX_SENATE_PERIOD);\\n }\\n\\n /**\\n * @custom:subsection ** ONLY SENATE **\\n *\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @notice approves a proposal and records given data to DataStore\\n * @notice specific changes for the reserved types (1, 2, 3) are implemented here,\\n * any other addition should take place in Portal, as not related.\\n * Note that GM has additional logic for package type approvals.\\n * @param id given ID proposal that has will be approved by Senate\\n * @dev Senate is not able to approve approved proposals\\n * @dev Senate is not able to approve expired proposals\\n */\\n function approveProposal(\\n GeodeModuleStorage storage self,\\n DataStoreModuleStorage storage DATASTORE,\\n uint256 id\\n ) external onlySenate(self) returns (address _controller, uint256 _type, bytes memory _name) {\\n require(self.proposals[id].deadline > block.timestamp, \\\"GML:not an active proposal\\\");\\n\\n _controller = self.proposals[id].CONTROLLER;\\n _type = self.proposals[id].TYPE;\\n _name = self.proposals[id].NAME;\\n\\n DATASTORE.writeUint(id, rks.TYPE, _type);\\n DATASTORE.writeAddress(id, rks.CONTROLLER, _controller);\\n DATASTORE.writeBytes(id, rks.NAME, _name);\\n DATASTORE.allIdsByType[_type].push(id);\\n\\n if (_type == ID_TYPE.SENATE) {\\n _setSenate(self, _controller, block.timestamp + MAX_SENATE_PERIOD);\\n } else if (_type == self.PACKAGE_TYPE) {\\n self.APPROVED_UPGRADE = _controller;\\n }\\n\\n // important\\n self.proposals[id].deadline = block.timestamp;\\n\\n emit Approved(id);\\n }\\n\\n /**\\n * @notice It is useful to be able to change the Senate's address without changing the expiry.\\n * @dev Does not change the expiry\\n */\\n function changeSenate(\\n GeodeModuleStorage storage self,\\n address _newSenate\\n ) external onlySenate(self) {\\n _setSenate(self, _newSenate, self.SENATE_EXPIRY);\\n }\\n\\n /**\\n * @custom:section ** ONLY CONTROLLER **\\n *\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @notice change the CONTROLLER of an ID\\n * @dev this operation cannot be reverted by the old CONTROLLER!!!\\n * @dev cannot provide address(0), try 0x000000000000000000000000000000000000dEaD\\n */\\n function changeIdCONTROLLER(\\n DataStoreModuleStorage storage DATASTORE,\\n uint256 id,\\n address newCONTROLLER\\n ) external onlyController(DATASTORE, id) {\\n require(newCONTROLLER != address(0), \\\"GML:CONTROLLER cannot be zero\\\");\\n\\n uint256 typeOfId = DATASTORE.readUint(id, rks.TYPE);\\n require(\\n typeOfId > ID_TYPE.LIMIT_MIN_USER && typeOfId < ID_TYPE.LIMIT_MAX_USER,\\n \\\"GML:ID TYPE is not user\\\"\\n );\\n\\n DATASTORE.writeAddress(id, rks.CONTROLLER, newCONTROLLER);\\n\\n emit ControllerChanged(id, newCONTROLLER);\\n }\\n}\\n\",\"keccak256\":\"0xe512a12a6b8972f526dfc4028517d5ea3a00ed0004833d7ef35fe12479ff8c9f\",\"license\":\"BUSL-1.1\"},\"contracts/modules/GeodeModule/structs/storage.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n// internal - structs\\nimport {Proposal} from \\\"./utils.sol\\\";\\n\\n/**\\n * @notice Storage struct for the Dual Governance logic\\n * @dev Dual Governance allows 2 parties to manage a package with proposals and approvals.\\n * @param GOVERNANCE a community that works to improve the core product and ensures its adoption in the DeFi ecosystem\\n * Suggests updates, such as new operators, contract/package upgrades, a new Senate (without any permission to force them)\\n * @param SENATE An address that protects the users by controlling the state of governance, contract updates and other crucial changes\\n * @param APPROVED_UPGRADE only 1 implementation contract SHOULD be \\\"approved\\\" at any given time.\\n * @param SENATE_EXPIRY refers to the last timestamp that SENATE can continue operating. Might not be utilized. Limited by MAX_SENATE_PERIOD\\n * @param PACKAGE_TYPE every package has a specific TYPE. Defined in globals/id_type.sol\\n * @param CONTRACT_VERSION always refers to the upgrade proposal ID. Does not increase uniformly like one might expect.\\n * @param proposals till approved, proposals are kept separated from the Isolated Storage\\n *\\n * @dev normally we would put custom:storage-location erc7201:geode.storage.GeodeModule\\n * but compiler throws an error... So np for now, just effects dev ex.\\n **/\\nstruct GeodeModuleStorage {\\n address GOVERNANCE;\\n address SENATE;\\n address APPROVED_UPGRADE;\\n uint256 SENATE_EXPIRY;\\n uint256 PACKAGE_TYPE;\\n uint256 CONTRACT_VERSION;\\n mapping(uint256 => Proposal) proposals;\\n}\\n\",\"keccak256\":\"0xed6ca1f88ad9b514c2fd8004c1b191b6b8baca81376e1f0c701381e30617cec3\",\"license\":\"BUSL-1.1\"},\"contracts/modules/GeodeModule/structs/utils.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n/**\\n * @notice Giving the control of a specific ID to proposed CONTROLLER.\\n *\\n * @param TYPE: refer to globals/id_type.sol\\n * @param CONTROLLER: the address that refers to the change that is proposed by given proposal.\\n * * This slot can refer to the controller of an id, a new implementation contract, a new Senate etc.\\n * @param NAME: DataStore generates ID by keccak(name, type)\\n * @param deadline: refers to last timestamp until a proposal expires, limited by MAX_PROPOSAL_DURATION\\n * * Expired proposals cannot be approved by Senate\\n * * Expired proposals cannot be overriden by new proposals\\n **/\\nstruct Proposal {\\n address CONTROLLER;\\n uint256 TYPE;\\n bytes NAME;\\n uint256 deadline;\\n}\\n\",\"keccak256\":\"0xcaa2a8bae465cbfe7ecfa41fa0e54a83d1e50475a6d0e5864a3169bf0d537577\",\"license\":\"BUSL-1.1\"},\"contracts/modules/StakeModule/libs/DepositContractLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n// internal - interfaces\\nimport {IDepositContract} from \\\"../../../interfaces/helpers/IDepositContract.sol\\\";\\n// internal - libraries\\nimport {BytesLib} from \\\"../../../helpers/BytesLib.sol\\\";\\n\\n/**\\n * @title DCL: Deposit Contract Library\\n *\\n * @notice Includes constants & functions that helps to the deposit process.\\n *\\n * @dev DEPOSIT_CONTRACT is chain specific and should be changed before deployments.\\n *\\n * @dev This is an internal library, requires NO deployment.\\n *\\n * @author Ice Bear & Crash Bandicoot\\n */\\n\\nlibrary DepositContractLib {\\n /**\\n * @custom:section ** CONSTANTS **\\n */\\n\\n IDepositContract internal constant DEPOSIT_CONTRACT =\\n IDepositContract(0x4242424242424242424242424242424242424242);\\n uint256 internal constant PUBKEY_LENGTH = 48;\\n uint256 internal constant SIGNATURE_LENGTH = 96;\\n uint256 internal constant WITHDRAWAL_CREDENTIALS_LENGTH = 32;\\n uint256 internal constant DEPOSIT_AMOUNT = 32 ether;\\n uint256 internal constant DEPOSIT_AMOUNT_PRESTAKE = 1 ether;\\n uint256 internal constant MAX_DEPOSITS_PER_CALL = 50;\\n\\n /**\\n * @custom:section ** FUNCTIONS **\\n */\\n\\n /**\\n * @dev Padding memory array with zeroes up to 64 bytes on the right\\n * @param _b Memory array of size 32 .. 64\\n */\\n function _pad64(bytes memory _b) internal pure returns (bytes memory) {\\n assert(_b.length >= 32 && _b.length <= 64);\\n if (64 == _b.length) return _b;\\n\\n bytes memory zero32 = new bytes(32);\\n assembly {\\n mstore(add(zero32, 0x20), 0)\\n }\\n\\n if (32 == _b.length) return BytesLib.concat(_b, zero32);\\n else return BytesLib.concat(_b, BytesLib.slice(zero32, 0, uint256(64 - _b.length)));\\n }\\n\\n /**\\n * @dev Converting value to little endian bytes and padding up to 32 bytes on the right\\n * @param _value Number less than `2**64` for compatibility reasons\\n */\\n function _toLittleEndian64(uint256 _value) internal pure returns (uint256 result) {\\n result = 0;\\n uint256 temp_value = _value;\\n for (uint256 i; i < 8; ++i) {\\n result = (result << 8) | (temp_value & 0xFF);\\n temp_value >>= 8;\\n }\\n\\n assert(0 == temp_value); // fully converted\\n result <<= (24 * 8);\\n }\\n\\n function _getDepositDataRoot(\\n bytes memory _pubkey,\\n bytes memory _withdrawalCredentials,\\n bytes memory _signature,\\n uint256 _stakeAmount\\n ) internal pure returns (bytes32) {\\n require(_stakeAmount >= 1 ether, \\\"DepositContract: deposit value too low\\\");\\n require(_stakeAmount % 1 gwei == 0, \\\"DepositContract: deposit value not multiple of gwei\\\");\\n\\n uint256 deposit_amount = _stakeAmount / 1 gwei;\\n bytes32 pubkeyRoot = sha256(_pad64(_pubkey));\\n bytes32 signatureRoot = sha256(\\n abi.encodePacked(\\n sha256(BytesLib.slice(_signature, 0, 64)),\\n sha256(_pad64(BytesLib.slice(_signature, 64, SIGNATURE_LENGTH - 64)))\\n )\\n );\\n\\n bytes32 depositDataRoot = sha256(\\n abi.encodePacked(\\n sha256(abi.encodePacked(pubkeyRoot, _withdrawalCredentials)),\\n sha256(abi.encodePacked(_toLittleEndian64(deposit_amount), signatureRoot))\\n )\\n );\\n\\n return depositDataRoot;\\n }\\n\\n /**\\n * @notice converts an address to withdrawal credential, used on validator creation\\n */\\n function addressToWC(address wcAddress) internal pure returns (bytes memory) {\\n uint256 w = 1 << 248;\\n\\n return abi.encodePacked(bytes32(w) | bytes32(uint256(uint160(address(wcAddress)))));\\n }\\n\\n /**\\n * @notice deposit to DEPOSIT_CONTRACT and initiate a validator.\\n */\\n function depositValidator(\\n bytes calldata pubkey,\\n bytes memory withdrawalCredential,\\n bytes memory signature,\\n uint256 amount\\n ) internal {\\n DEPOSIT_CONTRACT.deposit{value: amount}(\\n pubkey,\\n withdrawalCredential,\\n signature,\\n _getDepositDataRoot(pubkey, withdrawalCredential, signature, amount)\\n );\\n }\\n}\\n\",\"keccak256\":\"0x71fa2b28cf5299abb9cfd8d7b8130c84f104b7a74d3ee2d6f5274e2fcc9a7ab2\",\"license\":\"MIT\"},\"contracts/modules/StakeModule/structs/utils.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n/**\\n * @param state state of the validator, refer to globals.sol\\n * @param index representing this validator's placement on the chronological order of the validators proposals\\n * @param createdAt the timestamp pointing the proposal to create a validator with given pubkey.\\n * @param period the latest point in time the operator is allowed to maintain this validator (createdAt + validatorPeriod).\\n * @param poolId needed for withdrawal_credential\\n * @param operatorId needed for staking after allowance\\n * @param poolFee percentage of the rewards that will go to pool's maintainer, locked when the validator is proposed\\n * @param operatorFee percentage of the rewards that will go to operator's maintainer, locked when the validator is proposed\\n * @param infrastructureFee all fees are crucial for the price calculation by the oracle, even if its zero.\\n * @param signature31 BLS12-381 signature for the validator, used when the remaining 31 ETH is sent on validator activation.\\n **/\\nstruct Validator {\\n uint64 state;\\n uint64 index;\\n uint64 createdAt;\\n uint64 period;\\n uint256 poolId;\\n uint256 operatorId;\\n uint256 poolFee;\\n uint256 operatorFee;\\n uint256 infrastructureFee;\\n bytes signature31;\\n}\\n\",\"keccak256\":\"0xd7f21251a595d6cb1f23aee2015557064568e604e992b63d20acea0816dcd848\",\"license\":\"BUSL-1.1\"},\"contracts/modules/WithdrawalModule/WithdrawalModule.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n// external - libraries\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n// external - contracts\\nimport {ERC1155HolderUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/token/ERC1155/utils/ERC1155HolderUpgradeable.sol\\\";\\nimport {ReentrancyGuardUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport {PausableUpgradeable} from \\\"@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol\\\";\\n// internal - interfaces\\nimport {IgETH} from \\\"../../interfaces/IgETH.sol\\\";\\nimport {IPortal} from \\\"../../interfaces/IPortal.sol\\\";\\nimport {IWithdrawalModule} from \\\"../../interfaces/modules/IWithdrawalModule.sol\\\";\\n// internal - structs\\nimport {WithdrawalModuleStorage} from \\\"./structs/storage.sol\\\";\\n// internal - libraries\\nimport {WithdrawalModuleLib as WML} from \\\"./libs/WithdrawalModuleLib.sol\\\";\\n\\n/**\\n * @title WM: Withdrawal Module\\n *\\n * @notice Withdrawal Queue and voluntary exit elections.\\n * * Processing the withdrawals\\n * * Distributing the fees\\n * * Queueing withdrawal requests\\n * * Allowing (Instant Run-off) elections on which validators to exit.\\n * @dev all done while preserving the validator segregation.\\n *\\n * @dev There is 1 additional functionality implemented apart from the library:\\n * * if the price is not valid, user must prove it before processing validators.\\n *\\n * @dev review: this module delegates its functionality to WML (WithdrawalModuleLib).\\n *\\n * @dev 4 functions need to be overriden with access control when inherited:\\n * * pause, unpause, setExitThreshold, claimInfrastructureFees\\n *\\n * @dev __WithdrawalModule_init (or _unchained) call is NECESSARY when inherited.\\n *\\n * note This module does not implement necessary admin checks; or pausability overrides.\\n * * If a package inherits WM, should implement it's own logic around those.\\n *\\n * @author Ice Bear & Crash Bandicoot\\n */\\nabstract contract WithdrawalModule is\\n IWithdrawalModule,\\n ERC1155HolderUpgradeable,\\n ReentrancyGuardUpgradeable,\\n PausableUpgradeable\\n{\\n using WML for WithdrawalModuleStorage;\\n /**\\n * @custom:section ** VARIABLES **\\n *\\n * @dev Do not add any other variables here. Modules do not have a gap.\\n * Library's main struct has a gap, providing up to 16 storage slots for this module.\\n */\\n // keccak256(abi.encode(uint256(keccak256(\\\"geode.storage.WithdrawalModuleStorage\\\")) - 1)) & ~bytes32(uint256(0xff))\\n bytes32 private constant WithdrawalModuleStorageLocation =\\n 0x50605cc6f5170f0cdbb610edd2214831ea96f61cd1eba92cf58939f65736af00;\\n\\n function _getWithdrawalModuleStorage() internal pure returns (WithdrawalModuleStorage storage $) {\\n assembly {\\n $.slot := WithdrawalModuleStorageLocation\\n }\\n }\\n\\n /**\\n * @custom:section ** EVENTS **\\n */\\n event NewExitThreshold(uint256 threshold);\\n event Enqueue(uint256 indexed index, address owner);\\n event Vote(uint256 indexed index, bytes indexed pubkey, uint256 size);\\n event RequestTransfer(uint256 indexed index, address oldOwner, address newOwner);\\n event Fulfill(uint256 indexed index, uint256 fulfillAmount, uint256 claimableETH);\\n event Dequeue(uint256 indexed index, uint256 claim);\\n event Processed();\\n\\n /**\\n\\n /**\\n * @custom:section ** ABSTRACT FUNCTIONS **\\n *\\n * @dev these functions MUST be overriden for admin functionality.\\n */\\n\\n function pause() external virtual override;\\n\\n function unpause() external virtual override;\\n\\n function setExitThreshold(uint256 newThreshold) external virtual override;\\n\\n function claimInfrastructureFees(\\n address receiver\\n ) external virtual override returns (bool success);\\n\\n /**\\n * @custom:section ** INITIALIZING **\\n */\\n function __WithdrawalModule_init(\\n address _gETH_position,\\n address _portal_position,\\n uint256 _poolId\\n ) internal onlyInitializing {\\n __ReentrancyGuard_init();\\n __Pausable_init();\\n __ERC1155Holder_init();\\n __WithdrawalModule_init_unchained(_gETH_position, _portal_position, _poolId);\\n }\\n\\n function __WithdrawalModule_init_unchained(\\n address _gETH_position,\\n address _portal_position,\\n uint256 _poolId\\n ) internal onlyInitializing {\\n require(_gETH_position != address(0), \\\"WM:gETH cannot be zero address\\\");\\n require(_portal_position != address(0), \\\"WM:portal cannot be zero address\\\");\\n\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n $.gETH = IgETH(_gETH_position);\\n $.PORTAL = _portal_position;\\n $.POOL_ID = _poolId;\\n $.EXIT_THRESHOLD = WML.MIN_EXIT_THRESHOLD;\\n\\n $.gETH.avoidMiddlewares(_poolId, true);\\n }\\n\\n /**\\n * @custom:section ** GETTER FUNCTIONS **\\n *\\n * @custom:visibility -> view-external\\n */\\n function WithdrawalParams()\\n external\\n view\\n virtual\\n override\\n returns (\\n address gETH,\\n address portal,\\n uint256 poolId,\\n uint256 exitThreshold,\\n uint256 gatheredInfrastructureFees\\n )\\n {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n gETH = address($.gETH);\\n portal = $.PORTAL;\\n poolId = $.POOL_ID;\\n exitThreshold = $.EXIT_THRESHOLD;\\n gatheredInfrastructureFees = $.gatheredInfrastructureFees;\\n }\\n\\n function QueueParams()\\n external\\n view\\n virtual\\n override\\n returns (\\n uint256 requested,\\n uint256 realized,\\n uint256 realizedEtherBalance,\\n uint256 realizedPrice,\\n uint256 fulfilled,\\n uint256 fulfilledEtherBalance,\\n uint256 commonPoll\\n )\\n {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n requested = $.queue.requested;\\n realized = $.queue.realized;\\n realizedEtherBalance = $.queue.realizedEtherBalance;\\n realizedPrice = $.queue.realizedPrice;\\n fulfilled = $.queue.fulfilled;\\n fulfilledEtherBalance = $.queue.fulfilledEtherBalance;\\n commonPoll = $.queue.commonPoll;\\n }\\n\\n function getRequest(\\n uint256 index\\n )\\n external\\n view\\n virtual\\n override\\n returns (\\n address owner,\\n uint256 trigger,\\n uint256 size,\\n uint256 fulfilled,\\n uint256 claimableEther\\n )\\n {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n owner = $.requests[index].owner;\\n trigger = $.requests[index].trigger;\\n size = $.requests[index].size;\\n fulfilled = $.requests[index].fulfilled;\\n claimableEther = $.requests[index].claimableEther;\\n }\\n\\n function getValidatorData(\\n bytes calldata pubkey\\n )\\n external\\n view\\n virtual\\n override\\n returns (uint256 beaconBalance, uint256 withdrawnBalance, uint256 poll)\\n {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n beaconBalance = $.validators[pubkey].beaconBalance;\\n withdrawnBalance = $.validators[pubkey].withdrawnBalance;\\n poll = $.validators[pubkey].poll;\\n }\\n\\n /**\\n * @custom:section ** EARLY EXIT **\\n */\\n\\n /**\\n * @custom:visibility -> view\\n */\\n function canFinalizeExit(bytes calldata pubkey) external view virtual override returns (bool) {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n return $.canFinalizeExit(pubkey);\\n }\\n\\n function validatorThreshold(\\n bytes calldata pubkey\\n ) external view virtual override returns (uint256 threshold) {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n (threshold, ) = $.getValidatorThreshold(pubkey);\\n }\\n\\n /**\\n * @custom:section ** REQUESTS QUEUE **\\n */\\n /**\\n * @custom:subsection ** ENQUEUE **\\n *\\n * @custom:visibility -> external\\n */\\n\\n function enqueue(\\n uint256 size,\\n bytes calldata pubkey,\\n address owner\\n ) external virtual override returns (uint256 index) {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n index = $.enqueue(size, pubkey, owner);\\n }\\n\\n function enqueueBatch(\\n uint256[] calldata sizes,\\n bytes[] calldata pubkeys,\\n address owner\\n ) external virtual override returns (uint256[] memory indexes) {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n indexes = $.enqueueBatch(sizes, pubkeys, owner);\\n }\\n\\n function transferRequest(uint256 index, address newOwner) external virtual override {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n $.transferRequest(index, newOwner);\\n }\\n\\n /**\\n * @custom:subsection ** FULFILL **\\n */\\n\\n /**\\n * @custom:visibility -> view\\n */\\n\\n function fulfillable(uint256 index) external view virtual override returns (uint256) {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n return $.fulfillable(index, $.queue.realized, $.queue.fulfilled);\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n function fulfill(uint256 index) external virtual override {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n $.fulfill(index);\\n }\\n\\n function fulfillBatch(uint256[] calldata indexes) external virtual override {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n $.fulfillBatch(indexes);\\n }\\n\\n /**\\n * @custom:subsection ** DEQUEUE **\\n */\\n /**\\n * @custom:visibility -> external\\n */\\n function dequeue(uint256 index, address receiver) external virtual override {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n $.dequeue(index, receiver);\\n }\\n\\n function dequeueBatch(uint256[] calldata indexes, address receiver) external virtual override {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n $.dequeueBatch(indexes, receiver);\\n }\\n\\n /**\\n * @custom:section ** PROCESS BALANCES MERKLE UPDATE **\\n */\\n function processValidators(\\n bytes[] calldata pubkeys,\\n uint256[] calldata beaconBalances,\\n uint256[] calldata withdrawnBalances,\\n bytes32[][] calldata balanceProofs,\\n uint256 price,\\n bytes32[] calldata priceProof\\n ) external virtual override {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n if (!IPortal($.PORTAL).isPriceValid($.POOL_ID)) {\\n IPortal($.PORTAL).priceSync($.POOL_ID, price, priceProof);\\n }\\n $.processValidators(pubkeys, beaconBalances, withdrawnBalances, balanceProofs);\\n }\\n\\n /**\\n * @custom:section ** MULTICALL **\\n */\\n\\n /**\\n * @dev Receives and executes a batch of function calls on this contract.\\n * @dev This is necessary for the multistep operations done in this contract:\\n * * Enqueue, Process, Fulfill, Dequeue.\\n * @dev Using 'functionDelegateCall' so it does not cause any issues when using msg.sender etc.\\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\\n */\\n function multicall(\\n bytes[] calldata data\\n ) external virtual override returns (bytes[] memory results) {\\n results = new bytes[](data.length);\\n for (uint256 i; i < data.length; ) {\\n results[i] = Address.functionDelegateCall(address(this), data[i]);\\n\\n unchecked {\\n i += 1;\\n }\\n }\\n return results;\\n }\\n}\\n\",\"keccak256\":\"0xcc8b028b5b944156ef766ef8e75c24aaf489ee6e0f04108aa7cb877d16d428d4\",\"license\":\"BUSL-1.1\"},\"contracts/modules/WithdrawalModule/libs/WithdrawalModuleLib.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n// external - libraries\\nimport {MerkleProof} from \\\"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\\\";\\n// internal - globals\\nimport {PERCENTAGE_DENOMINATOR, gETH_DENOMINATOR} from \\\"../../../globals/macros.sol\\\";\\nimport {VALIDATOR_STATE} from \\\"../../../globals/validator_state.sol\\\";\\n// internal - interfaces\\nimport {IgETH} from \\\"../../../interfaces/IgETH.sol\\\";\\nimport {IPortal} from \\\"../../../interfaces/IPortal.sol\\\";\\n// internal - structs\\nimport {Queue, Request, ValidatorData} from \\\"../structs/utils.sol\\\";\\nimport {WithdrawalModuleStorage} from \\\"../structs/storage.sol\\\";\\n// internal - libraries\\nimport {DepositContractLib as DCL} from \\\"../../StakeModule/libs/DepositContractLib.sol\\\";\\nimport {Validator} from \\\"../../StakeModule/structs/utils.sol\\\";\\n\\n/**\\n * @title WML: Withdrawal Module Library\\n *\\n * @notice Improved validator withdrawals (and exits), while preserving the validator segregation.\\n *\\n * @notice Intended implementation scope:\\n * 1. Processing the withdrawals (partial and exits).\\n * * `processValidators` function handles any balance changes that is reflected from the Beacon Chain.\\n * * If a validator's balance on the Beacon Chain is ZERO, it exited (forced or voluntary).\\n *\\n * 2. Distributing the fees.\\n * * Pool and Operator fees are distributed whenever the validator is processed.\\n * * Note that if the validator is slashed before being processed, fees can be lost along with the stakers' profit.\\n *\\n * 3. Queueing withdrawal requests.\\n * * Users can request a withdrawal by forfeiting their gETH tokens.\\n * * Requests would be put in a queue (First-In-First-Out).\\n * * As the validators are processed, requests become claimable.\\n * * Users can dequeue partially or fully.\\n *\\n * 4. Allowing (Instant Run-off) elections on which validators to exit.\\n * * While getting into the queue, caller can vote on a validator, increasing it's 'poll'.\\n * * If a validator is not specified, vote goes to 'commonPoll'. It can be used for any validator to top-up the EXIT_THRESHOLD\\n * * If a validator is called for exit but there are remaining votes in it, it is transferred to the commonPoll.\\n * * Note that, elections are basically just stating a preference:\\n * * * Exit of the voted validator does not change the voter's priority in the queue.\\n *\\n * @dev The Queue\\n * Lets say every '-' is representing 1 gETH.\\n * Queue: --- -- ---------- -- --- --- - --- -- ---- ----- - ------- ---- -- -- - - -------- --\\n * There are 20 requests in this queue, adding up to 65 gETH, this is 'requested'.\\n * Every request has a 'size', first request' is 3 gETH , second' is 2 gETH.\\n * Every request has a 'trigger', pointing it's kickoff point. Thus, 3rd request' is 5 gETH.\\n * Let's say, there are 8 ETH processed in the contract, we burn 8 ETH worth of gETH.\\n * Let's say 8 ETH is 4 gETH. Then the first request can exit fully, and second one can exit for 1 gETH.\\n *\\n * @dev This process creates a unique question:\\n * Considering that profit processing, price updates and queue operations are ASYNC,\\n * how can we make sure that we are paying the correct price?\\n * We have determined 3 possible points that we can 'derisk' a Request:\\n * Enqueue -> ProcessValidators -> Dequeue\\n * 1. We derisk the Request when it is enqueued:\\n * * This would cause 2 issues:\\n * * a. Best case, we would prevent the queued Request from profiting while they are in the queue.\\n * * b. Since there is a slashing risk, we cannot promise a fixed Ether amount without knowing what would be the future price.\\n * 2. We derisk the Request when validators are processed, with the latest price for the derivative:\\n * * This is the correct approach as we REALIZE the price at this exact point: by increasing the cumulative claimable gETH.\\n * * However, we would need to insert an 'unbound for loop' through 'realized' Requests, when a 'processValidators' operation is finalized.\\n * * We cannot, nor should, enforce an 'unbound for loop' on requests array.\\n * 3. We derisk the Request when it is dequeued:\\n * * Simply, price changes would have unpredictable effects on the Queue: A request can be claimable now, but might become unclaimable later.\\n * * Derisked Requests that are waiting to be claimed, would hijack the real stakers' APR, while sitting on top of some allocated Ether.\\n * * Unclaimed Requests can prevent the latter requests since there would be no way to keep track of the previous unclaimed requests without enforcing the order.\\n * We do not want to promise vague returns, we do not want for loops over requests array or price checkpoints, we do not want APR hijacking.\\n * Thus, none of these points can be implemented without utilizing a trusted third party, like an Oracle.\\n * However, we want Withdrawal logic to have the minimum Third Party risk as Geode Developers.\\n * As a result, we have came up with a logic that will allow stakers to maintain their profitability without disrupting the 'derisk' moment.\\n * * a. We keep track of an internal price, stating the ratio of the claimable ETH and processed gETH: realizedPrice.\\n * * b. We derisk the Queue on 'processValidators' by increasing the cumulative gETH that can be claimed.\\n * * * We also adjust the realizedPrice considering the pricePerShare of the currently derisked asset amount.\\n * * c. Requests can be fulfilled in respect to the internal price BY ANYONE at any point after they become claimable.\\n * * d. Fulfilled requests, including partially fulfilled ones, can be claimed (ONLY) BY THE OWNER.\\n * Why using an internal Price instead of 'enforcing the PricePerShare' makes sense:\\n * * All Requests, without considering their index, are in the same pool until they are derisked through price processing.\\n * * If all of the claimable requests are fulfilled periodically (via a script etc.), we would expect internal price to be equal to 'PricePerShare'.\\n * * This way, a well maintained pool can prevent APR hijacking by fulfilling neglected Requests, while it is not enforced for all of the pools.\\n * However, this is a gas-heavy process so it might not be needed after every 'processValidators' operation.\\n * Similarly, 'processValidators' is expensive as well, we would advise calling it when there is a dequeue opportunity.\\n * As a conclusion, if all requests are fulfilled immediately after the off-chain calculation signals them being claimable;\\n * None of these approaches will be expensive, nor will disrupt the internal pricing for the latter requests.\\n *\\n * @dev while conducting the price calculations, a part of the balance within this contract should be taken into consideration.\\n * This ETH amount can be calculated as: sum(lambda x: requests[x].withdrawnBalance) - [fulfilledEtherBalance] (todo for the telescope).\\n * Note that, this is because: a price of the derivative is = total ETH / total Supply, and total ETH should include the balance within WP.\\n *\\n * @dev Contracts relying on this library must initialize WithdrawalModuleLib.WithdrawalModuleStorage\\n *\\n * @dev There are 'owner' checks on 'transferRequest', _dequeue (used by dequeue, dequeueBatch).\\n * However, we preferred to not use a modifier for that.\\n *\\n * @dev all parameters related to balance are denominated in gETH; except realizedEtherBalance,fulfilledEtherBalance and claimableEther:\\n * (requested, realized, fulfilled, commonPoll, trigger, size, fulfilled)\\n * @author Ice Bear & Crash Bandicoot\\n */\\nlibrary WithdrawalModuleLib {\\n /**\\n * @custom:section ** CONSTANTS **\\n */\\n /// @notice EXIT_THRESHOLD should be at least 60% and at most 100%\\n uint256 internal constant MIN_EXIT_THRESHOLD = 6e9; // (6 * PERCENTAGE_DENOMINATOR) / 10;\\n // minimum withdrawal request is 0.05 ETH\\n uint256 internal constant MIN_REQUEST_SIZE = 5e16;\\n\\n /**\\n * @custom:section ** EVENTS **\\n */\\n event NewExitThreshold(uint256 threshold);\\n event Enqueue(uint256 indexed index, address owner);\\n event Vote(uint256 indexed index, bytes indexed pubkey, uint256 size);\\n event RequestTransfer(uint256 indexed index, address oldOwner, address newOwner);\\n event Fulfill(uint256 indexed index, uint256 fulfillAmount, uint256 claimableETH);\\n event Dequeue(uint256 indexed index, uint256 claim);\\n event Processed();\\n\\n /**\\n * @custom:section ** HELPER **\\n */\\n\\n function _getPortal(WithdrawalModuleStorage storage self) internal view returns (IPortal) {\\n return IPortal(self.PORTAL);\\n }\\n\\n /**\\n * @custom:section ** EARLY EXIT REQUESTS **\\n */\\n\\n /**\\n * @custom:visibility -> view\\n */\\n /**\\n * @notice checks if given validator is exited, according to the information provided by Balances Merkle Root.\\n * @dev an external view function, just as an helper.\\n */\\n function canFinalizeExit(\\n WithdrawalModuleStorage storage self,\\n bytes calldata pubkey\\n ) external view returns (bool) {\\n if (self.validators[pubkey].beaconBalance != 0) {\\n return false;\\n }\\n\\n Validator memory val = _getPortal(self).getValidator(pubkey);\\n\\n // check pubkey belong to this pool\\n require(val.poolId == self.POOL_ID, \\\"WML:validator for an unknown pool\\\");\\n\\n if (val.state != VALIDATOR_STATE.ACTIVE && val.state != VALIDATOR_STATE.EXIT_REQUESTED) {\\n return false;\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @custom:visibility -> internal\\n */\\n\\n /**\\n * @notice notifies Portal to change validator state from ACTIVE to EXIT_REQUESTED\\n * @param pubkey public key of the given validator.\\n */\\n function _requestExit(\\n WithdrawalModuleStorage storage self,\\n bytes calldata pubkey\\n ) internal returns (bool) {\\n return _getPortal(self).requestExit(self.POOL_ID, pubkey);\\n }\\n\\n /**\\n * @notice notifies Portal to change validator state from ACTIVE or EXIT_REQUESTED, to EXITED.\\n * @dev no additional checks are needed as processValidators and PORTAL.finalizeExit has propser checks.\\n * @param pubkey public key of the given validator.\\n */\\n function _finalizeExit(WithdrawalModuleStorage storage self, bytes calldata pubkey) internal {\\n _getPortal(self).finalizeExit(self.POOL_ID, pubkey);\\n }\\n\\n /**\\n * @notice if the poll is above the threshold, calls Portal to request a voluntary exit.\\n * @param pubkey public key of the checked validator.\\n * @param commonPoll cached commonPoll\\n * @dev passing commonPoll around helps on gas on batch TXs.\\n */\\n function _checkAndRequestExit(\\n WithdrawalModuleStorage storage self,\\n bytes calldata pubkey,\\n uint256 commonPoll\\n ) internal returns (uint256) {\\n (uint256 threshold, uint256 beaconBalancePriced) = getValidatorThreshold(self, pubkey);\\n uint256 validatorPoll = self.validators[pubkey].poll;\\n\\n if (commonPoll + validatorPoll > threshold) {\\n // meaning it can request withdrawal\\n if (_requestExit(self, pubkey)) {\\n if (threshold > validatorPoll) {\\n // If Poll is not enough spend votes from commonPoll.\\n commonPoll -= threshold - validatorPoll;\\n } else if (validatorPoll > beaconBalancePriced) {\\n // If Poll is bigger than needed, move the extra votes instead of spending.\\n commonPoll += validatorPoll - beaconBalancePriced;\\n }\\n }\\n }\\n\\n return commonPoll;\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n /**\\n * @notice allowing EXIT_THRESHOLD to be set by the contract owner.\\n * @param newThreshold as percentage, denominated in PERCENTAGE_DENOMINATOR.\\n * @dev caller should be governed on module contract.\\n */\\n function setExitThreshold(WithdrawalModuleStorage storage self, uint256 newThreshold) external {\\n require(newThreshold >= MIN_EXIT_THRESHOLD, \\\"WML:min threshold is 60%\\\");\\n require(newThreshold <= PERCENTAGE_DENOMINATOR, \\\"WML:max threshold is 100%\\\");\\n\\n self.EXIT_THRESHOLD = newThreshold;\\n emit NewExitThreshold(newThreshold);\\n }\\n\\n /**\\n * @custom:subsection ** VOTE **\\n */\\n\\n /**\\n * @custom:visibility -> view\\n */\\n /**\\n * @notice figuring out the applied exit threshold, as in gETH, for a given validator.\\n * @param pubkey public key of the given validator.\\n */\\n function getValidatorThreshold(\\n WithdrawalModuleStorage storage self,\\n bytes calldata pubkey\\n ) public view returns (uint256 threshold, uint256 beaconBalancePriced) {\\n uint256 price = self.gETH.pricePerShare(self.POOL_ID);\\n beaconBalancePriced = ((self.validators[pubkey].beaconBalance * gETH_DENOMINATOR));\\n threshold = (beaconBalancePriced * self.EXIT_THRESHOLD) / PERCENTAGE_DENOMINATOR / price;\\n beaconBalancePriced = beaconBalancePriced / price;\\n }\\n\\n /**\\n * @custom:visibility -> internal\\n */\\n /**\\n * @notice a validator is chosen to be the next exit by enqueued Request\\n * @param pubkey public key of the voted validator.\\n * @param size specified gETH amount\\n */\\n function _vote(\\n WithdrawalModuleStorage storage self,\\n uint256 index,\\n bytes calldata pubkey,\\n uint256 size\\n ) internal {\\n Validator memory val = _getPortal(self).getValidator(pubkey);\\n\\n require(val.poolId == self.POOL_ID, \\\"WML:vote for an unknown pool\\\");\\n require(val.state == VALIDATOR_STATE.ACTIVE, \\\"WML:voted for inactive validator\\\");\\n\\n self.validators[pubkey].poll += size;\\n emit Vote(index, pubkey, size);\\n }\\n\\n /**\\n * @custom:section ** REQUESTS QUEUE **\\n */\\n\\n /**\\n * @custom:subsection ** ENQUEUE **\\n */\\n /**\\n * @custom:visibility -> internal\\n */\\n /**\\n * @notice internal function to push a new Request into Queue\\n * @param trigger the kickoff point for the Request\\n * @param size specified gETH amount\\n */\\n function _enqueue(\\n WithdrawalModuleStorage storage self,\\n uint256 trigger,\\n uint256 size,\\n address owner\\n ) internal returns (uint256 index) {\\n require(size >= MIN_REQUEST_SIZE, \\\"WML:min 0.05 gETH\\\");\\n require(owner != address(0), \\\"WML:owner cannot be zero address\\\");\\n\\n self.requests.push(\\n Request({owner: owner, trigger: trigger, size: size, fulfilled: 0, claimableEther: 0})\\n );\\n\\n index = self.requests.length - 1;\\n\\n emit Enqueue(index, owner);\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @notice queues a Request into Queue, processes the vote, exits the validator in case of a run-off.\\n * @param pubkey voted validator, vote goes into commonPoll if bytes(0) is given.\\n * @param owner allows caller to directly transfer the Request on creation\\n */\\n function enqueue(\\n WithdrawalModuleStorage storage self,\\n uint256 size,\\n bytes calldata pubkey,\\n address owner\\n ) external returns (uint256 index) {\\n uint256 requestedgETH = self.queue.requested;\\n index = _enqueue(self, requestedgETH, size, owner);\\n\\n if (pubkey.length == 0) {\\n self.queue.commonPoll += size;\\n } else {\\n _vote(self, index, pubkey, size);\\n }\\n\\n self.queue.requested = requestedgETH + size;\\n\\n self.gETH.safeTransferFrom(msg.sender, address(this), self.POOL_ID, size, \\\"\\\");\\n }\\n\\n /**\\n * @notice enqueue() with batch optimizations\\n * @param sizes array of gETH amount that are sent to enqueue multiple Requests.\\n * @param pubkeys array of voted validators, vote goes into commonPoll if bytes(0) is given.\\n * @param owner the owner for all the Requests being created.\\n */\\n function enqueueBatch(\\n WithdrawalModuleStorage storage self,\\n uint256[] calldata sizes,\\n bytes[] calldata pubkeys,\\n address owner\\n ) external returns (uint256[] memory indexes) {\\n uint256 len = sizes.length;\\n require(len == pubkeys.length, \\\"WML:invalid input length\\\");\\n\\n uint256 commonPoll = self.queue.commonPoll;\\n uint256 requestedgETH = self.queue.requested;\\n uint256 totalSize;\\n\\n indexes = new uint256[](len);\\n for (uint256 i; i < len; ) {\\n indexes[i] = _enqueue(self, requestedgETH, sizes[i], owner);\\n\\n if (pubkeys[i].length == 0) {\\n commonPoll += sizes[i];\\n } else {\\n _vote(self, indexes[i], pubkeys[i], sizes[i]);\\n }\\n requestedgETH = requestedgETH + sizes[i];\\n totalSize += sizes[i];\\n\\n unchecked {\\n i += 1;\\n }\\n }\\n\\n self.queue.commonPoll = commonPoll;\\n self.queue.requested = requestedgETH;\\n\\n self.gETH.safeTransferFrom(msg.sender, address(this), self.POOL_ID, totalSize, \\\"\\\");\\n }\\n\\n /**\\n * @notice transferring the ownership of a Request to a new address\\n * @param index placement of the Request within the requests array.\\n * @param newOwner new address that will be eligible to dequeue a Request.\\n * @dev only current Owner can change the owner\\n */\\n function transferRequest(\\n WithdrawalModuleStorage storage self,\\n uint256 index,\\n address newOwner\\n ) external {\\n address oldOwner = self.requests[index].owner;\\n require(msg.sender == oldOwner, \\\"WML:not owner\\\");\\n require(newOwner != address(0), \\\"WML:cannot transfer to zero address\\\");\\n require(\\n self.requests[index].fulfilled < self.requests[index].size,\\n \\\"WML:cannot transfer fulfilled\\\"\\n );\\n\\n self.requests[index].owner = newOwner;\\n\\n emit RequestTransfer(index, oldOwner, newOwner);\\n }\\n\\n /**\\n * @custom:subsection ** FULFILL **\\n */\\n /**\\n * @custom:visibility -> view\\n */\\n /**\\n * @notice given a request, figure out the fulfillable gETH amount, limited up to its size.\\n * @param index placement of the Request within the requests array.\\n * @param qRealized self.queue.realized, might also be hot value for Batch optimizations\\n * @param qFulfilled self.queue.fulfilled, might also be a hot value for Batch optimizations\\n * @dev taking the previously fulfilled amount into consideration as it is the previously claimed part.\\n */\\n function fulfillable(\\n WithdrawalModuleStorage storage self,\\n uint256 index,\\n uint256 qRealized,\\n uint256 qFulfilled\\n ) public view returns (uint256) {\\n if (qRealized > qFulfilled) {\\n uint256 rTrigger = self.requests[index].trigger;\\n uint256 rSize = self.requests[index].size;\\n uint256 rFulfilled = self.requests[index].fulfilled;\\n\\n uint256 rFloor = rTrigger + rFulfilled;\\n uint256 rCeil = rTrigger + rSize;\\n\\n if (qRealized > rCeil) {\\n return rSize - rFulfilled;\\n } else if (qRealized > rFloor) {\\n return qRealized - rFloor;\\n } else {\\n return 0;\\n }\\n } else {\\n return 0;\\n }\\n }\\n\\n /**\\n * @custom:visibility -> internal\\n */\\n /**\\n * @notice by using the realized part of the size, we fulfill a single request by making use of the internal pricing.\\n * @dev we burn the realized size of the Queue here because we do not want this process to mess with price\\n * * calculations of the oracle.\\n */\\n function _fulfill(WithdrawalModuleStorage storage self, uint256 index) internal {\\n uint256 toFulfill = fulfillable(self, index, self.queue.realized, self.queue.fulfilled);\\n\\n if (toFulfill > 0) {\\n uint256 claimableETH = (toFulfill * self.queue.realizedPrice) / gETH_DENOMINATOR;\\n self.requests[index].claimableEther += claimableETH;\\n self.requests[index].fulfilled += toFulfill;\\n self.queue.fulfilled += toFulfill;\\n self.queue.fulfilledEtherBalance += claimableETH;\\n\\n self.gETH.burn(address(this), self.POOL_ID, toFulfill);\\n\\n emit Fulfill(index, toFulfill, claimableETH);\\n }\\n }\\n\\n /**\\n * @notice _fulfill with Batch optimizations\\n * @param qRealized queue.realized, as a hot value.\\n * @param qFulfilled queue.fulfilled, as a hot value.\\n * @param qPrice queue.realizedPrice, as a hot value.\\n */\\n function _fulfillBatch(\\n WithdrawalModuleStorage storage self,\\n uint256[] calldata indexes,\\n uint256 qRealized,\\n uint256 qFulfilled,\\n uint256 qPrice\\n ) internal {\\n uint256 indexesLen = indexes.length;\\n\\n uint256 oldFulfilled = qFulfilled;\\n uint256 qfulfilledEtherBalance;\\n for (uint256 i; i < indexesLen; ) {\\n uint256 toFulfill = fulfillable(self, indexes[i], qRealized, qFulfilled);\\n if (toFulfill > 0) {\\n uint256 claimableETH = (toFulfill * qPrice) / gETH_DENOMINATOR;\\n self.requests[indexes[i]].claimableEther += claimableETH;\\n self.requests[indexes[i]].fulfilled += toFulfill;\\n qFulfilled += toFulfill;\\n qfulfilledEtherBalance += claimableETH;\\n\\n emit Fulfill(indexes[i], toFulfill, claimableETH);\\n }\\n\\n unchecked {\\n i += 1;\\n }\\n }\\n\\n self.queue.fulfilled = qFulfilled;\\n self.queue.fulfilledEtherBalance += qfulfilledEtherBalance;\\n self.gETH.burn(address(this), self.POOL_ID, qFulfilled - oldFulfilled);\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n function fulfill(WithdrawalModuleStorage storage self, uint256 index) external {\\n _fulfill(self, index);\\n }\\n\\n function fulfillBatch(WithdrawalModuleStorage storage self, uint256[] calldata indexes) external {\\n _fulfillBatch(\\n self,\\n indexes,\\n self.queue.realized,\\n self.queue.fulfilled,\\n self.queue.realizedPrice\\n );\\n }\\n\\n /**\\n * @custom:subsection ** DEQUEUE **\\n */\\n\\n /**\\n * @custom:visibility -> internal\\n */\\n\\n /**\\n * @notice given a Request from the requests array, remove the part that is currently claimable.\\n * @param index placement of the Request within the requests array.\\n * @dev only owner can call this function\\n */\\n function _dequeue(\\n WithdrawalModuleStorage storage self,\\n uint256 index\\n ) internal returns (uint256 claimableETH) {\\n require(msg.sender == self.requests[index].owner, \\\"WML:not owner\\\");\\n\\n claimableETH = self.requests[index].claimableEther;\\n require(claimableETH > 0, \\\"WML:not claimable\\\");\\n\\n self.requests[index].claimableEther = 0;\\n\\n emit Dequeue(index, claimableETH);\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @notice given a Request from the requests array, claim the part that is currently claimable and forward the ether amount to the given receiver.\\n * @param index placement of the Request within the requests array.\\n * @dev only owner can call this function\\n */\\n function dequeue(WithdrawalModuleStorage storage self, uint256 index, address receiver) external {\\n require(receiver != address(0), \\\"WML:receiver cannot be zero address\\\");\\n\\n _fulfill(self, index);\\n uint256 claimableETH = _dequeue(self, index);\\n\\n // send ETH\\n (bool sent, ) = payable(receiver).call{value: claimableETH}(\\\"\\\");\\n require(sent, \\\"WML:Failed to send Ether\\\");\\n }\\n\\n /**\\n * @notice dequeue() with batch optimizations\\n */\\n function dequeueBatch(\\n WithdrawalModuleStorage storage self,\\n uint256[] calldata indexes,\\n address receiver\\n ) external {\\n require(receiver != address(0), \\\"WML:receiver cannot be zero address\\\");\\n\\n _fulfillBatch(\\n self,\\n indexes,\\n self.queue.realized,\\n self.queue.fulfilled,\\n self.queue.realizedPrice\\n );\\n\\n uint256 claimableETH;\\n uint256 indexesLen = indexes.length;\\n for (uint256 i; i < indexesLen; ) {\\n claimableETH += _dequeue(self, indexes[i]);\\n\\n unchecked {\\n i += 1;\\n }\\n }\\n\\n // send ETH\\n (bool sent, ) = payable(receiver).call{value: claimableETH}(\\\"\\\");\\n require(sent, \\\"WML:Failed to send Ether\\\");\\n }\\n\\n /**\\n * @custom:section ** PROCESS BALANCES MERKLE UPDATE **\\n */\\n\\n /**\\n * @custom:visibility -> internal\\n */\\n /**\\n * @notice\\n * @param pubkey public key of the given validator.\\n * @param reportedWithdrawn withdrawn Ether amount according to the fresh Merkle root.\\n * @param processedWithdrawn previously reported withdrawn amount.\\n * @dev cannot overflow since max fee is 10%, if we change fee structure ever, we need to reconsider the math there! \\n * * Note that if a validator is EXITED, we would assume 32 ETH that the pool put is also accounted for.\\n @return extra calculated profit since the last time validator was processed\\n */\\n function _distributeFees(\\n WithdrawalModuleStorage storage self,\\n Validator memory val,\\n uint256 reportedWithdrawn,\\n uint256 processedWithdrawn\\n ) internal returns (uint256 extra) {\\n // reportedWithdrawn > processedWithdrawn checks are done as it should be before calling this function\\n uint256 profit = reportedWithdrawn - processedWithdrawn;\\n\\n uint256 poolProfit = (profit * val.poolFee) / PERCENTAGE_DENOMINATOR;\\n uint256 operatorProfit = (profit * val.operatorFee) / PERCENTAGE_DENOMINATOR;\\n uint256 infrastructureProfit = (profit * val.infrastructureFee) / PERCENTAGE_DENOMINATOR;\\n\\n _getPortal(self).increaseWalletBalance{value: poolProfit}(val.poolId);\\n _getPortal(self).increaseWalletBalance{value: operatorProfit}(val.operatorId);\\n self.gatheredInfrastructureFees += infrastructureProfit;\\n\\n extra = ((profit - poolProfit) - operatorProfit) - infrastructureProfit;\\n }\\n\\n /**\\n * @notice acting like queue is one entity, we sell it some gETH in respect to Oracle price.\\n * * by using the Ether from the latest withdrawals.\\n */\\n function _realizeProcessedEther(\\n WithdrawalModuleStorage storage self,\\n uint256 processedBalance\\n ) internal {\\n uint256 pps = self.gETH.pricePerShare(self.POOL_ID);\\n\\n uint256 processedgETH = ((processedBalance * gETH_DENOMINATOR) / pps);\\n uint256 newPrice = pps;\\n\\n uint256 internalPrice = self.queue.realizedPrice;\\n if (internalPrice > 0) {\\n uint256 claimable = self.queue.realized - self.queue.fulfilled;\\n if (claimable > 0) {\\n newPrice =\\n ((claimable * internalPrice) + (processedBalance * gETH_DENOMINATOR)) /\\n (claimable + processedgETH);\\n }\\n }\\n\\n self.queue.realized += processedgETH;\\n self.queue.realizedEtherBalance += processedBalance;\\n self.queue.realizedPrice = newPrice;\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n /**\\n * @notice main function of this library, processing given information about the provided validators.\\n * @dev not all validators need to be processed all the time, process them as you need.\\n * @dev We do not check if validators should be processed at all.\\n * Because its up to user if they want to pay extra for unnecessary operations.\\n * We should not be charging others extra to save their gas.\\n * @dev It is advised to sort the pks according to the time passed, or remaining, to ensure that\\n * the preferred validators are prioritized in a case\\n * when the subset of given validators are not called for an exit.\\n */\\n function processValidators(\\n WithdrawalModuleStorage storage self,\\n bytes[] calldata pubkeys,\\n uint256[] calldata beaconBalances,\\n uint256[] calldata withdrawnBalances,\\n bytes32[][] calldata balanceProofs\\n ) external {\\n uint256 pkLen = pubkeys.length;\\n require(\\n pkLen == beaconBalances.length &&\\n pkLen == withdrawnBalances.length &&\\n pkLen == balanceProofs.length,\\n \\\"WML:invalid lengths\\\"\\n );\\n\\n Validator[] memory validators = new Validator[](pkLen);\\n\\n {\\n bytes32 balanceMerkleRoot = _getPortal(self).getBalancesMerkleRoot();\\n for (uint256 i; i < pkLen; ) {\\n // fill the validators array while checking the pool id\\n validators[i] = _getPortal(self).getValidator(pubkeys[i]);\\n\\n // check pubkey belong to this pool\\n require(validators[i].poolId == self.POOL_ID, \\\"WML:validator for an unknown pool\\\");\\n\\n // verify balances\\n bytes32 leaf = keccak256(\\n bytes.concat(keccak256(abi.encode(pubkeys[i], beaconBalances[i], withdrawnBalances[i])))\\n );\\n require(\\n MerkleProof.verify(balanceProofs[i], balanceMerkleRoot, leaf),\\n \\\"WML:not all proofs are valid\\\"\\n );\\n\\n unchecked {\\n i += 1;\\n }\\n }\\n }\\n\\n uint256 commonPoll = self.queue.commonPoll;\\n uint256 processed;\\n for (uint256 j; j < pkLen; ) {\\n uint256 oldWitBal = self.validators[pubkeys[j]].withdrawnBalance;\\n\\n self.validators[pubkeys[j]].beaconBalance = beaconBalances[j];\\n self.validators[pubkeys[j]].withdrawnBalance = withdrawnBalances[j];\\n\\n if (beaconBalances[j] == 0) {\\n // exit\\n if (withdrawnBalances[j] > oldWitBal + DCL.DEPOSIT_AMOUNT) {\\n processed += _distributeFees(\\n self,\\n validators[j],\\n withdrawnBalances[j],\\n oldWitBal + DCL.DEPOSIT_AMOUNT\\n );\\n processed += DCL.DEPOSIT_AMOUNT;\\n } else if (withdrawnBalances[j] >= oldWitBal) {\\n processed += withdrawnBalances[j] - oldWitBal;\\n } else {\\n revert(\\\"WML:invalid withdrawn balance\\\");\\n }\\n _finalizeExit(self, pubkeys[j]);\\n } else {\\n // check if should request exit\\n if (withdrawnBalances[j] > oldWitBal) {\\n processed += _distributeFees(self, validators[j], withdrawnBalances[j], oldWitBal);\\n }\\n commonPoll = _checkAndRequestExit(self, pubkeys[j], commonPoll);\\n }\\n\\n unchecked {\\n j += 1;\\n }\\n }\\n self.queue.commonPoll = commonPoll;\\n\\n if (processed > 0) {\\n _realizeProcessedEther(self, processed);\\n }\\n\\n emit Processed();\\n }\\n}\\n\",\"keccak256\":\"0xb4eb31f0382ed5aceaffa235743d49b3640aa24342a32683ebdc3b13cd7e4a3f\",\"license\":\"BUSL-1.1\"},\"contracts/modules/WithdrawalModule/structs/storage.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n// internal - interfaces\\nimport {IgETH} from \\\"../../../interfaces/IgETH.sol\\\";\\n// internal - structs\\nimport {Queue, Request, ValidatorData} from \\\"./utils.sol\\\";\\n\\n/**\\n * @notice Storage struct for the Withdrawal Package enabling the Queued Withdrawal Requests with instant run-off validator exit elections\\n * @param gETH constant, ERC1155, all Geode Staking Derivatives.\\n * @param PORTAL constant, address of the PORTAL.\\n * @param POOL_ID constant, ID of the pool, also the token ID of represented gETH.\\n * @param EXIT_THRESHOLD variable, current exit threshold that is set by the owner.\\n * @param queue main variables related to Enqueue-Dequeue operations.\\n * @param requests an array of requests\\n * @param validators as pubkey being the key, the related data for the validators of the given pool. Updated on processValidators.\\n *\\n * @dev normally we would put custom:storage-location erc7201:geode.storage.StakeModule\\n * but compiler throws an error... So np for now, just effects dev ex.\\n **/\\nstruct WithdrawalModuleStorage {\\n IgETH gETH;\\n address PORTAL;\\n uint256 POOL_ID;\\n uint256 EXIT_THRESHOLD;\\n uint256 gatheredInfrastructureFees;\\n Queue queue;\\n Request[] requests;\\n mapping(bytes => ValidatorData) validators;\\n}\\n\",\"keccak256\":\"0xd03e0163b0795cdce81ac61536c047c784e8c75bea7e7d0d34a964b744811a61\",\"license\":\"BUSL-1.1\"},\"contracts/modules/WithdrawalModule/structs/utils.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n/**\\n * @param beaconBalance Beacon Chain balance of the validator (current).\\n * @param withdrawnBalance Representing any Ether sent from Beacon Chain to a withdrawal package (cumulative).\\n * @param poll size of the requests that specifically voted for given validator to exit. as in gETH.\\n **/\\nstruct ValidatorData {\\n uint256 beaconBalance;\\n uint256 withdrawnBalance;\\n uint256 poll;\\n}\\n\\n/**\\n * @param owner the address that can dequeue the request. Ownership can be transferred.\\n * @param trigger cumulative sum of the previous requests, as in gETH.\\n * @param size size of the withdrawal request, as in gETH.\\n * @param fulfilled part of the 'size' that became available after being processed relative to the 'realizedPrice'. as in gETH.\\n * @param claimableEther current ETH amount that can be claimed by the Owner, increased in respect to 'fulfilled' and 'realizedPrice', decreased with dequeue.\\n **/\\nstruct Request {\\n address owner;\\n uint256 trigger;\\n uint256 size;\\n uint256 fulfilled;\\n uint256 claimableEther;\\n}\\n\\n/**\\n * @param requested cumulative size of all requests, as in gETH.\\n * ex: --- ------ ------ - - --- : 20 : there are 6 requests totaling up to 20 gETH.\\n * @param realized cumulative size of gETH that is processed and can be used to fulfill Requests, as in gETH\\n * ex: ----- -- -- - ----- -- : 17 : there are 17 gETH, processed as a response to the withdrawn funds.\\n * @param fulfilled cumulative size of the fulfilled requests, claimed or claimable, as in gETH\\n * ex: --- ----xx ------ x - ooo : 14 : there are 15 gETH being used to fulfill requests,including one that is partially filled. 3 gETH is still claimable.\\n * @param realizedEtherBalance cumulative size of the withdrawn and realized balances. Note that, (realizedEtherBalance * realizedPrice != realized) as price changes constantly.\\n * @param fulfilledEtherBalance cumulative size of the fulfilled requests.\\n * @param realizedPrice current Price of the queue, used when fulfilling a Request, updated with processValidators.\\n * @param commonPoll current size of requests that did not vote on any specific validator, as in gETH.\\n **/\\nstruct Queue {\\n uint256 requested;\\n uint256 realized;\\n uint256 realizedEtherBalance;\\n uint256 realizedPrice;\\n uint256 fulfilled;\\n uint256 fulfilledEtherBalance;\\n uint256 commonPoll;\\n}\\n\",\"keccak256\":\"0x3eda33c444a9331c757cd1cd1b069b398a9c8afa9bb1130f42908ff639ed988e\",\"license\":\"BUSL-1.1\"},\"contracts/packages/WithdrawalPackage.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\nimport {ERC1967Utils} from \\\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\\\";\\n// internal - globals\\nimport {ID_TYPE} from \\\"../globals/id_type.sol\\\";\\nimport {RESERVED_KEY_SPACE as rks} from \\\"../globals/reserved_key_space.sol\\\";\\n// internal - interfaces\\nimport {IGeodeModule} from \\\"../interfaces/modules/IGeodeModule.sol\\\";\\nimport {IWithdrawalModule} from \\\"../interfaces/modules/IWithdrawalModule.sol\\\";\\nimport {IWithdrawalPackage} from \\\"../interfaces/packages/IWithdrawalPackage.sol\\\";\\nimport {IPortal} from \\\"../interfaces/IPortal.sol\\\";\\n// internal - structs\\nimport {GeodeModuleStorage} from \\\"../modules/GeodeModule/structs/storage.sol\\\";\\nimport {WithdrawalModuleStorage} from \\\"../modules/WithdrawalModule/structs/storage.sol\\\";\\n// internal - libraries\\nimport {WithdrawalModuleLib as WML} from \\\"../modules/WithdrawalModule/libs/WithdrawalModuleLib.sol\\\";\\n// internal - contracts\\nimport {GeodeModule} from \\\"../modules/GeodeModule/GeodeModule.sol\\\";\\nimport {WithdrawalModule} from \\\"../modules/WithdrawalModule/WithdrawalModule.sol\\\";\\n\\ncontract WithdrawalPackage is IWithdrawalPackage, GeodeModule, WithdrawalModule {\\n using WML for WithdrawalModuleStorage;\\n /**\\n * @custom:section ** VARIABLES **\\n * Following immutable parameters are set when the referance library implementation is deployed.\\n * Making necessary data for initialization reachable for all instances of LP.\\n */\\n /// @notice gETH position\\n address internal immutable gETHPos;\\n /// @notice Portal position\\n address internal immutable portalPos;\\n\\n /**\\n * @custom:section ** MODIFIERS **\\n */\\n\\n modifier onlyOwner() {\\n require(msg.sender == _getGeodeModuleStorage().SENATE, \\\"WP:sender not owner\\\");\\n _;\\n }\\n\\n /**\\n * @custom:section ** INITIALIZING **\\n */\\n /**\\n * @custom:oz-upgrades-unsafe-allow constructor\\n *\\n * @dev we don't want to provide these package-specific not-changing parameters\\n * accross all instances of the packages.\\n * So we will store them in the ref implementation contract of the package,\\n * and fetch when needed on initialization.\\n */\\n constructor(address _gETHPos, address _portalPos) {\\n require(_gETHPos != address(0), \\\"WP:_gETHPos cannot be zero\\\");\\n require(_portalPos != address(0), \\\"WP:_portalPos cannot be zero\\\");\\n\\n gETHPos = _gETHPos;\\n portalPos = _portalPos;\\n\\n _disableInitializers();\\n }\\n\\n /**\\n * @dev While 'data' parameter is not currently used it is a standarized approach on all\\n * * GeodePackages have the same function signature on 'initialize'.\\n */\\n function initialize(\\n uint256 poolId,\\n address poolOwner,\\n bytes calldata versionName,\\n bytes calldata data\\n ) public virtual override initializer {\\n __WithdrawalPackage_init(poolId, poolOwner, versionName);\\n }\\n\\n function __WithdrawalPackage_init(\\n uint256 poolId,\\n address poolOwner,\\n bytes calldata versionName\\n ) internal onlyInitializing {\\n __GeodeModule_init(\\n portalPos,\\n poolOwner,\\n type(uint256).max,\\n ID_TYPE.PACKAGE_WITHDRAWAL,\\n versionName\\n );\\n __WithdrawalModule_init(gETHPos, portalPos, poolId);\\n __WithdrawalPackage_init_unchained();\\n }\\n\\n function __WithdrawalPackage_init_unchained() internal onlyInitializing {}\\n\\n function getPoolId() public view override returns (uint256) {\\n return _getWithdrawalModuleStorage().POOL_ID;\\n }\\n\\n /**\\n * @dev GeodeModule override\\n */\\n function getProposedVersion() public view virtual override returns (uint256) {\\n GeodeModuleStorage storage GMStorage = _getGeodeModuleStorage();\\n\\n return IPortal(GMStorage.GOVERNANCE).getPackageVersion(GMStorage.PACKAGE_TYPE);\\n }\\n\\n /**\\n * @dev GeodeModule override\\n */\\n function isolationMode()\\n external\\n view\\n virtual\\n override(GeodeModule, IGeodeModule)\\n returns (bool)\\n {\\n if (paused()) {\\n return true;\\n }\\n\\n GeodeModuleStorage storage GMStorage = _getGeodeModuleStorage();\\n\\n if (\\n GMStorage.CONTRACT_VERSION !=\\n IPortal(GMStorage.GOVERNANCE).getPackageVersion(GMStorage.PACKAGE_TYPE)\\n ) {\\n return true;\\n }\\n\\n if (GMStorage.APPROVED_UPGRADE != ERC1967Utils.getImplementation()) {\\n return true;\\n }\\n\\n if (\\n IPortal(GMStorage.GOVERNANCE).readAddress(getPoolId(), rks.CONTROLLER) != GMStorage.SENATE\\n ) {\\n return true;\\n }\\n\\n return false;\\n }\\n\\n /**\\n * @custom:section ** ADMIN FUNCTIONS **\\n *\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @custom:subsection ** UPGRADABILITY FUNCTIONS **\\n */\\n\\n /**\\n * @dev IGeodePackage override\\n */\\n function pullUpgrade() external virtual override onlyOwner {\\n GeodeModuleStorage storage GMStorage = _getGeodeModuleStorage();\\n IPortal Portal = IPortal(GMStorage.GOVERNANCE);\\n\\n require(!Portal.isolationMode(), \\\"WP:Portal is isolated\\\");\\n require(\\n GMStorage.CONTRACT_VERSION != Portal.getPackageVersion(GMStorage.PACKAGE_TYPE),\\n \\\"WP:no upgrades\\\"\\n );\\n\\n uint256 id = Portal.pushUpgrade(GMStorage.PACKAGE_TYPE);\\n approveProposal(id);\\n }\\n\\n /**\\n * @custom:subsection ** PAUSABILITY FUNCTIONS **\\n */\\n\\n /**\\n * @notice pausing the contract activates the isolationMode\\n */\\n function pause() external virtual override(WithdrawalModule, IWithdrawalModule) onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * @notice unpausing the contract deactivates the isolationMode\\n */\\n function unpause() external virtual override(WithdrawalModule, IWithdrawalModule) onlyOwner {\\n _unpause();\\n }\\n\\n /**\\n * @custom:subsection ** WITHDRAWAL QUEUE **\\n *\\n * @dev WM override\\n */\\n function setExitThreshold(\\n uint256 newThreshold\\n ) external virtual override(WithdrawalModule, IWithdrawalModule) onlyOwner {\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n $.setExitThreshold(newThreshold);\\n }\\n\\n /**\\n * @custom:subsection ** INFRASTRUCTURE FEE **\\n *\\n * @dev WM override\\n */\\n function claimInfrastructureFees(\\n address receiver\\n ) external virtual override(WithdrawalModule, IWithdrawalModule) returns (bool success) {\\n require(msg.sender == IPortal(_getGeodeModuleStorage().GOVERNANCE).getGovernance());\\n\\n WithdrawalModuleStorage storage $ = _getWithdrawalModuleStorage();\\n uint256 claimable = $.gatheredInfrastructureFees;\\n\\n (success, ) = payable(receiver).call{value: claimable}(\\\"\\\");\\n require(success, \\\"WP:Failed to send ETH\\\");\\n }\\n\\n /**\\n * @notice fallback functions: receive\\n */\\n\\n receive() external payable {}\\n}\\n\",\"keccak256\":\"0xb8d2e194da87e5ced2e8e63c2ef5f4e7cffd5697efeb3c36810c72c895dfbd69\",\"license\":\"BUSL-1.1\"}},\"version\":1}", + "bytecode": "0x60e0604052306080523480156200001557600080fd5b506040516200439d3803806200439d8339810160408190526200003891620001e2565b6001600160a01b038216620000945760405162461bcd60e51b815260206004820152601a60248201527f57503a5f67455448506f732063616e6e6f74206265207a65726f00000000000060448201526064015b60405180910390fd5b6001600160a01b038116620000ec5760405162461bcd60e51b815260206004820152601c60248201527f57503a5f706f7274616c506f732063616e6e6f74206265207a65726f0000000060448201526064016200008b565b6001600160a01b0380831660a052811660c0526200010962000111565b50506200021a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620001625760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001c25780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b0381168114620001dd57600080fd5b919050565b60008060408385031215620001f657600080fd5b6200020183620001c5565b91506200021160208401620001c5565b90509250929050565b60805160a05160c05161413e6200025f60003960008181612635015261268801526000612667015260008181612207015281816122300152612449015261413e6000f3fe6080604052600436106102e85760003560e01c80638650c07211610190578063bf211ed1116100dc578063dca1086111610095578063e72b1d6d1161006f578063e72b1d6d14610a06578063e768887e14610a26578063e78e839714610a46578063f23a6e6114610a6657600080fd5b8063dca10861146109a6578063e02a5208146109c6578063e68e1218146109e657600080fd5b8063bf211ed114610855578063c58343ef1461089d578063c7f758a8146108ef578063d2583aee1461091c578063d99a16c514610966578063dab840c71461098657600080fd5b8063ac144d8b11610149578063ad4ac4c411610123578063ad4ac4c41461078d578063ad8655cb146107db578063aec98863146107fb578063bc197c811461081057600080fd5b8063ac144d8b1461070f578063ac9650d81461072f578063ad3cb1cc1461075c57600080fd5b80638650c072146106565780638794fabc1461066b5780638aa104351461068b57806398951b56146106a05780639934b281146106cf57806399ac48ba146106ef57600080fd5b806356a72dbf1161024f578063722679541161020857806377a3a813116101e257806377a3a813146105c65780637aed42ce146106015780637e5358d1146106215780638456cb591461064157600080fd5b80637226795414610564578063745653de14610591578063753b8807146105a657600080fd5b806356a72dbf146104855780635731bc1d146104a55780635a34bb15146104c55780635c975abb146104e55780635d9e085d1461050a5780636d07e4041461054457600080fd5b8063419754c5116102a1578063419754c5146103d05780634b75642f146103f05780634f1ef286146104105780634f5141e91461042357806352d1902d146104505780635329512b1461046557600080fd5b806301ffc9a7146102f45780631da7159114610329578063289b3c0d1461035757806338fff2d0146103845780633b8ba862146103995780633f4ba83a146103b957600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004613072565b610a92565b60405190151581526020015b60405180910390f35b34801561033557600080fd5b5061034961034436600461309c565b610ac9565b604051908152602001610320565b34801561036357600080fd5b5061036c610adc565b6040516001600160a01b039091168152602001610320565b34801561039057600080fd5b50610349610af7565b3480156103a557600080fd5b506103496103b436600461311b565b610b0a565b3480156103c557600080fd5b506103ce610bb5565b005b3480156103dc57600080fd5b506103146103eb36600461317e565b610bfb565b3480156103fc57600080fd5b506103ce61040b36600461319b565b610d41565b6103ce61041e366004613277565b610df0565b34801561042f57600080fd5b5061044361043e36600461330a565b610e0f565b604051610320919061338d565b34801561045c57600080fd5b50610349610ea4565b34801561047157600080fd5b5061036c6104803660046133d1565b610ec1565b34801561049157600080fd5b506103496104a036600461309c565b610ee7565b3480156104b157600080fd5b506103ce6104c03660046133fd565b610f0b565b3480156104d157600080fd5b506103496104e0366004613453565b610f8b565b3480156104f157600080fd5b506000805160206140e98339815191525460ff16610314565b34801561051657600080fd5b5061034961052536600461319b565b60009081526000805160206140a9833981519152602052604090205490565b34801561055057600080fd5b506103ce61055f36600461349e565b610fc2565b34801561057057600080fd5b5061058461057f36600461309c565b61101d565b604051610320919061351e565b34801561059d57600080fd5b50610349611039565b3480156105b257600080fd5b506103ce6105c136600461319b565b6110ba565b3480156105d257600080fd5b506105e66105e1366004613531565b611106565b60408051938452602084019290925290820152606001610320565b34801561060d57600080fd5b5061031461061c366004613531565b611192565b34801561062d57600080fd5b5061034961063c36600461319b565b61121c565b34801561064d57600080fd5b506103ce6112bc565b34801561066257600080fd5b506103146112f7565b34801561067757600080fd5b506103ce610686366004613572565b611482565b34801561069757600080fd5b506103496115fb565b3480156106ac57600080fd5b506106c06106bb36600461319b565b611610565b6040516103209392919061366e565b3480156106db57600080fd5b506103ce6106ea366004613695565b6116e0565b3480156106fb57600080fd5b5061036c61070a36600461309c565b6117f6565b34801561071b57600080fd5b5061034961072a366004613720565b611812565b34801561073b57600080fd5b5061074f61074a36600461377e565b6118aa565b60405161032091906137b3565b34801561076857600080fd5b50610584604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561079957600080fd5b506107a2611993565b604080516001600160a01b039687168152948616602086015292909416918301919091526060820152608081019190915260a001610320565b3480156107e757600080fd5b506103ce6107f636600461317e565b6119da565b34801561080757600080fd5b506103ce611a2e565b34801561081c57600080fd5b5061083c61082b36600461389e565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610320565b34801561086157600080fd5b5061086a611c4c565b604080516001600160a01b039687168152959094166020860152928401919091526060830152608082015260a001610320565b3480156108a957600080fd5b506108bd6108b836600461319b565b611c92565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610320565b3480156108fb57600080fd5b5061090f61090a36600461319b565b611d88565b604051610320919061394b565b34801561092857600080fd5b50610931611e48565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610320565b34801561097257600080fd5b506103ce61098136600461349e565b611e96565b34801561099257600080fd5b506103ce6109a136600461317e565b611f22565b3480156109b257600080fd5b506103ce6109c136600461377e565b611f76565b3480156109d257600080fd5b506103496109e136600461309c565b611fbe565b3480156109f257600080fd5b50610349610a01366004613531565b612001565b348015610a1257600080fd5b50610349610a213660046133d1565b612093565b348015610a3257600080fd5b50610584610a413660046133d1565b6120b0565b348015610a5257600080fd5b506103ce610a6136600461349e565b6120cd565b348015610a7257600080fd5b5061083c610a81366004613999565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b1480610ac357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000610ad58383612128565b9392505050565b600080610ae7612154565b546001600160a01b031692915050565b6000610b01612178565b60020154905090565b600080610b15612154565b6040516318ffae5d60e21b81529091507387828ff83A8B257D544c06fe64B6838DD2Fb0ED1906363feb97490610b699084906000805160206140a9833981519152908c908c908c908c908c90600401613a2a565b602060405180830381865af4158015610b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baa9190613a72565b979650505050505050565b610bbd612154565b600101546001600160a01b03163314610bf15760405162461bcd60e51b8152600401610be890613a8b565b60405180910390fd5b610bf961219c565b565b6000610c05612154565b546040805163289b3c0d60e01b815290516001600160a01b039092169163289b3c0d916004808201926020929091908290030181865afa158015610c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c719190613ab8565b6001600160a01b0316336001600160a01b031614610c8e57600080fd5b6000610c98612178565b6004810154604051919250906001600160a01b038516908290600081818185875af1925050503d8060008114610cea576040519150601f19603f3d011682016040523d82523d6000602084013e610cef565b606091505b50508093505082610d3a5760405162461bcd60e51b81526020600482015260156024820152740aea0748cc2d2d8cac840e8de40e6cadcc8408aa89605b1b6044820152606401610be8565b5050919050565b610d49612154565b600101546001600160a01b03163314610d745760405162461bcd60e51b8152600401610be890613a8b565b6000610d7e612178565b6040516357babf8b60e01b81526004810182905260248101849052909150737224F427fA92CE4FD8d0058C354634217438b34c906357babf8b906044015b60006040518083038186803b158015610dd457600080fd5b505af4158015610de8573d6000803e3d6000fd5b505050505050565b610df86121fc565b610e018261228a565b610e0b828261237c565b5050565b60606000610e1b612178565b604051630b4d65a760e41b8152909150737224F427fA92CE4FD8d0058C354634217438b34c9063b4d65a7090610e5f9084908b908b908b908b908b90600401613b98565b600060405180830381865af4158015610e7c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610baa9190810190613be1565b6000610eae61243e565b506000805160206140c983398151915290565b60006000805160206140a9833981519152610ede81868686612487565b95945050505050565b60006000805160206140a9833981519152610f038185856124c5565b949350505050565b6000610f15612178565b604051633da28bc160e11b8152909150737224F427fA92CE4FD8d0058C354634217438b34c90637b45178290610f55908490889088908890600401613c66565b60006040518083038186803b158015610f6d57600080fd5b505af4158015610f81573d6000803e3d6000fd5b5050505050505050565b6000838383604051602001610fa293929190613c99565b60408051601f198184030181529190528051602090910120949350505050565b6040516330b2175760e11b81526000805160206140a98339815191526004820152602481018390526001600160a01b03821660448201527387828ff83A8B257D544c06fe64B6838DD2Fb0ED1906361642eae90606401610dbc565b60606000805160206140a9833981519152610f038185856124ef565b600080611044612154565b8054600480830154604051630eca989d60e11b8152918201529192506001600160a01b031690631d95313a90602401602060405180830381865afa158015611090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b49190613a72565b91505090565b60006110c4612178565b6040516311aeabff60e31b81526004810182905260248101849052909150737224F427fA92CE4FD8d0058C354634217438b34c90638d755ff890604401610dbc565b600080600080611114612178565b905080600d01868660405161112a929190613cbd565b908152604051908190036020018120549450600d82019061114e9088908890613cbd565b908152602001604051809103902060010154925080600d018686604051611176929190613cbd565b9081526020016040518091039020600201549150509250925092565b60008061119d612178565b6040516345bece4760e11b8152909150737224F427fA92CE4FD8d0058C354634217438b34c90638b7d9c8e906111db90849088908890600401613ccd565b602060405180830381865af41580156111f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f039190613ce7565b600080611227612178565b6006810154600982015460405163928b8e4d60e01b8152600481018490526024810187905260448101929092526064820152909150737224F427fA92CE4FD8d0058C354634217438b34c9063928b8e4d90608401602060405180830381865af4158015611298573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad59190613a72565b6112c4612154565b600101546001600160a01b031633146112ef5760405162461bcd60e51b8152600401610be890613a8b565b610bf96125a1565b60006113126000805160206140e98339815191525460ff1690565b1561131d5750600190565b6000611327612154565b8054600480830154604051630eca989d60e11b8152918201529192506001600160a01b031690631d95313a90602401602060405180830381865afa158015611373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113979190613a72565b8160050154146113a957600191505090565b6113b16125ea565b60028201546001600160a01b039081169116146113d057600191505090565b600181015481546001600160a01b0391821691166399ac48ba6113f1610af7565b6040516001600160e01b031960e084901b16815260048101919091526921a7a72a2927a62622a960b11b6024820152604401602060405180830381865afa158015611440573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114649190613ab8565b6001600160a01b03161461147a57600191505090565b600091505090565b600061148c612178565b60018101546002820154604051630300147560e11b815260048101919091529192506001600160a01b03169063060028ea90602401602060405180830381865afa1580156114de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115029190613ce7565b6115745760018101546002820154604051637e1ece9f60e01b81526001600160a01b0390921691637e1ece9f9161154191889088908890600401613d09565b600060405180830381600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b505050505b80737224F427fA92CE4FD8d0058C354634217438b34c6311c9522c90918e8e8e8e8e8e8e8e6040518a63ffffffff1660e01b81526004016115bd99989796959493929190613d29565b60006040518083038186803b1580156115d557600080fd5b505af41580156115e9573d6000803e3d6000fd5b50505050505050505050505050505050565b600080611606612154565b6005015492915050565b6000806060600061161f612154565b90507387828ff83A8B257D544c06fe64B6838DD2Fb0ED1636dc129ae826000805160206140a98339815191526040516001600160e01b031960e085901b1681526004810192909252602482015260448101889052606401600060405180830381865af4158015611693573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116bb9190810190613e57565b6004840154929650909450925083036116d8576116d88486612606565b509193909250565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156117255750825b90506000826001600160401b031660011480156117415750303b155b90508115801561174f575080155b1561176d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561179757845460ff60401b1916600160401b1785555b6117a38b8b8b8b612628565b83156117e957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050565b60006000805160206140a9833981519152610f038185856126bb565b60008061181d612178565b60405163020ec69760e61b8152909150737224F427fA92CE4FD8d0058C354634217438b34c906383b1a5c09061185f9084908a908a908a908a90600401613eb0565b602060405180830381865af415801561187c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a09190613a72565b9695505050505050565b6060816001600160401b038111156118c4576118c46131b4565b6040519080825280602002602001820160405280156118f757816020015b60608152602001906001900390816118e25790505b50905060005b8281101561198c576119673085858481811061191b5761191b613eea565b905060200281019061192d9190613f00565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126ef92505050565b82828151811061197957611979613eea565b60209081029190910101526001016118fd565b5092915050565b6000806000806000806119a4612154565b80546001820154600283015460038401546004909401546001600160a01b039384169b9284169a50921697509195509350915050565b60006119e4612154565b6040516361ac0f7160e11b8152600481018290526001600160a01b03841660248201529091507387828ff83A8B257D544c06fe64B6838DD2Fb0ED19063c3581ee290604401610dbc565b611a36612154565b600101546001600160a01b03163314611a615760405162461bcd60e51b8152600401610be890613a8b565b6000611a6b612154565b805460408051634328603960e11b815290519293506001600160a01b03909116918291638650c0729160048083019260209291908290030181865afa158015611ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adc9190613ce7565b15611b215760405162461bcd60e51b815260206004820152601560248201527415d40e941bdc9d185b081a5cc81a5cdbdb185d1959605a1b6044820152606401610be8565b600482810154604051630eca989d60e11b8152918201526001600160a01b03821690631d95313a90602401602060405180830381865afa158015611b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8d9190613a72565b826005015403611bd05760405162461bcd60e51b815260206004820152600e60248201526d57503a6e6f20757067726164657360901b6044820152606401610be8565b60048281015460405163e3099e0960e01b8152918201526000906001600160a01b0383169063e3099e09906024016020604051808303816000875af1158015611c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c419190613a72565b9050610de881611610565b600080600080600080611c5d612178565b80546001820154600283015460038401546004909401546001600160a01b039384169b92909316995097509195509350915050565b600080600080600080611ca3612178565b905080600c018781548110611cba57611cba613eea565b6000918252602090912060059091020154600c820180546001600160a01b0390921697509088908110611cef57611cef613eea565b906000526020600020906005020160010154945080600c018781548110611d1857611d18613eea565b906000526020600020906005020160020154935080600c018781548110611d4157611d41613eea565b906000526020600020906005020160030154925080600c018781548110611d6a57611d6a613eea565b90600052602060002090600502016004015491505091939590929450565b611dbc604051806080016040528060006001600160a01b031681526020016000815260200160608152602001600081525090565b6000611dc6612154565b6040516337a3804160e11b815260048101829052602481018590529091507387828ff83A8B257D544c06fe64B6838DD2Fb0ED190636f47008290604401600060405180830381865af4158015611e20573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ad59190810190613f46565b600080600080600080600080611e5c612178565b60058101546006820154600783015460088401546009850154600a860154600b90960154949e939d50919b50995097509195509350915050565b6000611ea0612178565b604051630222d4bb60e11b815260048101829052602481018590526001600160a01b0384166044820152909150737224F427fA92CE4FD8d0058C354634217438b34c90630445a976906064015b60006040518083038186803b158015611f0557600080fd5b505af4158015611f19573d6000803e3d6000fd5b50505050505050565b6000611f2c612154565b6040516307c0451b60e11b8152600481018290526001600160a01b03841660248201529091507387828ff83A8B257D544c06fe64B6838DD2Fb0ED190630f808a3690604401610dbc565b6000611f80612178565b604051634699d87760e11b8152909150737224F427fA92CE4FD8d0058C354634217438b34c90638d33b0ee90611eed90849087908790600401613ff2565b60008281526000805160206140a9833981519152602081905260408220805484908110611fed57611fed613eea565b906000526020600020015491505092915050565b60008061200c612178565b604051631420eb4b60e21b8152909150737224F427fA92CE4FD8d0058C354634217438b34c90635083ad2c9061204a90849088908890600401613ccd565b6040805180830381865af4158015612066573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208a919061400c565b50949350505050565b60006000805160206140a9833981519152610ede8186868661275c565b60606000805160206140a9833981519152610ede8186868661278b565b60006120d7612178565b6040516393c8c5e960e01b815260048101829052602481018590526001600160a01b0384166044820152909150737224F427fA92CE4FD8d0058C354634217438b34c906393c8c5e990606401611eed565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b7f121584cf2b7b1dee51ceaabc76cdefc72f829ce42dd8cc5282d8e9f009b0420090565b7f50605cc6f5170f0cdbb610edd2214831ea96f61cd1eba92cf58939f65736af0090565b6121a4612842565b6000805160206140e9833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061226c57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166122606125ea565b6001600160a01b031614155b15610bf95760405163703e46dd60e11b815260040160405180910390fd5b6000612294612154565b90507387828ff83A8B257D544c06fe64B6838DD2Fb0ED163b57e6b0b82846122ba6125ea565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039182166024840152166044820152606401602060405180830381865af415801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190613ce7565b610e0b5760405162461bcd60e51b815260206004820152601960248201527f474d3a6e6f7420616c6c6f77656420746f2075706772616465000000000000006044820152606401610be8565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156123d6575060408051601f3d908101601f191682019092526123d391810190613a72565b60015b6123fe57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610be8565b6000805160206140c9833981519152811461242f57604051632a87526960e21b815260048101829052602401610be8565b6124398383612872565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bf95760405163703e46dd60e11b815260040160405180910390fd5b60008460030160006124a28461249d8888612128565b612128565b81526020810191909152604001600020546001600160a01b031695945050505050565b60008360010160006124d78585612128565b81526020019081526020016000205490509392505050565b60608360020160006125018585612128565b8152602001908152602001600020805461251a90614030565b80601f016020809104026020016040519081016040528092919081815260200182805461254690614030565b80156125935780601f1061256857610100808354040283529160200191612593565b820191906000526020600020905b81548152906001019060200180831161257657829003601f168201915b505050505090509392505050565b6125a96128c8565b6000805160206140e9833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336121de565b6000805160206140c9833981519152546001600160a01b031690565b61261f8260405180602001604052806000815250610df0565b610e0b816128f9565b612630612944565b6126627f00000000000000000000000000000000000000000000000000000000000000008460001961271b868661298d565b6126ad7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000866129b3565b6126b56129de565b50505050565b60008360030160006126cd8585612128565b81526020810191909152604001600020546001600160a01b0316949350505050565b6060600080846001600160a01b03168460405161270c919061406a565b600060405180830381855af49150503d8060008114612747576040519150601f19603f3d011682016040523d82523d6000602084013e61274c565b606091505b5091509150610ede8583836129e6565b60008460010160006127728461249d8888612128565b8152602001908152602001600020549050949350505050565b60608460020160006127a18461249d8888612128565b815260200190815260200160002080546127ba90614030565b80601f01602080910402602001604051908101604052809291908181526020018280546127e690614030565b80156128335780601f1061280857610100808354040283529160200191612833565b820191906000526020600020905b81548152906001019060200180831161281657829003601f168201915b50505050509050949350505050565b6000805160206140e98339815191525460ff16610bf957604051638dfc202b60e01b815260040160405180910390fd5b61287b82612a3b565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156128c05761243982826126ef565b610e0b612aa0565b6000805160206140e98339815191525460ff1615610bf95760405163d93c066560e01b815260040160405180910390fd5b6000612903612154565b600581018390556040518381529091507ffddcded6b4f4730c226821172046b48372d3cd963c159701ae1b7c3bcac541bb9060200160405180910390a15050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610bf957604051631afcd79f60e31b815260040160405180910390fd5b612995612944565b61299d6129de565b6129a56129de565b610de8868686868686612abf565b6129bb612944565b6129c3612e4b565b6129cb612e5b565b6129d36129de565b612439838383612e6b565b610bf9612944565b6060826129fb576129f682612fc3565b610ad5565b8151158015612a1257506001600160a01b0384163b155b1561198c57604051639996b31560e01b81526001600160a01b0385166004820152602401610be8565b806001600160a01b03163b600003612a7157604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610be8565b6000805160206140c983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b3415610bf95760405163b398979f60e01b815260040160405180910390fd5b612ac7612944565b6001600160a01b038616612b1d5760405162461bcd60e51b815260206004820152601c60248201527f474d3a676f7665726e616e63652063616e6e6f74206265207a65726f000000006044820152606401610be8565b6001600160a01b038516612b735760405162461bcd60e51b815260206004820152601860248201527f474d3a73656e6174652063616e6e6f74206265207a65726f00000000000000006044820152606401610be8565b428411612bb85760405162461bcd60e51b8152602060048201526013602482015272474d3a6c6f772073656e61746545787069727960681b6044820152606401610be8565b82600003612c085760405162461bcd60e51b815260206004820152601d60248201527f474d3a7061636b616765547970652063616e6e6f74206265207a65726f0000006044820152606401610be8565b6000819003612c645760405162461bcd60e51b815260206004820152602260248201527f474d3a696e697456657273696f6e4e616d652063616e6e6f7420626520656d70604482015261747960f01b6064820152608401610be8565b6000612c6e612154565b8054336001600160a01b031991821681178355600183018054909216179055600381018690556004810185905590506000805160206140a983398151915260007387828ff83A8B257D544c06fe64B6838DD2Fb0ED16363feb9748484612cd26125ea565b8a8a8a620151806040518863ffffffff1660e01b8152600401612cfb9796959493929190613a2a565b602060405180830381865af4158015612d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3c9190613a72565b6040516336e094d760e11b81526004810185905260248101849052604481018290529091507387828ff83A8B257D544c06fe64B6838DD2Fb0ED190636dc129ae90606401600060405180830381865af4158015612d9d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612dc59190810190613e57565b505050612e13612e0e86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506004860154612fef565b6128f9565b505080546001600160a01b039788166001600160a01b0319918216178255600190910180549690971695169490941790945550505050565b612e53612944565b610bf9613023565b612e63612944565b610bf9613051565b612e73612944565b6001600160a01b038316612ec95760405162461bcd60e51b815260206004820152601e60248201527f574d3a674554482063616e6e6f74206265207a65726f206164647265737300006044820152606401610be8565b6001600160a01b038216612f1f5760405162461bcd60e51b815260206004820181905260248201527f574d3a706f7274616c2063616e6e6f74206265207a65726f20616464726573736044820152606401610be8565b6000612f29612178565b80546001600160a01b03199081166001600160a01b038781169182178455600180850180549094169188169190911790925560028301859055640165a0bc006003840155604051630492f6e160e01b8152600481018690526024810192909252919250630492f6e190604401600060405180830381600087803b158015612faf57600080fd5b505af1158015610f81573d6000803e3d6000fd5b805115612fd35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50565b60008282604051602001613004929190614086565b60408051601f1981840301815291905280516020909101209392505050565b61302b612944565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b613059612944565b6000805160206140e9833981519152805460ff19169055565b60006020828403121561308457600080fd5b81356001600160e01b031981168114610ad557600080fd5b600080604083850312156130af57600080fd5b50508035926020909101359150565b6001600160a01b0381168114612fec57600080fd5b60008083601f8401126130e557600080fd5b5081356001600160401b038111156130fc57600080fd5b60208301915083602082850101111561311457600080fd5b9250929050565b60008060008060006080868803121561313357600080fd5b853561313e816130be565b94506020860135935060408601356001600160401b0381111561316057600080fd5b61316c888289016130d3565b96999598509660600135949350505050565b60006020828403121561319057600080fd5b8135610ad5816130be565b6000602082840312156131ad57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156131f2576131f26131b4565b604052919050565b60006001600160401b03821115613213576132136131b4565b50601f01601f191660200190565b600082601f83011261323257600080fd5b8135613245613240826131fa565b6131ca565b81815284602083860101111561325a57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561328a57600080fd5b8235613295816130be565b915060208301356001600160401b038111156132b057600080fd5b6132bc85828601613221565b9150509250929050565b60008083601f8401126132d857600080fd5b5081356001600160401b038111156132ef57600080fd5b6020830191508360208260051b850101111561311457600080fd5b60008060008060006060868803121561332257600080fd5b85356001600160401b038082111561333957600080fd5b61334589838a016132c6565b9097509550602088013591508082111561335e57600080fd5b5061336b888289016132c6565b909450925050604086013561337f816130be565b809150509295509295909350565b6020808252825182820181905260009190848201906040850190845b818110156133c5578351835292840192918401916001016133a9565b50909695505050505050565b6000806000606084860312156133e657600080fd5b505081359360208301359350604090920135919050565b60008060006040848603121561341257600080fd5b83356001600160401b0381111561342857600080fd5b613434868287016132c6565b9094509250506020840135613448816130be565b809150509250925092565b60008060006040848603121561346857600080fd5b83356001600160401b0381111561347e57600080fd5b61348a868287016130d3565b909790965060209590950135949350505050565b600080604083850312156134b157600080fd5b8235915060208301356134c3816130be565b809150509250929050565b60005b838110156134e95781810151838201526020016134d1565b50506000910152565b6000815180845261350a8160208601602086016134ce565b601f01601f19169290920160200192915050565b602081526000610ad560208301846134f2565b6000806020838503121561354457600080fd5b82356001600160401b0381111561355a57600080fd5b613566858286016130d3565b90969095509350505050565b600080600080600080600080600080600060c08c8e03121561359357600080fd5b6001600160401b03808d3511156135a957600080fd5b6135b68e8e358f016132c6565b909c509a5060208d01358110156135cc57600080fd5b6135dc8e60208f01358f016132c6565b909a50985060408d01358110156135f257600080fd5b6136028e60408f01358f016132c6565b909850965060608d013581101561361857600080fd5b6136288e60608f01358f016132c6565b909650945060808d0135935060a08d013581101561364557600080fd5b506136568d60a08e01358e016132c6565b81935080925050509295989b509295989b9093969950565b60018060a01b0384168152826020820152606060408201526000610ede60608301846134f2565b600080600080600080608087890312156136ae57600080fd5b8635955060208701356136c0816130be565b945060408701356001600160401b03808211156136dc57600080fd5b6136e88a838b016130d3565b9096509450606089013591508082111561370157600080fd5b5061370e89828a016130d3565b979a9699509497509295939492505050565b6000806000806060858703121561373657600080fd5b8435935060208501356001600160401b0381111561375357600080fd5b61375f878288016130d3565b9094509250506040850135613773816130be565b939692955090935050565b6000806020838503121561379157600080fd5b82356001600160401b038111156137a757600080fd5b613566858286016132c6565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561380857603f198886030184526137f68583516134f2565b945092850192908501906001016137da565b5092979650505050505050565b60006001600160401b0382111561382e5761382e6131b4565b5060051b60200190565b600082601f83011261384957600080fd5b8135602061385961324083613815565b82815260059290921b8401810191818101908684111561387857600080fd5b8286015b84811015613893578035835291830191830161387c565b509695505050505050565b600080600080600060a086880312156138b657600080fd5b85356138c1816130be565b945060208601356138d1816130be565b935060408601356001600160401b03808211156138ed57600080fd5b6138f989838a01613838565b9450606088013591508082111561390f57600080fd5b61391b89838a01613838565b9350608088013591508082111561393157600080fd5b5061393e88828901613221565b9150509295509295909350565b6020815260018060a01b03825116602082015260208201516040820152600060408301516080606084015261398360a08401826134f2565b9050606084015160808401528091505092915050565b600080600080600060a086880312156139b157600080fd5b85356139bc816130be565b945060208601356139cc816130be565b9350604086013592506060860135915060808601356001600160401b038111156139f557600080fd5b61393e88828901613221565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b87815286602082015260018060a01b038616604082015284606082015260c060808201526000613a5e60c083018587613a01565b90508260a083015298975050505050505050565b600060208284031215613a8457600080fd5b5051919050565b6020808252601390820152722ba81d39b2b73232b9103737ba1037bbb732b960691b604082015260600190565b600060208284031215613aca57600080fd5b8151610ad5816130be565b81835260006001600160fb1b03831115613aee57600080fd5b8260051b80836020870137939093016020019392505050565b81835260006020808501808196508560051b810191508460005b87811015613b8b5782840389528135601e19883603018112613b4257600080fd5b870185810190356001600160401b03811115613b5d57600080fd5b803603821315613b6c57600080fd5b613b77868284613a01565b9a87019a9550505090840190600101613b21565b5091979650505050505050565b868152608060208201526000613bb2608083018789613ad5565b8281036040840152613bc5818688613b07565b91505060018060a01b0383166060830152979650505050505050565b60006020808385031215613bf457600080fd5b82516001600160401b03811115613c0a57600080fd5b8301601f81018513613c1b57600080fd5b8051613c2961324082613815565b81815260059190911b82018301908381019087831115613c4857600080fd5b928401925b82841015610baa57835182529284019290840190613c4d565b848152606060208201526000613c80606083018587613ad5565b905060018060a01b038316604083015295945050505050565b604081526000613cad604083018587613a01565b9050826020830152949350505050565b8183823760009101908152919050565b838152604060208201526000610ede604083018486613a01565b600060208284031215613cf957600080fd5b81518015158114610ad557600080fd5b8481528360208201526060604082015260006118a0606083018486613ad5565b8981526000602060a081840152613d4460a084018b8d613b07565b8381036040850152613d57818a8c613ad5565b90508381036060850152613d6c81888a613ad5565b84810360808601528581529050818101600586811b830184018860005b89811015613dfa57858303601f190185528135368c9003601e19018112613daf57600080fd5b8b0187810190356001600160401b03811115613dca57600080fd5b80861b3603821315613ddb57600080fd5b613de6858284613ad5565b968901969450505090860190600101613d89565b505080955050505050509a9950505050505050505050565b600082601f830112613e2357600080fd5b8151613e31613240826131fa565b818152846020838601011115613e4657600080fd5b610f038260208301602087016134ce565b600080600060608486031215613e6c57600080fd5b8351613e77816130be565b6020850151604086015191945092506001600160401b03811115613e9a57600080fd5b613ea686828701613e12565b9150509250925092565b858152846020820152608060408201526000613ed0608083018587613a01565b905060018060a01b03831660608301529695505050505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112613f1757600080fd5b8301803591506001600160401b03821115613f3157600080fd5b60200191503681900382131561311457600080fd5b600060208284031215613f5857600080fd5b81516001600160401b0380821115613f6f57600080fd5b9083019060808286031215613f8357600080fd5b604051608081018181108382111715613f9e57613f9e6131b4565b6040528251613fac816130be565b815260208381015190820152604083015182811115613fca57600080fd5b613fd687828601613e12565b6040830152506060830151606082015280935050505092915050565b838152604060208201526000610ede604083018486613ad5565b6000806040838503121561401f57600080fd5b505080516020909101519092909150565b600181811c9082168061404457607f821691505b60208210810361406457634e487b7160e01b600052602260045260246000fd5b50919050565b6000825161407c8184602087016134ce565b9190910192915050565b60408152600061409960408301856134f2565b9050826020830152939250505056fea3ee0f890fa2a50cc11476f86783721ec49c3aba88b83a957fe08235f6485c00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbccd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a264697066735822122010f211f6cf7ffc7524dec2da4c36b578d0b849a4a992aa8087b8058940a38e7764736f6c63430008140033", + "deployedBytecode": "0x6080604052600436106102e85760003560e01c80638650c07211610190578063bf211ed1116100dc578063dca1086111610095578063e72b1d6d1161006f578063e72b1d6d14610a06578063e768887e14610a26578063e78e839714610a46578063f23a6e6114610a6657600080fd5b8063dca10861146109a6578063e02a5208146109c6578063e68e1218146109e657600080fd5b8063bf211ed114610855578063c58343ef1461089d578063c7f758a8146108ef578063d2583aee1461091c578063d99a16c514610966578063dab840c71461098657600080fd5b8063ac144d8b11610149578063ad4ac4c411610123578063ad4ac4c41461078d578063ad8655cb146107db578063aec98863146107fb578063bc197c811461081057600080fd5b8063ac144d8b1461070f578063ac9650d81461072f578063ad3cb1cc1461075c57600080fd5b80638650c072146106565780638794fabc1461066b5780638aa104351461068b57806398951b56146106a05780639934b281146106cf57806399ac48ba146106ef57600080fd5b806356a72dbf1161024f578063722679541161020857806377a3a813116101e257806377a3a813146105c65780637aed42ce146106015780637e5358d1146106215780638456cb591461064157600080fd5b80637226795414610564578063745653de14610591578063753b8807146105a657600080fd5b806356a72dbf146104855780635731bc1d146104a55780635a34bb15146104c55780635c975abb146104e55780635d9e085d1461050a5780636d07e4041461054457600080fd5b8063419754c5116102a1578063419754c5146103d05780634b75642f146103f05780634f1ef286146104105780634f5141e91461042357806352d1902d146104505780635329512b1461046557600080fd5b806301ffc9a7146102f45780631da7159114610329578063289b3c0d1461035757806338fff2d0146103845780633b8ba862146103995780633f4ba83a146103b957600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004613072565b610a92565b60405190151581526020015b60405180910390f35b34801561033557600080fd5b5061034961034436600461309c565b610ac9565b604051908152602001610320565b34801561036357600080fd5b5061036c610adc565b6040516001600160a01b039091168152602001610320565b34801561039057600080fd5b50610349610af7565b3480156103a557600080fd5b506103496103b436600461311b565b610b0a565b3480156103c557600080fd5b506103ce610bb5565b005b3480156103dc57600080fd5b506103146103eb36600461317e565b610bfb565b3480156103fc57600080fd5b506103ce61040b36600461319b565b610d41565b6103ce61041e366004613277565b610df0565b34801561042f57600080fd5b5061044361043e36600461330a565b610e0f565b604051610320919061338d565b34801561045c57600080fd5b50610349610ea4565b34801561047157600080fd5b5061036c6104803660046133d1565b610ec1565b34801561049157600080fd5b506103496104a036600461309c565b610ee7565b3480156104b157600080fd5b506103ce6104c03660046133fd565b610f0b565b3480156104d157600080fd5b506103496104e0366004613453565b610f8b565b3480156104f157600080fd5b506000805160206140e98339815191525460ff16610314565b34801561051657600080fd5b5061034961052536600461319b565b60009081526000805160206140a9833981519152602052604090205490565b34801561055057600080fd5b506103ce61055f36600461349e565b610fc2565b34801561057057600080fd5b5061058461057f36600461309c565b61101d565b604051610320919061351e565b34801561059d57600080fd5b50610349611039565b3480156105b257600080fd5b506103ce6105c136600461319b565b6110ba565b3480156105d257600080fd5b506105e66105e1366004613531565b611106565b60408051938452602084019290925290820152606001610320565b34801561060d57600080fd5b5061031461061c366004613531565b611192565b34801561062d57600080fd5b5061034961063c36600461319b565b61121c565b34801561064d57600080fd5b506103ce6112bc565b34801561066257600080fd5b506103146112f7565b34801561067757600080fd5b506103ce610686366004613572565b611482565b34801561069757600080fd5b506103496115fb565b3480156106ac57600080fd5b506106c06106bb36600461319b565b611610565b6040516103209392919061366e565b3480156106db57600080fd5b506103ce6106ea366004613695565b6116e0565b3480156106fb57600080fd5b5061036c61070a36600461309c565b6117f6565b34801561071b57600080fd5b5061034961072a366004613720565b611812565b34801561073b57600080fd5b5061074f61074a36600461377e565b6118aa565b60405161032091906137b3565b34801561076857600080fd5b50610584604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561079957600080fd5b506107a2611993565b604080516001600160a01b039687168152948616602086015292909416918301919091526060820152608081019190915260a001610320565b3480156107e757600080fd5b506103ce6107f636600461317e565b6119da565b34801561080757600080fd5b506103ce611a2e565b34801561081c57600080fd5b5061083c61082b36600461389e565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610320565b34801561086157600080fd5b5061086a611c4c565b604080516001600160a01b039687168152959094166020860152928401919091526060830152608082015260a001610320565b3480156108a957600080fd5b506108bd6108b836600461319b565b611c92565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610320565b3480156108fb57600080fd5b5061090f61090a36600461319b565b611d88565b604051610320919061394b565b34801561092857600080fd5b50610931611e48565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610320565b34801561097257600080fd5b506103ce61098136600461349e565b611e96565b34801561099257600080fd5b506103ce6109a136600461317e565b611f22565b3480156109b257600080fd5b506103ce6109c136600461377e565b611f76565b3480156109d257600080fd5b506103496109e136600461309c565b611fbe565b3480156109f257600080fd5b50610349610a01366004613531565b612001565b348015610a1257600080fd5b50610349610a213660046133d1565b612093565b348015610a3257600080fd5b50610584610a413660046133d1565b6120b0565b348015610a5257600080fd5b506103ce610a6136600461349e565b6120cd565b348015610a7257600080fd5b5061083c610a81366004613999565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b1480610ac357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000610ad58383612128565b9392505050565b600080610ae7612154565b546001600160a01b031692915050565b6000610b01612178565b60020154905090565b600080610b15612154565b6040516318ffae5d60e21b815290915073__$dabd46e1bb7f0d62843614b2ceac53b60c$__906363feb97490610b699084906000805160206140a9833981519152908c908c908c908c908c90600401613a2a565b602060405180830381865af4158015610b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baa9190613a72565b979650505050505050565b610bbd612154565b600101546001600160a01b03163314610bf15760405162461bcd60e51b8152600401610be890613a8b565b60405180910390fd5b610bf961219c565b565b6000610c05612154565b546040805163289b3c0d60e01b815290516001600160a01b039092169163289b3c0d916004808201926020929091908290030181865afa158015610c4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c719190613ab8565b6001600160a01b0316336001600160a01b031614610c8e57600080fd5b6000610c98612178565b6004810154604051919250906001600160a01b038516908290600081818185875af1925050503d8060008114610cea576040519150601f19603f3d011682016040523d82523d6000602084013e610cef565b606091505b50508093505082610d3a5760405162461bcd60e51b81526020600482015260156024820152740aea0748cc2d2d8cac840e8de40e6cadcc8408aa89605b1b6044820152606401610be8565b5050919050565b610d49612154565b600101546001600160a01b03163314610d745760405162461bcd60e51b8152600401610be890613a8b565b6000610d7e612178565b6040516357babf8b60e01b8152600481018290526024810184905290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__906357babf8b906044015b60006040518083038186803b158015610dd457600080fd5b505af4158015610de8573d6000803e3d6000fd5b505050505050565b610df86121fc565b610e018261228a565b610e0b828261237c565b5050565b60606000610e1b612178565b604051630b4d65a760e41b815290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__9063b4d65a7090610e5f9084908b908b908b908b908b90600401613b98565b600060405180830381865af4158015610e7c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610baa9190810190613be1565b6000610eae61243e565b506000805160206140c983398151915290565b60006000805160206140a9833981519152610ede81868686612487565b95945050505050565b60006000805160206140a9833981519152610f038185856124c5565b949350505050565b6000610f15612178565b604051633da28bc160e11b815290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__90637b45178290610f55908490889088908890600401613c66565b60006040518083038186803b158015610f6d57600080fd5b505af4158015610f81573d6000803e3d6000fd5b5050505050505050565b6000838383604051602001610fa293929190613c99565b60408051601f198184030181529190528051602090910120949350505050565b6040516330b2175760e11b81526000805160206140a98339815191526004820152602481018390526001600160a01b038216604482015273__$dabd46e1bb7f0d62843614b2ceac53b60c$__906361642eae90606401610dbc565b60606000805160206140a9833981519152610f038185856124ef565b600080611044612154565b8054600480830154604051630eca989d60e11b8152918201529192506001600160a01b031690631d95313a90602401602060405180830381865afa158015611090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b49190613a72565b91505090565b60006110c4612178565b6040516311aeabff60e31b8152600481018290526024810184905290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__90638d755ff890604401610dbc565b600080600080611114612178565b905080600d01868660405161112a929190613cbd565b908152604051908190036020018120549450600d82019061114e9088908890613cbd565b908152602001604051809103902060010154925080600d018686604051611176929190613cbd565b9081526020016040518091039020600201549150509250925092565b60008061119d612178565b6040516345bece4760e11b815290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__90638b7d9c8e906111db90849088908890600401613ccd565b602060405180830381865af41580156111f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f039190613ce7565b600080611227612178565b6006810154600982015460405163928b8e4d60e01b815260048101849052602481018790526044810192909252606482015290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__9063928b8e4d90608401602060405180830381865af4158015611298573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad59190613a72565b6112c4612154565b600101546001600160a01b031633146112ef5760405162461bcd60e51b8152600401610be890613a8b565b610bf96125a1565b60006113126000805160206140e98339815191525460ff1690565b1561131d5750600190565b6000611327612154565b8054600480830154604051630eca989d60e11b8152918201529192506001600160a01b031690631d95313a90602401602060405180830381865afa158015611373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113979190613a72565b8160050154146113a957600191505090565b6113b16125ea565b60028201546001600160a01b039081169116146113d057600191505090565b600181015481546001600160a01b0391821691166399ac48ba6113f1610af7565b6040516001600160e01b031960e084901b16815260048101919091526921a7a72a2927a62622a960b11b6024820152604401602060405180830381865afa158015611440573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114649190613ab8565b6001600160a01b03161461147a57600191505090565b600091505090565b600061148c612178565b60018101546002820154604051630300147560e11b815260048101919091529192506001600160a01b03169063060028ea90602401602060405180830381865afa1580156114de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115029190613ce7565b6115745760018101546002820154604051637e1ece9f60e01b81526001600160a01b0390921691637e1ece9f9161154191889088908890600401613d09565b600060405180830381600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b505050505b8073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__6311c9522c90918e8e8e8e8e8e8e8e6040518a63ffffffff1660e01b81526004016115bd99989796959493929190613d29565b60006040518083038186803b1580156115d557600080fd5b505af41580156115e9573d6000803e3d6000fd5b50505050505050505050505050505050565b600080611606612154565b6005015492915050565b6000806060600061161f612154565b905073__$dabd46e1bb7f0d62843614b2ceac53b60c$__636dc129ae826000805160206140a98339815191526040516001600160e01b031960e085901b1681526004810192909252602482015260448101889052606401600060405180830381865af4158015611693573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116bb9190810190613e57565b6004840154929650909450925083036116d8576116d88486612606565b509193909250565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156117255750825b90506000826001600160401b031660011480156117415750303b155b90508115801561174f575080155b1561176d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561179757845460ff60401b1916600160401b1785555b6117a38b8b8b8b612628565b83156117e957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050565b60006000805160206140a9833981519152610f038185856126bb565b60008061181d612178565b60405163020ec69760e61b815290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__906383b1a5c09061185f9084908a908a908a908a90600401613eb0565b602060405180830381865af415801561187c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a09190613a72565b9695505050505050565b6060816001600160401b038111156118c4576118c46131b4565b6040519080825280602002602001820160405280156118f757816020015b60608152602001906001900390816118e25790505b50905060005b8281101561198c576119673085858481811061191b5761191b613eea565b905060200281019061192d9190613f00565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126ef92505050565b82828151811061197957611979613eea565b60209081029190910101526001016118fd565b5092915050565b6000806000806000806119a4612154565b80546001820154600283015460038401546004909401546001600160a01b039384169b9284169a50921697509195509350915050565b60006119e4612154565b6040516361ac0f7160e11b8152600481018290526001600160a01b038416602482015290915073__$dabd46e1bb7f0d62843614b2ceac53b60c$__9063c3581ee290604401610dbc565b611a36612154565b600101546001600160a01b03163314611a615760405162461bcd60e51b8152600401610be890613a8b565b6000611a6b612154565b805460408051634328603960e11b815290519293506001600160a01b03909116918291638650c0729160048083019260209291908290030181865afa158015611ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adc9190613ce7565b15611b215760405162461bcd60e51b815260206004820152601560248201527415d40e941bdc9d185b081a5cc81a5cdbdb185d1959605a1b6044820152606401610be8565b600482810154604051630eca989d60e11b8152918201526001600160a01b03821690631d95313a90602401602060405180830381865afa158015611b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8d9190613a72565b826005015403611bd05760405162461bcd60e51b815260206004820152600e60248201526d57503a6e6f20757067726164657360901b6044820152606401610be8565b60048281015460405163e3099e0960e01b8152918201526000906001600160a01b0383169063e3099e09906024016020604051808303816000875af1158015611c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c419190613a72565b9050610de881611610565b600080600080600080611c5d612178565b80546001820154600283015460038401546004909401546001600160a01b039384169b92909316995097509195509350915050565b600080600080600080611ca3612178565b905080600c018781548110611cba57611cba613eea565b6000918252602090912060059091020154600c820180546001600160a01b0390921697509088908110611cef57611cef613eea565b906000526020600020906005020160010154945080600c018781548110611d1857611d18613eea565b906000526020600020906005020160020154935080600c018781548110611d4157611d41613eea565b906000526020600020906005020160030154925080600c018781548110611d6a57611d6a613eea565b90600052602060002090600502016004015491505091939590929450565b611dbc604051806080016040528060006001600160a01b031681526020016000815260200160608152602001600081525090565b6000611dc6612154565b6040516337a3804160e11b8152600481018290526024810185905290915073__$dabd46e1bb7f0d62843614b2ceac53b60c$__90636f47008290604401600060405180830381865af4158015611e20573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ad59190810190613f46565b600080600080600080600080611e5c612178565b60058101546006820154600783015460088401546009850154600a860154600b90960154949e939d50919b50995097509195509350915050565b6000611ea0612178565b604051630222d4bb60e11b815260048101829052602481018590526001600160a01b038416604482015290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__90630445a976906064015b60006040518083038186803b158015611f0557600080fd5b505af4158015611f19573d6000803e3d6000fd5b50505050505050565b6000611f2c612154565b6040516307c0451b60e11b8152600481018290526001600160a01b038416602482015290915073__$dabd46e1bb7f0d62843614b2ceac53b60c$__90630f808a3690604401610dbc565b6000611f80612178565b604051634699d87760e11b815290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__90638d33b0ee90611eed90849087908790600401613ff2565b60008281526000805160206140a9833981519152602081905260408220805484908110611fed57611fed613eea565b906000526020600020015491505092915050565b60008061200c612178565b604051631420eb4b60e21b815290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__90635083ad2c9061204a90849088908890600401613ccd565b6040805180830381865af4158015612066573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208a919061400c565b50949350505050565b60006000805160206140a9833981519152610ede8186868661275c565b60606000805160206140a9833981519152610ede8186868661278b565b60006120d7612178565b6040516393c8c5e960e01b815260048101829052602481018590526001600160a01b038416604482015290915073__$9ac600e8e8caf8e716c00e1b9cc2af3047$__906393c8c5e990606401611eed565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b7f121584cf2b7b1dee51ceaabc76cdefc72f829ce42dd8cc5282d8e9f009b0420090565b7f50605cc6f5170f0cdbb610edd2214831ea96f61cd1eba92cf58939f65736af0090565b6121a4612842565b6000805160206140e9833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061226c57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166122606125ea565b6001600160a01b031614155b15610bf95760405163703e46dd60e11b815260040160405180910390fd5b6000612294612154565b905073__$dabd46e1bb7f0d62843614b2ceac53b60c$__63b57e6b0b82846122ba6125ea565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039182166024840152166044820152606401602060405180830381865af415801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190613ce7565b610e0b5760405162461bcd60e51b815260206004820152601960248201527f474d3a6e6f7420616c6c6f77656420746f2075706772616465000000000000006044820152606401610be8565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156123d6575060408051601f3d908101601f191682019092526123d391810190613a72565b60015b6123fe57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610be8565b6000805160206140c9833981519152811461242f57604051632a87526960e21b815260048101829052602401610be8565b6124398383612872565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bf95760405163703e46dd60e11b815260040160405180910390fd5b60008460030160006124a28461249d8888612128565b612128565b81526020810191909152604001600020546001600160a01b031695945050505050565b60008360010160006124d78585612128565b81526020019081526020016000205490509392505050565b60608360020160006125018585612128565b8152602001908152602001600020805461251a90614030565b80601f016020809104026020016040519081016040528092919081815260200182805461254690614030565b80156125935780601f1061256857610100808354040283529160200191612593565b820191906000526020600020905b81548152906001019060200180831161257657829003601f168201915b505050505090509392505050565b6125a96128c8565b6000805160206140e9833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336121de565b6000805160206140c9833981519152546001600160a01b031690565b61261f8260405180602001604052806000815250610df0565b610e0b816128f9565b612630612944565b6126627f00000000000000000000000000000000000000000000000000000000000000008460001961271b868661298d565b6126ad7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000866129b3565b6126b56129de565b50505050565b60008360030160006126cd8585612128565b81526020810191909152604001600020546001600160a01b0316949350505050565b6060600080846001600160a01b03168460405161270c919061406a565b600060405180830381855af49150503d8060008114612747576040519150601f19603f3d011682016040523d82523d6000602084013e61274c565b606091505b5091509150610ede8583836129e6565b60008460010160006127728461249d8888612128565b8152602001908152602001600020549050949350505050565b60608460020160006127a18461249d8888612128565b815260200190815260200160002080546127ba90614030565b80601f01602080910402602001604051908101604052809291908181526020018280546127e690614030565b80156128335780601f1061280857610100808354040283529160200191612833565b820191906000526020600020905b81548152906001019060200180831161281657829003601f168201915b50505050509050949350505050565b6000805160206140e98339815191525460ff16610bf957604051638dfc202b60e01b815260040160405180910390fd5b61287b82612a3b565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156128c05761243982826126ef565b610e0b612aa0565b6000805160206140e98339815191525460ff1615610bf95760405163d93c066560e01b815260040160405180910390fd5b6000612903612154565b600581018390556040518381529091507ffddcded6b4f4730c226821172046b48372d3cd963c159701ae1b7c3bcac541bb9060200160405180910390a15050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610bf957604051631afcd79f60e31b815260040160405180910390fd5b612995612944565b61299d6129de565b6129a56129de565b610de8868686868686612abf565b6129bb612944565b6129c3612e4b565b6129cb612e5b565b6129d36129de565b612439838383612e6b565b610bf9612944565b6060826129fb576129f682612fc3565b610ad5565b8151158015612a1257506001600160a01b0384163b155b1561198c57604051639996b31560e01b81526001600160a01b0385166004820152602401610be8565b806001600160a01b03163b600003612a7157604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610be8565b6000805160206140c983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b3415610bf95760405163b398979f60e01b815260040160405180910390fd5b612ac7612944565b6001600160a01b038616612b1d5760405162461bcd60e51b815260206004820152601c60248201527f474d3a676f7665726e616e63652063616e6e6f74206265207a65726f000000006044820152606401610be8565b6001600160a01b038516612b735760405162461bcd60e51b815260206004820152601860248201527f474d3a73656e6174652063616e6e6f74206265207a65726f00000000000000006044820152606401610be8565b428411612bb85760405162461bcd60e51b8152602060048201526013602482015272474d3a6c6f772073656e61746545787069727960681b6044820152606401610be8565b82600003612c085760405162461bcd60e51b815260206004820152601d60248201527f474d3a7061636b616765547970652063616e6e6f74206265207a65726f0000006044820152606401610be8565b6000819003612c645760405162461bcd60e51b815260206004820152602260248201527f474d3a696e697456657273696f6e4e616d652063616e6e6f7420626520656d70604482015261747960f01b6064820152608401610be8565b6000612c6e612154565b8054336001600160a01b031991821681178355600183018054909216179055600381018690556004810185905590506000805160206140a9833981519152600073__$dabd46e1bb7f0d62843614b2ceac53b60c$__6363feb9748484612cd26125ea565b8a8a8a620151806040518863ffffffff1660e01b8152600401612cfb9796959493929190613a2a565b602060405180830381865af4158015612d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3c9190613a72565b6040516336e094d760e11b815260048101859052602481018490526044810182905290915073__$dabd46e1bb7f0d62843614b2ceac53b60c$__90636dc129ae90606401600060405180830381865af4158015612d9d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612dc59190810190613e57565b505050612e13612e0e86868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506004860154612fef565b6128f9565b505080546001600160a01b039788166001600160a01b0319918216178255600190910180549690971695169490941790945550505050565b612e53612944565b610bf9613023565b612e63612944565b610bf9613051565b612e73612944565b6001600160a01b038316612ec95760405162461bcd60e51b815260206004820152601e60248201527f574d3a674554482063616e6e6f74206265207a65726f206164647265737300006044820152606401610be8565b6001600160a01b038216612f1f5760405162461bcd60e51b815260206004820181905260248201527f574d3a706f7274616c2063616e6e6f74206265207a65726f20616464726573736044820152606401610be8565b6000612f29612178565b80546001600160a01b03199081166001600160a01b038781169182178455600180850180549094169188169190911790925560028301859055640165a0bc006003840155604051630492f6e160e01b8152600481018690526024810192909252919250630492f6e190604401600060405180830381600087803b158015612faf57600080fd5b505af1158015610f81573d6000803e3d6000fd5b805115612fd35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50565b60008282604051602001613004929190614086565b60408051601f1981840301815291905280516020909101209392505050565b61302b612944565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b613059612944565b6000805160206140e9833981519152805460ff19169055565b60006020828403121561308457600080fd5b81356001600160e01b031981168114610ad557600080fd5b600080604083850312156130af57600080fd5b50508035926020909101359150565b6001600160a01b0381168114612fec57600080fd5b60008083601f8401126130e557600080fd5b5081356001600160401b038111156130fc57600080fd5b60208301915083602082850101111561311457600080fd5b9250929050565b60008060008060006080868803121561313357600080fd5b853561313e816130be565b94506020860135935060408601356001600160401b0381111561316057600080fd5b61316c888289016130d3565b96999598509660600135949350505050565b60006020828403121561319057600080fd5b8135610ad5816130be565b6000602082840312156131ad57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156131f2576131f26131b4565b604052919050565b60006001600160401b03821115613213576132136131b4565b50601f01601f191660200190565b600082601f83011261323257600080fd5b8135613245613240826131fa565b6131ca565b81815284602083860101111561325a57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561328a57600080fd5b8235613295816130be565b915060208301356001600160401b038111156132b057600080fd5b6132bc85828601613221565b9150509250929050565b60008083601f8401126132d857600080fd5b5081356001600160401b038111156132ef57600080fd5b6020830191508360208260051b850101111561311457600080fd5b60008060008060006060868803121561332257600080fd5b85356001600160401b038082111561333957600080fd5b61334589838a016132c6565b9097509550602088013591508082111561335e57600080fd5b5061336b888289016132c6565b909450925050604086013561337f816130be565b809150509295509295909350565b6020808252825182820181905260009190848201906040850190845b818110156133c5578351835292840192918401916001016133a9565b50909695505050505050565b6000806000606084860312156133e657600080fd5b505081359360208301359350604090920135919050565b60008060006040848603121561341257600080fd5b83356001600160401b0381111561342857600080fd5b613434868287016132c6565b9094509250506020840135613448816130be565b809150509250925092565b60008060006040848603121561346857600080fd5b83356001600160401b0381111561347e57600080fd5b61348a868287016130d3565b909790965060209590950135949350505050565b600080604083850312156134b157600080fd5b8235915060208301356134c3816130be565b809150509250929050565b60005b838110156134e95781810151838201526020016134d1565b50506000910152565b6000815180845261350a8160208601602086016134ce565b601f01601f19169290920160200192915050565b602081526000610ad560208301846134f2565b6000806020838503121561354457600080fd5b82356001600160401b0381111561355a57600080fd5b613566858286016130d3565b90969095509350505050565b600080600080600080600080600080600060c08c8e03121561359357600080fd5b6001600160401b03808d3511156135a957600080fd5b6135b68e8e358f016132c6565b909c509a5060208d01358110156135cc57600080fd5b6135dc8e60208f01358f016132c6565b909a50985060408d01358110156135f257600080fd5b6136028e60408f01358f016132c6565b909850965060608d013581101561361857600080fd5b6136288e60608f01358f016132c6565b909650945060808d0135935060a08d013581101561364557600080fd5b506136568d60a08e01358e016132c6565b81935080925050509295989b509295989b9093969950565b60018060a01b0384168152826020820152606060408201526000610ede60608301846134f2565b600080600080600080608087890312156136ae57600080fd5b8635955060208701356136c0816130be565b945060408701356001600160401b03808211156136dc57600080fd5b6136e88a838b016130d3565b9096509450606089013591508082111561370157600080fd5b5061370e89828a016130d3565b979a9699509497509295939492505050565b6000806000806060858703121561373657600080fd5b8435935060208501356001600160401b0381111561375357600080fd5b61375f878288016130d3565b9094509250506040850135613773816130be565b939692955090935050565b6000806020838503121561379157600080fd5b82356001600160401b038111156137a757600080fd5b613566858286016132c6565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561380857603f198886030184526137f68583516134f2565b945092850192908501906001016137da565b5092979650505050505050565b60006001600160401b0382111561382e5761382e6131b4565b5060051b60200190565b600082601f83011261384957600080fd5b8135602061385961324083613815565b82815260059290921b8401810191818101908684111561387857600080fd5b8286015b84811015613893578035835291830191830161387c565b509695505050505050565b600080600080600060a086880312156138b657600080fd5b85356138c1816130be565b945060208601356138d1816130be565b935060408601356001600160401b03808211156138ed57600080fd5b6138f989838a01613838565b9450606088013591508082111561390f57600080fd5b61391b89838a01613838565b9350608088013591508082111561393157600080fd5b5061393e88828901613221565b9150509295509295909350565b6020815260018060a01b03825116602082015260208201516040820152600060408301516080606084015261398360a08401826134f2565b9050606084015160808401528091505092915050565b600080600080600060a086880312156139b157600080fd5b85356139bc816130be565b945060208601356139cc816130be565b9350604086013592506060860135915060808601356001600160401b038111156139f557600080fd5b61393e88828901613221565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b87815286602082015260018060a01b038616604082015284606082015260c060808201526000613a5e60c083018587613a01565b90508260a083015298975050505050505050565b600060208284031215613a8457600080fd5b5051919050565b6020808252601390820152722ba81d39b2b73232b9103737ba1037bbb732b960691b604082015260600190565b600060208284031215613aca57600080fd5b8151610ad5816130be565b81835260006001600160fb1b03831115613aee57600080fd5b8260051b80836020870137939093016020019392505050565b81835260006020808501808196508560051b810191508460005b87811015613b8b5782840389528135601e19883603018112613b4257600080fd5b870185810190356001600160401b03811115613b5d57600080fd5b803603821315613b6c57600080fd5b613b77868284613a01565b9a87019a9550505090840190600101613b21565b5091979650505050505050565b868152608060208201526000613bb2608083018789613ad5565b8281036040840152613bc5818688613b07565b91505060018060a01b0383166060830152979650505050505050565b60006020808385031215613bf457600080fd5b82516001600160401b03811115613c0a57600080fd5b8301601f81018513613c1b57600080fd5b8051613c2961324082613815565b81815260059190911b82018301908381019087831115613c4857600080fd5b928401925b82841015610baa57835182529284019290840190613c4d565b848152606060208201526000613c80606083018587613ad5565b905060018060a01b038316604083015295945050505050565b604081526000613cad604083018587613a01565b9050826020830152949350505050565b8183823760009101908152919050565b838152604060208201526000610ede604083018486613a01565b600060208284031215613cf957600080fd5b81518015158114610ad557600080fd5b8481528360208201526060604082015260006118a0606083018486613ad5565b8981526000602060a081840152613d4460a084018b8d613b07565b8381036040850152613d57818a8c613ad5565b90508381036060850152613d6c81888a613ad5565b84810360808601528581529050818101600586811b830184018860005b89811015613dfa57858303601f190185528135368c9003601e19018112613daf57600080fd5b8b0187810190356001600160401b03811115613dca57600080fd5b80861b3603821315613ddb57600080fd5b613de6858284613ad5565b968901969450505090860190600101613d89565b505080955050505050509a9950505050505050505050565b600082601f830112613e2357600080fd5b8151613e31613240826131fa565b818152846020838601011115613e4657600080fd5b610f038260208301602087016134ce565b600080600060608486031215613e6c57600080fd5b8351613e77816130be565b6020850151604086015191945092506001600160401b03811115613e9a57600080fd5b613ea686828701613e12565b9150509250925092565b858152846020820152608060408201526000613ed0608083018587613a01565b905060018060a01b03831660608301529695505050505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112613f1757600080fd5b8301803591506001600160401b03821115613f3157600080fd5b60200191503681900382131561311457600080fd5b600060208284031215613f5857600080fd5b81516001600160401b0380821115613f6f57600080fd5b9083019060808286031215613f8357600080fd5b604051608081018181108382111715613f9e57613f9e6131b4565b6040528251613fac816130be565b815260208381015190820152604083015182811115613fca57600080fd5b613fd687828601613e12565b6040830152506060830151606082015280935050505092915050565b838152604060208201526000610ede604083018486613ad5565b6000806040838503121561401f57600080fd5b505080516020909101519092909150565b600181811c9082168061404457607f821691505b60208210810361406457634e487b7160e01b600052602260045260246000fd5b50919050565b6000825161407c8184602087016134ce565b9190910192915050565b60408152600061409960408301856134f2565b9050826020830152939250505056fea3ee0f890fa2a50cc11476f86783721ec49c3aba88b83a957fe08235f6485c00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbccd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a264697066735822122010f211f6cf7ffc7524dec2da4c36b578d0b849a4a992aa8087b8058940a38e7764736f6c63430008140033", + "libraries": { + "GeodeModuleLib": "0x87828ff83A8B257D544c06fe64B6838DD2Fb0ED1", + "WithdrawalModuleLib": "0x7224F427fA92CE4FD8d0058C354634217438b34c" + }, + "devdoc": { + "errors": { + "AddressEmptyCode(address)": [ + { + "details": "There's no code at `target` (it is not a contract)." + } + ], + "ERC1967InvalidImplementation(address)": [ + { + "details": "The `implementation` of the proxy is invalid." + } + ], + "ERC1967NonPayable()": [ + { + "details": "An upgrade function sees `msg.value > 0` that may be lost." + } + ], + "EnforcedPause()": [ + { + "details": "The operation failed because the contract is paused." + } + ], + "ExpectedPause()": [ + { + "details": "The operation failed because the contract is not paused." + } + ], + "FailedInnerCall()": [ + { + "details": "A call to an address target failed. The target may have reverted." + } + ], + "InvalidInitialization()": [ + { + "details": "The contract is already initialized." + } + ], + "NotInitializing()": [ + { + "details": "The contract is not initializing." + } + ], + "ReentrancyGuardReentrantCall()": [ + { + "details": "Unauthorized reentrant call." + } + ], + "UUPSUnauthorizedCallContext()": [ + { + "details": "The call is from an unauthorized context." + } + ], + "UUPSUnsupportedProxiableUUID(bytes32)": [ + { + "details": "The storage `slot` is unsupported as a UUID." + } + ] + }, + "events": { + "ContractVersionSet(uint256)": { + "custom:section": "** EVENTS **" + }, + "Initialized(uint64)": { + "details": "Triggered when the contract has been initialized or reinitialized." + }, + "NewExitThreshold(uint256)": { + "custom:section": "** EVENTS **" + }, + "Paused(address)": { + "details": "Emitted when the pause is triggered by `account`." + }, + "Unpaused(address)": { + "details": "Emitted when the pause is lifted by `account`." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": { + "GeodeParams()": { + "custom:section": "** GETTER FUNCTIONS **", + "custom:visibility": "-> view-external" + }, + "WithdrawalParams()": { + "custom:section": "** GETTER FUNCTIONS **", + "custom:visibility": "-> view-external" + }, + "allIdsByType(uint256,uint256)": { + "details": "useful for outside reach, shouldn't be used within contracts as a referance", + "returns": { + "_0": "allIdsByType is an array of IDs of the given TYPE from Datastore, returns a specific index" + } + }, + "approveProposal(uint256)": { + "details": "handles PACKAGE_TYPE proposals by upgrading the contract immediately.onlySenate is checked inside GML.approveProposal" + }, + "canFinalizeExit(bytes)": { + "custom:visibility": "-> view" + }, + "changeIdCONTROLLER(uint256,address)": { + "custom:subsection": "** ONLY CONTROLLER **" + }, + "claimInfrastructureFees(address)": { + "custom:subsection": "** INFRASTRUCTURE FEE **", + "details": "WM override" + }, + "constructor": { + "custom:oz-upgrades-unsafe-allow": "constructor", + "details": "we don't want to provide these package-specific not-changing parameters accross all instances of the packages. So we will store them in the ref implementation contract of the package, and fetch when needed on initialization." + }, + "dequeue(uint256,address)": { + "custom:visibility": "-> external" + }, + "enqueue(uint256,bytes,address)": { + "custom:subsection": "** ENQUEUE **", + "custom:visibility": "-> external" + }, + "fulfill(uint256)": { + "custom:visibility": "-> external" + }, + "fulfillable(uint256)": { + "custom:visibility": "-> view" + }, + "generateId(string,uint256)": { + "details": "id is generated by keccak(name, type)" + }, + "getProposedVersion()": { + "details": "GeodeModule override" + }, + "initialize(uint256,address,bytes,bytes)": { + "details": "While 'data' parameter is not currently used it is a standarized approach on all * GeodePackages have the same function signature on 'initialize'." + }, + "isolationMode()": { + "details": "GeodeModule override" + }, + "multicall(bytes[])": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Receives and executes a batch of function calls on this contract.This is necessary for the multistep operations done in this contract: * Enqueue, Process, Fulfill, Dequeue.Using 'functionDelegateCall' so it does not cause any issues when using msg.sender etc." + }, + "paused()": { + "details": "Returns true if the contract is paused, and false otherwise." + }, + "processValidators(bytes[],uint256[],uint256[],bytes32[][],uint256,bytes32[])": { + "custom:section": "** PROCESS BALANCES MERKLE UPDATE **" + }, + "propose(address,uint256,bytes,uint256)": { + "custom:subsection": "** ONLY GOVERNANCE **" + }, + "proxiableUUID()": { + "details": "Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier." + }, + "pullUpgrade()": { + "details": "IGeodePackage override" + }, + "readUintArray(uint256,bytes32,uint256)": { + "custom:section": "** ARRAY GETTER FUNCTIONS **", + "custom:visibility": "-> view-external" + }, + "setExitThreshold(uint256)": { + "custom:subsection": "** WITHDRAWAL QUEUE **", + "details": "WM override" + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "upgradeToAndCall(address,bytes)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "generateId(string,uint256)": { + "notice": "useful function for string inputs - returns same with the DSML.generateId" + }, + "getKey(uint256,bytes32)": { + "notice": "useful view function for string inputs - returns same with the DSML.generateId" + }, + "pause()": { + "notice": "pausing the contract activates the isolationMode" + }, + "unpause()": { + "notice": "unpausing the contract deactivates the isolationMode" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/geodefi/abis/holesky/token/gETH.json b/geodefi/abis/holesky/token/gETH.json index 2d68740..902c65b 100644 --- a/geodefi/abis/holesky/token/gETH.json +++ b/geodefi/abis/holesky/token/gETH.json @@ -1,5 +1,5 @@ { - "address": "0xaA970005F693Ae459e0ee107c63b546E8ff51d5d", + "address": "0xaFE4151bC01770B5D2298555D1cCdaf273bC9D2E", "abi": [ { "inputs": [ @@ -1277,22 +1277,22 @@ "type": "function" } ], - "transactionHash": "0xfb339c1cae5df822c5a43729d60359ef1b735fbdd7013e94068a85ab96091732", + "transactionHash": "0x08a97cab0e929a13ef18ce3fc76713a3c272cbc985108539c788926e418ac5a1", "receipt": { "to": null, "from": "0x7B6fA217a374826FCa50dccB87041AE0e34Ba1f5", - "contractAddress": "0xaA970005F693Ae459e0ee107c63b546E8ff51d5d", + "contractAddress": "0xaFE4151bC01770B5D2298555D1cCdaf273bC9D2E", "transactionIndex": 1, - "gasUsed": "2443482", - "logsBloom": "0x00000004000000000040000000000000008000000000000000000200000000000000000000000000000000000000004000000000000000000000000000000000000000000000000400000000000000000040000000000000000000000000000000000000020000000000000000000800000000000008000000000020001000000000000000000000000000000000008000000000000000000000000002000000000000000020000000000000000000020000000000000000001000000000000000000000000000000000008000000000085000010000000100002000000020000000000000000000000000000000400000000400000000000000000000000000", - "blockHash": "0x5ebdb385dee76144b18b58d43b05eadfe98a1778b04d8cfde53c204faa2b97ea", - "transactionHash": "0xfb339c1cae5df822c5a43729d60359ef1b735fbdd7013e94068a85ab96091732", + "gasUsed": "2443506", + "logsBloom": "0x00000004000000000000000000000000008000000000000000000200000000000000000000000000000000000000004000000000000000000000000000000000000000000000000400000000000000000042000000000000000000000000000000000000020000000000000000000800000000000008000000000020001000000000000000000000000000000000008000000000000000000000004002000000000000000020000000000000000000000000000000000000001000000000000000000000000000000000000000000000085000010000000100002000000020000000000000000000000000000000400000000400000010000000000000000000", + "blockHash": "0x1f8e9fbf85d4e60e8f6d11b4caa939540c22fb948a0abe8fe8098f2c1d00cb4a", + "transactionHash": "0x08a97cab0e929a13ef18ce3fc76713a3c272cbc985108539c788926e418ac5a1", "logs": [ { "transactionIndex": 1, - "blockNumber": 852069, - "transactionHash": "0xfb339c1cae5df822c5a43729d60359ef1b735fbdd7013e94068a85ab96091732", - "address": "0xaA970005F693Ae459e0ee107c63b546E8ff51d5d", + "blockNumber": 1550542, + "transactionHash": "0x08a97cab0e929a13ef18ce3fc76713a3c272cbc985108539c788926e418ac5a1", + "address": "0xaFE4151bC01770B5D2298555D1cCdaf273bC9D2E", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1301,13 +1301,13 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x5ebdb385dee76144b18b58d43b05eadfe98a1778b04d8cfde53c204faa2b97ea" + "blockHash": "0x1f8e9fbf85d4e60e8f6d11b4caa939540c22fb948a0abe8fe8098f2c1d00cb4a" }, { "transactionIndex": 1, - "blockNumber": 852069, - "transactionHash": "0xfb339c1cae5df822c5a43729d60359ef1b735fbdd7013e94068a85ab96091732", - "address": "0xaA970005F693Ae459e0ee107c63b546E8ff51d5d", + "blockNumber": 1550542, + "transactionHash": "0x08a97cab0e929a13ef18ce3fc76713a3c272cbc985108539c788926e418ac5a1", + "address": "0xaFE4151bC01770B5D2298555D1cCdaf273bC9D2E", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", "0x7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c", @@ -1316,13 +1316,13 @@ ], "data": "0x", "logIndex": 1, - "blockHash": "0x5ebdb385dee76144b18b58d43b05eadfe98a1778b04d8cfde53c204faa2b97ea" + "blockHash": "0x1f8e9fbf85d4e60e8f6d11b4caa939540c22fb948a0abe8fe8098f2c1d00cb4a" }, { "transactionIndex": 1, - "blockNumber": 852069, - "transactionHash": "0xfb339c1cae5df822c5a43729d60359ef1b735fbdd7013e94068a85ab96091732", - "address": "0xaA970005F693Ae459e0ee107c63b546E8ff51d5d", + "blockNumber": 1550542, + "transactionHash": "0x08a97cab0e929a13ef18ce3fc76713a3c272cbc985108539c788926e418ac5a1", + "address": "0xaFE4151bC01770B5D2298555D1cCdaf273bC9D2E", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", "0x65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a", @@ -1331,13 +1331,13 @@ ], "data": "0x", "logIndex": 2, - "blockHash": "0x5ebdb385dee76144b18b58d43b05eadfe98a1778b04d8cfde53c204faa2b97ea" + "blockHash": "0x1f8e9fbf85d4e60e8f6d11b4caa939540c22fb948a0abe8fe8098f2c1d00cb4a" }, { "transactionIndex": 1, - "blockNumber": 852069, - "transactionHash": "0xfb339c1cae5df822c5a43729d60359ef1b735fbdd7013e94068a85ab96091732", - "address": "0xaA970005F693Ae459e0ee107c63b546E8ff51d5d", + "blockNumber": 1550542, + "transactionHash": "0x08a97cab0e929a13ef18ce3fc76713a3c272cbc985108539c788926e418ac5a1", + "address": "0xaFE4151bC01770B5D2298555D1cCdaf273bC9D2E", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", "0x9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6", @@ -1346,13 +1346,13 @@ ], "data": "0x", "logIndex": 3, - "blockHash": "0x5ebdb385dee76144b18b58d43b05eadfe98a1778b04d8cfde53c204faa2b97ea" + "blockHash": "0x1f8e9fbf85d4e60e8f6d11b4caa939540c22fb948a0abe8fe8098f2c1d00cb4a" }, { "transactionIndex": 1, - "blockNumber": 852069, - "transactionHash": "0xfb339c1cae5df822c5a43729d60359ef1b735fbdd7013e94068a85ab96091732", - "address": "0xaA970005F693Ae459e0ee107c63b546E8ff51d5d", + "blockNumber": 1550542, + "transactionHash": "0x08a97cab0e929a13ef18ce3fc76713a3c272cbc985108539c788926e418ac5a1", + "address": "0xaFE4151bC01770B5D2298555D1cCdaf273bC9D2E", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", "0xf04f52d1f685586eac22a7ca73ab9ce0c45b77d01934bed334a9ff223be978a1", @@ -1361,13 +1361,13 @@ ], "data": "0x", "logIndex": 4, - "blockHash": "0x5ebdb385dee76144b18b58d43b05eadfe98a1778b04d8cfde53c204faa2b97ea" + "blockHash": "0x1f8e9fbf85d4e60e8f6d11b4caa939540c22fb948a0abe8fe8098f2c1d00cb4a" }, { "transactionIndex": 1, - "blockNumber": 852069, - "transactionHash": "0xfb339c1cae5df822c5a43729d60359ef1b735fbdd7013e94068a85ab96091732", - "address": "0xaA970005F693Ae459e0ee107c63b546E8ff51d5d", + "blockNumber": 1550542, + "transactionHash": "0x08a97cab0e929a13ef18ce3fc76713a3c272cbc985108539c788926e418ac5a1", + "address": "0xaFE4151bC01770B5D2298555D1cCdaf273bC9D2E", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", "0x68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef1", @@ -1376,24 +1376,24 @@ ], "data": "0x", "logIndex": 5, - "blockHash": "0x5ebdb385dee76144b18b58d43b05eadfe98a1778b04d8cfde53c204faa2b97ea" + "blockHash": "0x1f8e9fbf85d4e60e8f6d11b4caa939540c22fb948a0abe8fe8098f2c1d00cb4a" } ], - "blockNumber": 852069, - "cumulativeGasUsed": "2464482", + "blockNumber": 1550542, + "cumulativeGasUsed": "2464970", "status": 1, "byzantium": true }, "args": [ - "Geode Staked Ether", + "Geodefi Staked Ether", "gETH", "https://api.geode.fi/geth" ], "numDeployments": 1, - "solcInputHash": "cfc92d910e56f99740a6d4737a3b72cb", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_uri\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC1155InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idsLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"valuesLength\",\"type\":\"uint256\"}],\"name\":\"ERC1155InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC1155InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC1155InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC1155InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155MissingApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"middleware\",\"type\":\"address\"}],\"name\":\"gETHInvalidMiddleware\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"gETHZeroId\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"avoider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isAvoid\",\"type\":\"bool\"}],\"name\":\"Avoider\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"middleware\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isSet\",\"type\":\"bool\"}],\"name\":\"MiddlewareSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pricePerShare\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"updateTimestamp\",\"type\":\"uint256\"}],\"name\":\"PriceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"TransferBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIDDLEWARE_MANAGER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ORACLE_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAUSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"URI_SETTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isAvoid\",\"type\":\"bool\"}],\"name\":\"avoidMiddlewares\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"balanceOfBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"burnBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"denominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"exists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"isAvoider\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"middleware\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"isMiddleware\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"mintBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"pricePerShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"priceUpdateTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"middleware\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isSet\",\"type\":\"bool\"}],\"name\":\"setMiddleware\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"setPricePerShare\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"newuri\",\"type\":\"string\"}],\"name\":\"setURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newMiddlewareManager\",\"type\":\"address\"}],\"name\":\"transferMiddlewareManagerRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newMinter\",\"type\":\"address\"}],\"name\":\"transferMinterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOracle\",\"type\":\"address\"}],\"name\":\"transferOracleRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newPauser\",\"type\":\"address\"}],\"name\":\"transferPauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newUriSetter\",\"type\":\"address\"}],\"name\":\"transferUriSetterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Ice Bear & Crash Bandicoot\",\"details\":\"gETH is chain-agnostic, meaning it can be used on any evm chain (given the correct name and symbol).gETH is immutable, it cannot be upgraded.gETH is a special ERC1155 contract with additional functionalities: gETHMiddlewares: * Most important functionality gETH provides: * Allowing any other contract to provide additional functionality * around the balance and price data, such as using an ID like ERC20. * This addition effectively result in changes in * safeTransferFrom(), burn(), _doSafeTransferAcceptanceCheck() * functions, reasoning is in the comments. Avoiders: * If one wants to remain unbound from gETHMiddlewares, * it can be done so by calling \\\"avoidMiddlewares\\\" function. PricePerShare: * Keeping track of the ratio between the derivative * and the underlaying staked asset, Ether. Denominator: * ERC1155 does not have decimals and it is not wise to use the name convention * but we need to provide some information on how to denominate the balances, price, etc.review ERC1155PausableBurnableSupply, which is generated with Openzeppelin wizard.\",\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"details\":\"Indicates an error related to the current `balance` of a `sender`. Used in transfers.\",\"params\":{\"balance\":\"Current balance for the interacting account.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"sender\":\"Address whose tokens are being transferred.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC1155InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC1155InvalidArrayLength(uint256,uint256)\":[{\"details\":\"Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. Used in batch transfers.\",\"params\":{\"idsLength\":\"Length of the array of token identifiers\",\"valuesLength\":\"Length of the array of token amounts\"}}],\"ERC1155InvalidOperator(address)\":[{\"details\":\"Indicates a failure with the `operator` to be approved. Used in approvals.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC1155InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC1155InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC1155MissingApprovalForAll(address,address)\":[{\"details\":\"Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\",\"owner\":\"Address of the current owner of a token.\"}}],\"EnforcedPause()\":[{\"details\":\"The operation failed because the contract is paused.\"}],\"ExpectedPause()\":[{\"details\":\"The operation failed because the contract is not paused.\"}],\"gETHZeroId()\":[{\"custom:section\":\"** ERRORS **\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to `approved`.\"},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"PriceUpdated(uint256,uint256,uint256)\":{\"custom:section\":\"** EVENTS **\"},\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"details\":\"Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all transfers.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"details\":\"Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.\"},\"URI(string,uint256)\":{\"details\":\"Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. If an {URI} event was emitted for `id`, the standard https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value returned by {IERC1155MetadataURI-uri}.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"}},\"kind\":\"dev\",\"methods\":{\"avoidMiddlewares(uint256,bool)\":{\"details\":\"ADDED for gETH*\",\"params\":{\"isAvoid\":\"true: restrict middlewares, false: allow middlewares\"}},\"balanceOf(address,uint256)\":{\"details\":\"See {IERC1155-balanceOf}.\"},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length.\"},\"burn(address,uint256,uint256)\":{\"details\":\"CHANGED for gETHADDED \\\"((!(isMiddleware(sender, id))) || (isAvoider(account, id)))\\\" pass conditionSee ERC1155Burnable burn: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/cffb2f1ddcd87efd68effc92cfd336c5145acabd/contracts/token/ERC1155/extensions/ERC1155Burnable.sol#L13C1-L19C6\"},\"constructor\":{\"params\":{\"_name\":\"chain specific name: Geode Staked Ether, geode Staked Avax etc.\",\"_symbol\":\"chain specific symbol of the staking derivative: gETH, gGNO, gAVAX, etc.*\"}},\"denominator()\":{\"details\":\"ERC1155 does not have a decimals, and it is not wise to use the same nameADDED for gETH\"},\"exists(uint256)\":{\"details\":\"Indicates whether any token exist with a given id, or not.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC1155-isApprovedForAll}.\"},\"isAvoider(address,uint256)\":{\"details\":\"ADDED for gETH*\",\"params\":{\"account\":\"the potential avoider\"}},\"isMiddleware(address,uint256)\":{\"details\":\"ADDED for gETH\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"pricePerShare(uint256)\":{\"details\":\"ADDED for gETH\",\"returns\":{\"_0\":\"price of the derivative in terms of underlying token, Ether\"}},\"priceUpdateTimestamp(uint256)\":{\"details\":\"ADDED for gETH\",\"returns\":{\"_0\":\"timestamp of the latest price update for given ID\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155-safeBatchTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"CHANGED for gETHADDED \\\"((!isMiddleware(sender, id)) || isAvoider(from, id))\\\" pass conditionSee ERC1155 safeTransferFrom: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/cffb2f1ddcd87efd68effc92cfd336c5145acabd/contracts/token/ERC1155/ERC1155.sol#L109C29-L109C29\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC1155-setApprovalForAll}.\"},\"setMiddleware(address,uint256,bool)\":{\"details\":\"ADDED for gETH\",\"params\":{\"isSet\":\"true: sets as a middleware, false: unsets\",\"middleware\":\"Address of the contract that will act as a middleware\"}},\"setPricePerShare(uint256,uint256)\":{\"details\":\"ADDED for gETH\"},\"totalSupply()\":{\"details\":\"Total value of tokens.\"},\"totalSupply(uint256)\":{\"details\":\"Total value of tokens in with a given id.\"},\"transferMiddlewareManagerRole(address)\":{\"details\":\"MIDDLEWARE MANAGER is basically a superUser, there can be only 1 at a given time,intended as \\\"Portal\\\"\"},\"transferMinterRole(address)\":{\"details\":\"MINTER is basically a superUser, there can be only 1 at a given time,intended as \\\"Portal\\\"\"},\"transferOracleRole(address)\":{\"details\":\"ORACLE is basically a superUser, there can be only 1 at a given time,intended as \\\"Portal\\\"\"},\"transferPauserRole(address)\":{\"details\":\"PAUSER is basically a superUser, there can be only 1 at a given time,intended as \\\"Portal\\\"\"},\"transferUriSetterRole(address)\":{\"details\":\"URI_SETTER is basically a superuser, there can be only 1 at a given time,intended as \\\"Governance/DAO\\\"\"},\"uri(uint256)\":{\"details\":\"See {IERC1155MetadataURI-uri}. This implementation returns the same URI for *all* token types. It relies on the token type ID substitution mechanism https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. Clients calling this function must replace the `\\\\{id\\\\}` substring with the actual token type ID.\"}},\"stateVariables\":{\"DENOMINATOR\":{\"custom:section\":\"** CONSTANTS **\"},\"_avoiders\":{\"details\":\"ADDED for gETH*\"},\"_middlewares\":{\"details\":\"There can be multiple Middlewares for 1 staking pool.ADDED for gETH*\"},\"_pricePerShare\":{\"details\":\"Freshly created IDs should return 1e18 since initally 1 ETH = 1 gETHADDED for gETH*\"},\"_priceUpdateTimestamp\":{\"details\":\"ADDED for gETH*\"},\"name\":{\"custom:section\":\"** VARIABLES **\"}},\"title\":\"gETH : Geode Finance Liquid Staking Derivatives\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"avoidMiddlewares(uint256,bool)\":{\"notice\":\"Restrict any affect of middlewares on the tokens of caller\"},\"constructor\":{\"notice\":\"Sets name, symbol, uri and grants necessary roles.\"},\"denominator()\":{\"notice\":\"a centralized denominator for all contract using gETH\"},\"isAvoider(address,uint256)\":{\"notice\":\"Checks if the given address restricts the affect of the middlewares on their gETH\"},\"isMiddleware(address,uint256)\":{\"notice\":\"Check if an address is approved as a middleware for an ID\"},\"setMiddleware(address,uint256,bool)\":{\"notice\":\"Set an address of a contract that will act as a middleware on gETH contract for a specific ID\"},\"setPricePerShare(uint256,uint256)\":{\"notice\":\"Only ORACLE can call this function and set price\"},\"transferMiddlewareManagerRole(address)\":{\"notice\":\"transfers the authorized party for middleware management\"},\"transferMinterRole(address)\":{\"notice\":\"transfers the authorized party for Minting operations related to minting\"},\"transferOracleRole(address)\":{\"notice\":\"transfers the authorized party for Oracle operations related to pricing\"},\"transferPauserRole(address)\":{\"notice\":\"transfers the authorized party for Pausing operations.\"},\"transferUriSetterRole(address)\":{\"notice\":\"transfers the authorized party for setting a new uri.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/gETH.sol\":\"gETH\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IAccessControl} from \\\"./IAccessControl.sol\\\";\\nimport {Context} from \\\"../utils/Context.sol\\\";\\nimport {ERC165} from \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address account => bool) hasRole;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 role => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with an {AccessControlUnauthorizedAccount} error including the required role.\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\\n return _roles[role].hasRole[account];\\n }\\n\\n /**\\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\\n * is missing `role`.\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert AccessControlUnauthorizedAccount(account, role);\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `callerConfirmation`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\\n if (callerConfirmation != _msgSender()) {\\n revert AccessControlBadConfirmation();\\n }\\n\\n _revokeRole(role, callerConfirmation);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\\n if (!hasRole(role, account)) {\\n _roles[role].hasRole[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\\n if (hasRole(role, account)) {\\n _roles[role].hasRole[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n return true;\\n } else {\\n return false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev The `account` is missing a role.\\n */\\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\\n\\n /**\\n * @dev The caller of a function is not the expected one.\\n *\\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\\n */\\n error AccessControlBadConfirmation();\\n\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `callerConfirmation`.\\n */\\n function renounceRole(bytes32 role, address callerConfirmation) external;\\n}\\n\",\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard ERC20 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\\n */\\ninterface IERC20Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC20InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC20InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC20InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC20InvalidSpender(address spender);\\n}\\n\\n/**\\n * @dev Standard ERC721 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\\n */\\ninterface IERC721Errors {\\n /**\\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\\n * Used in balance queries.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721InvalidOwner(address owner);\\n\\n /**\\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721NonexistentToken(uint256 tokenId);\\n\\n /**\\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param tokenId Identifier number of a token.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC721InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC721InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC721InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC721InvalidOperator(address operator);\\n}\\n\\n/**\\n * @dev Standard ERC1155 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\\n */\\ninterface IERC1155Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC1155InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC1155InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC1155MissingApprovalForAll(address operator, address owner);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC1155InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC1155InvalidOperator(address operator);\\n\\n /**\\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\\n * Used in batch transfers.\\n * @param idsLength Length of the array of token identifiers\\n * @param valuesLength Length of the array of token amounts\\n */\\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\\n}\\n\",\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\\n */\\ninterface IERC1155 is IERC165 {\\n /**\\n * @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.\\n */\\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n /**\\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\\n * transfers.\\n */\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] values\\n );\\n\\n /**\\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\\n * `approved`.\\n */\\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\\n\\n /**\\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\\n *\\n * If an {URI} event was emitted for `id`, the standard\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\\n * returned by {IERC1155MetadataURI-uri}.\\n */\\n event URI(string value, uint256 indexed id);\\n\\n /**\\n * @dev Returns the value of tokens of token type `id` owned by `account`.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function balanceOf(address account, uint256 id) external view returns (uint256);\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\\n *\\n * Requirements:\\n *\\n * - `accounts` and `ids` must have the same length.\\n */\\n function balanceOfBatch(\\n address[] calldata accounts,\\n uint256[] calldata ids\\n ) external view returns (uint256[] memory);\\n\\n /**\\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\\n *\\n * Emits an {ApprovalForAll} event.\\n *\\n * Requirements:\\n *\\n * - `operator` cannot be the caller.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\\n *\\n * See {setApprovalForAll}.\\n */\\n function isApprovedForAll(address account, address operator) external view returns (bool);\\n\\n /**\\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`.\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155Received} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\\n *\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `values` must have the same length.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external;\\n}\\n\",\"keccak256\":\"0xe64b3445a3f638890af7ad92464cd18f1f202a2f5a7ed42dabf74317bae43303\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Interface that must be implemented by smart contracts in order to receive\\n * ERC-1155 token transfers.\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xb69597a63b202e28401128bed6a6d259e8730191274471af7303eafb247881a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/extensions/IERC1155MetadataURI.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC1155} from \\\"../IERC1155.sol\\\";\\n\\n/**\\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\\n */\\ninterface IERC1155MetadataURI is IERC1155 {\\n /**\\n * @dev Returns the URI for token type `id`.\\n *\\n * If the `\\\\{id\\\\}` substring is present in the URI, it must be replaced by\\n * clients with the actual token type ID.\\n */\\n function uri(uint256 id) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xe92b5e199b963d108ad6e06feeede151ba23849e0d064956535489ff967ffe68\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Arrays.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Arrays.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {StorageSlot} from \\\"./StorageSlot.sol\\\";\\nimport {Math} from \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to array types.\\n */\\nlibrary Arrays {\\n using StorageSlot for bytes32;\\n\\n /**\\n * @dev Searches a sorted `array` and returns the first index that contains\\n * a value greater or equal to `element`. If no such index exists (i.e. all\\n * values in the array are strictly less than `element`), the array length is\\n * returned. Time complexity O(log n).\\n *\\n * `array` is expected to be sorted in ascending order, and to contain no\\n * repeated elements.\\n */\\n function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {\\n uint256 low = 0;\\n uint256 high = array.length;\\n\\n if (high == 0) {\\n return 0;\\n }\\n\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n\\n // Note that mid will always be strictly less than high (i.e. it will be a valid array index)\\n // because Math.average rounds towards zero (it does integer division with truncation).\\n if (unsafeAccess(array, mid).value > element) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.\\n if (low > 0 && unsafeAccess(array, low - 1).value == element) {\\n return low - 1;\\n } else {\\n return low;\\n }\\n }\\n\\n /**\\n * @dev Access an array in an \\\"unsafe\\\" way. Skips solidity \\\"index-out-of-range\\\" check.\\n *\\n * WARNING: Only use if you are certain `pos` is lower than the array length.\\n */\\n function unsafeAccess(address[] storage arr, uint256 pos) internal pure returns (StorageSlot.AddressSlot storage) {\\n bytes32 slot;\\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0, arr.slot)\\n slot := add(keccak256(0, 0x20), pos)\\n }\\n return slot.getAddressSlot();\\n }\\n\\n /**\\n * @dev Access an array in an \\\"unsafe\\\" way. Skips solidity \\\"index-out-of-range\\\" check.\\n *\\n * WARNING: Only use if you are certain `pos` is lower than the array length.\\n */\\n function unsafeAccess(bytes32[] storage arr, uint256 pos) internal pure returns (StorageSlot.Bytes32Slot storage) {\\n bytes32 slot;\\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0, arr.slot)\\n slot := add(keccak256(0, 0x20), pos)\\n }\\n return slot.getBytes32Slot();\\n }\\n\\n /**\\n * @dev Access an array in an \\\"unsafe\\\" way. Skips solidity \\\"index-out-of-range\\\" check.\\n *\\n * WARNING: Only use if you are certain `pos` is lower than the array length.\\n */\\n function unsafeAccess(uint256[] storage arr, uint256 pos) internal pure returns (StorageSlot.Uint256Slot storage) {\\n bytes32 slot;\\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0, arr.slot)\\n slot := add(keccak256(0, 0x20), pos)\\n }\\n return slot.getUint256Slot();\\n }\\n\\n /**\\n * @dev Access an array in an \\\"unsafe\\\" way. Skips solidity \\\"index-out-of-range\\\" check.\\n *\\n * WARNING: Only use if you are certain `pos` is lower than the array length.\\n */\\n function unsafeMemoryAccess(uint256[] memory arr, uint256 pos) internal pure returns (uint256 res) {\\n assembly {\\n res := mload(add(add(arr, 0x20), mul(pos, 0x20)))\\n }\\n }\\n\\n /**\\n * @dev Access an array in an \\\"unsafe\\\" way. Skips solidity \\\"index-out-of-range\\\" check.\\n *\\n * WARNING: Only use if you are certain `pos` is lower than the array length.\\n */\\n function unsafeMemoryAccess(address[] memory arr, uint256 pos) internal pure returns (address res) {\\n assembly {\\n res := mload(add(add(arr, 0x20), mul(pos, 0x20)))\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8806d620b6571932b662cfd48fbd518d4f70df1f88a23b5724cacde64a77bda1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x75a4ee64c68dbd5f38bddd06e664a64c8271b4caa554fb6f0607dfd672bb4bf3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Pausable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Context} from \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract Pausable is Context {\\n bool private _paused;\\n\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n /**\\n * @dev The operation failed because the contract is paused.\\n */\\n error EnforcedPause();\\n\\n /**\\n * @dev The operation failed because the contract is not paused.\\n */\\n error ExpectedPause();\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n constructor() {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n _requireNotPaused();\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n _requirePaused();\\n _;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Throws if the contract is paused.\\n */\\n function _requireNotPaused() internal view virtual {\\n if (paused()) {\\n revert EnforcedPause();\\n }\\n }\\n\\n /**\\n * @dev Throws if the contract is not paused.\\n */\\n function _requirePaused() internal view virtual {\\n if (!paused()) {\\n revert ExpectedPause();\\n }\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n}\\n\",\"keccak256\":\"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(newImplementation.code.length > 0);\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Muldiv operation overflow.\\n */\\n error MathOverflowedMulDiv();\\n\\n enum Rounding {\\n Floor, // Toward negative infinity\\n Ceil, // Toward positive infinity\\n Trunc, // Toward zero\\n Expand // Away from zero\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds towards infinity instead\\n * of rounding towards zero.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (b == 0) {\\n // Guarantee the same behavior as in a regular Solidity division.\\n return a / b;\\n }\\n\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n * denominator == 0.\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n * Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0 = x * y; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n if (denominator <= prod1) {\\n revert MathOverflowedMulDiv();\\n }\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n uint256 twos = denominator & (0 - denominator);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\\n // works in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n * towards zero.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n */\\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n return uint8(rounding) % 2 == 1;\\n }\\n}\\n\",\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\"},\"contracts/gETH.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n// external - interfaces\\nimport {IERC1155} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\\\";\\n// internal - globals\\nimport {gETH_DENOMINATOR} from \\\"./globals/macros.sol\\\";\\n// internal - interfaces\\nimport {IERC1155Burnable} from \\\"./interfaces/helpers/IERC1155PausableBurnableSupply.sol\\\";\\nimport {IgETH} from \\\"./interfaces/IgETH.sol\\\";\\n// internal - contracts\\nimport {ERC1155, ERC1155Burnable, ERC1155PausableBurnableSupply} from \\\"./helpers/ERC1155PausableBurnableSupply.sol\\\";\\n\\n/**\\n * @title gETH : Geode Finance Liquid Staking Derivatives\\n *\\n * @dev gETH is chain-agnostic, meaning it can be used on any evm chain (given the correct name and symbol).\\n *\\n * @dev gETH is immutable, it cannot be upgraded.\\n *\\n * @dev gETH is a special ERC1155 contract with additional functionalities:\\n * gETHMiddlewares:\\n * * Most important functionality gETH provides:\\n * * Allowing any other contract to provide additional functionality\\n * * around the balance and price data, such as using an ID like ERC20.\\n * * This addition effectively result in changes in\\n * * safeTransferFrom(), burn(), _doSafeTransferAcceptanceCheck()\\n * * functions, reasoning is in the comments.\\n * Avoiders:\\n * * If one wants to remain unbound from gETHMiddlewares,\\n * * it can be done so by calling \\\"avoidMiddlewares\\\" function.\\n * PricePerShare:\\n * * Keeping track of the ratio between the derivative\\n * * and the underlaying staked asset, Ether.\\n * Denominator:\\n * * ERC1155 does not have decimals and it is not wise to use the name convention\\n * * but we need to provide some information on how to denominate the balances, price, etc.\\n *\\n * @dev review ERC1155PausableBurnableSupply, which is generated with Openzeppelin wizard.\\n *\\n * @author Ice Bear & Crash Bandicoot\\n */\\ncontract gETH is IgETH, ERC1155PausableBurnableSupply {\\n /**\\n * @custom:section ** ERRORS **\\n */\\n error gETHZeroId();\\n error gETHInvalidMiddleware(address middleware);\\n /**\\n * @custom:section ** CONSTANTS **\\n */\\n uint256 private immutable DENOMINATOR = gETH_DENOMINATOR;\\n bytes32 public immutable MIDDLEWARE_MANAGER_ROLE = keccak256(\\\"MIDDLEWARE_MANAGER_ROLE\\\");\\n bytes32 public immutable ORACLE_ROLE = keccak256(\\\"ORACLE_ROLE\\\");\\n\\n /**\\n * @custom:section ** VARIABLES **\\n */\\n\\n string public name;\\n string public symbol;\\n /**\\n * @notice Mapping from pool IDs to gETHMiddleware implementation addresses\\n * @dev There can be multiple Middlewares for 1 staking pool.\\n * @dev ADDED for gETH\\n **/\\n mapping(uint256 => mapping(address => bool)) private _middlewares;\\n\\n /**\\n * @notice Mapping of user addresses who chose to restrict the access of Middlewares\\n * @dev ADDED for gETH\\n **/\\n mapping(address => mapping(uint256 => bool)) private _avoiders;\\n\\n /**\\n * @notice shows the underlying ETH for 1 staked gETH for a given asset ID\\n * @dev Freshly created IDs should return 1e18 since initally 1 ETH = 1 gETH\\n * @dev ADDED for gETH\\n **/\\n mapping(uint256 => uint256) private _pricePerShare;\\n /**\\n * @notice ID to timestamp, pointing the second that the latest price update happened\\n * @dev ADDED for gETH\\n **/\\n mapping(uint256 => uint256) private _priceUpdateTimestamp;\\n\\n /**\\n * @custom:section ** EVENTS **\\n */\\n event PriceUpdated(uint256 id, uint256 pricePerShare, uint256 updateTimestamp);\\n event MiddlewareSet(uint256 id, address middleware, bool isSet);\\n event Avoider(address avoider, uint256 id, bool isAvoid);\\n\\n /**\\n * @custom:section ** CONSTRUCTOR **\\n */\\n /**\\n * @notice Sets name, symbol, uri and grants necessary roles.\\n * @param _name chain specific name: Geode Staked Ether, geode Staked Avax etc.\\n * @param _symbol chain specific symbol of the staking derivative: gETH, gGNO, gAVAX, etc.\\n **/\\n constructor(\\n string memory _name,\\n string memory _symbol,\\n string memory _uri\\n ) ERC1155PausableBurnableSupply(_uri) {\\n name = _name;\\n symbol = _symbol;\\n\\n _grantRole(keccak256(\\\"MIDDLEWARE_MANAGER_ROLE\\\"), _msgSender());\\n _grantRole(keccak256(\\\"ORACLE_ROLE\\\"), _msgSender());\\n }\\n\\n /**\\n * @custom:section ** DENOMINATOR **\\n *\\n * @custom:visibility -> view\\n */\\n /**\\n * @notice a centralized denominator for all contract using gETH\\n * @dev ERC1155 does not have a decimals, and it is not wise to use the same name\\n * @dev ADDED for gETH\\n */\\n function denominator() public view virtual override returns (uint256) {\\n return DENOMINATOR;\\n }\\n\\n /**\\n * @custom:section ** MIDDLEWARES **\\n */\\n\\n /**\\n * @custom:visibility -> view-public\\n */\\n\\n /**\\n * @notice Check if an address is approved as a middleware for an ID\\n * @dev ADDED for gETH\\n */\\n function isMiddleware(\\n address middleware,\\n uint256 id\\n ) public view virtual override returns (bool) {\\n return _middlewares[id][middleware];\\n }\\n\\n /**\\n * @custom:visibility -> internal\\n */\\n /**\\n * @dev Only authorized parties should set the middleware\\n * @dev ADDED for gETH\\n */\\n function _setMiddleware(address _middleware, uint256 _id, bool _isSet) internal virtual {\\n _middlewares[_id][_middleware] = _isSet;\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n /**\\n * @notice Set an address of a contract that will\\n * act as a middleware on gETH contract for a specific ID\\n * @param middleware Address of the contract that will act as a middleware\\n * @param isSet true: sets as a middleware, false: unsets\\n * @dev ADDED for gETH\\n */\\n function setMiddleware(\\n address middleware,\\n uint256 id,\\n bool isSet\\n ) external virtual override onlyRole(MIDDLEWARE_MANAGER_ROLE) {\\n if (middleware == address(0) || middleware.code.length == 0) {\\n revert gETHInvalidMiddleware(middleware);\\n }\\n\\n _setMiddleware(middleware, id, isSet);\\n\\n emit MiddlewareSet(id, middleware, isSet);\\n }\\n\\n /**\\n * @custom:section ** AVOIDERS **\\n */\\n /**\\n * @custom:visibility -> view-public\\n */\\n /**\\n * @notice Checks if the given address restricts the affect of the middlewares on their gETH\\n * @param account the potential avoider\\n * @dev ADDED for gETH\\n **/\\n function isAvoider(address account, uint256 id) public view virtual override returns (bool) {\\n return _avoiders[account][id];\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n /**\\n * @notice Restrict any affect of middlewares on the tokens of caller\\n * @param isAvoid true: restrict middlewares, false: allow middlewares\\n * @dev ADDED for gETH\\n **/\\n function avoidMiddlewares(uint256 id, bool isAvoid) external virtual override {\\n address account = _msgSender();\\n\\n _avoiders[account][id] = isAvoid;\\n\\n emit Avoider(account, id, isAvoid);\\n }\\n\\n /**\\n * @custom:section ** PRICE **\\n */\\n\\n /**\\n * @custom:visibility -> view-external\\n */\\n\\n /**\\n * @dev ADDED for gETH\\n * @return price of the derivative in terms of underlying token, Ether\\n */\\n function pricePerShare(uint256 id) external view virtual override returns (uint256) {\\n return _pricePerShare[id];\\n }\\n\\n /**\\n * @dev ADDED for gETH\\n * @return timestamp of the latest price update for given ID\\n */\\n function priceUpdateTimestamp(uint256 id) external view virtual override returns (uint256) {\\n return _priceUpdateTimestamp[id];\\n }\\n\\n /**\\n * @custom:visibility -> internal\\n */\\n\\n /**\\n * @dev ADDED for gETH\\n */\\n function _setPricePerShare(uint256 _price, uint256 _id) internal virtual {\\n _pricePerShare[_id] = _price;\\n _priceUpdateTimestamp[_id] = block.timestamp;\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @notice Only ORACLE can call this function and set price\\n * @dev ADDED for gETH\\n */\\n function setPricePerShare(\\n uint256 price,\\n uint256 id\\n ) external virtual override onlyRole(ORACLE_ROLE) {\\n if (id == 0) {\\n revert gETHZeroId();\\n }\\n\\n _setPricePerShare(price, id);\\n\\n emit PriceUpdated(id, price, block.timestamp);\\n }\\n\\n /**\\n * @custom:section ** ROLES **\\n *\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @notice transfers the authorized party for setting a new uri.\\n * @dev URI_SETTER is basically a superuser, there can be only 1 at a given time,\\n * @dev intended as \\\"Governance/DAO\\\"\\n */\\n function transferUriSetterRole(\\n address newUriSetter\\n ) external virtual override onlyRole(URI_SETTER_ROLE) {\\n _grantRole(URI_SETTER_ROLE, newUriSetter);\\n renounceRole(URI_SETTER_ROLE, _msgSender());\\n }\\n\\n /**\\n * @notice transfers the authorized party for Pausing operations.\\n * @dev PAUSER is basically a superUser, there can be only 1 at a given time,\\n * @dev intended as \\\"Portal\\\"\\n */\\n function transferPauserRole(address newPauser) external virtual override onlyRole(PAUSER_ROLE) {\\n _grantRole(PAUSER_ROLE, newPauser);\\n renounceRole(PAUSER_ROLE, _msgSender());\\n }\\n\\n /**\\n * @notice transfers the authorized party for Minting operations related to minting\\n * @dev MINTER is basically a superUser, there can be only 1 at a given time,\\n * @dev intended as \\\"Portal\\\"\\n */\\n function transferMinterRole(address newMinter) external virtual override onlyRole(MINTER_ROLE) {\\n _grantRole(MINTER_ROLE, newMinter);\\n renounceRole(MINTER_ROLE, _msgSender());\\n }\\n\\n /**\\n * @notice transfers the authorized party for Oracle operations related to pricing\\n * @dev ORACLE is basically a superUser, there can be only 1 at a given time,\\n * @dev intended as \\\"Portal\\\"\\n */\\n function transferOracleRole(address newOracle) external virtual override onlyRole(ORACLE_ROLE) {\\n _grantRole(ORACLE_ROLE, newOracle);\\n renounceRole(ORACLE_ROLE, _msgSender());\\n }\\n\\n /**\\n * @notice transfers the authorized party for middleware management\\n * @dev MIDDLEWARE MANAGER is basically a superUser, there can be only 1 at a given time,\\n * @dev intended as \\\"Portal\\\"\\n */\\n function transferMiddlewareManagerRole(\\n address newMiddlewareManager\\n ) external virtual override onlyRole(MIDDLEWARE_MANAGER_ROLE) {\\n _grantRole(MIDDLEWARE_MANAGER_ROLE, newMiddlewareManager);\\n renounceRole(MIDDLEWARE_MANAGER_ROLE, _msgSender());\\n }\\n\\n /**\\n * @custom:section ** OVERRIDES **\\n *\\n * @dev middleware of a specific ID can move funds between accounts without approval.\\n * So, we will be overriding 2 functions:\\n * * safeTransferFrom\\n * * burn\\n * note safeBatchTransferFrom is not need to be overriden,\\n * as a middleware should not do batch transfers.\\n *\\n * @dev middlewares should handle transfer checks internally.\\n * Because of this we want to remove the SafeTransferAcceptanceCheck if the caller is a middleware.\\n * However, overriding _doSafeTransferAcceptanceCheck was not possible, so we copy pasted OZ contracts and\\n * made it internal virtual.\\n * note _doSafeBatchTransferAcceptanceCheck is not need to be overriden,\\n * as a middleware should not do batch transfers.\\n */\\n\\n /**\\n * @dev CHANGED for gETH\\n * @dev ADDED if (!isMiddleware) check\\n * @dev See ERC1155 _doSafeTransferAcceptanceCheck:\\n * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/cffb2f1ddcd87efd68effc92cfd336c5145acabd/contracts/token/ERC1155/ERC1155.sol#L381\\n */\\n function _doSafeTransferAcceptanceCheck(\\n address operator,\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) internal virtual override {\\n if (!(isMiddleware(operator, id))) {\\n super._doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);\\n }\\n }\\n\\n /**\\n * @dev CHANGED for gETH\\n * @dev ADDED \\\"((!isMiddleware(sender, id)) || isAvoider(from, id))\\\" pass condition\\n * @dev See ERC1155 safeTransferFrom:\\n * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/cffb2f1ddcd87efd68effc92cfd336c5145acabd/contracts/token/ERC1155/ERC1155.sol#L109C29-L109C29\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 value,\\n bytes memory data\\n ) public virtual override(ERC1155, IERC1155) {\\n address sender = _msgSender();\\n\\n if (from != sender && !isApprovedForAll(from, sender)) {\\n if ((!isMiddleware(sender, id)) || isAvoider(from, id)) {\\n revert ERC1155MissingApprovalForAll(sender, from);\\n }\\n }\\n\\n _safeTransferFrom(from, to, id, value, data);\\n }\\n\\n /**\\n * @dev CHANGED for gETH\\n * @dev ADDED \\\"((!(isMiddleware(sender, id))) || (isAvoider(account, id)))\\\" pass condition\\n * @dev See ERC1155Burnable burn:\\n * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/cffb2f1ddcd87efd68effc92cfd336c5145acabd/contracts/token/ERC1155/extensions/ERC1155Burnable.sol#L13C1-L19C6\\n */\\n function burn(\\n address account,\\n uint256 id,\\n uint256 value\\n ) public virtual override(ERC1155Burnable, IERC1155Burnable) {\\n address sender = _msgSender();\\n\\n if (account != sender && !isApprovedForAll(account, sender)) {\\n if ((!isMiddleware(sender, id)) || isAvoider(account, id)) {\\n revert ERC1155MissingApprovalForAll(sender, account);\\n }\\n }\\n\\n _burn(account, id, value);\\n }\\n}\\n\",\"keccak256\":\"0x406c933d4d2f14a12ad536ea35a5725502679e07a860f0b7bf794391f56b5aba\",\"license\":\"MIT\"},\"contracts/globals/macros.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n// no floats in solidity. If needed, PERCENTAGE_DENOMINATOR always represents \\\"1\\\" (100%)\\nuint256 constant PERCENTAGE_DENOMINATOR = 1e10;\\n\\nuint256 constant gETH_DENOMINATOR = 1e18;\\n\",\"keccak256\":\"0x9d699aeaf6da35d188a5495eec188b28a990e09bd04fa7701d28c4ff9afba801\",\"license\":\"MIT\"},\"contracts/helpers/ERC1155PausableBurnableSupply.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/ERC1155.sol)\\n\\n// External\\n// Dependencies: ERC1155\\n// * interfaces\\nimport {IERC165} from \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport {IERC1155} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\\\";\\nimport {IERC1155Receiver} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Errors} from \\\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\\\";\\n// * libraries\\nimport {Arrays} from \\\"@openzeppelin/contracts/utils/Arrays.sol\\\";\\n// * contracts\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ERC165} from \\\"@openzeppelin/contracts/utils/introspection/ERC165.sol\\\";\\n\\n// Dependencies: ERC1155Pausable\\nimport {Pausable} from \\\"@openzeppelin/contracts/utils/Pausable.sol\\\";\\n\\n// Dependencies: ERC1155PausableBurnableSupply\\nimport {AccessControl} from \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\n\\n// Internal - interfaces\\nimport {IERC1155Burnable, IERC1155Supply, IERC1155PausableBurnableSupply} from \\\"../interfaces/helpers/IERC1155PausableBurnableSupply.sol\\\";\\n\\nabstract contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n using Arrays for uint256[];\\n using Arrays for address[];\\n\\n mapping(uint256 id => mapping(address account => uint256)) private _balances;\\n\\n mapping(address account => mapping(address operator => bool)) private _operatorApprovals;\\n\\n // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json\\n string private _uri;\\n\\n /**\\n * @dev See {_setURI}.\\n */\\n constructor(string memory uri_) {\\n _setURI(uri_);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC165, IERC165) returns (bool) {\\n return\\n interfaceId == type(IERC1155).interfaceId ||\\n interfaceId == type(IERC1155MetadataURI).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC1155MetadataURI-uri}.\\n *\\n * This implementation returns the same URI for *all* token types. It relies\\n * on the token type ID substitution mechanism\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\\n *\\n * Clients calling this function must replace the `\\\\{id\\\\}` substring with the\\n * actual token type ID.\\n */\\n function uri(uint256 /* id */) public view virtual returns (string memory) {\\n return _uri;\\n }\\n\\n /**\\n * @dev See {IERC1155-balanceOf}.\\n */\\n function balanceOf(address account, uint256 id) public view virtual returns (uint256) {\\n return _balances[id][account];\\n }\\n\\n /**\\n * @dev See {IERC1155-balanceOfBatch}.\\n *\\n * Requirements:\\n *\\n * - `accounts` and `ids` must have the same length.\\n */\\n function balanceOfBatch(\\n address[] memory accounts,\\n uint256[] memory ids\\n ) public view virtual returns (uint256[] memory) {\\n if (accounts.length != ids.length) {\\n revert ERC1155InvalidArrayLength(ids.length, accounts.length);\\n }\\n\\n uint256[] memory batchBalances = new uint256[](accounts.length);\\n\\n for (uint256 i = 0; i < accounts.length; ++i) {\\n batchBalances[i] = balanceOf(accounts.unsafeMemoryAccess(i), ids.unsafeMemoryAccess(i));\\n }\\n\\n return batchBalances;\\n }\\n\\n /**\\n * @dev See {IERC1155-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC1155-isApprovedForAll}.\\n */\\n function isApprovedForAll(address account, address operator) public view virtual returns (bool) {\\n return _operatorApprovals[account][operator];\\n }\\n\\n /**\\n * @dev See {IERC1155-safeTransferFrom}.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 value,\\n bytes memory data\\n ) public virtual {\\n address sender = _msgSender();\\n if (from != sender && !isApprovedForAll(from, sender)) {\\n revert ERC1155MissingApprovalForAll(sender, from);\\n }\\n _safeTransferFrom(from, to, id, value, data);\\n }\\n\\n /**\\n * @dev See {IERC1155-safeBatchTransferFrom}.\\n */\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values,\\n bytes memory data\\n ) public virtual {\\n address sender = _msgSender();\\n if (from != sender && !isApprovedForAll(from, sender)) {\\n revert ERC1155MissingApprovalForAll(sender, from);\\n }\\n _safeBatchTransferFrom(from, to, ids, values, data);\\n }\\n\\n /**\\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`. Will mint (or burn) if `from`\\n * (or `to`) is the zero address.\\n *\\n * Emits a {TransferSingle} event if the arrays contain one element, and {TransferBatch} otherwise.\\n *\\n * Requirements:\\n *\\n * - If `to` refers to a smart contract, it must implement either {IERC1155Receiver-onERC1155Received}\\n * or {IERC1155Receiver-onERC1155BatchReceived} and return the acceptance magic value.\\n * - `ids` and `values` must have the same length.\\n *\\n * NOTE: The ERC-1155 acceptance check is not performed in this function. See {_updateWithAcceptanceCheck} instead.\\n */\\n function _update(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values\\n ) internal virtual {\\n if (ids.length != values.length) {\\n revert ERC1155InvalidArrayLength(ids.length, values.length);\\n }\\n\\n address operator = _msgSender();\\n\\n for (uint256 i = 0; i < ids.length; ++i) {\\n uint256 id = ids.unsafeMemoryAccess(i);\\n uint256 value = values.unsafeMemoryAccess(i);\\n\\n if (from != address(0)) {\\n uint256 fromBalance = _balances[id][from];\\n if (fromBalance < value) {\\n revert ERC1155InsufficientBalance(from, fromBalance, value, id);\\n }\\n unchecked {\\n // Overflow not possible: value <= fromBalance\\n _balances[id][from] = fromBalance - value;\\n }\\n }\\n\\n if (to != address(0)) {\\n _balances[id][to] += value;\\n }\\n }\\n\\n if (ids.length == 1) {\\n uint256 id = ids.unsafeMemoryAccess(0);\\n uint256 value = values.unsafeMemoryAccess(0);\\n emit TransferSingle(operator, from, to, id, value);\\n } else {\\n emit TransferBatch(operator, from, to, ids, values);\\n }\\n }\\n\\n /**\\n * @dev Version of {_update} that performs the token acceptance check by calling\\n * {IERC1155Receiver-onERC1155Received} or {IERC1155Receiver-onERC1155BatchReceived} on the receiver address if it\\n * contains code (eg. is a smart contract at the moment of execution).\\n *\\n * IMPORTANT: Overriding this function is discouraged because it poses a reentrancy risk from the receiver. So any\\n * update to the contract state after this function would break the check-effect-interaction pattern. Consider\\n * overriding {_update} instead.\\n */\\n function _updateWithAcceptanceCheck(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values,\\n bytes memory data\\n ) internal virtual {\\n _update(from, to, ids, values);\\n if (to != address(0)) {\\n address operator = _msgSender();\\n if (ids.length == 1) {\\n uint256 id = ids.unsafeMemoryAccess(0);\\n uint256 value = values.unsafeMemoryAccess(0);\\n _doSafeTransferAcceptanceCheck(operator, from, to, id, value, data);\\n } else {\\n _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, values, data);\\n }\\n }\\n }\\n\\n /**\\n * @dev Transfers a `value` tokens of token type `id` from `from` to `to`.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function _safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 value,\\n bytes memory data\\n ) internal {\\n if (to == address(0)) {\\n revert ERC1155InvalidReceiver(address(0));\\n }\\n if (from == address(0)) {\\n revert ERC1155InvalidSender(address(0));\\n }\\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\\n _updateWithAcceptanceCheck(from, to, ids, values, data);\\n }\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n * - `ids` and `values` must have the same length.\\n */\\n function _safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values,\\n bytes memory data\\n ) internal {\\n if (to == address(0)) {\\n revert ERC1155InvalidReceiver(address(0));\\n }\\n if (from == address(0)) {\\n revert ERC1155InvalidSender(address(0));\\n }\\n _updateWithAcceptanceCheck(from, to, ids, values, data);\\n }\\n\\n /**\\n * @dev Sets a new URI for all token types, by relying on the token type ID\\n * substitution mechanism\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\\n *\\n * By this mechanism, any occurrence of the `\\\\{id\\\\}` substring in either the\\n * URI or any of the values in the JSON file at said URI will be replaced by\\n * clients with the token type ID.\\n *\\n * For example, the `https://token-cdn-domain/\\\\{id\\\\}.json` URI would be\\n * interpreted by clients as\\n * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`\\n * for token type ID 0x4cce0.\\n *\\n * See {uri}.\\n *\\n * Because these URIs cannot be meaningfully represented by the {URI} event,\\n * this function emits no events.\\n */\\n function _setURI(string memory newuri) internal virtual {\\n _uri = newuri;\\n }\\n\\n /**\\n * @dev Creates a `value` amount of tokens of type `id`, and assigns them to `to`.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function _mint(address to, uint256 id, uint256 value, bytes memory data) internal {\\n if (to == address(0)) {\\n revert ERC1155InvalidReceiver(address(0));\\n }\\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\\n _updateWithAcceptanceCheck(address(0), to, ids, values, data);\\n }\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `values` must have the same length.\\n * - `to` cannot be the zero address.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function _mintBatch(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values,\\n bytes memory data\\n ) internal {\\n if (to == address(0)) {\\n revert ERC1155InvalidReceiver(address(0));\\n }\\n _updateWithAcceptanceCheck(address(0), to, ids, values, data);\\n }\\n\\n /**\\n * @dev Destroys a `value` amount of tokens of type `id` from `from`\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `from` must have at least `value` amount of tokens of type `id`.\\n */\\n function _burn(address from, uint256 id, uint256 value) internal {\\n if (from == address(0)) {\\n revert ERC1155InvalidSender(address(0));\\n }\\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\\n _updateWithAcceptanceCheck(from, address(0), ids, values, \\\"\\\");\\n }\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `from` must have at least `value` amount of tokens of type `id`.\\n * - `ids` and `values` must have the same length.\\n */\\n function _burnBatch(address from, uint256[] memory ids, uint256[] memory values) internal {\\n if (from == address(0)) {\\n revert ERC1155InvalidSender(address(0));\\n }\\n _updateWithAcceptanceCheck(from, address(0), ids, values, \\\"\\\");\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Emits an {ApprovalForAll} event.\\n *\\n * Requirements:\\n *\\n * - `operator` cannot be the zero address.\\n */\\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\\n if (operator == address(0)) {\\n revert ERC1155InvalidOperator(address(0));\\n }\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Performs an acceptance check by calling {IERC1155-onERC1155Received} on the `to` address\\n * if it contains code at the moment of execution.\\n */\\n function _doSafeTransferAcceptanceCheck(\\n address operator,\\n address from,\\n address to,\\n uint256 id,\\n uint256 value,\\n bytes memory data\\n ) internal virtual {\\n if (to.code.length > 0) {\\n try IERC1155Receiver(to).onERC1155Received(operator, from, id, value, data) returns (\\n bytes4 response\\n ) {\\n if (response != IERC1155Receiver.onERC1155Received.selector) {\\n // Tokens rejected\\n revert ERC1155InvalidReceiver(to);\\n }\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n // non-ERC1155Receiver implementer\\n revert ERC1155InvalidReceiver(to);\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Performs a batch acceptance check by calling {IERC1155-onERC1155BatchReceived} on the `to` address\\n * if it contains code at the moment of execution.\\n */\\n function _doSafeBatchTransferAcceptanceCheck(\\n address operator,\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values,\\n bytes memory data\\n ) private {\\n if (to.code.length > 0) {\\n try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, values, data) returns (\\n bytes4 response\\n ) {\\n if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {\\n // Tokens rejected\\n revert ERC1155InvalidReceiver(to);\\n }\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n // non-ERC1155Receiver implementer\\n revert ERC1155InvalidReceiver(to);\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Creates an array in memory with only one value for each of the elements provided.\\n */\\n function _asSingletonArrays(\\n uint256 element1,\\n uint256 element2\\n ) private pure returns (uint256[] memory array1, uint256[] memory array2) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Load the free memory pointer\\n array1 := mload(0x40)\\n // Set array length to 1\\n mstore(array1, 1)\\n // Store the single element at the next word after the length (where content starts)\\n mstore(add(array1, 0x20), element1)\\n\\n // Repeat for next array locating it right after the first array\\n array2 := add(array1, 0x40)\\n mstore(array2, 1)\\n mstore(add(array2, 0x20), element2)\\n\\n // Update the free memory pointer by pointing after the second array\\n mstore(0x40, add(array2, 0x40))\\n }\\n }\\n}\\n\\nabstract contract ERC1155Pausable is ERC1155, Pausable {\\n /**\\n * @dev See {ERC1155-_update}.\\n *\\n * Requirements:\\n *\\n * - the contract must not be paused.\\n */\\n function _update(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values\\n ) internal virtual override whenNotPaused {\\n super._update(from, to, ids, values);\\n }\\n}\\n\\nabstract contract ERC1155Burnable is IERC1155Burnable, ERC1155 {\\n function burn(address account, uint256 id, uint256 value) public virtual override {\\n if (account != _msgSender() && !isApprovedForAll(account, _msgSender())) {\\n revert ERC1155MissingApprovalForAll(_msgSender(), account);\\n }\\n\\n _burn(account, id, value);\\n }\\n\\n function burnBatch(\\n address account,\\n uint256[] memory ids,\\n uint256[] memory values\\n ) public virtual {\\n if (account != _msgSender() && !isApprovedForAll(account, _msgSender())) {\\n revert ERC1155MissingApprovalForAll(_msgSender(), account);\\n }\\n\\n _burnBatch(account, ids, values);\\n }\\n}\\n\\nabstract contract ERC1155Supply is IERC1155Supply, ERC1155 {\\n mapping(uint256 id => uint256) private _totalSupply;\\n uint256 private _totalSupplyAll;\\n\\n /**\\n * @dev Total value of tokens in with a given id.\\n */\\n function totalSupply(uint256 id) public view virtual returns (uint256) {\\n return _totalSupply[id];\\n }\\n\\n /**\\n * @dev Total value of tokens.\\n */\\n function totalSupply() public view virtual returns (uint256) {\\n return _totalSupplyAll;\\n }\\n\\n /**\\n * @dev Indicates whether any token exist with a given id, or not.\\n */\\n function exists(uint256 id) public view virtual returns (bool) {\\n return totalSupply(id) > 0;\\n }\\n\\n /**\\n * @dev See {ERC1155-_update}.\\n */\\n function _update(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values\\n ) internal virtual override {\\n super._update(from, to, ids, values);\\n\\n if (from == address(0)) {\\n uint256 totalMintValue = 0;\\n for (uint256 i = 0; i < ids.length; ++i) {\\n uint256 value = values[i];\\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\\n _totalSupply[ids[i]] += value;\\n totalMintValue += value;\\n }\\n // Overflow check required: The rest of the code assumes that totalSupplyAll never overflows\\n _totalSupplyAll += totalMintValue;\\n }\\n\\n if (to == address(0)) {\\n uint256 totalBurnValue = 0;\\n for (uint256 i = 0; i < ids.length; ++i) {\\n uint256 value = values[i];\\n\\n unchecked {\\n // Overflow not possible: values[i] <= balanceOf(from, ids[i]) <= totalSupply(ids[i])\\n _totalSupply[ids[i]] -= value;\\n // Overflow not possible: sum_i(values[i]) <= sum_i(totalSupply(ids[i])) <= totalSupplyAll\\n totalBurnValue += value;\\n }\\n }\\n unchecked {\\n // Overflow not possible: totalBurnValue = sum_i(values[i]) <= sum_i(totalSupply(ids[i])) <= totalSupplyAll\\n _totalSupplyAll -= totalBurnValue;\\n }\\n }\\n }\\n}\\n\\n/**\\n * @notice Base contract for gETH.\\n * @dev Above contracts are taken from Openzeppelin.\\n * @dev Only difference is _doSafeTransferAcceptanceCheck is being internal virtual instead of private, because we want to be able to override it in gETH:\\n * ERC1155:\\n * * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/cffb2f1ddcd87efd68effc92cfd336c5145acabd/contracts/token/ERC1155/ERC1155.sol#1\\n * ERC1155Pausable:\\n * * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/37afdc8910f2853426c20e504ecfe5d992e21813/contracts/token/ERC1155/extensions/ERC1155Pausable.sol#L1\\n * ERC1155Burnable:\\n * * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/37afdc8910f2853426c20e504ecfe5d992e21813/contracts/token/ERC1155/extensions/ERC1155Burnable.sol#L1\\n * ERC1155Supply:\\n * * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/37afdc8910f2853426c20e504ecfe5d992e21813/contracts/token/ERC1155/extensions/ERC1155Supply.sol#L1\\n *\\n * @dev Below contract ERC1155PausableBurnableSupply is created with openzeppelin wizard:\\n * + Mintable\\n * + Burnable\\n * + Supply Tracking\\n * + Pausable\\n * + Updatable URI\\n * + Roles\\n * Additionally, its constructor is changed for some gas savings.\\n */\\ncontract ERC1155PausableBurnableSupply is\\n IERC1155PausableBurnableSupply,\\n ERC1155,\\n AccessControl,\\n ERC1155Pausable,\\n ERC1155Burnable,\\n ERC1155Supply\\n{\\n bytes32 public immutable URI_SETTER_ROLE = keccak256(\\\"URI_SETTER_ROLE\\\");\\n bytes32 public immutable PAUSER_ROLE = keccak256(\\\"PAUSER_ROLE\\\");\\n bytes32 public immutable MINTER_ROLE = keccak256(\\\"MINTER_ROLE\\\");\\n\\n constructor(string memory uri_) ERC1155(uri_) {\\n _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n _grantRole(keccak256(\\\"URI_SETTER_ROLE\\\"), msg.sender);\\n _grantRole(keccak256(\\\"PAUSER_ROLE\\\"), msg.sender);\\n _grantRole(keccak256(\\\"MINTER_ROLE\\\"), msg.sender);\\n }\\n\\n function setURI(string memory newuri) public override onlyRole(URI_SETTER_ROLE) {\\n _setURI(newuri);\\n }\\n\\n function pause() public override onlyRole(PAUSER_ROLE) {\\n _pause();\\n }\\n\\n function unpause() public override onlyRole(PAUSER_ROLE) {\\n _unpause();\\n }\\n\\n function mint(\\n address account,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) public override onlyRole(MINTER_ROLE) {\\n _mint(account, id, amount, data);\\n }\\n\\n function mintBatch(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) public override onlyRole(MINTER_ROLE) {\\n _mintBatch(to, ids, amounts, data);\\n }\\n\\n // The following functions are overrides required by Solidity.\\n\\n function _update(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values\\n ) internal override(ERC1155, ERC1155Pausable, ERC1155Supply) {\\n super._update(from, to, ids, values);\\n }\\n\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view override(ERC1155, AccessControl, IERC165) returns (bool) {\\n return super.supportsInterface(interfaceId);\\n }\\n}\\n\",\"keccak256\":\"0xb76c0ea8cd2679e5e4fd0ca893b9c058fa0aed271ca526971434ba28ebbd4c4d\",\"license\":\"MIT\"},\"contracts/interfaces/IgETH.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IERC1155PausableBurnableSupply} from \\\"./helpers/IERC1155PausableBurnableSupply.sol\\\";\\n\\ninterface IgETH is IERC1155PausableBurnableSupply {\\n function denominator() external view returns (uint256);\\n\\n function isMiddleware(address middleware, uint256 id) external view returns (bool);\\n\\n function setMiddleware(address middleware, uint256 id, bool isSet) external;\\n\\n function isAvoider(address account, uint256 id) external view returns (bool);\\n\\n function avoidMiddlewares(uint256 id, bool isAvoid) external;\\n\\n function pricePerShare(uint256 id) external view returns (uint256);\\n\\n function priceUpdateTimestamp(uint256 id) external view returns (uint256);\\n\\n function setPricePerShare(uint256 price, uint256 id) external;\\n\\n function transferUriSetterRole(address newUriSetter) external;\\n\\n function transferPauserRole(address newPauser) external;\\n\\n function transferMinterRole(address newMinter) external;\\n\\n function transferOracleRole(address newOracle) external;\\n\\n function transferMiddlewareManagerRole(address newMiddlewareManager) external;\\n}\\n\",\"keccak256\":\"0xa093b769e8ba42091d3db8a9e4ddc1be066f4aa92f61ee552983c22a0e9f29d8\",\"license\":\"MIT\"},\"contracts/interfaces/helpers/IERC1155PausableBurnableSupply.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/// @dev IERC1155 inherits IERC165\\nimport {IERC1155} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Errors} from \\\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\\\";\\n\\ninterface IERC1155Burnable is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function burn(address account, uint256 id, uint256 value) external;\\n\\n function burnBatch(address account, uint256[] memory ids, uint256[] memory values) external;\\n}\\n\\ninterface IERC1155Supply is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function totalSupply(uint256 id) external view returns (uint256);\\n\\n function exists(uint256 id) external view returns (bool);\\n}\\n\\ninterface IERC1155PausableBurnableSupply is IERC1155Burnable, IERC1155Supply {\\n function setURI(string memory newuri) external;\\n\\n function pause() external;\\n\\n function unpause() external;\\n\\n function mint(address account, uint256 id, uint256 amount, bytes memory data) external;\\n\\n function mintBatch(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) external;\\n}\\n\",\"keccak256\":\"0x8b0a02fdbc8d54c815d68e122f6869348217b5efd853c8b833c59d2053998ef0\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x61014060405260008051602062002cf283398151915260805260008051602062002d1283398151915260a05260008051602062002d3283398151915260c052670de0b6b3a764000060e05260008051602062002d528339815191526101005260008051602062002cd2833981519152610120523480156200007f57600080fd5b5060405162002d7238038062002d72833981016040819052620000a29162000307565b8080620000af816200017d565b506004805460ff19169055620000c76000336200018f565b50620000e360008051602062002cf2833981519152336200018f565b50620000ff60008051602062002d12833981519152336200018f565b506200011b60008051602062002d32833981519152336200018f565b50600790506200012c848262000427565b5060086200013b838262000427565b506200015760008051602062002d52833981519152336200018f565b506200017360008051602062002cd2833981519152336200018f565b50505050620004f3565b60026200018b828262000427565b5050565b60008281526003602090815260408083206001600160a01b038516845290915281205460ff16620002385760008381526003602090815260408083206001600160a01b03861684529091529020805460ff19166001179055620001ef3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016200023c565b5060005b92915050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200026a57600080fd5b81516001600160401b038082111562000287576200028762000242565b604051601f8301601f19908116603f01168101908282118183101715620002b257620002b262000242565b81604052838152602092508683858801011115620002cf57600080fd5b600091505b83821015620002f35785820183015181830184015290820190620002d4565b600093810190920192909252949350505050565b6000806000606084860312156200031d57600080fd5b83516001600160401b03808211156200033557600080fd5b620003438783880162000258565b945060208601519150808211156200035a57600080fd5b620003688783880162000258565b935060408601519150808211156200037f57600080fd5b506200038e8682870162000258565b9150509250925092565b600181811c90821680620003ad57607f821691505b602082108103620003ce57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200042257600081815260208120601f850160051c81016020861015620003fd5750805b601f850160051c820191505b818110156200041e5782815560010162000409565b5050505b505050565b81516001600160401b0381111562000443576200044362000242565b6200045b8162000454845462000398565b84620003d4565b602080601f8311600181146200049357600084156200047a5750858301515b600019600386901b1c1916600185901b1785556200041e565b600085815260208120601f198616915b82811015620004c457888601518255948401946001909101908401620004a3565b5085821015620004e35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161010051610120516126f5620005dd60003960008181610321015281816108f101528181610dcc01528181610df90152610e2401526000818161062401528181610c1801528181610f8c01528181610fb90152610fe4015260006105130152600081816105b0015281816108b401528181610d6401528181610e8e01528181610ebb0152610ee60152600081816105ea01528181610ae401528181610d9a01528181610f0d01528181610f3a0152610f65015260008181610499015281816106c101528181610a3101528181610a5e0152610a8901526126f56000f3fe608060405234801561001057600080fd5b506004361061027e5760003560e01c80636b20c4541161015c578063b8bf60f9116100ce578063e63ab1e911610087578063e63ab1e9146105e5578063e985e9c51461060c578063eef37fd51461061f578063f242432a14610646578063f5298aca14610659578063f759cc3b1461066c57600080fd5b8063b8bf60f914610552578063bad383a614610565578063bd85b03914610578578063c7bddb1e14610598578063d5391393146105ab578063d547741f146105d257600080fd5b8063908d67ed11610120578063908d67ed146104d657806391d14854146104f657806395d89b411461050957806396ce079514610511578063a217fddf14610537578063a22cb4651461053f57600080fd5b80636b20c4541461046e578063731133e9146104815780637f345710146104945780638456cb59146104bb5780638801b9b8146104c357600080fd5b8063248a9ca3116101f55780633f4ba83a116101b95780633f4ba83a146103f35780634d280a55146103fb5780634e1273f41461040e5780634f558e791461042e578063512be796146104505780635c975abb1461046357600080fd5b8063248a9ca3146103845780632eb2c2d6146103a75780632f2ff15d146103ba5780633106fde8146103cd57806336568abe146103e057600080fd5b8063072650d211610247578063072650d21461030957806307e2cea51461031c5780630e89341c1461034357806318160ddd146103565780631f7fdffa1461035e57806322af59971461037157600080fd5b8062fdd58e1461028357806301ffc9a7146102a957806302fe5305146102cc5780630492f6e1146102e157806306fdde03146102f4575b600080fd5b610296610291366004611ce6565b61068c565b6040519081526020015b60405180910390f35b6102bc6102b7366004611d26565b6106b4565b60405190151581526020016102a0565b6102df6102da366004611de9565b6106bf565b005b6102df6102ef366004611e4a565b6106f6565b6102fc610765565b6040516102a09190611ebc565b6102bc610317366004611ce6565b6107f3565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102fc610351366004611ecf565b61081e565b600654610296565b6102df61036c366004611f97565b6108b2565b6102df61037f366004612030565b6108ef565b610296610392366004611ecf565b60009081526003602052604090206001015490565b6102df6103b5366004612052565b610998565b6102df6103c83660046120fc565b610a04565b6102df6103db36600461211f565b610a2f565b6102df6103ee3660046120fc565b610aaa565b6102df610ae2565b6102bc610409366004611ce6565b610b17565b61042161041c36600461213a565b610b41565b6040516102a09190612235565b6102bc61043c366004611ecf565b600090815260056020526040902054151590565b6102df61045e366004612248565b610c16565b60045460ff166102bc565b6102df61047c366004612284565b610d08565b6102df61048f3660046122f8565b610d62565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102df610d98565b6102df6104d136600461211f565b610dca565b6102966104e4366004611ecf565b6000908152600c602052604090205490565b6102bc6105043660046120fc565b610e49565b6102fc610e74565b7f0000000000000000000000000000000000000000000000000000000000000000610296565b610296600081565b6102df61054d36600461234d565b610e81565b6102df61056036600461211f565b610e8c565b6102df61057336600461211f565b610f0b565b610296610586366004611ecf565b60009081526005602052604090205490565b6102df6105a636600461211f565b610f8a565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102df6105e03660046120fc565b611009565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102bc61061a366004612377565b61102e565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102df6106543660046123a1565b61105c565b6102df610667366004612406565b6110db565b61029661067a366004611ecf565b6000908152600b602052604090205490565b6000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006106ae82611158565b7f00000000000000000000000000000000000000000000000000000000000000006106e98161117d565b6106f282611187565b5050565b336000818152600a60209081526040808320868452825291829020805460ff19168515159081179091558251848152918201869052918101919091527f78738b8c4717822a58cc752d3b2d657f2d706db6042748d69d2048438ff07e2c906060015b60405180910390a1505050565b6007805461077290612439565b80601f016020809104026020016040519081016040528092919081815260200182805461079e90612439565b80156107eb5780601f106107c0576101008083540402835291602001916107eb565b820191906000526020600020905b8154815290600101906020018083116107ce57829003601f168201915b505050505081565b6001600160a01b03919091166000908152600a60209081526040808320938352929052205460ff1690565b60606002805461082d90612439565b80601f016020809104026020016040519081016040528092919081815260200182805461085990612439565b80156108a65780601f1061087b576101008083540402835291602001916108a6565b820191906000526020600020905b81548152906001019060200180831161088957829003601f168201915b50505050509050919050565b7f00000000000000000000000000000000000000000000000000000000000000006108dc8161117d565b6108e885858585611193565b5050505050565b7f00000000000000000000000000000000000000000000000000000000000000006109198161117d565b8160000361093a5760405163dcef3bd560e01b815260040160405180910390fd5b6000828152600b60209081526040808320869055600c9091529020429055604080518381526020810185905242918101919091527f15819dd2fd9f6418b142e798d08a18d0bf06ea368f4480b7b0d3f75bd966bc4890606001610758565b336001600160a01b03861681148015906109b957506109b7868261102e565b155b156109ef5760405163711bec9160e11b81526001600160a01b038083166004830152871660248201526044015b60405180910390fd5b6109fc86868686866111cb565b505050505050565b600082815260036020526040902060010154610a1f8161117d565b610a29838361122b565b50505050565b7f0000000000000000000000000000000000000000000000000000000000000000610a598161117d565b610a837f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f0000000000000000000000000000000000000000000000000000000000000000335b6001600160a01b0381163314610ad35760405163334bd91960e11b815260040160405180910390fd5b610add82826112bf565b505050565b7f0000000000000000000000000000000000000000000000000000000000000000610b0c8161117d565b610b1461132c565b50565b60009081526009602090815260408083206001600160a01b03949094168352929052205460ff1690565b60608151835114610b725781518351604051635b05999160e01b8152600481019290925260248201526044016109e6565b6000835167ffffffffffffffff811115610b8e57610b8e611d4a565b604051908082528060200260200182016040528015610bb7578160200160208202803683370190505b50905060005b8451811015610c0e57602080820286010151610be19060208084028701015161068c565b828281518110610bf357610bf3612473565b6020908102919091010152610c078161249f565b9050610bbd565b509392505050565b7f0000000000000000000000000000000000000000000000000000000000000000610c408161117d565b6001600160a01b0384161580610c5e57506001600160a01b0384163b155b15610c8757604051630789b04160e41b81526001600160a01b03851660048201526024016109e6565b60008381526009602090815260408083206001600160a01b03881684529091529020805460ff1916831515179055604080518481526001600160a01b0386166020820152831515918101919091527fc3c7dc5ac1b5d811719dbd5be732967d24ed27897351a8a123e526f6b53dc5249060600160405180910390a150505050565b6001600160a01b0383163314801590610d285750610d26833361102e565b155b15610d575760405163711bec9160e11b81523360048201526001600160a01b03841660248201526044016109e6565b610add83838361137e565b7f0000000000000000000000000000000000000000000000000000000000000000610d8c8161117d565b6108e8858585856113c4565b7f0000000000000000000000000000000000000000000000000000000000000000610dc28161117d565b610b14611421565b7f0000000000000000000000000000000000000000000000000000000000000000610df48161117d565b610e1e7f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b60009182526003602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6008805461077290612439565b6106f233838361145e565b7f0000000000000000000000000000000000000000000000000000000000000000610eb68161117d565b610ee07f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b7f0000000000000000000000000000000000000000000000000000000000000000610f358161117d565b610f5f7f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b7f0000000000000000000000000000000000000000000000000000000000000000610fb48161117d565b610fde7f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b6000828152600360205260409020600101546110248161117d565b610a2983836112bf565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b336001600160a01b038616811480159061107d575061107b868261102e565b155b156110ce5761108c8185610b17565b158061109d575061109d86856107f3565b156110ce5760405163711bec9160e11b81526001600160a01b038083166004830152871660248201526044016109e6565b6109fc86868686866114f4565b336001600160a01b03841681148015906110fc57506110fa848261102e565b155b1561114d5761110b8184610b17565b158061111c575061111c84846107f3565b1561114d5760405163711bec9160e11b81526001600160a01b038083166004830152851660248201526044016109e6565b610a29848484611582565b60006001600160e01b03198216637965db0b60e01b14806106ae57506106ae826115ea565b610b14813361163a565b60026106f282826124fe565b6001600160a01b0384166111bd57604051632bfa23e760e11b8152600060048201526024016109e6565b610a29600085858585611673565b6001600160a01b0384166111f557604051632bfa23e760e11b8152600060048201526024016109e6565b6001600160a01b03851661121e57604051626a0d4560e21b8152600060048201526024016109e6565b6108e88585858585611673565b60006112378383610e49565b6112b75760008381526003602090815260408083206001600160a01b03861684529091529020805460ff1916600117905561126f3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016106ae565b5060006106ae565b60006112cb8383610e49565b156112b75760008381526003602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016106ae565b6113346116c6565b6004805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166113a757604051626a0d4560e21b8152600060048201526024016109e6565b610add836000848460405180602001604052806000815250611673565b6001600160a01b0384166113ee57604051632bfa23e760e11b8152600060048201526024016109e6565b604080516001808252602082018690528183019081526060820185905260808201909252906109fc600087848487611673565b6114296116eb565b6004805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113613390565b6001600160a01b0382166114875760405162ced3e160e81b8152600060048201526024016109e6565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661151e57604051632bfa23e760e11b8152600060048201526024016109e6565b6001600160a01b03851661154757604051626a0d4560e21b8152600060048201526024016109e6565b604080516001808252602082018690528183019081526060820185905260808201909252906115798787848487611673565b50505050505050565b6001600160a01b0383166115ab57604051626a0d4560e21b8152600060048201526024016109e6565b604080516001808252602082018590528183019081526060820184905260a082019092526000608082018181529192916108e891879185908590611673565b60006001600160e01b03198216636cdb3d1360e11b148061161b57506001600160e01b031982166303a24d0760e21b145b806106ae57506301ffc9a760e01b6001600160e01b03198316146106ae565b6116448282610e49565b6106f25760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016109e6565b61167f8585858561170f565b6001600160a01b038416156108e857825133906001036116b857602084810151908401516116b183898985858961171b565b50506109fc565b6109fc818787878787611737565b60045460ff166116e957604051638dfc202b60e01b815260040160405180910390fd5b565b60045460ff16156116e95760405163d93c066560e01b815260040160405180910390fd5b610a298484848461185b565b6117258684610b17565b6109fc576109fc8686868686866119b5565b6001600160a01b0384163b156109fc5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061177b90899089908890889088906004016125be565b6020604051808303816000875af19250505080156117b6575060408051601f3d908101601f191682019092526117b39181019061261c565b60015b61181f573d8080156117e4576040519150601f19603f3d011682016040523d82523d6000602084013e6117e9565b606091505b50805160000361181757604051632bfa23e760e11b81526001600160a01b03861660048201526024016109e6565b805181602001fd5b6001600160e01b0319811663bc197c8160e01b1461157957604051632bfa23e760e11b81526001600160a01b03861660048201526024016109e6565b61186784848484611a9e565b6001600160a01b03841661191a576000805b835181101561190057600083828151811061189657611896612473565b6020026020010151905080600560008785815181106118b7576118b7612473565b6020026020010151815260200190815260200160002060008282546118dc9190612639565b909155506118ec90508184612639565b925050806118f99061249f565b9050611879565b5080600660008282546119139190612639565b9091555050505b6001600160a01b038316610a29576000805b83518110156119a457600083828151811061194957611949612473565b60200260200101519050806005600087858151811061196a5761196a612473565b60200260200101518152602001908152602001600020600082825403925050819055508083019250508061199d9061249f565b905061192c565b506006805491909103905550505050565b6001600160a01b0384163b156109fc5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906119f9908990899088908890889060040161264c565b6020604051808303816000875af1925050508015611a34575060408051601f3d908101601f19168201909252611a319181019061261c565b60015b611a62573d8080156117e4576040519150601f19603f3d011682016040523d82523d6000602084013e6117e9565b6001600160e01b0319811663f23a6e6160e01b1461157957604051632bfa23e760e11b81526001600160a01b03861660048201526024016109e6565b611aa66116eb565b610a29848484848051825114611adc5781518151604051635b05999160e01b8152600481019290925260248201526044016109e6565b3360005b8351811015611beb576020818102858101820151908501909101516001600160a01b03881615611b93576000828152602081815260408083206001600160a01b038c16845290915290205481811015611b6c576040516303dee4c560e01b81526001600160a01b038a1660048201526024810182905260448101839052606481018490526084016109e6565b6000838152602081815260408083206001600160a01b038d16845290915290209082900390555b6001600160a01b03871615611bd8576000828152602081815260408083206001600160a01b038b16845290915281208054839290611bd2908490612639565b90915550505b505080611be49061249f565b9050611ae0565b508251600103611c6c5760208301516000906020840151909150856001600160a01b0316876001600160a01b0316846001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051611c5d929190918252602082015260400190565b60405180910390a450506108e8565b836001600160a01b0316856001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611cbb929190612691565b60405180910390a45050505050565b80356001600160a01b0381168114611ce157600080fd5b919050565b60008060408385031215611cf957600080fd5b611d0283611cca565b946020939093013593505050565b6001600160e01b031981168114610b1457600080fd5b600060208284031215611d3857600080fd5b8135611d4381611d10565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611d8957611d89611d4a565b604052919050565b600067ffffffffffffffff831115611dab57611dab611d4a565b611dbe601f8401601f1916602001611d60565b9050828152838383011115611dd257600080fd5b828260208301376000602084830101529392505050565b600060208284031215611dfb57600080fd5b813567ffffffffffffffff811115611e1257600080fd5b8201601f81018413611e2357600080fd5b611e3284823560208401611d91565b949350505050565b80358015158114611ce157600080fd5b60008060408385031215611e5d57600080fd5b82359150611e6d60208401611e3a565b90509250929050565b6000815180845260005b81811015611e9c57602081850181015186830182015201611e80565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611d436020830184611e76565b600060208284031215611ee157600080fd5b5035919050565b600067ffffffffffffffff821115611f0257611f02611d4a565b5060051b60200190565b600082601f830112611f1d57600080fd5b81356020611f32611f2d83611ee8565b611d60565b82815260059290921b84018101918181019086841115611f5157600080fd5b8286015b84811015611f6c5780358352918301918301611f55565b509695505050505050565b600082601f830112611f8857600080fd5b611d4383833560208501611d91565b60008060008060808587031215611fad57600080fd5b611fb685611cca565b9350602085013567ffffffffffffffff80821115611fd357600080fd5b611fdf88838901611f0c565b94506040870135915080821115611ff557600080fd5b61200188838901611f0c565b9350606087013591508082111561201757600080fd5b5061202487828801611f77565b91505092959194509250565b6000806040838503121561204357600080fd5b50508035926020909101359150565b600080600080600060a0868803121561206a57600080fd5b61207386611cca565b945061208160208701611cca565b9350604086013567ffffffffffffffff8082111561209e57600080fd5b6120aa89838a01611f0c565b945060608801359150808211156120c057600080fd5b6120cc89838a01611f0c565b935060808801359150808211156120e257600080fd5b506120ef88828901611f77565b9150509295509295909350565b6000806040838503121561210f57600080fd5b82359150611e6d60208401611cca565b60006020828403121561213157600080fd5b611d4382611cca565b6000806040838503121561214d57600080fd5b823567ffffffffffffffff8082111561216557600080fd5b818501915085601f83011261217957600080fd5b81356020612189611f2d83611ee8565b82815260059290921b840181019181810190898411156121a857600080fd5b948201945b838610156121cd576121be86611cca565b825294820194908201906121ad565b965050860135925050808211156121e357600080fd5b506121f085828601611f0c565b9150509250929050565b600081518084526020808501945080840160005b8381101561222a5781518752958201959082019060010161220e565b509495945050505050565b602081526000611d4360208301846121fa565b60008060006060848603121561225d57600080fd5b61226684611cca565b92506020840135915061227b60408501611e3a565b90509250925092565b60008060006060848603121561229957600080fd5b6122a284611cca565b9250602084013567ffffffffffffffff808211156122bf57600080fd5b6122cb87838801611f0c565b935060408601359150808211156122e157600080fd5b506122ee86828701611f0c565b9150509250925092565b6000806000806080858703121561230e57600080fd5b61231785611cca565b93506020850135925060408501359150606085013567ffffffffffffffff81111561234157600080fd5b61202487828801611f77565b6000806040838503121561236057600080fd5b61236983611cca565b9150611e6d60208401611e3a565b6000806040838503121561238a57600080fd5b61239383611cca565b9150611e6d60208401611cca565b600080600080600060a086880312156123b957600080fd5b6123c286611cca565b94506123d060208701611cca565b93506040860135925060608601359150608086013567ffffffffffffffff8111156123fa57600080fd5b6120ef88828901611f77565b60008060006060848603121561241b57600080fd5b61242484611cca565b95602085013595506040909401359392505050565b600181811c9082168061244d57607f821691505b60208210810361246d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016124b1576124b1612489565b5060010190565b601f821115610add57600081815260208120601f850160051c810160208610156124df5750805b601f850160051c820191505b818110156109fc578281556001016124eb565b815167ffffffffffffffff81111561251857612518611d4a565b61252c816125268454612439565b846124b8565b602080601f83116001811461256157600084156125495750858301515b600019600386901b1c1916600185901b1785556109fc565b600085815260208120601f198616915b8281101561259057888601518255948401946001909101908401612571565b50858210156125ae5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0386811682528516602082015260a0604082018190526000906125ea908301866121fa565b82810360608401526125fc81866121fa565b905082810360808401526126108185611e76565b98975050505050505050565b60006020828403121561262e57600080fd5b8151611d4381611d10565b808201808211156106ae576106ae612489565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061268690830184611e76565b979650505050505050565b6040815260006126a460408301856121fa565b82810360208401526126b681856121fa565b9594505050505056fea2646970667358221220b0486822d2fc39dd80bd38ccf2ae2ae27752440731d8a2fba5fcfb02aeb66c6264736f6c6343000814003368e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef17804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6f04f52d1f685586eac22a7ca73ab9ce0c45b77d01934bed334a9ff223be978a1", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061027e5760003560e01c80636b20c4541161015c578063b8bf60f9116100ce578063e63ab1e911610087578063e63ab1e9146105e5578063e985e9c51461060c578063eef37fd51461061f578063f242432a14610646578063f5298aca14610659578063f759cc3b1461066c57600080fd5b8063b8bf60f914610552578063bad383a614610565578063bd85b03914610578578063c7bddb1e14610598578063d5391393146105ab578063d547741f146105d257600080fd5b8063908d67ed11610120578063908d67ed146104d657806391d14854146104f657806395d89b411461050957806396ce079514610511578063a217fddf14610537578063a22cb4651461053f57600080fd5b80636b20c4541461046e578063731133e9146104815780637f345710146104945780638456cb59146104bb5780638801b9b8146104c357600080fd5b8063248a9ca3116101f55780633f4ba83a116101b95780633f4ba83a146103f35780634d280a55146103fb5780634e1273f41461040e5780634f558e791461042e578063512be796146104505780635c975abb1461046357600080fd5b8063248a9ca3146103845780632eb2c2d6146103a75780632f2ff15d146103ba5780633106fde8146103cd57806336568abe146103e057600080fd5b8063072650d211610247578063072650d21461030957806307e2cea51461031c5780630e89341c1461034357806318160ddd146103565780631f7fdffa1461035e57806322af59971461037157600080fd5b8062fdd58e1461028357806301ffc9a7146102a957806302fe5305146102cc5780630492f6e1146102e157806306fdde03146102f4575b600080fd5b610296610291366004611ce6565b61068c565b6040519081526020015b60405180910390f35b6102bc6102b7366004611d26565b6106b4565b60405190151581526020016102a0565b6102df6102da366004611de9565b6106bf565b005b6102df6102ef366004611e4a565b6106f6565b6102fc610765565b6040516102a09190611ebc565b6102bc610317366004611ce6565b6107f3565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102fc610351366004611ecf565b61081e565b600654610296565b6102df61036c366004611f97565b6108b2565b6102df61037f366004612030565b6108ef565b610296610392366004611ecf565b60009081526003602052604090206001015490565b6102df6103b5366004612052565b610998565b6102df6103c83660046120fc565b610a04565b6102df6103db36600461211f565b610a2f565b6102df6103ee3660046120fc565b610aaa565b6102df610ae2565b6102bc610409366004611ce6565b610b17565b61042161041c36600461213a565b610b41565b6040516102a09190612235565b6102bc61043c366004611ecf565b600090815260056020526040902054151590565b6102df61045e366004612248565b610c16565b60045460ff166102bc565b6102df61047c366004612284565b610d08565b6102df61048f3660046122f8565b610d62565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102df610d98565b6102df6104d136600461211f565b610dca565b6102966104e4366004611ecf565b6000908152600c602052604090205490565b6102bc6105043660046120fc565b610e49565b6102fc610e74565b7f0000000000000000000000000000000000000000000000000000000000000000610296565b610296600081565b6102df61054d36600461234d565b610e81565b6102df61056036600461211f565b610e8c565b6102df61057336600461211f565b610f0b565b610296610586366004611ecf565b60009081526005602052604090205490565b6102df6105a636600461211f565b610f8a565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102df6105e03660046120fc565b611009565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102bc61061a366004612377565b61102e565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102df6106543660046123a1565b61105c565b6102df610667366004612406565b6110db565b61029661067a366004611ecf565b6000908152600b602052604090205490565b6000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006106ae82611158565b7f00000000000000000000000000000000000000000000000000000000000000006106e98161117d565b6106f282611187565b5050565b336000818152600a60209081526040808320868452825291829020805460ff19168515159081179091558251848152918201869052918101919091527f78738b8c4717822a58cc752d3b2d657f2d706db6042748d69d2048438ff07e2c906060015b60405180910390a1505050565b6007805461077290612439565b80601f016020809104026020016040519081016040528092919081815260200182805461079e90612439565b80156107eb5780601f106107c0576101008083540402835291602001916107eb565b820191906000526020600020905b8154815290600101906020018083116107ce57829003601f168201915b505050505081565b6001600160a01b03919091166000908152600a60209081526040808320938352929052205460ff1690565b60606002805461082d90612439565b80601f016020809104026020016040519081016040528092919081815260200182805461085990612439565b80156108a65780601f1061087b576101008083540402835291602001916108a6565b820191906000526020600020905b81548152906001019060200180831161088957829003601f168201915b50505050509050919050565b7f00000000000000000000000000000000000000000000000000000000000000006108dc8161117d565b6108e885858585611193565b5050505050565b7f00000000000000000000000000000000000000000000000000000000000000006109198161117d565b8160000361093a5760405163dcef3bd560e01b815260040160405180910390fd5b6000828152600b60209081526040808320869055600c9091529020429055604080518381526020810185905242918101919091527f15819dd2fd9f6418b142e798d08a18d0bf06ea368f4480b7b0d3f75bd966bc4890606001610758565b336001600160a01b03861681148015906109b957506109b7868261102e565b155b156109ef5760405163711bec9160e11b81526001600160a01b038083166004830152871660248201526044015b60405180910390fd5b6109fc86868686866111cb565b505050505050565b600082815260036020526040902060010154610a1f8161117d565b610a29838361122b565b50505050565b7f0000000000000000000000000000000000000000000000000000000000000000610a598161117d565b610a837f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f0000000000000000000000000000000000000000000000000000000000000000335b6001600160a01b0381163314610ad35760405163334bd91960e11b815260040160405180910390fd5b610add82826112bf565b505050565b7f0000000000000000000000000000000000000000000000000000000000000000610b0c8161117d565b610b1461132c565b50565b60009081526009602090815260408083206001600160a01b03949094168352929052205460ff1690565b60608151835114610b725781518351604051635b05999160e01b8152600481019290925260248201526044016109e6565b6000835167ffffffffffffffff811115610b8e57610b8e611d4a565b604051908082528060200260200182016040528015610bb7578160200160208202803683370190505b50905060005b8451811015610c0e57602080820286010151610be19060208084028701015161068c565b828281518110610bf357610bf3612473565b6020908102919091010152610c078161249f565b9050610bbd565b509392505050565b7f0000000000000000000000000000000000000000000000000000000000000000610c408161117d565b6001600160a01b0384161580610c5e57506001600160a01b0384163b155b15610c8757604051630789b04160e41b81526001600160a01b03851660048201526024016109e6565b60008381526009602090815260408083206001600160a01b03881684529091529020805460ff1916831515179055604080518481526001600160a01b0386166020820152831515918101919091527fc3c7dc5ac1b5d811719dbd5be732967d24ed27897351a8a123e526f6b53dc5249060600160405180910390a150505050565b6001600160a01b0383163314801590610d285750610d26833361102e565b155b15610d575760405163711bec9160e11b81523360048201526001600160a01b03841660248201526044016109e6565b610add83838361137e565b7f0000000000000000000000000000000000000000000000000000000000000000610d8c8161117d565b6108e8858585856113c4565b7f0000000000000000000000000000000000000000000000000000000000000000610dc28161117d565b610b14611421565b7f0000000000000000000000000000000000000000000000000000000000000000610df48161117d565b610e1e7f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b60009182526003602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6008805461077290612439565b6106f233838361145e565b7f0000000000000000000000000000000000000000000000000000000000000000610eb68161117d565b610ee07f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b7f0000000000000000000000000000000000000000000000000000000000000000610f358161117d565b610f5f7f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b7f0000000000000000000000000000000000000000000000000000000000000000610fb48161117d565b610fde7f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b6000828152600360205260409020600101546110248161117d565b610a2983836112bf565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b336001600160a01b038616811480159061107d575061107b868261102e565b155b156110ce5761108c8185610b17565b158061109d575061109d86856107f3565b156110ce5760405163711bec9160e11b81526001600160a01b038083166004830152871660248201526044016109e6565b6109fc86868686866114f4565b336001600160a01b03841681148015906110fc57506110fa848261102e565b155b1561114d5761110b8184610b17565b158061111c575061111c84846107f3565b1561114d5760405163711bec9160e11b81526001600160a01b038083166004830152851660248201526044016109e6565b610a29848484611582565b60006001600160e01b03198216637965db0b60e01b14806106ae57506106ae826115ea565b610b14813361163a565b60026106f282826124fe565b6001600160a01b0384166111bd57604051632bfa23e760e11b8152600060048201526024016109e6565b610a29600085858585611673565b6001600160a01b0384166111f557604051632bfa23e760e11b8152600060048201526024016109e6565b6001600160a01b03851661121e57604051626a0d4560e21b8152600060048201526024016109e6565b6108e88585858585611673565b60006112378383610e49565b6112b75760008381526003602090815260408083206001600160a01b03861684529091529020805460ff1916600117905561126f3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016106ae565b5060006106ae565b60006112cb8383610e49565b156112b75760008381526003602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016106ae565b6113346116c6565b6004805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166113a757604051626a0d4560e21b8152600060048201526024016109e6565b610add836000848460405180602001604052806000815250611673565b6001600160a01b0384166113ee57604051632bfa23e760e11b8152600060048201526024016109e6565b604080516001808252602082018690528183019081526060820185905260808201909252906109fc600087848487611673565b6114296116eb565b6004805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113613390565b6001600160a01b0382166114875760405162ced3e160e81b8152600060048201526024016109e6565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661151e57604051632bfa23e760e11b8152600060048201526024016109e6565b6001600160a01b03851661154757604051626a0d4560e21b8152600060048201526024016109e6565b604080516001808252602082018690528183019081526060820185905260808201909252906115798787848487611673565b50505050505050565b6001600160a01b0383166115ab57604051626a0d4560e21b8152600060048201526024016109e6565b604080516001808252602082018590528183019081526060820184905260a082019092526000608082018181529192916108e891879185908590611673565b60006001600160e01b03198216636cdb3d1360e11b148061161b57506001600160e01b031982166303a24d0760e21b145b806106ae57506301ffc9a760e01b6001600160e01b03198316146106ae565b6116448282610e49565b6106f25760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016109e6565b61167f8585858561170f565b6001600160a01b038416156108e857825133906001036116b857602084810151908401516116b183898985858961171b565b50506109fc565b6109fc818787878787611737565b60045460ff166116e957604051638dfc202b60e01b815260040160405180910390fd5b565b60045460ff16156116e95760405163d93c066560e01b815260040160405180910390fd5b610a298484848461185b565b6117258684610b17565b6109fc576109fc8686868686866119b5565b6001600160a01b0384163b156109fc5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061177b90899089908890889088906004016125be565b6020604051808303816000875af19250505080156117b6575060408051601f3d908101601f191682019092526117b39181019061261c565b60015b61181f573d8080156117e4576040519150601f19603f3d011682016040523d82523d6000602084013e6117e9565b606091505b50805160000361181757604051632bfa23e760e11b81526001600160a01b03861660048201526024016109e6565b805181602001fd5b6001600160e01b0319811663bc197c8160e01b1461157957604051632bfa23e760e11b81526001600160a01b03861660048201526024016109e6565b61186784848484611a9e565b6001600160a01b03841661191a576000805b835181101561190057600083828151811061189657611896612473565b6020026020010151905080600560008785815181106118b7576118b7612473565b6020026020010151815260200190815260200160002060008282546118dc9190612639565b909155506118ec90508184612639565b925050806118f99061249f565b9050611879565b5080600660008282546119139190612639565b9091555050505b6001600160a01b038316610a29576000805b83518110156119a457600083828151811061194957611949612473565b60200260200101519050806005600087858151811061196a5761196a612473565b60200260200101518152602001908152602001600020600082825403925050819055508083019250508061199d9061249f565b905061192c565b506006805491909103905550505050565b6001600160a01b0384163b156109fc5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906119f9908990899088908890889060040161264c565b6020604051808303816000875af1925050508015611a34575060408051601f3d908101601f19168201909252611a319181019061261c565b60015b611a62573d8080156117e4576040519150601f19603f3d011682016040523d82523d6000602084013e6117e9565b6001600160e01b0319811663f23a6e6160e01b1461157957604051632bfa23e760e11b81526001600160a01b03861660048201526024016109e6565b611aa66116eb565b610a29848484848051825114611adc5781518151604051635b05999160e01b8152600481019290925260248201526044016109e6565b3360005b8351811015611beb576020818102858101820151908501909101516001600160a01b03881615611b93576000828152602081815260408083206001600160a01b038c16845290915290205481811015611b6c576040516303dee4c560e01b81526001600160a01b038a1660048201526024810182905260448101839052606481018490526084016109e6565b6000838152602081815260408083206001600160a01b038d16845290915290209082900390555b6001600160a01b03871615611bd8576000828152602081815260408083206001600160a01b038b16845290915281208054839290611bd2908490612639565b90915550505b505080611be49061249f565b9050611ae0565b508251600103611c6c5760208301516000906020840151909150856001600160a01b0316876001600160a01b0316846001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051611c5d929190918252602082015260400190565b60405180910390a450506108e8565b836001600160a01b0316856001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611cbb929190612691565b60405180910390a45050505050565b80356001600160a01b0381168114611ce157600080fd5b919050565b60008060408385031215611cf957600080fd5b611d0283611cca565b946020939093013593505050565b6001600160e01b031981168114610b1457600080fd5b600060208284031215611d3857600080fd5b8135611d4381611d10565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611d8957611d89611d4a565b604052919050565b600067ffffffffffffffff831115611dab57611dab611d4a565b611dbe601f8401601f1916602001611d60565b9050828152838383011115611dd257600080fd5b828260208301376000602084830101529392505050565b600060208284031215611dfb57600080fd5b813567ffffffffffffffff811115611e1257600080fd5b8201601f81018413611e2357600080fd5b611e3284823560208401611d91565b949350505050565b80358015158114611ce157600080fd5b60008060408385031215611e5d57600080fd5b82359150611e6d60208401611e3a565b90509250929050565b6000815180845260005b81811015611e9c57602081850181015186830182015201611e80565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611d436020830184611e76565b600060208284031215611ee157600080fd5b5035919050565b600067ffffffffffffffff821115611f0257611f02611d4a565b5060051b60200190565b600082601f830112611f1d57600080fd5b81356020611f32611f2d83611ee8565b611d60565b82815260059290921b84018101918181019086841115611f5157600080fd5b8286015b84811015611f6c5780358352918301918301611f55565b509695505050505050565b600082601f830112611f8857600080fd5b611d4383833560208501611d91565b60008060008060808587031215611fad57600080fd5b611fb685611cca565b9350602085013567ffffffffffffffff80821115611fd357600080fd5b611fdf88838901611f0c565b94506040870135915080821115611ff557600080fd5b61200188838901611f0c565b9350606087013591508082111561201757600080fd5b5061202487828801611f77565b91505092959194509250565b6000806040838503121561204357600080fd5b50508035926020909101359150565b600080600080600060a0868803121561206a57600080fd5b61207386611cca565b945061208160208701611cca565b9350604086013567ffffffffffffffff8082111561209e57600080fd5b6120aa89838a01611f0c565b945060608801359150808211156120c057600080fd5b6120cc89838a01611f0c565b935060808801359150808211156120e257600080fd5b506120ef88828901611f77565b9150509295509295909350565b6000806040838503121561210f57600080fd5b82359150611e6d60208401611cca565b60006020828403121561213157600080fd5b611d4382611cca565b6000806040838503121561214d57600080fd5b823567ffffffffffffffff8082111561216557600080fd5b818501915085601f83011261217957600080fd5b81356020612189611f2d83611ee8565b82815260059290921b840181019181810190898411156121a857600080fd5b948201945b838610156121cd576121be86611cca565b825294820194908201906121ad565b965050860135925050808211156121e357600080fd5b506121f085828601611f0c565b9150509250929050565b600081518084526020808501945080840160005b8381101561222a5781518752958201959082019060010161220e565b509495945050505050565b602081526000611d4360208301846121fa565b60008060006060848603121561225d57600080fd5b61226684611cca565b92506020840135915061227b60408501611e3a565b90509250925092565b60008060006060848603121561229957600080fd5b6122a284611cca565b9250602084013567ffffffffffffffff808211156122bf57600080fd5b6122cb87838801611f0c565b935060408601359150808211156122e157600080fd5b506122ee86828701611f0c565b9150509250925092565b6000806000806080858703121561230e57600080fd5b61231785611cca565b93506020850135925060408501359150606085013567ffffffffffffffff81111561234157600080fd5b61202487828801611f77565b6000806040838503121561236057600080fd5b61236983611cca565b9150611e6d60208401611e3a565b6000806040838503121561238a57600080fd5b61239383611cca565b9150611e6d60208401611cca565b600080600080600060a086880312156123b957600080fd5b6123c286611cca565b94506123d060208701611cca565b93506040860135925060608601359150608086013567ffffffffffffffff8111156123fa57600080fd5b6120ef88828901611f77565b60008060006060848603121561241b57600080fd5b61242484611cca565b95602085013595506040909401359392505050565b600181811c9082168061244d57607f821691505b60208210810361246d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016124b1576124b1612489565b5060010190565b601f821115610add57600081815260208120601f850160051c810160208610156124df5750805b601f850160051c820191505b818110156109fc578281556001016124eb565b815167ffffffffffffffff81111561251857612518611d4a565b61252c816125268454612439565b846124b8565b602080601f83116001811461256157600084156125495750858301515b600019600386901b1c1916600185901b1785556109fc565b600085815260208120601f198616915b8281101561259057888601518255948401946001909101908401612571565b50858210156125ae5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0386811682528516602082015260a0604082018190526000906125ea908301866121fa565b82810360608401526125fc81866121fa565b905082810360808401526126108185611e76565b98975050505050505050565b60006020828403121561262e57600080fd5b8151611d4381611d10565b808201808211156106ae576106ae612489565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061268690830184611e76565b979650505050505050565b6040815260006126a460408301856121fa565b82810360208401526126b681856121fa565b9594505050505056fea2646970667358221220b0486822d2fc39dd80bd38ccf2ae2ae27752440731d8a2fba5fcfb02aeb66c6264736f6c63430008140033", + "solcInputHash": "983f26216548ae9c38be8d3a1167f02e", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_uri\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC1155InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idsLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"valuesLength\",\"type\":\"uint256\"}],\"name\":\"ERC1155InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC1155InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC1155InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC1155InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155MissingApprovalForAll\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EnforcedPause\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedPause\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"middleware\",\"type\":\"address\"}],\"name\":\"gETHInvalidMiddleware\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"gETHZeroId\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"avoider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isAvoid\",\"type\":\"bool\"}],\"name\":\"Avoider\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"middleware\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isSet\",\"type\":\"bool\"}],\"name\":\"MiddlewareSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pricePerShare\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"updateTimestamp\",\"type\":\"uint256\"}],\"name\":\"PriceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"TransferBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIDDLEWARE_MANAGER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ORACLE_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAUSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"URI_SETTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isAvoid\",\"type\":\"bool\"}],\"name\":\"avoidMiddlewares\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"balanceOfBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"burnBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"denominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"exists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"isAvoider\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"middleware\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"isMiddleware\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"mintBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"pricePerShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"priceUpdateTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"middleware\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isSet\",\"type\":\"bool\"}],\"name\":\"setMiddleware\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"setPricePerShare\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"newuri\",\"type\":\"string\"}],\"name\":\"setURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newMiddlewareManager\",\"type\":\"address\"}],\"name\":\"transferMiddlewareManagerRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newMinter\",\"type\":\"address\"}],\"name\":\"transferMinterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOracle\",\"type\":\"address\"}],\"name\":\"transferOracleRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newPauser\",\"type\":\"address\"}],\"name\":\"transferPauserRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newUriSetter\",\"type\":\"address\"}],\"name\":\"transferUriSetterRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Ice Bear & Crash Bandicoot\",\"details\":\"gETH is chain-agnostic, meaning it can be used on any evm chain (given the correct name and symbol).gETH is immutable, it cannot be upgraded.gETH is a special ERC1155 contract with additional functionalities: gETHMiddlewares: * Most important functionality gETH provides: * Allowing any other contract to provide additional functionality * around the balance and price data, such as using an ID like ERC20. * This addition effectively result in changes in * safeTransferFrom(), burn(), _doSafeTransferAcceptanceCheck() * functions, reasoning is in the comments. Avoiders: * If one wants to remain unbound from gETHMiddlewares, * it can be done so by calling \\\"avoidMiddlewares\\\" function. PricePerShare: * Keeping track of the ratio between the derivative * and the underlaying staked asset, Ether. Denominator: * ERC1155 does not have decimals and it is not wise to use the name convention * but we need to provide some information on how to denominate the balances, price, etc.review ERC1155PausableBurnableSupply, which is generated with Openzeppelin wizard.\",\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ERC1155InsufficientBalance(address,uint256,uint256,uint256)\":[{\"details\":\"Indicates an error related to the current `balance` of a `sender`. Used in transfers.\",\"params\":{\"balance\":\"Current balance for the interacting account.\",\"needed\":\"Minimum amount required to perform a transfer.\",\"sender\":\"Address whose tokens are being transferred.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC1155InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC1155InvalidArrayLength(uint256,uint256)\":[{\"details\":\"Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. Used in batch transfers.\",\"params\":{\"idsLength\":\"Length of the array of token identifiers\",\"valuesLength\":\"Length of the array of token amounts\"}}],\"ERC1155InvalidOperator(address)\":[{\"details\":\"Indicates a failure with the `operator` to be approved. Used in approvals.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC1155InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC1155InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC1155MissingApprovalForAll(address,address)\":[{\"details\":\"Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\",\"owner\":\"Address of the current owner of a token.\"}}],\"EnforcedPause()\":[{\"details\":\"The operation failed because the contract is paused.\"}],\"ExpectedPause()\":[{\"details\":\"The operation failed because the contract is not paused.\"}],\"gETHZeroId()\":[{\"custom:section\":\"** ERRORS **\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to `approved`.\"},\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"PriceUpdated(uint256,uint256,uint256)\":{\"custom:section\":\"** EVENTS **\"},\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"details\":\"Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all transfers.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"details\":\"Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.\"},\"URI(string,uint256)\":{\"details\":\"Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. If an {URI} event was emitted for `id`, the standard https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value returned by {IERC1155MetadataURI-uri}.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"}},\"kind\":\"dev\",\"methods\":{\"avoidMiddlewares(uint256,bool)\":{\"details\":\"ADDED for gETH*\",\"params\":{\"isAvoid\":\"true: restrict middlewares, false: allow middlewares\"}},\"balanceOf(address,uint256)\":{\"details\":\"See {IERC1155-balanceOf}.\"},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length.\"},\"burn(address,uint256,uint256)\":{\"details\":\"CHANGED for gETHADDED \\\"((!(isMiddleware(sender, id))) || (isAvoider(account, id)))\\\" pass conditionSee ERC1155Burnable burn: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/cffb2f1ddcd87efd68effc92cfd336c5145acabd/contracts/token/ERC1155/extensions/ERC1155Burnable.sol#L13C1-L19C6\"},\"constructor\":{\"params\":{\"_name\":\"chain specific name: Geode Staked Ether, geode Staked Avax etc.\",\"_symbol\":\"chain specific symbol of the staking derivative: gETH, gGNO, gAVAX, etc.*\"}},\"denominator()\":{\"details\":\"ERC1155 does not have a decimals, and it is not wise to use the same nameADDED for gETH\"},\"exists(uint256)\":{\"details\":\"Indicates whether any token exist with a given id, or not.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC1155-isApprovedForAll}.\"},\"isAvoider(address,uint256)\":{\"details\":\"ADDED for gETH*\",\"params\":{\"account\":\"the potential avoider\"}},\"isMiddleware(address,uint256)\":{\"details\":\"ADDED for gETH\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"pricePerShare(uint256)\":{\"details\":\"ADDED for gETH\",\"returns\":{\"_0\":\"price of the derivative in terms of underlying token, Ether\"}},\"priceUpdateTimestamp(uint256)\":{\"details\":\"ADDED for gETH\",\"returns\":{\"_0\":\"timestamp of the latest price update for given ID\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155-safeBatchTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"CHANGED for gETHADDED \\\"((!isMiddleware(sender, id)) || isAvoider(from, id))\\\" pass conditionSee ERC1155 safeTransferFrom: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/cffb2f1ddcd87efd68effc92cfd336c5145acabd/contracts/token/ERC1155/ERC1155.sol#L109C29-L109C29\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC1155-setApprovalForAll}.\"},\"setMiddleware(address,uint256,bool)\":{\"details\":\"ADDED for gETH\",\"params\":{\"isSet\":\"true: sets as a middleware, false: unsets\",\"middleware\":\"Address of the contract that will act as a middleware\"}},\"setPricePerShare(uint256,uint256)\":{\"details\":\"ADDED for gETH\"},\"totalSupply()\":{\"details\":\"Total value of tokens.\"},\"totalSupply(uint256)\":{\"details\":\"Total value of tokens in with a given id.\"},\"transferMiddlewareManagerRole(address)\":{\"details\":\"MIDDLEWARE MANAGER is basically a superUser, there can be only 1 at a given time,intended as \\\"Portal\\\"\"},\"transferMinterRole(address)\":{\"details\":\"MINTER is basically a superUser, there can be only 1 at a given time,intended as \\\"Portal\\\"\"},\"transferOracleRole(address)\":{\"details\":\"ORACLE is basically a superUser, there can be only 1 at a given time,intended as \\\"Portal\\\"\"},\"transferPauserRole(address)\":{\"details\":\"PAUSER is basically a superUser, there can be only 1 at a given time,intended as \\\"Portal\\\"\"},\"transferUriSetterRole(address)\":{\"details\":\"URI_SETTER is basically a superuser, there can be only 1 at a given time,intended as \\\"Governance/DAO\\\"\"},\"uri(uint256)\":{\"details\":\"See {IERC1155MetadataURI-uri}. This implementation returns the same URI for *all* token types. It relies on the token type ID substitution mechanism https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. Clients calling this function must replace the `\\\\{id\\\\}` substring with the actual token type ID.\"}},\"stateVariables\":{\"DENOMINATOR\":{\"custom:section\":\"** CONSTANTS **\"},\"_avoiders\":{\"details\":\"ADDED for gETH*\"},\"_middlewares\":{\"details\":\"There can be multiple Middlewares for 1 staking pool.ADDED for gETH*\"},\"_pricePerShare\":{\"details\":\"Freshly created IDs should return 1e18 since initally 1 ETH = 1 gETHADDED for gETH*\"},\"_priceUpdateTimestamp\":{\"details\":\"ADDED for gETH*\"},\"name\":{\"custom:section\":\"** VARIABLES **\"}},\"title\":\"gETH : Geodefi Liquid Staking Derivatives\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"avoidMiddlewares(uint256,bool)\":{\"notice\":\"Restrict any affect of middlewares on the tokens of caller\"},\"constructor\":{\"notice\":\"Sets name, symbol, uri and grants necessary roles.\"},\"denominator()\":{\"notice\":\"a centralized denominator for all contract using gETH\"},\"isAvoider(address,uint256)\":{\"notice\":\"Checks if the given address restricts the affect of the middlewares on their gETH\"},\"isMiddleware(address,uint256)\":{\"notice\":\"Check if an address is approved as a middleware for an ID\"},\"setMiddleware(address,uint256,bool)\":{\"notice\":\"Set an address of a contract that will act as a middleware on gETH contract for a specific ID\"},\"setPricePerShare(uint256,uint256)\":{\"notice\":\"Only ORACLE can call this function and set price\"},\"transferMiddlewareManagerRole(address)\":{\"notice\":\"transfers the authorized party for middleware management\"},\"transferMinterRole(address)\":{\"notice\":\"transfers the authorized party for Minting operations related to minting\"},\"transferOracleRole(address)\":{\"notice\":\"transfers the authorized party for Oracle operations related to pricing\"},\"transferPauserRole(address)\":{\"notice\":\"transfers the authorized party for Pausing operations.\"},\"transferUriSetterRole(address)\":{\"notice\":\"transfers the authorized party for setting a new uri.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/gETH.sol\":\"gETH\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IAccessControl} from \\\"./IAccessControl.sol\\\";\\nimport {Context} from \\\"../utils/Context.sol\\\";\\nimport {ERC165} from \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address account => bool) hasRole;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 role => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with an {AccessControlUnauthorizedAccount} error including the required role.\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual returns (bool) {\\n return _roles[role].hasRole[account];\\n }\\n\\n /**\\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\\n * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\\n * is missing `role`.\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert AccessControlUnauthorizedAccount(account, role);\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `callerConfirmation`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address callerConfirmation) public virtual {\\n if (callerConfirmation != _msgSender()) {\\n revert AccessControlBadConfirmation();\\n }\\n\\n _revokeRole(role, callerConfirmation);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\\n if (!hasRole(role, account)) {\\n _roles[role].hasRole[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\\n if (hasRole(role, account)) {\\n _roles[role].hasRole[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n return true;\\n } else {\\n return false;\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev The `account` is missing a role.\\n */\\n error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\\n\\n /**\\n * @dev The caller of a function is not the expected one.\\n *\\n * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\\n */\\n error AccessControlBadConfirmation();\\n\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `callerConfirmation`.\\n */\\n function renounceRole(bytes32 role, address callerConfirmation) external;\\n}\\n\",\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard ERC20 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.\\n */\\ninterface IERC20Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC20InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC20InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `spender`\\u2019s `allowance`. Used in transfers.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n * @param allowance Amount of tokens a `spender` is allowed to operate with.\\n * @param needed Minimum amount required to perform a transfer.\\n */\\n error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC20InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\\n * @param spender Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC20InvalidSpender(address spender);\\n}\\n\\n/**\\n * @dev Standard ERC721 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.\\n */\\ninterface IERC721Errors {\\n /**\\n * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.\\n * Used in balance queries.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721InvalidOwner(address owner);\\n\\n /**\\n * @dev Indicates a `tokenId` whose `owner` is the zero address.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721NonexistentToken(uint256 tokenId);\\n\\n /**\\n * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param tokenId Identifier number of a token.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC721InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC721InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC721InsufficientApproval(address operator, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC721InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC721InvalidOperator(address operator);\\n}\\n\\n/**\\n * @dev Standard ERC1155 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.\\n */\\ninterface IERC1155Errors {\\n /**\\n * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n * @param balance Current balance for the interacting account.\\n * @param needed Minimum amount required to perform a transfer.\\n * @param tokenId Identifier number of a token.\\n */\\n error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\\n\\n /**\\n * @dev Indicates a failure with the token `sender`. Used in transfers.\\n * @param sender Address whose tokens are being transferred.\\n */\\n error ERC1155InvalidSender(address sender);\\n\\n /**\\n * @dev Indicates a failure with the token `receiver`. Used in transfers.\\n * @param receiver Address to which tokens are being transferred.\\n */\\n error ERC1155InvalidReceiver(address receiver);\\n\\n /**\\n * @dev Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n * @param owner Address of the current owner of a token.\\n */\\n error ERC1155MissingApprovalForAll(address operator, address owner);\\n\\n /**\\n * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\\n * @param approver Address initiating an approval operation.\\n */\\n error ERC1155InvalidApprover(address approver);\\n\\n /**\\n * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\\n * @param operator Address that may be allowed to operate on tokens without being their owner.\\n */\\n error ERC1155InvalidOperator(address operator);\\n\\n /**\\n * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\\n * Used in batch transfers.\\n * @param idsLength Length of the array of token identifiers\\n * @param valuesLength Length of the array of token amounts\\n */\\n error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\\n}\\n\",\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\\n */\\ninterface IERC1155 is IERC165 {\\n /**\\n * @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.\\n */\\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n /**\\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\\n * transfers.\\n */\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] values\\n );\\n\\n /**\\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\\n * `approved`.\\n */\\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\\n\\n /**\\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\\n *\\n * If an {URI} event was emitted for `id`, the standard\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\\n * returned by {IERC1155MetadataURI-uri}.\\n */\\n event URI(string value, uint256 indexed id);\\n\\n /**\\n * @dev Returns the value of tokens of token type `id` owned by `account`.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function balanceOf(address account, uint256 id) external view returns (uint256);\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\\n *\\n * Requirements:\\n *\\n * - `accounts` and `ids` must have the same length.\\n */\\n function balanceOfBatch(\\n address[] calldata accounts,\\n uint256[] calldata ids\\n ) external view returns (uint256[] memory);\\n\\n /**\\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\\n *\\n * Emits an {ApprovalForAll} event.\\n *\\n * Requirements:\\n *\\n * - `operator` cannot be the caller.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\\n *\\n * See {setApprovalForAll}.\\n */\\n function isApprovedForAll(address account, address operator) external view returns (bool);\\n\\n /**\\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`.\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155Received} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\\n *\\n *\\n * WARNING: This function can potentially allow a reentrancy attack when transferring tokens\\n * to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver.\\n * Ensure to follow the checks-effects-interactions pattern and consider employing\\n * reentrancy guards when interacting with untrusted contracts.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `values` must have the same length.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external;\\n}\\n\",\"keccak256\":\"0xe64b3445a3f638890af7ad92464cd18f1f202a2f5a7ed42dabf74317bae43303\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Interface that must be implemented by smart contracts in order to receive\\n * ERC-1155 token transfers.\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xb69597a63b202e28401128bed6a6d259e8730191274471af7303eafb247881a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/extensions/IERC1155MetadataURI.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC1155} from \\\"../IERC1155.sol\\\";\\n\\n/**\\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\\n */\\ninterface IERC1155MetadataURI is IERC1155 {\\n /**\\n * @dev Returns the URI for token type `id`.\\n *\\n * If the `\\\\{id\\\\}` substring is present in the URI, it must be replaced by\\n * clients with the actual token type ID.\\n */\\n function uri(uint256 id) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xe92b5e199b963d108ad6e06feeede151ba23849e0d064956535489ff967ffe68\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Arrays.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Arrays.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {StorageSlot} from \\\"./StorageSlot.sol\\\";\\nimport {Math} from \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev Collection of functions related to array types.\\n */\\nlibrary Arrays {\\n using StorageSlot for bytes32;\\n\\n /**\\n * @dev Searches a sorted `array` and returns the first index that contains\\n * a value greater or equal to `element`. If no such index exists (i.e. all\\n * values in the array are strictly less than `element`), the array length is\\n * returned. Time complexity O(log n).\\n *\\n * `array` is expected to be sorted in ascending order, and to contain no\\n * repeated elements.\\n */\\n function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {\\n uint256 low = 0;\\n uint256 high = array.length;\\n\\n if (high == 0) {\\n return 0;\\n }\\n\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n\\n // Note that mid will always be strictly less than high (i.e. it will be a valid array index)\\n // because Math.average rounds towards zero (it does integer division with truncation).\\n if (unsafeAccess(array, mid).value > element) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.\\n if (low > 0 && unsafeAccess(array, low - 1).value == element) {\\n return low - 1;\\n } else {\\n return low;\\n }\\n }\\n\\n /**\\n * @dev Access an array in an \\\"unsafe\\\" way. Skips solidity \\\"index-out-of-range\\\" check.\\n *\\n * WARNING: Only use if you are certain `pos` is lower than the array length.\\n */\\n function unsafeAccess(address[] storage arr, uint256 pos) internal pure returns (StorageSlot.AddressSlot storage) {\\n bytes32 slot;\\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0, arr.slot)\\n slot := add(keccak256(0, 0x20), pos)\\n }\\n return slot.getAddressSlot();\\n }\\n\\n /**\\n * @dev Access an array in an \\\"unsafe\\\" way. Skips solidity \\\"index-out-of-range\\\" check.\\n *\\n * WARNING: Only use if you are certain `pos` is lower than the array length.\\n */\\n function unsafeAccess(bytes32[] storage arr, uint256 pos) internal pure returns (StorageSlot.Bytes32Slot storage) {\\n bytes32 slot;\\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0, arr.slot)\\n slot := add(keccak256(0, 0x20), pos)\\n }\\n return slot.getBytes32Slot();\\n }\\n\\n /**\\n * @dev Access an array in an \\\"unsafe\\\" way. Skips solidity \\\"index-out-of-range\\\" check.\\n *\\n * WARNING: Only use if you are certain `pos` is lower than the array length.\\n */\\n function unsafeAccess(uint256[] storage arr, uint256 pos) internal pure returns (StorageSlot.Uint256Slot storage) {\\n bytes32 slot;\\n // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr`\\n // following https://docs.soliditylang.org/en/v0.8.20/internals/layout_in_storage.html#mappings-and-dynamic-arrays.\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0, arr.slot)\\n slot := add(keccak256(0, 0x20), pos)\\n }\\n return slot.getUint256Slot();\\n }\\n\\n /**\\n * @dev Access an array in an \\\"unsafe\\\" way. Skips solidity \\\"index-out-of-range\\\" check.\\n *\\n * WARNING: Only use if you are certain `pos` is lower than the array length.\\n */\\n function unsafeMemoryAccess(uint256[] memory arr, uint256 pos) internal pure returns (uint256 res) {\\n assembly {\\n res := mload(add(add(arr, 0x20), mul(pos, 0x20)))\\n }\\n }\\n\\n /**\\n * @dev Access an array in an \\\"unsafe\\\" way. Skips solidity \\\"index-out-of-range\\\" check.\\n *\\n * WARNING: Only use if you are certain `pos` is lower than the array length.\\n */\\n function unsafeMemoryAccess(address[] memory arr, uint256 pos) internal pure returns (address res) {\\n assembly {\\n res := mload(add(add(arr, 0x20), mul(pos, 0x20)))\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8806d620b6571932b662cfd48fbd518d4f70df1f88a23b5724cacde64a77bda1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0x75a4ee64c68dbd5f38bddd06e664a64c8271b4caa554fb6f0607dfd672bb4bf3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Pausable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Context} from \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract Pausable is Context {\\n bool private _paused;\\n\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n /**\\n * @dev The operation failed because the contract is paused.\\n */\\n error EnforcedPause();\\n\\n /**\\n * @dev The operation failed because the contract is not paused.\\n */\\n error ExpectedPause();\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n constructor() {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n _requireNotPaused();\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n _requirePaused();\\n _;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Throws if the contract is paused.\\n */\\n function _requireNotPaused() internal view virtual {\\n if (paused()) {\\n revert EnforcedPause();\\n }\\n }\\n\\n /**\\n * @dev Throws if the contract is not paused.\\n */\\n function _requirePaused() internal view virtual {\\n if (!paused()) {\\n revert ExpectedPause();\\n }\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n}\\n\",\"keccak256\":\"0xb2e5f50762c27fb4b123e3619c3c02bdcba5e515309382e5bfb6f7d6486510bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(newImplementation.code.length > 0);\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Muldiv operation overflow.\\n */\\n error MathOverflowedMulDiv();\\n\\n enum Rounding {\\n Floor, // Toward negative infinity\\n Ceil, // Toward positive infinity\\n Trunc, // Toward zero\\n Expand // Away from zero\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds towards infinity instead\\n * of rounding towards zero.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (b == 0) {\\n // Guarantee the same behavior as in a regular Solidity division.\\n return a / b;\\n }\\n\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n * denominator == 0.\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n * Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0 = x * y; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n if (denominator <= prod1) {\\n revert MathOverflowedMulDiv();\\n }\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n uint256 twos = denominator & (0 - denominator);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\\n // works in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n * towards zero.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n */\\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n return uint8(rounding) % 2 == 1;\\n }\\n}\\n\",\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\"},\"contracts/gETH.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n// external - interfaces\\nimport {IERC1155} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\\\";\\n// internal - globals\\nimport {gETH_DENOMINATOR} from \\\"./globals/macros.sol\\\";\\n// internal - interfaces\\nimport {IERC1155Burnable} from \\\"./interfaces/helpers/IERC1155PausableBurnableSupply.sol\\\";\\nimport {IgETH} from \\\"./interfaces/IgETH.sol\\\";\\n// internal - contracts\\nimport {ERC1155, ERC1155Burnable, ERC1155PausableBurnableSupply} from \\\"./helpers/ERC1155PausableBurnableSupply.sol\\\";\\n\\n/**\\n * @title gETH : Geodefi Liquid Staking Derivatives\\n *\\n * @dev gETH is chain-agnostic, meaning it can be used on any evm chain (given the correct name and symbol).\\n *\\n * @dev gETH is immutable, it cannot be upgraded.\\n *\\n * @dev gETH is a special ERC1155 contract with additional functionalities:\\n * gETHMiddlewares:\\n * * Most important functionality gETH provides:\\n * * Allowing any other contract to provide additional functionality\\n * * around the balance and price data, such as using an ID like ERC20.\\n * * This addition effectively result in changes in\\n * * safeTransferFrom(), burn(), _doSafeTransferAcceptanceCheck()\\n * * functions, reasoning is in the comments.\\n * Avoiders:\\n * * If one wants to remain unbound from gETHMiddlewares,\\n * * it can be done so by calling \\\"avoidMiddlewares\\\" function.\\n * PricePerShare:\\n * * Keeping track of the ratio between the derivative\\n * * and the underlaying staked asset, Ether.\\n * Denominator:\\n * * ERC1155 does not have decimals and it is not wise to use the name convention\\n * * but we need to provide some information on how to denominate the balances, price, etc.\\n *\\n * @dev review ERC1155PausableBurnableSupply, which is generated with Openzeppelin wizard.\\n *\\n * @author Ice Bear & Crash Bandicoot\\n */\\ncontract gETH is IgETH, ERC1155PausableBurnableSupply {\\n /**\\n * @custom:section ** ERRORS **\\n */\\n error gETHZeroId();\\n error gETHInvalidMiddleware(address middleware);\\n /**\\n * @custom:section ** CONSTANTS **\\n */\\n uint256 private immutable DENOMINATOR = gETH_DENOMINATOR;\\n bytes32 public immutable MIDDLEWARE_MANAGER_ROLE = keccak256(\\\"MIDDLEWARE_MANAGER_ROLE\\\");\\n bytes32 public immutable ORACLE_ROLE = keccak256(\\\"ORACLE_ROLE\\\");\\n\\n /**\\n * @custom:section ** VARIABLES **\\n */\\n\\n string public name;\\n string public symbol;\\n /**\\n * @notice Mapping from pool IDs to gETHMiddleware implementation addresses\\n * @dev There can be multiple Middlewares for 1 staking pool.\\n * @dev ADDED for gETH\\n **/\\n mapping(uint256 => mapping(address => bool)) private _middlewares;\\n\\n /**\\n * @notice Mapping of user addresses who chose to restrict the access of Middlewares\\n * @dev ADDED for gETH\\n **/\\n mapping(address => mapping(uint256 => bool)) private _avoiders;\\n\\n /**\\n * @notice shows the underlying ETH for 1 staked gETH for a given asset ID\\n * @dev Freshly created IDs should return 1e18 since initally 1 ETH = 1 gETH\\n * @dev ADDED for gETH\\n **/\\n mapping(uint256 => uint256) private _pricePerShare;\\n /**\\n * @notice ID to timestamp, pointing the second that the latest price update happened\\n * @dev ADDED for gETH\\n **/\\n mapping(uint256 => uint256) private _priceUpdateTimestamp;\\n\\n /**\\n * @custom:section ** EVENTS **\\n */\\n event PriceUpdated(uint256 id, uint256 pricePerShare, uint256 updateTimestamp);\\n event MiddlewareSet(uint256 id, address middleware, bool isSet);\\n event Avoider(address avoider, uint256 id, bool isAvoid);\\n\\n /**\\n * @custom:section ** CONSTRUCTOR **\\n */\\n /**\\n * @notice Sets name, symbol, uri and grants necessary roles.\\n * @param _name chain specific name: Geode Staked Ether, geode Staked Avax etc.\\n * @param _symbol chain specific symbol of the staking derivative: gETH, gGNO, gAVAX, etc.\\n **/\\n constructor(\\n string memory _name,\\n string memory _symbol,\\n string memory _uri\\n ) ERC1155PausableBurnableSupply(_uri) {\\n name = _name;\\n symbol = _symbol;\\n\\n _grantRole(keccak256(\\\"MIDDLEWARE_MANAGER_ROLE\\\"), _msgSender());\\n _grantRole(keccak256(\\\"ORACLE_ROLE\\\"), _msgSender());\\n }\\n\\n /**\\n * @custom:section ** DENOMINATOR **\\n *\\n * @custom:visibility -> view\\n */\\n /**\\n * @notice a centralized denominator for all contract using gETH\\n * @dev ERC1155 does not have a decimals, and it is not wise to use the same name\\n * @dev ADDED for gETH\\n */\\n function denominator() public view virtual override returns (uint256) {\\n return DENOMINATOR;\\n }\\n\\n /**\\n * @custom:section ** MIDDLEWARES **\\n */\\n\\n /**\\n * @custom:visibility -> view-public\\n */\\n\\n /**\\n * @notice Check if an address is approved as a middleware for an ID\\n * @dev ADDED for gETH\\n */\\n function isMiddleware(\\n address middleware,\\n uint256 id\\n ) public view virtual override returns (bool) {\\n return _middlewares[id][middleware];\\n }\\n\\n /**\\n * @custom:visibility -> internal\\n */\\n /**\\n * @dev Only authorized parties should set the middleware\\n * @dev ADDED for gETH\\n */\\n function _setMiddleware(address _middleware, uint256 _id, bool _isSet) internal virtual {\\n _middlewares[_id][_middleware] = _isSet;\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n /**\\n * @notice Set an address of a contract that will\\n * act as a middleware on gETH contract for a specific ID\\n * @param middleware Address of the contract that will act as a middleware\\n * @param isSet true: sets as a middleware, false: unsets\\n * @dev ADDED for gETH\\n */\\n function setMiddleware(\\n address middleware,\\n uint256 id,\\n bool isSet\\n ) external virtual override onlyRole(MIDDLEWARE_MANAGER_ROLE) {\\n if (middleware == address(0) || middleware.code.length == 0) {\\n revert gETHInvalidMiddleware(middleware);\\n }\\n\\n _setMiddleware(middleware, id, isSet);\\n\\n emit MiddlewareSet(id, middleware, isSet);\\n }\\n\\n /**\\n * @custom:section ** AVOIDERS **\\n */\\n /**\\n * @custom:visibility -> view-public\\n */\\n /**\\n * @notice Checks if the given address restricts the affect of the middlewares on their gETH\\n * @param account the potential avoider\\n * @dev ADDED for gETH\\n **/\\n function isAvoider(address account, uint256 id) public view virtual override returns (bool) {\\n return _avoiders[account][id];\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n /**\\n * @notice Restrict any affect of middlewares on the tokens of caller\\n * @param isAvoid true: restrict middlewares, false: allow middlewares\\n * @dev ADDED for gETH\\n **/\\n function avoidMiddlewares(uint256 id, bool isAvoid) external virtual override {\\n address account = _msgSender();\\n\\n _avoiders[account][id] = isAvoid;\\n\\n emit Avoider(account, id, isAvoid);\\n }\\n\\n /**\\n * @custom:section ** PRICE **\\n */\\n\\n /**\\n * @custom:visibility -> view-external\\n */\\n\\n /**\\n * @dev ADDED for gETH\\n * @return price of the derivative in terms of underlying token, Ether\\n */\\n function pricePerShare(uint256 id) external view virtual override returns (uint256) {\\n return _pricePerShare[id];\\n }\\n\\n /**\\n * @dev ADDED for gETH\\n * @return timestamp of the latest price update for given ID\\n */\\n function priceUpdateTimestamp(uint256 id) external view virtual override returns (uint256) {\\n return _priceUpdateTimestamp[id];\\n }\\n\\n /**\\n * @custom:visibility -> internal\\n */\\n\\n /**\\n * @dev ADDED for gETH\\n */\\n function _setPricePerShare(uint256 _price, uint256 _id) internal virtual {\\n _pricePerShare[_id] = _price;\\n _priceUpdateTimestamp[_id] = block.timestamp;\\n }\\n\\n /**\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @notice Only ORACLE can call this function and set price\\n * @dev ADDED for gETH\\n */\\n function setPricePerShare(\\n uint256 price,\\n uint256 id\\n ) external virtual override onlyRole(ORACLE_ROLE) {\\n if (id == 0) {\\n revert gETHZeroId();\\n }\\n\\n _setPricePerShare(price, id);\\n\\n emit PriceUpdated(id, price, block.timestamp);\\n }\\n\\n /**\\n * @custom:section ** ROLES **\\n *\\n * @custom:visibility -> external\\n */\\n\\n /**\\n * @notice transfers the authorized party for setting a new uri.\\n * @dev URI_SETTER is basically a superuser, there can be only 1 at a given time,\\n * @dev intended as \\\"Governance/DAO\\\"\\n */\\n function transferUriSetterRole(\\n address newUriSetter\\n ) external virtual override onlyRole(URI_SETTER_ROLE) {\\n _grantRole(URI_SETTER_ROLE, newUriSetter);\\n renounceRole(URI_SETTER_ROLE, _msgSender());\\n }\\n\\n /**\\n * @notice transfers the authorized party for Pausing operations.\\n * @dev PAUSER is basically a superUser, there can be only 1 at a given time,\\n * @dev intended as \\\"Portal\\\"\\n */\\n function transferPauserRole(address newPauser) external virtual override onlyRole(PAUSER_ROLE) {\\n _grantRole(PAUSER_ROLE, newPauser);\\n renounceRole(PAUSER_ROLE, _msgSender());\\n }\\n\\n /**\\n * @notice transfers the authorized party for Minting operations related to minting\\n * @dev MINTER is basically a superUser, there can be only 1 at a given time,\\n * @dev intended as \\\"Portal\\\"\\n */\\n function transferMinterRole(address newMinter) external virtual override onlyRole(MINTER_ROLE) {\\n _grantRole(MINTER_ROLE, newMinter);\\n renounceRole(MINTER_ROLE, _msgSender());\\n }\\n\\n /**\\n * @notice transfers the authorized party for Oracle operations related to pricing\\n * @dev ORACLE is basically a superUser, there can be only 1 at a given time,\\n * @dev intended as \\\"Portal\\\"\\n */\\n function transferOracleRole(address newOracle) external virtual override onlyRole(ORACLE_ROLE) {\\n _grantRole(ORACLE_ROLE, newOracle);\\n renounceRole(ORACLE_ROLE, _msgSender());\\n }\\n\\n /**\\n * @notice transfers the authorized party for middleware management\\n * @dev MIDDLEWARE MANAGER is basically a superUser, there can be only 1 at a given time,\\n * @dev intended as \\\"Portal\\\"\\n */\\n function transferMiddlewareManagerRole(\\n address newMiddlewareManager\\n ) external virtual override onlyRole(MIDDLEWARE_MANAGER_ROLE) {\\n _grantRole(MIDDLEWARE_MANAGER_ROLE, newMiddlewareManager);\\n renounceRole(MIDDLEWARE_MANAGER_ROLE, _msgSender());\\n }\\n\\n /**\\n * @custom:section ** OVERRIDES **\\n *\\n * @dev middleware of a specific ID can move funds between accounts without approval.\\n * So, we will be overriding 2 functions:\\n * * safeTransferFrom\\n * * burn\\n * note safeBatchTransferFrom is not need to be overriden,\\n * as a middleware should not do batch transfers.\\n *\\n * @dev middlewares should handle transfer checks internally.\\n * Because of this we want to remove the SafeTransferAcceptanceCheck if the caller is a middleware.\\n * However, overriding _doSafeTransferAcceptanceCheck was not possible, so we copy pasted OZ contracts and\\n * made it internal virtual.\\n * note _doSafeBatchTransferAcceptanceCheck is not need to be overriden,\\n * as a middleware should not do batch transfers.\\n */\\n\\n /**\\n * @dev CHANGED for gETH\\n * @dev ADDED if (!isMiddleware) check\\n * @dev See ERC1155 _doSafeTransferAcceptanceCheck:\\n * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/cffb2f1ddcd87efd68effc92cfd336c5145acabd/contracts/token/ERC1155/ERC1155.sol#L381\\n */\\n function _doSafeTransferAcceptanceCheck(\\n address operator,\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) internal virtual override {\\n if (!(isMiddleware(operator, id))) {\\n super._doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);\\n }\\n }\\n\\n /**\\n * @dev CHANGED for gETH\\n * @dev ADDED \\\"((!isMiddleware(sender, id)) || isAvoider(from, id))\\\" pass condition\\n * @dev See ERC1155 safeTransferFrom:\\n * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/cffb2f1ddcd87efd68effc92cfd336c5145acabd/contracts/token/ERC1155/ERC1155.sol#L109C29-L109C29\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 value,\\n bytes memory data\\n ) public virtual override(ERC1155, IERC1155) {\\n address sender = _msgSender();\\n\\n if (from != sender && !isApprovedForAll(from, sender)) {\\n if ((!isMiddleware(sender, id)) || isAvoider(from, id)) {\\n revert ERC1155MissingApprovalForAll(sender, from);\\n }\\n }\\n\\n _safeTransferFrom(from, to, id, value, data);\\n }\\n\\n /**\\n * @dev CHANGED for gETH\\n * @dev ADDED \\\"((!(isMiddleware(sender, id))) || (isAvoider(account, id)))\\\" pass condition\\n * @dev See ERC1155Burnable burn:\\n * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/cffb2f1ddcd87efd68effc92cfd336c5145acabd/contracts/token/ERC1155/extensions/ERC1155Burnable.sol#L13C1-L19C6\\n */\\n function burn(\\n address account,\\n uint256 id,\\n uint256 value\\n ) public virtual override(ERC1155Burnable, IERC1155Burnable) {\\n address sender = _msgSender();\\n\\n if (account != sender && !isApprovedForAll(account, sender)) {\\n if ((!isMiddleware(sender, id)) || isAvoider(account, id)) {\\n revert ERC1155MissingApprovalForAll(sender, account);\\n }\\n }\\n\\n _burn(account, id, value);\\n }\\n}\\n\",\"keccak256\":\"0x41b5f35077750cd75074e8afbeca1f6cb7e6131e0284d041da84c53f2aef9506\",\"license\":\"BUSL-1.1\"},\"contracts/globals/macros.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity =0.8.20;\\n\\n// no floats in solidity. If needed, PERCENTAGE_DENOMINATOR always represents \\\"1\\\" (100%)\\nuint256 constant PERCENTAGE_DENOMINATOR = 1e10;\\n\\nuint256 constant gETH_DENOMINATOR = 1e18;\\n\",\"keccak256\":\"0xdcbe1faa8712a653a87f4e185afb598388c2bbe62a750989df57afeac2848168\",\"license\":\"BUSL-1.1\"},\"contracts/helpers/ERC1155PausableBurnableSupply.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/ERC1155.sol)\\n\\n// External\\n// Dependencies: ERC1155\\n// * interfaces\\nimport {IERC165} from \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport {IERC1155} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\\\";\\nimport {IERC1155Receiver} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Errors} from \\\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\\\";\\n// * libraries\\nimport {Arrays} from \\\"@openzeppelin/contracts/utils/Arrays.sol\\\";\\n// * contracts\\nimport {Context} from \\\"@openzeppelin/contracts/utils/Context.sol\\\";\\nimport {ERC165} from \\\"@openzeppelin/contracts/utils/introspection/ERC165.sol\\\";\\n\\n// Dependencies: ERC1155Pausable\\nimport {Pausable} from \\\"@openzeppelin/contracts/utils/Pausable.sol\\\";\\n\\n// Dependencies: ERC1155PausableBurnableSupply\\nimport {AccessControl} from \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\n\\n// Internal - interfaces\\nimport {IERC1155Burnable, IERC1155Supply, IERC1155PausableBurnableSupply} from \\\"../interfaces/helpers/IERC1155PausableBurnableSupply.sol\\\";\\n\\nabstract contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n using Arrays for uint256[];\\n using Arrays for address[];\\n\\n mapping(uint256 id => mapping(address account => uint256)) private _balances;\\n\\n mapping(address account => mapping(address operator => bool)) private _operatorApprovals;\\n\\n // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json\\n string private _uri;\\n\\n /**\\n * @dev See {_setURI}.\\n */\\n constructor(string memory uri_) {\\n _setURI(uri_);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC165, IERC165) returns (bool) {\\n return\\n interfaceId == type(IERC1155).interfaceId ||\\n interfaceId == type(IERC1155MetadataURI).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC1155MetadataURI-uri}.\\n *\\n * This implementation returns the same URI for *all* token types. It relies\\n * on the token type ID substitution mechanism\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\\n *\\n * Clients calling this function must replace the `\\\\{id\\\\}` substring with the\\n * actual token type ID.\\n */\\n function uri(uint256 /* id */) public view virtual returns (string memory) {\\n return _uri;\\n }\\n\\n /**\\n * @dev See {IERC1155-balanceOf}.\\n */\\n function balanceOf(address account, uint256 id) public view virtual returns (uint256) {\\n return _balances[id][account];\\n }\\n\\n /**\\n * @dev See {IERC1155-balanceOfBatch}.\\n *\\n * Requirements:\\n *\\n * - `accounts` and `ids` must have the same length.\\n */\\n function balanceOfBatch(\\n address[] memory accounts,\\n uint256[] memory ids\\n ) public view virtual returns (uint256[] memory) {\\n if (accounts.length != ids.length) {\\n revert ERC1155InvalidArrayLength(ids.length, accounts.length);\\n }\\n\\n uint256[] memory batchBalances = new uint256[](accounts.length);\\n\\n for (uint256 i = 0; i < accounts.length; ++i) {\\n batchBalances[i] = balanceOf(accounts.unsafeMemoryAccess(i), ids.unsafeMemoryAccess(i));\\n }\\n\\n return batchBalances;\\n }\\n\\n /**\\n * @dev See {IERC1155-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC1155-isApprovedForAll}.\\n */\\n function isApprovedForAll(address account, address operator) public view virtual returns (bool) {\\n return _operatorApprovals[account][operator];\\n }\\n\\n /**\\n * @dev See {IERC1155-safeTransferFrom}.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 value,\\n bytes memory data\\n ) public virtual {\\n address sender = _msgSender();\\n if (from != sender && !isApprovedForAll(from, sender)) {\\n revert ERC1155MissingApprovalForAll(sender, from);\\n }\\n _safeTransferFrom(from, to, id, value, data);\\n }\\n\\n /**\\n * @dev See {IERC1155-safeBatchTransferFrom}.\\n */\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values,\\n bytes memory data\\n ) public virtual {\\n address sender = _msgSender();\\n if (from != sender && !isApprovedForAll(from, sender)) {\\n revert ERC1155MissingApprovalForAll(sender, from);\\n }\\n _safeBatchTransferFrom(from, to, ids, values, data);\\n }\\n\\n /**\\n * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`. Will mint (or burn) if `from`\\n * (or `to`) is the zero address.\\n *\\n * Emits a {TransferSingle} event if the arrays contain one element, and {TransferBatch} otherwise.\\n *\\n * Requirements:\\n *\\n * - If `to` refers to a smart contract, it must implement either {IERC1155Receiver-onERC1155Received}\\n * or {IERC1155Receiver-onERC1155BatchReceived} and return the acceptance magic value.\\n * - `ids` and `values` must have the same length.\\n *\\n * NOTE: The ERC-1155 acceptance check is not performed in this function. See {_updateWithAcceptanceCheck} instead.\\n */\\n function _update(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values\\n ) internal virtual {\\n if (ids.length != values.length) {\\n revert ERC1155InvalidArrayLength(ids.length, values.length);\\n }\\n\\n address operator = _msgSender();\\n\\n for (uint256 i = 0; i < ids.length; ++i) {\\n uint256 id = ids.unsafeMemoryAccess(i);\\n uint256 value = values.unsafeMemoryAccess(i);\\n\\n if (from != address(0)) {\\n uint256 fromBalance = _balances[id][from];\\n if (fromBalance < value) {\\n revert ERC1155InsufficientBalance(from, fromBalance, value, id);\\n }\\n unchecked {\\n // Overflow not possible: value <= fromBalance\\n _balances[id][from] = fromBalance - value;\\n }\\n }\\n\\n if (to != address(0)) {\\n _balances[id][to] += value;\\n }\\n }\\n\\n if (ids.length == 1) {\\n uint256 id = ids.unsafeMemoryAccess(0);\\n uint256 value = values.unsafeMemoryAccess(0);\\n emit TransferSingle(operator, from, to, id, value);\\n } else {\\n emit TransferBatch(operator, from, to, ids, values);\\n }\\n }\\n\\n /**\\n * @dev Version of {_update} that performs the token acceptance check by calling\\n * {IERC1155Receiver-onERC1155Received} or {IERC1155Receiver-onERC1155BatchReceived} on the receiver address if it\\n * contains code (eg. is a smart contract at the moment of execution).\\n *\\n * IMPORTANT: Overriding this function is discouraged because it poses a reentrancy risk from the receiver. So any\\n * update to the contract state after this function would break the check-effect-interaction pattern. Consider\\n * overriding {_update} instead.\\n */\\n function _updateWithAcceptanceCheck(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values,\\n bytes memory data\\n ) internal virtual {\\n _update(from, to, ids, values);\\n if (to != address(0)) {\\n address operator = _msgSender();\\n if (ids.length == 1) {\\n uint256 id = ids.unsafeMemoryAccess(0);\\n uint256 value = values.unsafeMemoryAccess(0);\\n _doSafeTransferAcceptanceCheck(operator, from, to, id, value, data);\\n } else {\\n _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, values, data);\\n }\\n }\\n }\\n\\n /**\\n * @dev Transfers a `value` tokens of token type `id` from `from` to `to`.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of tokens of type `id` of at least `value` amount.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function _safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 value,\\n bytes memory data\\n ) internal {\\n if (to == address(0)) {\\n revert ERC1155InvalidReceiver(address(0));\\n }\\n if (from == address(0)) {\\n revert ERC1155InvalidSender(address(0));\\n }\\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\\n _updateWithAcceptanceCheck(from, to, ids, values, data);\\n }\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n * - `ids` and `values` must have the same length.\\n */\\n function _safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values,\\n bytes memory data\\n ) internal {\\n if (to == address(0)) {\\n revert ERC1155InvalidReceiver(address(0));\\n }\\n if (from == address(0)) {\\n revert ERC1155InvalidSender(address(0));\\n }\\n _updateWithAcceptanceCheck(from, to, ids, values, data);\\n }\\n\\n /**\\n * @dev Sets a new URI for all token types, by relying on the token type ID\\n * substitution mechanism\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\\n *\\n * By this mechanism, any occurrence of the `\\\\{id\\\\}` substring in either the\\n * URI or any of the values in the JSON file at said URI will be replaced by\\n * clients with the token type ID.\\n *\\n * For example, the `https://token-cdn-domain/\\\\{id\\\\}.json` URI would be\\n * interpreted by clients as\\n * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`\\n * for token type ID 0x4cce0.\\n *\\n * See {uri}.\\n *\\n * Because these URIs cannot be meaningfully represented by the {URI} event,\\n * this function emits no events.\\n */\\n function _setURI(string memory newuri) internal virtual {\\n _uri = newuri;\\n }\\n\\n /**\\n * @dev Creates a `value` amount of tokens of type `id`, and assigns them to `to`.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function _mint(address to, uint256 id, uint256 value, bytes memory data) internal {\\n if (to == address(0)) {\\n revert ERC1155InvalidReceiver(address(0));\\n }\\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\\n _updateWithAcceptanceCheck(address(0), to, ids, values, data);\\n }\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `values` must have the same length.\\n * - `to` cannot be the zero address.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function _mintBatch(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values,\\n bytes memory data\\n ) internal {\\n if (to == address(0)) {\\n revert ERC1155InvalidReceiver(address(0));\\n }\\n _updateWithAcceptanceCheck(address(0), to, ids, values, data);\\n }\\n\\n /**\\n * @dev Destroys a `value` amount of tokens of type `id` from `from`\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `from` must have at least `value` amount of tokens of type `id`.\\n */\\n function _burn(address from, uint256 id, uint256 value) internal {\\n if (from == address(0)) {\\n revert ERC1155InvalidSender(address(0));\\n }\\n (uint256[] memory ids, uint256[] memory values) = _asSingletonArrays(id, value);\\n _updateWithAcceptanceCheck(from, address(0), ids, values, \\\"\\\");\\n }\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `from` must have at least `value` amount of tokens of type `id`.\\n * - `ids` and `values` must have the same length.\\n */\\n function _burnBatch(address from, uint256[] memory ids, uint256[] memory values) internal {\\n if (from == address(0)) {\\n revert ERC1155InvalidSender(address(0));\\n }\\n _updateWithAcceptanceCheck(from, address(0), ids, values, \\\"\\\");\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Emits an {ApprovalForAll} event.\\n *\\n * Requirements:\\n *\\n * - `operator` cannot be the zero address.\\n */\\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\\n if (operator == address(0)) {\\n revert ERC1155InvalidOperator(address(0));\\n }\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Performs an acceptance check by calling {IERC1155-onERC1155Received} on the `to` address\\n * if it contains code at the moment of execution.\\n */\\n function _doSafeTransferAcceptanceCheck(\\n address operator,\\n address from,\\n address to,\\n uint256 id,\\n uint256 value,\\n bytes memory data\\n ) internal virtual {\\n if (to.code.length > 0) {\\n try IERC1155Receiver(to).onERC1155Received(operator, from, id, value, data) returns (\\n bytes4 response\\n ) {\\n if (response != IERC1155Receiver.onERC1155Received.selector) {\\n // Tokens rejected\\n revert ERC1155InvalidReceiver(to);\\n }\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n // non-ERC1155Receiver implementer\\n revert ERC1155InvalidReceiver(to);\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Performs a batch acceptance check by calling {IERC1155-onERC1155BatchReceived} on the `to` address\\n * if it contains code at the moment of execution.\\n */\\n function _doSafeBatchTransferAcceptanceCheck(\\n address operator,\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values,\\n bytes memory data\\n ) private {\\n if (to.code.length > 0) {\\n try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, values, data) returns (\\n bytes4 response\\n ) {\\n if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {\\n // Tokens rejected\\n revert ERC1155InvalidReceiver(to);\\n }\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n // non-ERC1155Receiver implementer\\n revert ERC1155InvalidReceiver(to);\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Creates an array in memory with only one value for each of the elements provided.\\n */\\n function _asSingletonArrays(\\n uint256 element1,\\n uint256 element2\\n ) private pure returns (uint256[] memory array1, uint256[] memory array2) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Load the free memory pointer\\n array1 := mload(0x40)\\n // Set array length to 1\\n mstore(array1, 1)\\n // Store the single element at the next word after the length (where content starts)\\n mstore(add(array1, 0x20), element1)\\n\\n // Repeat for next array locating it right after the first array\\n array2 := add(array1, 0x40)\\n mstore(array2, 1)\\n mstore(add(array2, 0x20), element2)\\n\\n // Update the free memory pointer by pointing after the second array\\n mstore(0x40, add(array2, 0x40))\\n }\\n }\\n}\\n\\nabstract contract ERC1155Pausable is ERC1155, Pausable {\\n /**\\n * @dev See {ERC1155-_update}.\\n *\\n * Requirements:\\n *\\n * - the contract must not be paused.\\n */\\n function _update(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values\\n ) internal virtual override whenNotPaused {\\n super._update(from, to, ids, values);\\n }\\n}\\n\\nabstract contract ERC1155Burnable is IERC1155Burnable, ERC1155 {\\n function burn(address account, uint256 id, uint256 value) public virtual override {\\n if (account != _msgSender() && !isApprovedForAll(account, _msgSender())) {\\n revert ERC1155MissingApprovalForAll(_msgSender(), account);\\n }\\n\\n _burn(account, id, value);\\n }\\n\\n function burnBatch(\\n address account,\\n uint256[] memory ids,\\n uint256[] memory values\\n ) public virtual {\\n if (account != _msgSender() && !isApprovedForAll(account, _msgSender())) {\\n revert ERC1155MissingApprovalForAll(_msgSender(), account);\\n }\\n\\n _burnBatch(account, ids, values);\\n }\\n}\\n\\nabstract contract ERC1155Supply is IERC1155Supply, ERC1155 {\\n mapping(uint256 id => uint256) private _totalSupply;\\n uint256 private _totalSupplyAll;\\n\\n /**\\n * @dev Total value of tokens in with a given id.\\n */\\n function totalSupply(uint256 id) public view virtual returns (uint256) {\\n return _totalSupply[id];\\n }\\n\\n /**\\n * @dev Total value of tokens.\\n */\\n function totalSupply() public view virtual returns (uint256) {\\n return _totalSupplyAll;\\n }\\n\\n /**\\n * @dev Indicates whether any token exist with a given id, or not.\\n */\\n function exists(uint256 id) public view virtual returns (bool) {\\n return totalSupply(id) > 0;\\n }\\n\\n /**\\n * @dev See {ERC1155-_update}.\\n */\\n function _update(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values\\n ) internal virtual override {\\n super._update(from, to, ids, values);\\n\\n if (from == address(0)) {\\n uint256 totalMintValue = 0;\\n for (uint256 i = 0; i < ids.length; ++i) {\\n uint256 value = values[i];\\n // Overflow check required: The rest of the code assumes that totalSupply never overflows\\n _totalSupply[ids[i]] += value;\\n totalMintValue += value;\\n }\\n // Overflow check required: The rest of the code assumes that totalSupplyAll never overflows\\n _totalSupplyAll += totalMintValue;\\n }\\n\\n if (to == address(0)) {\\n uint256 totalBurnValue = 0;\\n for (uint256 i = 0; i < ids.length; ++i) {\\n uint256 value = values[i];\\n\\n unchecked {\\n // Overflow not possible: values[i] <= balanceOf(from, ids[i]) <= totalSupply(ids[i])\\n _totalSupply[ids[i]] -= value;\\n // Overflow not possible: sum_i(values[i]) <= sum_i(totalSupply(ids[i])) <= totalSupplyAll\\n totalBurnValue += value;\\n }\\n }\\n unchecked {\\n // Overflow not possible: totalBurnValue = sum_i(values[i]) <= sum_i(totalSupply(ids[i])) <= totalSupplyAll\\n _totalSupplyAll -= totalBurnValue;\\n }\\n }\\n }\\n}\\n\\n/**\\n * @notice Base contract for gETH.\\n * @dev Above contracts are taken from Openzeppelin.\\n * @dev Only difference is _doSafeTransferAcceptanceCheck is being internal virtual instead of private, because we want to be able to override it in gETH:\\n * ERC1155:\\n * * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/cffb2f1ddcd87efd68effc92cfd336c5145acabd/contracts/token/ERC1155/ERC1155.sol#1\\n * ERC1155Pausable:\\n * * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/37afdc8910f2853426c20e504ecfe5d992e21813/contracts/token/ERC1155/extensions/ERC1155Pausable.sol#L1\\n * ERC1155Burnable:\\n * * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/37afdc8910f2853426c20e504ecfe5d992e21813/contracts/token/ERC1155/extensions/ERC1155Burnable.sol#L1\\n * ERC1155Supply:\\n * * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/37afdc8910f2853426c20e504ecfe5d992e21813/contracts/token/ERC1155/extensions/ERC1155Supply.sol#L1\\n *\\n * @dev Below contract ERC1155PausableBurnableSupply is created with openzeppelin wizard:\\n * + Mintable\\n * + Burnable\\n * + Supply Tracking\\n * + Pausable\\n * + Updatable URI\\n * + Roles\\n * Additionally, its constructor is changed for some gas savings.\\n */\\ncontract ERC1155PausableBurnableSupply is\\n IERC1155PausableBurnableSupply,\\n ERC1155,\\n AccessControl,\\n ERC1155Pausable,\\n ERC1155Burnable,\\n ERC1155Supply\\n{\\n bytes32 public immutable URI_SETTER_ROLE = keccak256(\\\"URI_SETTER_ROLE\\\");\\n bytes32 public immutable PAUSER_ROLE = keccak256(\\\"PAUSER_ROLE\\\");\\n bytes32 public immutable MINTER_ROLE = keccak256(\\\"MINTER_ROLE\\\");\\n\\n constructor(string memory uri_) ERC1155(uri_) {\\n _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n _grantRole(keccak256(\\\"URI_SETTER_ROLE\\\"), msg.sender);\\n _grantRole(keccak256(\\\"PAUSER_ROLE\\\"), msg.sender);\\n _grantRole(keccak256(\\\"MINTER_ROLE\\\"), msg.sender);\\n }\\n\\n function setURI(string memory newuri) public override onlyRole(URI_SETTER_ROLE) {\\n _setURI(newuri);\\n }\\n\\n function pause() public override onlyRole(PAUSER_ROLE) {\\n _pause();\\n }\\n\\n function unpause() public override onlyRole(PAUSER_ROLE) {\\n _unpause();\\n }\\n\\n function mint(\\n address account,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) public override onlyRole(MINTER_ROLE) {\\n _mint(account, id, amount, data);\\n }\\n\\n function mintBatch(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) public override onlyRole(MINTER_ROLE) {\\n _mintBatch(to, ids, amounts, data);\\n }\\n\\n // The following functions are overrides required by Solidity.\\n\\n function _update(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory values\\n ) internal override(ERC1155, ERC1155Pausable, ERC1155Supply) {\\n super._update(from, to, ids, values);\\n }\\n\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view override(ERC1155, AccessControl, IERC165) returns (bool) {\\n return super.supportsInterface(interfaceId);\\n }\\n}\\n\",\"keccak256\":\"0xb76c0ea8cd2679e5e4fd0ca893b9c058fa0aed271ca526971434ba28ebbd4c4d\",\"license\":\"MIT\"},\"contracts/interfaces/IgETH.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\nimport {IERC1155PausableBurnableSupply} from \\\"./helpers/IERC1155PausableBurnableSupply.sol\\\";\\n\\ninterface IgETH is IERC1155PausableBurnableSupply {\\n function denominator() external view returns (uint256);\\n\\n function isMiddleware(address middleware, uint256 id) external view returns (bool);\\n\\n function setMiddleware(address middleware, uint256 id, bool isSet) external;\\n\\n function isAvoider(address account, uint256 id) external view returns (bool);\\n\\n function avoidMiddlewares(uint256 id, bool isAvoid) external;\\n\\n function pricePerShare(uint256 id) external view returns (uint256);\\n\\n function priceUpdateTimestamp(uint256 id) external view returns (uint256);\\n\\n function setPricePerShare(uint256 price, uint256 id) external;\\n\\n function transferUriSetterRole(address newUriSetter) external;\\n\\n function transferPauserRole(address newPauser) external;\\n\\n function transferMinterRole(address newMinter) external;\\n\\n function transferOracleRole(address newOracle) external;\\n\\n function transferMiddlewareManagerRole(address newMiddlewareManager) external;\\n}\\n\",\"keccak256\":\"0xa093b769e8ba42091d3db8a9e4ddc1be066f4aa92f61ee552983c22a0e9f29d8\",\"license\":\"MIT\"},\"contracts/interfaces/helpers/IERC1155PausableBurnableSupply.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity =0.8.20;\\n\\n/// @dev IERC1155 inherits IERC165\\nimport {IERC1155} from \\\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\\\";\\nimport {IERC1155MetadataURI} from \\\"@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol\\\";\\nimport {IERC1155Errors} from \\\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\\\";\\n\\ninterface IERC1155Burnable is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function burn(address account, uint256 id, uint256 value) external;\\n\\n function burnBatch(address account, uint256[] memory ids, uint256[] memory values) external;\\n}\\n\\ninterface IERC1155Supply is IERC1155, IERC1155MetadataURI, IERC1155Errors {\\n function totalSupply(uint256 id) external view returns (uint256);\\n\\n function exists(uint256 id) external view returns (bool);\\n}\\n\\ninterface IERC1155PausableBurnableSupply is IERC1155Burnable, IERC1155Supply {\\n function setURI(string memory newuri) external;\\n\\n function pause() external;\\n\\n function unpause() external;\\n\\n function mint(address account, uint256 id, uint256 amount, bytes memory data) external;\\n\\n function mintBatch(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) external;\\n}\\n\",\"keccak256\":\"0x8b0a02fdbc8d54c815d68e122f6869348217b5efd853c8b833c59d2053998ef0\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x61014060405260008051602062002cf283398151915260805260008051602062002d1283398151915260a05260008051602062002d3283398151915260c052670de0b6b3a764000060e05260008051602062002d528339815191526101005260008051602062002cd2833981519152610120523480156200007f57600080fd5b5060405162002d7238038062002d72833981016040819052620000a29162000307565b8080620000af816200017d565b506004805460ff19169055620000c76000336200018f565b50620000e360008051602062002cf2833981519152336200018f565b50620000ff60008051602062002d12833981519152336200018f565b506200011b60008051602062002d32833981519152336200018f565b50600790506200012c848262000427565b5060086200013b838262000427565b506200015760008051602062002d52833981519152336200018f565b506200017360008051602062002cd2833981519152336200018f565b50505050620004f3565b60026200018b828262000427565b5050565b60008281526003602090815260408083206001600160a01b038516845290915281205460ff16620002385760008381526003602090815260408083206001600160a01b03861684529091529020805460ff19166001179055620001ef3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016200023c565b5060005b92915050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200026a57600080fd5b81516001600160401b038082111562000287576200028762000242565b604051601f8301601f19908116603f01168101908282118183101715620002b257620002b262000242565b81604052838152602092508683858801011115620002cf57600080fd5b600091505b83821015620002f35785820183015181830184015290820190620002d4565b600093810190920192909252949350505050565b6000806000606084860312156200031d57600080fd5b83516001600160401b03808211156200033557600080fd5b620003438783880162000258565b945060208601519150808211156200035a57600080fd5b620003688783880162000258565b935060408601519150808211156200037f57600080fd5b506200038e8682870162000258565b9150509250925092565b600181811c90821680620003ad57607f821691505b602082108103620003ce57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200042257600081815260208120601f850160051c81016020861015620003fd5750805b601f850160051c820191505b818110156200041e5782815560010162000409565b5050505b505050565b81516001600160401b0381111562000443576200044362000242565b6200045b8162000454845462000398565b84620003d4565b602080601f8311600181146200049357600084156200047a5750858301515b600019600386901b1c1916600185901b1785556200041e565b600085815260208120601f198616915b82811015620004c457888601518255948401946001909101908401620004a3565b5085821015620004e35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161010051610120516126f5620005dd60003960008181610321015281816108f101528181610dcc01528181610df90152610e2401526000818161062401528181610c1801528181610f8c01528181610fb90152610fe4015260006105130152600081816105b0015281816108b401528181610d6401528181610e8e01528181610ebb0152610ee60152600081816105ea01528181610ae401528181610d9a01528181610f0d01528181610f3a0152610f65015260008181610499015281816106c101528181610a3101528181610a5e0152610a8901526126f56000f3fe608060405234801561001057600080fd5b506004361061027e5760003560e01c80636b20c4541161015c578063b8bf60f9116100ce578063e63ab1e911610087578063e63ab1e9146105e5578063e985e9c51461060c578063eef37fd51461061f578063f242432a14610646578063f5298aca14610659578063f759cc3b1461066c57600080fd5b8063b8bf60f914610552578063bad383a614610565578063bd85b03914610578578063c7bddb1e14610598578063d5391393146105ab578063d547741f146105d257600080fd5b8063908d67ed11610120578063908d67ed146104d657806391d14854146104f657806395d89b411461050957806396ce079514610511578063a217fddf14610537578063a22cb4651461053f57600080fd5b80636b20c4541461046e578063731133e9146104815780637f345710146104945780638456cb59146104bb5780638801b9b8146104c357600080fd5b8063248a9ca3116101f55780633f4ba83a116101b95780633f4ba83a146103f35780634d280a55146103fb5780634e1273f41461040e5780634f558e791461042e578063512be796146104505780635c975abb1461046357600080fd5b8063248a9ca3146103845780632eb2c2d6146103a75780632f2ff15d146103ba5780633106fde8146103cd57806336568abe146103e057600080fd5b8063072650d211610247578063072650d21461030957806307e2cea51461031c5780630e89341c1461034357806318160ddd146103565780631f7fdffa1461035e57806322af59971461037157600080fd5b8062fdd58e1461028357806301ffc9a7146102a957806302fe5305146102cc5780630492f6e1146102e157806306fdde03146102f4575b600080fd5b610296610291366004611ce6565b61068c565b6040519081526020015b60405180910390f35b6102bc6102b7366004611d26565b6106b4565b60405190151581526020016102a0565b6102df6102da366004611de9565b6106bf565b005b6102df6102ef366004611e4a565b6106f6565b6102fc610765565b6040516102a09190611ebc565b6102bc610317366004611ce6565b6107f3565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102fc610351366004611ecf565b61081e565b600654610296565b6102df61036c366004611f97565b6108b2565b6102df61037f366004612030565b6108ef565b610296610392366004611ecf565b60009081526003602052604090206001015490565b6102df6103b5366004612052565b610998565b6102df6103c83660046120fc565b610a04565b6102df6103db36600461211f565b610a2f565b6102df6103ee3660046120fc565b610aaa565b6102df610ae2565b6102bc610409366004611ce6565b610b17565b61042161041c36600461213a565b610b41565b6040516102a09190612235565b6102bc61043c366004611ecf565b600090815260056020526040902054151590565b6102df61045e366004612248565b610c16565b60045460ff166102bc565b6102df61047c366004612284565b610d08565b6102df61048f3660046122f8565b610d62565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102df610d98565b6102df6104d136600461211f565b610dca565b6102966104e4366004611ecf565b6000908152600c602052604090205490565b6102bc6105043660046120fc565b610e49565b6102fc610e74565b7f0000000000000000000000000000000000000000000000000000000000000000610296565b610296600081565b6102df61054d36600461234d565b610e81565b6102df61056036600461211f565b610e8c565b6102df61057336600461211f565b610f0b565b610296610586366004611ecf565b60009081526005602052604090205490565b6102df6105a636600461211f565b610f8a565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102df6105e03660046120fc565b611009565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102bc61061a366004612377565b61102e565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102df6106543660046123a1565b61105c565b6102df610667366004612406565b6110db565b61029661067a366004611ecf565b6000908152600b602052604090205490565b6000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006106ae82611158565b7f00000000000000000000000000000000000000000000000000000000000000006106e98161117d565b6106f282611187565b5050565b336000818152600a60209081526040808320868452825291829020805460ff19168515159081179091558251848152918201869052918101919091527f78738b8c4717822a58cc752d3b2d657f2d706db6042748d69d2048438ff07e2c906060015b60405180910390a1505050565b6007805461077290612439565b80601f016020809104026020016040519081016040528092919081815260200182805461079e90612439565b80156107eb5780601f106107c0576101008083540402835291602001916107eb565b820191906000526020600020905b8154815290600101906020018083116107ce57829003601f168201915b505050505081565b6001600160a01b03919091166000908152600a60209081526040808320938352929052205460ff1690565b60606002805461082d90612439565b80601f016020809104026020016040519081016040528092919081815260200182805461085990612439565b80156108a65780601f1061087b576101008083540402835291602001916108a6565b820191906000526020600020905b81548152906001019060200180831161088957829003601f168201915b50505050509050919050565b7f00000000000000000000000000000000000000000000000000000000000000006108dc8161117d565b6108e885858585611193565b5050505050565b7f00000000000000000000000000000000000000000000000000000000000000006109198161117d565b8160000361093a5760405163dcef3bd560e01b815260040160405180910390fd5b6000828152600b60209081526040808320869055600c9091529020429055604080518381526020810185905242918101919091527f15819dd2fd9f6418b142e798d08a18d0bf06ea368f4480b7b0d3f75bd966bc4890606001610758565b336001600160a01b03861681148015906109b957506109b7868261102e565b155b156109ef5760405163711bec9160e11b81526001600160a01b038083166004830152871660248201526044015b60405180910390fd5b6109fc86868686866111cb565b505050505050565b600082815260036020526040902060010154610a1f8161117d565b610a29838361122b565b50505050565b7f0000000000000000000000000000000000000000000000000000000000000000610a598161117d565b610a837f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f0000000000000000000000000000000000000000000000000000000000000000335b6001600160a01b0381163314610ad35760405163334bd91960e11b815260040160405180910390fd5b610add82826112bf565b505050565b7f0000000000000000000000000000000000000000000000000000000000000000610b0c8161117d565b610b1461132c565b50565b60009081526009602090815260408083206001600160a01b03949094168352929052205460ff1690565b60608151835114610b725781518351604051635b05999160e01b8152600481019290925260248201526044016109e6565b6000835167ffffffffffffffff811115610b8e57610b8e611d4a565b604051908082528060200260200182016040528015610bb7578160200160208202803683370190505b50905060005b8451811015610c0e57602080820286010151610be19060208084028701015161068c565b828281518110610bf357610bf3612473565b6020908102919091010152610c078161249f565b9050610bbd565b509392505050565b7f0000000000000000000000000000000000000000000000000000000000000000610c408161117d565b6001600160a01b0384161580610c5e57506001600160a01b0384163b155b15610c8757604051630789b04160e41b81526001600160a01b03851660048201526024016109e6565b60008381526009602090815260408083206001600160a01b03881684529091529020805460ff1916831515179055604080518481526001600160a01b0386166020820152831515918101919091527fc3c7dc5ac1b5d811719dbd5be732967d24ed27897351a8a123e526f6b53dc5249060600160405180910390a150505050565b6001600160a01b0383163314801590610d285750610d26833361102e565b155b15610d575760405163711bec9160e11b81523360048201526001600160a01b03841660248201526044016109e6565b610add83838361137e565b7f0000000000000000000000000000000000000000000000000000000000000000610d8c8161117d565b6108e8858585856113c4565b7f0000000000000000000000000000000000000000000000000000000000000000610dc28161117d565b610b14611421565b7f0000000000000000000000000000000000000000000000000000000000000000610df48161117d565b610e1e7f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b60009182526003602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6008805461077290612439565b6106f233838361145e565b7f0000000000000000000000000000000000000000000000000000000000000000610eb68161117d565b610ee07f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b7f0000000000000000000000000000000000000000000000000000000000000000610f358161117d565b610f5f7f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b7f0000000000000000000000000000000000000000000000000000000000000000610fb48161117d565b610fde7f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b6000828152600360205260409020600101546110248161117d565b610a2983836112bf565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b336001600160a01b038616811480159061107d575061107b868261102e565b155b156110ce5761108c8185610b17565b158061109d575061109d86856107f3565b156110ce5760405163711bec9160e11b81526001600160a01b038083166004830152871660248201526044016109e6565b6109fc86868686866114f4565b336001600160a01b03841681148015906110fc57506110fa848261102e565b155b1561114d5761110b8184610b17565b158061111c575061111c84846107f3565b1561114d5760405163711bec9160e11b81526001600160a01b038083166004830152851660248201526044016109e6565b610a29848484611582565b60006001600160e01b03198216637965db0b60e01b14806106ae57506106ae826115ea565b610b14813361163a565b60026106f282826124fe565b6001600160a01b0384166111bd57604051632bfa23e760e11b8152600060048201526024016109e6565b610a29600085858585611673565b6001600160a01b0384166111f557604051632bfa23e760e11b8152600060048201526024016109e6565b6001600160a01b03851661121e57604051626a0d4560e21b8152600060048201526024016109e6565b6108e88585858585611673565b60006112378383610e49565b6112b75760008381526003602090815260408083206001600160a01b03861684529091529020805460ff1916600117905561126f3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016106ae565b5060006106ae565b60006112cb8383610e49565b156112b75760008381526003602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016106ae565b6113346116c6565b6004805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166113a757604051626a0d4560e21b8152600060048201526024016109e6565b610add836000848460405180602001604052806000815250611673565b6001600160a01b0384166113ee57604051632bfa23e760e11b8152600060048201526024016109e6565b604080516001808252602082018690528183019081526060820185905260808201909252906109fc600087848487611673565b6114296116eb565b6004805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113613390565b6001600160a01b0382166114875760405162ced3e160e81b8152600060048201526024016109e6565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661151e57604051632bfa23e760e11b8152600060048201526024016109e6565b6001600160a01b03851661154757604051626a0d4560e21b8152600060048201526024016109e6565b604080516001808252602082018690528183019081526060820185905260808201909252906115798787848487611673565b50505050505050565b6001600160a01b0383166115ab57604051626a0d4560e21b8152600060048201526024016109e6565b604080516001808252602082018590528183019081526060820184905260a082019092526000608082018181529192916108e891879185908590611673565b60006001600160e01b03198216636cdb3d1360e11b148061161b57506001600160e01b031982166303a24d0760e21b145b806106ae57506301ffc9a760e01b6001600160e01b03198316146106ae565b6116448282610e49565b6106f25760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016109e6565b61167f8585858561170f565b6001600160a01b038416156108e857825133906001036116b857602084810151908401516116b183898985858961171b565b50506109fc565b6109fc818787878787611737565b60045460ff166116e957604051638dfc202b60e01b815260040160405180910390fd5b565b60045460ff16156116e95760405163d93c066560e01b815260040160405180910390fd5b610a298484848461185b565b6117258684610b17565b6109fc576109fc8686868686866119b5565b6001600160a01b0384163b156109fc5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061177b90899089908890889088906004016125be565b6020604051808303816000875af19250505080156117b6575060408051601f3d908101601f191682019092526117b39181019061261c565b60015b61181f573d8080156117e4576040519150601f19603f3d011682016040523d82523d6000602084013e6117e9565b606091505b50805160000361181757604051632bfa23e760e11b81526001600160a01b03861660048201526024016109e6565b805181602001fd5b6001600160e01b0319811663bc197c8160e01b1461157957604051632bfa23e760e11b81526001600160a01b03861660048201526024016109e6565b61186784848484611a9e565b6001600160a01b03841661191a576000805b835181101561190057600083828151811061189657611896612473565b6020026020010151905080600560008785815181106118b7576118b7612473565b6020026020010151815260200190815260200160002060008282546118dc9190612639565b909155506118ec90508184612639565b925050806118f99061249f565b9050611879565b5080600660008282546119139190612639565b9091555050505b6001600160a01b038316610a29576000805b83518110156119a457600083828151811061194957611949612473565b60200260200101519050806005600087858151811061196a5761196a612473565b60200260200101518152602001908152602001600020600082825403925050819055508083019250508061199d9061249f565b905061192c565b506006805491909103905550505050565b6001600160a01b0384163b156109fc5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906119f9908990899088908890889060040161264c565b6020604051808303816000875af1925050508015611a34575060408051601f3d908101601f19168201909252611a319181019061261c565b60015b611a62573d8080156117e4576040519150601f19603f3d011682016040523d82523d6000602084013e6117e9565b6001600160e01b0319811663f23a6e6160e01b1461157957604051632bfa23e760e11b81526001600160a01b03861660048201526024016109e6565b611aa66116eb565b610a29848484848051825114611adc5781518151604051635b05999160e01b8152600481019290925260248201526044016109e6565b3360005b8351811015611beb576020818102858101820151908501909101516001600160a01b03881615611b93576000828152602081815260408083206001600160a01b038c16845290915290205481811015611b6c576040516303dee4c560e01b81526001600160a01b038a1660048201526024810182905260448101839052606481018490526084016109e6565b6000838152602081815260408083206001600160a01b038d16845290915290209082900390555b6001600160a01b03871615611bd8576000828152602081815260408083206001600160a01b038b16845290915281208054839290611bd2908490612639565b90915550505b505080611be49061249f565b9050611ae0565b508251600103611c6c5760208301516000906020840151909150856001600160a01b0316876001600160a01b0316846001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051611c5d929190918252602082015260400190565b60405180910390a450506108e8565b836001600160a01b0316856001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611cbb929190612691565b60405180910390a45050505050565b80356001600160a01b0381168114611ce157600080fd5b919050565b60008060408385031215611cf957600080fd5b611d0283611cca565b946020939093013593505050565b6001600160e01b031981168114610b1457600080fd5b600060208284031215611d3857600080fd5b8135611d4381611d10565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611d8957611d89611d4a565b604052919050565b600067ffffffffffffffff831115611dab57611dab611d4a565b611dbe601f8401601f1916602001611d60565b9050828152838383011115611dd257600080fd5b828260208301376000602084830101529392505050565b600060208284031215611dfb57600080fd5b813567ffffffffffffffff811115611e1257600080fd5b8201601f81018413611e2357600080fd5b611e3284823560208401611d91565b949350505050565b80358015158114611ce157600080fd5b60008060408385031215611e5d57600080fd5b82359150611e6d60208401611e3a565b90509250929050565b6000815180845260005b81811015611e9c57602081850181015186830182015201611e80565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611d436020830184611e76565b600060208284031215611ee157600080fd5b5035919050565b600067ffffffffffffffff821115611f0257611f02611d4a565b5060051b60200190565b600082601f830112611f1d57600080fd5b81356020611f32611f2d83611ee8565b611d60565b82815260059290921b84018101918181019086841115611f5157600080fd5b8286015b84811015611f6c5780358352918301918301611f55565b509695505050505050565b600082601f830112611f8857600080fd5b611d4383833560208501611d91565b60008060008060808587031215611fad57600080fd5b611fb685611cca565b9350602085013567ffffffffffffffff80821115611fd357600080fd5b611fdf88838901611f0c565b94506040870135915080821115611ff557600080fd5b61200188838901611f0c565b9350606087013591508082111561201757600080fd5b5061202487828801611f77565b91505092959194509250565b6000806040838503121561204357600080fd5b50508035926020909101359150565b600080600080600060a0868803121561206a57600080fd5b61207386611cca565b945061208160208701611cca565b9350604086013567ffffffffffffffff8082111561209e57600080fd5b6120aa89838a01611f0c565b945060608801359150808211156120c057600080fd5b6120cc89838a01611f0c565b935060808801359150808211156120e257600080fd5b506120ef88828901611f77565b9150509295509295909350565b6000806040838503121561210f57600080fd5b82359150611e6d60208401611cca565b60006020828403121561213157600080fd5b611d4382611cca565b6000806040838503121561214d57600080fd5b823567ffffffffffffffff8082111561216557600080fd5b818501915085601f83011261217957600080fd5b81356020612189611f2d83611ee8565b82815260059290921b840181019181810190898411156121a857600080fd5b948201945b838610156121cd576121be86611cca565b825294820194908201906121ad565b965050860135925050808211156121e357600080fd5b506121f085828601611f0c565b9150509250929050565b600081518084526020808501945080840160005b8381101561222a5781518752958201959082019060010161220e565b509495945050505050565b602081526000611d4360208301846121fa565b60008060006060848603121561225d57600080fd5b61226684611cca565b92506020840135915061227b60408501611e3a565b90509250925092565b60008060006060848603121561229957600080fd5b6122a284611cca565b9250602084013567ffffffffffffffff808211156122bf57600080fd5b6122cb87838801611f0c565b935060408601359150808211156122e157600080fd5b506122ee86828701611f0c565b9150509250925092565b6000806000806080858703121561230e57600080fd5b61231785611cca565b93506020850135925060408501359150606085013567ffffffffffffffff81111561234157600080fd5b61202487828801611f77565b6000806040838503121561236057600080fd5b61236983611cca565b9150611e6d60208401611e3a565b6000806040838503121561238a57600080fd5b61239383611cca565b9150611e6d60208401611cca565b600080600080600060a086880312156123b957600080fd5b6123c286611cca565b94506123d060208701611cca565b93506040860135925060608601359150608086013567ffffffffffffffff8111156123fa57600080fd5b6120ef88828901611f77565b60008060006060848603121561241b57600080fd5b61242484611cca565b95602085013595506040909401359392505050565b600181811c9082168061244d57607f821691505b60208210810361246d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016124b1576124b1612489565b5060010190565b601f821115610add57600081815260208120601f850160051c810160208610156124df5750805b601f850160051c820191505b818110156109fc578281556001016124eb565b815167ffffffffffffffff81111561251857612518611d4a565b61252c816125268454612439565b846124b8565b602080601f83116001811461256157600084156125495750858301515b600019600386901b1c1916600185901b1785556109fc565b600085815260208120601f198616915b8281101561259057888601518255948401946001909101908401612571565b50858210156125ae5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0386811682528516602082015260a0604082018190526000906125ea908301866121fa565b82810360608401526125fc81866121fa565b905082810360808401526126108185611e76565b98975050505050505050565b60006020828403121561262e57600080fd5b8151611d4381611d10565b808201808211156106ae576106ae612489565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061268690830184611e76565b979650505050505050565b6040815260006126a460408301856121fa565b82810360208401526126b681856121fa565b9594505050505056fea26469706673582212209bbed32d6721c64ceba3b65442c0f787ab50f64f5b2a41faa37ab3dca6a0375c64736f6c6343000814003368e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef17804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6f04f52d1f685586eac22a7ca73ab9ce0c45b77d01934bed334a9ff223be978a1", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061027e5760003560e01c80636b20c4541161015c578063b8bf60f9116100ce578063e63ab1e911610087578063e63ab1e9146105e5578063e985e9c51461060c578063eef37fd51461061f578063f242432a14610646578063f5298aca14610659578063f759cc3b1461066c57600080fd5b8063b8bf60f914610552578063bad383a614610565578063bd85b03914610578578063c7bddb1e14610598578063d5391393146105ab578063d547741f146105d257600080fd5b8063908d67ed11610120578063908d67ed146104d657806391d14854146104f657806395d89b411461050957806396ce079514610511578063a217fddf14610537578063a22cb4651461053f57600080fd5b80636b20c4541461046e578063731133e9146104815780637f345710146104945780638456cb59146104bb5780638801b9b8146104c357600080fd5b8063248a9ca3116101f55780633f4ba83a116101b95780633f4ba83a146103f35780634d280a55146103fb5780634e1273f41461040e5780634f558e791461042e578063512be796146104505780635c975abb1461046357600080fd5b8063248a9ca3146103845780632eb2c2d6146103a75780632f2ff15d146103ba5780633106fde8146103cd57806336568abe146103e057600080fd5b8063072650d211610247578063072650d21461030957806307e2cea51461031c5780630e89341c1461034357806318160ddd146103565780631f7fdffa1461035e57806322af59971461037157600080fd5b8062fdd58e1461028357806301ffc9a7146102a957806302fe5305146102cc5780630492f6e1146102e157806306fdde03146102f4575b600080fd5b610296610291366004611ce6565b61068c565b6040519081526020015b60405180910390f35b6102bc6102b7366004611d26565b6106b4565b60405190151581526020016102a0565b6102df6102da366004611de9565b6106bf565b005b6102df6102ef366004611e4a565b6106f6565b6102fc610765565b6040516102a09190611ebc565b6102bc610317366004611ce6565b6107f3565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102fc610351366004611ecf565b61081e565b600654610296565b6102df61036c366004611f97565b6108b2565b6102df61037f366004612030565b6108ef565b610296610392366004611ecf565b60009081526003602052604090206001015490565b6102df6103b5366004612052565b610998565b6102df6103c83660046120fc565b610a04565b6102df6103db36600461211f565b610a2f565b6102df6103ee3660046120fc565b610aaa565b6102df610ae2565b6102bc610409366004611ce6565b610b17565b61042161041c36600461213a565b610b41565b6040516102a09190612235565b6102bc61043c366004611ecf565b600090815260056020526040902054151590565b6102df61045e366004612248565b610c16565b60045460ff166102bc565b6102df61047c366004612284565b610d08565b6102df61048f3660046122f8565b610d62565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102df610d98565b6102df6104d136600461211f565b610dca565b6102966104e4366004611ecf565b6000908152600c602052604090205490565b6102bc6105043660046120fc565b610e49565b6102fc610e74565b7f0000000000000000000000000000000000000000000000000000000000000000610296565b610296600081565b6102df61054d36600461234d565b610e81565b6102df61056036600461211f565b610e8c565b6102df61057336600461211f565b610f0b565b610296610586366004611ecf565b60009081526005602052604090205490565b6102df6105a636600461211f565b610f8a565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102df6105e03660046120fc565b611009565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102bc61061a366004612377565b61102e565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102df6106543660046123a1565b61105c565b6102df610667366004612406565b6110db565b61029661067a366004611ecf565b6000908152600b602052604090205490565b6000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006106ae82611158565b7f00000000000000000000000000000000000000000000000000000000000000006106e98161117d565b6106f282611187565b5050565b336000818152600a60209081526040808320868452825291829020805460ff19168515159081179091558251848152918201869052918101919091527f78738b8c4717822a58cc752d3b2d657f2d706db6042748d69d2048438ff07e2c906060015b60405180910390a1505050565b6007805461077290612439565b80601f016020809104026020016040519081016040528092919081815260200182805461079e90612439565b80156107eb5780601f106107c0576101008083540402835291602001916107eb565b820191906000526020600020905b8154815290600101906020018083116107ce57829003601f168201915b505050505081565b6001600160a01b03919091166000908152600a60209081526040808320938352929052205460ff1690565b60606002805461082d90612439565b80601f016020809104026020016040519081016040528092919081815260200182805461085990612439565b80156108a65780601f1061087b576101008083540402835291602001916108a6565b820191906000526020600020905b81548152906001019060200180831161088957829003601f168201915b50505050509050919050565b7f00000000000000000000000000000000000000000000000000000000000000006108dc8161117d565b6108e885858585611193565b5050505050565b7f00000000000000000000000000000000000000000000000000000000000000006109198161117d565b8160000361093a5760405163dcef3bd560e01b815260040160405180910390fd5b6000828152600b60209081526040808320869055600c9091529020429055604080518381526020810185905242918101919091527f15819dd2fd9f6418b142e798d08a18d0bf06ea368f4480b7b0d3f75bd966bc4890606001610758565b336001600160a01b03861681148015906109b957506109b7868261102e565b155b156109ef5760405163711bec9160e11b81526001600160a01b038083166004830152871660248201526044015b60405180910390fd5b6109fc86868686866111cb565b505050505050565b600082815260036020526040902060010154610a1f8161117d565b610a29838361122b565b50505050565b7f0000000000000000000000000000000000000000000000000000000000000000610a598161117d565b610a837f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f0000000000000000000000000000000000000000000000000000000000000000335b6001600160a01b0381163314610ad35760405163334bd91960e11b815260040160405180910390fd5b610add82826112bf565b505050565b7f0000000000000000000000000000000000000000000000000000000000000000610b0c8161117d565b610b1461132c565b50565b60009081526009602090815260408083206001600160a01b03949094168352929052205460ff1690565b60608151835114610b725781518351604051635b05999160e01b8152600481019290925260248201526044016109e6565b6000835167ffffffffffffffff811115610b8e57610b8e611d4a565b604051908082528060200260200182016040528015610bb7578160200160208202803683370190505b50905060005b8451811015610c0e57602080820286010151610be19060208084028701015161068c565b828281518110610bf357610bf3612473565b6020908102919091010152610c078161249f565b9050610bbd565b509392505050565b7f0000000000000000000000000000000000000000000000000000000000000000610c408161117d565b6001600160a01b0384161580610c5e57506001600160a01b0384163b155b15610c8757604051630789b04160e41b81526001600160a01b03851660048201526024016109e6565b60008381526009602090815260408083206001600160a01b03881684529091529020805460ff1916831515179055604080518481526001600160a01b0386166020820152831515918101919091527fc3c7dc5ac1b5d811719dbd5be732967d24ed27897351a8a123e526f6b53dc5249060600160405180910390a150505050565b6001600160a01b0383163314801590610d285750610d26833361102e565b155b15610d575760405163711bec9160e11b81523360048201526001600160a01b03841660248201526044016109e6565b610add83838361137e565b7f0000000000000000000000000000000000000000000000000000000000000000610d8c8161117d565b6108e8858585856113c4565b7f0000000000000000000000000000000000000000000000000000000000000000610dc28161117d565b610b14611421565b7f0000000000000000000000000000000000000000000000000000000000000000610df48161117d565b610e1e7f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b60009182526003602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6008805461077290612439565b6106f233838361145e565b7f0000000000000000000000000000000000000000000000000000000000000000610eb68161117d565b610ee07f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b7f0000000000000000000000000000000000000000000000000000000000000000610f358161117d565b610f5f7f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b7f0000000000000000000000000000000000000000000000000000000000000000610fb48161117d565b610fde7f00000000000000000000000000000000000000000000000000000000000000008361122b565b506106f27f000000000000000000000000000000000000000000000000000000000000000033610aaa565b6000828152600360205260409020600101546110248161117d565b610a2983836112bf565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b336001600160a01b038616811480159061107d575061107b868261102e565b155b156110ce5761108c8185610b17565b158061109d575061109d86856107f3565b156110ce5760405163711bec9160e11b81526001600160a01b038083166004830152871660248201526044016109e6565b6109fc86868686866114f4565b336001600160a01b03841681148015906110fc57506110fa848261102e565b155b1561114d5761110b8184610b17565b158061111c575061111c84846107f3565b1561114d5760405163711bec9160e11b81526001600160a01b038083166004830152851660248201526044016109e6565b610a29848484611582565b60006001600160e01b03198216637965db0b60e01b14806106ae57506106ae826115ea565b610b14813361163a565b60026106f282826124fe565b6001600160a01b0384166111bd57604051632bfa23e760e11b8152600060048201526024016109e6565b610a29600085858585611673565b6001600160a01b0384166111f557604051632bfa23e760e11b8152600060048201526024016109e6565b6001600160a01b03851661121e57604051626a0d4560e21b8152600060048201526024016109e6565b6108e88585858585611673565b60006112378383610e49565b6112b75760008381526003602090815260408083206001600160a01b03861684529091529020805460ff1916600117905561126f3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016106ae565b5060006106ae565b60006112cb8383610e49565b156112b75760008381526003602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016106ae565b6113346116c6565b6004805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166113a757604051626a0d4560e21b8152600060048201526024016109e6565b610add836000848460405180602001604052806000815250611673565b6001600160a01b0384166113ee57604051632bfa23e760e11b8152600060048201526024016109e6565b604080516001808252602082018690528183019081526060820185905260808201909252906109fc600087848487611673565b6114296116eb565b6004805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113613390565b6001600160a01b0382166114875760405162ced3e160e81b8152600060048201526024016109e6565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661151e57604051632bfa23e760e11b8152600060048201526024016109e6565b6001600160a01b03851661154757604051626a0d4560e21b8152600060048201526024016109e6565b604080516001808252602082018690528183019081526060820185905260808201909252906115798787848487611673565b50505050505050565b6001600160a01b0383166115ab57604051626a0d4560e21b8152600060048201526024016109e6565b604080516001808252602082018590528183019081526060820184905260a082019092526000608082018181529192916108e891879185908590611673565b60006001600160e01b03198216636cdb3d1360e11b148061161b57506001600160e01b031982166303a24d0760e21b145b806106ae57506301ffc9a760e01b6001600160e01b03198316146106ae565b6116448282610e49565b6106f25760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016109e6565b61167f8585858561170f565b6001600160a01b038416156108e857825133906001036116b857602084810151908401516116b183898985858961171b565b50506109fc565b6109fc818787878787611737565b60045460ff166116e957604051638dfc202b60e01b815260040160405180910390fd5b565b60045460ff16156116e95760405163d93c066560e01b815260040160405180910390fd5b610a298484848461185b565b6117258684610b17565b6109fc576109fc8686868686866119b5565b6001600160a01b0384163b156109fc5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061177b90899089908890889088906004016125be565b6020604051808303816000875af19250505080156117b6575060408051601f3d908101601f191682019092526117b39181019061261c565b60015b61181f573d8080156117e4576040519150601f19603f3d011682016040523d82523d6000602084013e6117e9565b606091505b50805160000361181757604051632bfa23e760e11b81526001600160a01b03861660048201526024016109e6565b805181602001fd5b6001600160e01b0319811663bc197c8160e01b1461157957604051632bfa23e760e11b81526001600160a01b03861660048201526024016109e6565b61186784848484611a9e565b6001600160a01b03841661191a576000805b835181101561190057600083828151811061189657611896612473565b6020026020010151905080600560008785815181106118b7576118b7612473565b6020026020010151815260200190815260200160002060008282546118dc9190612639565b909155506118ec90508184612639565b925050806118f99061249f565b9050611879565b5080600660008282546119139190612639565b9091555050505b6001600160a01b038316610a29576000805b83518110156119a457600083828151811061194957611949612473565b60200260200101519050806005600087858151811061196a5761196a612473565b60200260200101518152602001908152602001600020600082825403925050819055508083019250508061199d9061249f565b905061192c565b506006805491909103905550505050565b6001600160a01b0384163b156109fc5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906119f9908990899088908890889060040161264c565b6020604051808303816000875af1925050508015611a34575060408051601f3d908101601f19168201909252611a319181019061261c565b60015b611a62573d8080156117e4576040519150601f19603f3d011682016040523d82523d6000602084013e6117e9565b6001600160e01b0319811663f23a6e6160e01b1461157957604051632bfa23e760e11b81526001600160a01b03861660048201526024016109e6565b611aa66116eb565b610a29848484848051825114611adc5781518151604051635b05999160e01b8152600481019290925260248201526044016109e6565b3360005b8351811015611beb576020818102858101820151908501909101516001600160a01b03881615611b93576000828152602081815260408083206001600160a01b038c16845290915290205481811015611b6c576040516303dee4c560e01b81526001600160a01b038a1660048201526024810182905260448101839052606481018490526084016109e6565b6000838152602081815260408083206001600160a01b038d16845290915290209082900390555b6001600160a01b03871615611bd8576000828152602081815260408083206001600160a01b038b16845290915281208054839290611bd2908490612639565b90915550505b505080611be49061249f565b9050611ae0565b508251600103611c6c5760208301516000906020840151909150856001600160a01b0316876001600160a01b0316846001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051611c5d929190918252602082015260400190565b60405180910390a450506108e8565b836001600160a01b0316856001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611cbb929190612691565b60405180910390a45050505050565b80356001600160a01b0381168114611ce157600080fd5b919050565b60008060408385031215611cf957600080fd5b611d0283611cca565b946020939093013593505050565b6001600160e01b031981168114610b1457600080fd5b600060208284031215611d3857600080fd5b8135611d4381611d10565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611d8957611d89611d4a565b604052919050565b600067ffffffffffffffff831115611dab57611dab611d4a565b611dbe601f8401601f1916602001611d60565b9050828152838383011115611dd257600080fd5b828260208301376000602084830101529392505050565b600060208284031215611dfb57600080fd5b813567ffffffffffffffff811115611e1257600080fd5b8201601f81018413611e2357600080fd5b611e3284823560208401611d91565b949350505050565b80358015158114611ce157600080fd5b60008060408385031215611e5d57600080fd5b82359150611e6d60208401611e3a565b90509250929050565b6000815180845260005b81811015611e9c57602081850181015186830182015201611e80565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611d436020830184611e76565b600060208284031215611ee157600080fd5b5035919050565b600067ffffffffffffffff821115611f0257611f02611d4a565b5060051b60200190565b600082601f830112611f1d57600080fd5b81356020611f32611f2d83611ee8565b611d60565b82815260059290921b84018101918181019086841115611f5157600080fd5b8286015b84811015611f6c5780358352918301918301611f55565b509695505050505050565b600082601f830112611f8857600080fd5b611d4383833560208501611d91565b60008060008060808587031215611fad57600080fd5b611fb685611cca565b9350602085013567ffffffffffffffff80821115611fd357600080fd5b611fdf88838901611f0c565b94506040870135915080821115611ff557600080fd5b61200188838901611f0c565b9350606087013591508082111561201757600080fd5b5061202487828801611f77565b91505092959194509250565b6000806040838503121561204357600080fd5b50508035926020909101359150565b600080600080600060a0868803121561206a57600080fd5b61207386611cca565b945061208160208701611cca565b9350604086013567ffffffffffffffff8082111561209e57600080fd5b6120aa89838a01611f0c565b945060608801359150808211156120c057600080fd5b6120cc89838a01611f0c565b935060808801359150808211156120e257600080fd5b506120ef88828901611f77565b9150509295509295909350565b6000806040838503121561210f57600080fd5b82359150611e6d60208401611cca565b60006020828403121561213157600080fd5b611d4382611cca565b6000806040838503121561214d57600080fd5b823567ffffffffffffffff8082111561216557600080fd5b818501915085601f83011261217957600080fd5b81356020612189611f2d83611ee8565b82815260059290921b840181019181810190898411156121a857600080fd5b948201945b838610156121cd576121be86611cca565b825294820194908201906121ad565b965050860135925050808211156121e357600080fd5b506121f085828601611f0c565b9150509250929050565b600081518084526020808501945080840160005b8381101561222a5781518752958201959082019060010161220e565b509495945050505050565b602081526000611d4360208301846121fa565b60008060006060848603121561225d57600080fd5b61226684611cca565b92506020840135915061227b60408501611e3a565b90509250925092565b60008060006060848603121561229957600080fd5b6122a284611cca565b9250602084013567ffffffffffffffff808211156122bf57600080fd5b6122cb87838801611f0c565b935060408601359150808211156122e157600080fd5b506122ee86828701611f0c565b9150509250925092565b6000806000806080858703121561230e57600080fd5b61231785611cca565b93506020850135925060408501359150606085013567ffffffffffffffff81111561234157600080fd5b61202487828801611f77565b6000806040838503121561236057600080fd5b61236983611cca565b9150611e6d60208401611e3a565b6000806040838503121561238a57600080fd5b61239383611cca565b9150611e6d60208401611cca565b600080600080600060a086880312156123b957600080fd5b6123c286611cca565b94506123d060208701611cca565b93506040860135925060608601359150608086013567ffffffffffffffff8111156123fa57600080fd5b6120ef88828901611f77565b60008060006060848603121561241b57600080fd5b61242484611cca565b95602085013595506040909401359392505050565b600181811c9082168061244d57607f821691505b60208210810361246d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016124b1576124b1612489565b5060010190565b601f821115610add57600081815260208120601f850160051c810160208610156124df5750805b601f850160051c820191505b818110156109fc578281556001016124eb565b815167ffffffffffffffff81111561251857612518611d4a565b61252c816125268454612439565b846124b8565b602080601f83116001811461256157600084156125495750858301515b600019600386901b1c1916600185901b1785556109fc565b600085815260208120601f198616915b8281101561259057888601518255948401946001909101908401612571565b50858210156125ae5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0386811682528516602082015260a0604082018190526000906125ea908301866121fa565b82810360608401526125fc81866121fa565b905082810360808401526126108185611e76565b98975050505050505050565b60006020828403121561262e57600080fd5b8151611d4381611d10565b808201808211156106ae576106ae612489565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061268690830184611e76565b979650505050505050565b6040815260006126a460408301856121fa565b82810360208401526126b681856121fa565b9594505050505056fea26469706673582212209bbed32d6721c64ceba3b65442c0f787ab50f64f5b2a41faa37ab3dca6a0375c64736f6c63430008140033", "devdoc": { "author": "Ice Bear & Crash Bandicoot", "details": "gETH is chain-agnostic, meaning it can be used on any evm chain (given the correct name and symbol).gETH is immutable, it cannot be upgraded.gETH is a special ERC1155 contract with additional functionalities: gETHMiddlewares: * Most important functionality gETH provides: * Allowing any other contract to provide additional functionality * around the balance and price data, such as using an ID like ERC20. * This addition effectively result in changes in * safeTransferFrom(), burn(), _doSafeTransferAcceptanceCheck() * functions, reasoning is in the comments. Avoiders: * If one wants to remain unbound from gETHMiddlewares, * it can be done so by calling \"avoidMiddlewares\" function. PricePerShare: * Keeping track of the ratio between the derivative * and the underlaying staked asset, Ether. Denominator: * ERC1155 does not have decimals and it is not wise to use the name convention * but we need to provide some information on how to denominate the balances, price, etc.review ERC1155PausableBurnableSupply, which is generated with Openzeppelin wizard.", @@ -1652,7 +1652,7 @@ "custom:section": "** VARIABLES **" } }, - "title": "gETH : Geode Finance Liquid Staking Derivatives", + "title": "gETH : Geodefi Liquid Staking Derivatives", "version": 1 }, "userdoc": { @@ -1700,7 +1700,7 @@ "storageLayout": { "storage": [ { - "astId": 22955, + "astId": 20481, "contract": "contracts/gETH.sol:gETH", "label": "_balances", "offset": 0, @@ -1708,7 +1708,7 @@ "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))" }, { - "astId": 22961, + "astId": 20487, "contract": "contracts/gETH.sol:gETH", "label": "_operatorApprovals", "offset": 0, @@ -1716,7 +1716,7 @@ "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" }, { - "astId": 22963, + "astId": 20489, "contract": "contracts/gETH.sol:gETH", "label": "_uri", "offset": 0, @@ -1724,15 +1724,15 @@ "type": "t_string_storage" }, { - "astId": 2441, + "astId": 1398, "contract": "contracts/gETH.sol:gETH", "label": "_roles", "offset": 0, "slot": "3", - "type": "t_mapping(t_bytes32,t_struct(RoleData)2436_storage)" + "type": "t_mapping(t_bytes32,t_struct(RoleData)1393_storage)" }, { - "astId": 4373, + "astId": 3182, "contract": "contracts/gETH.sol:gETH", "label": "_paused", "offset": 0, @@ -1740,7 +1740,7 @@ "type": "t_bool" }, { - "astId": 24082, + "astId": 21608, "contract": "contracts/gETH.sol:gETH", "label": "_totalSupply", "offset": 0, @@ -1748,7 +1748,7 @@ "type": "t_mapping(t_uint256,t_uint256)" }, { - "astId": 24084, + "astId": 21610, "contract": "contracts/gETH.sol:gETH", "label": "_totalSupplyAll", "offset": 0, @@ -1756,7 +1756,7 @@ "type": "t_uint256" }, { - "astId": 21779, + "astId": 19305, "contract": "contracts/gETH.sol:gETH", "label": "name", "offset": 0, @@ -1764,7 +1764,7 @@ "type": "t_string_storage" }, { - "astId": 21781, + "astId": 19307, "contract": "contracts/gETH.sol:gETH", "label": "symbol", "offset": 0, @@ -1772,7 +1772,7 @@ "type": "t_string_storage" }, { - "astId": 21788, + "astId": 19314, "contract": "contracts/gETH.sol:gETH", "label": "_middlewares", "offset": 0, @@ -1780,7 +1780,7 @@ "type": "t_mapping(t_uint256,t_mapping(t_address,t_bool))" }, { - "astId": 21795, + "astId": 19321, "contract": "contracts/gETH.sol:gETH", "label": "_avoiders", "offset": 0, @@ -1788,7 +1788,7 @@ "type": "t_mapping(t_address,t_mapping(t_uint256,t_bool))" }, { - "astId": 21800, + "astId": 19326, "contract": "contracts/gETH.sol:gETH", "label": "_pricePerShare", "offset": 0, @@ -1796,7 +1796,7 @@ "type": "t_mapping(t_uint256,t_uint256)" }, { - "astId": 21805, + "astId": 19331, "contract": "contracts/gETH.sol:gETH", "label": "_priceUpdateTimestamp", "offset": 0, @@ -1848,12 +1848,12 @@ "numberOfBytes": "32", "value": "t_uint256" }, - "t_mapping(t_bytes32,t_struct(RoleData)2436_storage)": { + "t_mapping(t_bytes32,t_struct(RoleData)1393_storage)": { "encoding": "mapping", "key": "t_bytes32", "label": "mapping(bytes32 => struct AccessControl.RoleData)", "numberOfBytes": "32", - "value": "t_struct(RoleData)2436_storage" + "value": "t_struct(RoleData)1393_storage" }, "t_mapping(t_uint256,t_bool)": { "encoding": "mapping", @@ -1888,12 +1888,12 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(RoleData)2436_storage": { + "t_struct(RoleData)1393_storage": { "encoding": "inplace", "label": "struct AccessControl.RoleData", "members": [ { - "astId": 2433, + "astId": 1390, "contract": "contracts/gETH.sol:gETH", "label": "hasRole", "offset": 0, @@ -1901,7 +1901,7 @@ "type": "t_mapping(t_address,t_bool)" }, { - "astId": 2435, + "astId": 1392, "contract": "contracts/gETH.sol:gETH", "label": "adminRole", "offset": 0, From a19804799cbb1405e2213eb8e68366555967d7a7 Mon Sep 17 00:00:00 2001 From: Ice Bear Date: Wed, 15 May 2024 22:08:57 +0300 Subject: [PATCH 2/3] Feat: Exception names improved --- docs/creating_validators.rst | 2 -- docs/exceptions.rst | 20 ++++++++++---------- geodefi/classes/id.py | 6 +++--- geodefi/classes/portal.py | 4 ++-- geodefi/exceptions/main.py | 20 ++++++++++---------- geodefi/geodefi.py | 6 +++--- geodefi/utils/bls/main.py | 20 ++++++++++---------- geodefi/utils/wrappers.py | 16 ++++++---------- tests/test_id.py | 8 ++++---- tests/test_version.py | 4 ++-- 10 files changed, 50 insertions(+), 56 deletions(-) diff --git a/docs/creating_validators.rst b/docs/creating_validators.rst index a0ac478..076d937 100644 --- a/docs/creating_validators.rst +++ b/docs/creating_validators.rst @@ -26,8 +26,6 @@ Keep your `mnemonic` in mind You can use a new mnemonic for every single pool, or you can use a one global mnemonic and increase its index over time. But, it is very important that you keep some consistency on your mnemonic usage, while keeping it safe. -I will use one global mnemonic. - Detect which pools you can stake for ------------------------------------ diff --git a/docs/exceptions.rst b/docs/exceptions.rst index 73762c5..eea0115 100644 --- a/docs/exceptions.rst +++ b/docs/exceptions.rst @@ -4,42 +4,42 @@ Exceptions =============== -.. py:exception:: PythonVersionException +.. py:exception:: PythonVersionError Raises whenPython ``Current version is < 3.7 or > 3.10`` -.. py:exception:: UnknownChainException +.. py:exception:: UnknownChainError Raises when ``Provided RPC points to an unknown chainId`` -.. py:exception:: UnexpectedResponseException +.. py:exception:: UnexpectedResponseError Raises when ``Https call resulted with an error code (non 2xx)`` -.. py:exception:: HTTPRequestException +.. py:exception:: HTTPRequestError Raises when ``RESPONSE IS NOT CODE 200`` -.. py:exception:: MaxAttemptException +.. py:exception:: MaxAttemptError Raises when ``MULTIPLE ATTEMPT MADE BUT CALL FAILED`` -.. py:exception:: DepositSizeException +.. py:exception:: DepositSizeError Raises when ``DEPOSIT SIZE IS NOT CORRECT !(1/31) !(1/31)`` -.. py:exception:: WithdrawalCredentialException +.. py:exception:: WithdrawalCredentialError Raises when ``INCORRECT withdrawal_credentials`` -.. py:exception:: GenesisForkException +.. py:exception:: GenesisForkError Raises when ``INCORRECT fork_version`` -.. py:exception:: NetworkNameException +.. py:exception:: NetworkNameError Raises when ``INCORRECT network_name`` -.. py:exception:: DepositDataException +.. py:exception:: DepositDataError Raises when ``CAN NOT VERIFY DEPOSIT DATA`` diff --git a/geodefi/classes/id.py b/geodefi/classes/id.py index d6133cf..747e82c 100644 --- a/geodefi/classes/id.py +++ b/geodefi/classes/id.py @@ -5,7 +5,7 @@ from geodefi.globals import Network, ID_TYPE from geodefi.utils import to_bytes32, to_string, multiple_attempt -from geodefi.exceptions import UnexpectedResponseException +from geodefi.exceptions import UnexpectedResponseError class Id: @@ -73,7 +73,7 @@ def _read_bytes(self, key: str, is_string: bool = False, is_hex=False): else: return res else: - raise UnexpectedResponseException + raise UnexpectedResponseError @multiple_attempt def _read_bytes_array( @@ -93,7 +93,7 @@ def _read_bytes_array( else: return res else: - raise UnexpectedResponseException + raise UnexpectedResponseError @multiple_attempt def _read_address(self, key: str): diff --git a/geodefi/classes/portal.py b/geodefi/classes/portal.py index 6f5dbb5..39ddf23 100644 --- a/geodefi/classes/portal.py +++ b/geodefi/classes/portal.py @@ -4,7 +4,7 @@ from geodefi.globals import Network from geodefi.utils import get_contract_abi, to_bytes32, to_string -from geodefi.exceptions import UnknownChainException +from geodefi.exceptions import UnknownChainError from .pool import Pool from .operator import Operator @@ -43,7 +43,7 @@ def __init__(self, w3: Web3, beacon: Beacon): ): self._set_beacon(beacon) else: - raise UnknownChainException + raise UnknownChainError address, abi = get_contract_abi( network=self.network, kind="package", name="Portal" diff --git a/geodefi/exceptions/main.py b/geodefi/exceptions/main.py index a42c3cc..7f25378 100644 --- a/geodefi/exceptions/main.py +++ b/geodefi/exceptions/main.py @@ -1,38 +1,38 @@ -class PythonVersionException(Exception): +class PythonVersionError(Exception): "Current version is < 3.7 or > 3.10" -class UnknownChainException(Exception): +class UnknownChainError(Exception): "Provided RPC points to an unknown chainId" -class UnexpectedResponseException(Exception): +class UnexpectedResponseError(Exception): "Https call resulted with an error code (non 2xx)" -class HTTPRequestException(Exception): +class HTTPRequestError(Exception): "RESPONSE IS NOT CODE 200" -class MaxAttemptException(Exception): +class MaxAttemptError(Exception): "MULTIPLE ATTEMPT MADE BUT CALL FAILED" -class DepositSizeException(Exception): +class DepositSizeError(Exception): "DEPOSIT SIZE IS NOT CORRECT !(1/31)" -class WithdrawalCredentialException(Exception): +class WithdrawalCredentialError(Exception): "INCORRECT withdrawal_credentials" -class GenesisForkException(Exception): +class GenesisForkError(Exception): "INCORRECT fork_version" -class NetworkNameException(Exception): +class NetworkNameError(Exception): "INCORRECT network_name" -class DepositDataException(Exception): +class DepositDataError(Exception): "CAN NOT VERIFY DEPOSIT DATA" diff --git a/geodefi/geodefi.py b/geodefi/geodefi.py index 7e42cf4..312996b 100644 --- a/geodefi/geodefi.py +++ b/geodefi/geodefi.py @@ -1,6 +1,6 @@ import sys from web3 import Web3, HTTPProvider, WebsocketProvider -from geodefi.exceptions import PythonVersionException, UnknownChainException +from geodefi.exceptions import PythonVersionError, UnknownChainError from geodefi.globals import Network from geodefi.classes import Portal, Token, Beacon @@ -10,7 +10,7 @@ def check_python_version() -> None: Checks that the python version running is sufficient and exits if not. """ if sys.version_info <= (3, 7) and sys.version_info >= (3, 10): - raise PythonVersionException + raise PythonVersionError sys.exit() @@ -30,7 +30,7 @@ def __init__(self, exec_api: str = "", cons_api: str = ""): ): self._set_beacon(cons_api) else: - raise UnknownChainException + raise UnknownChainError # Set the Token instance self._set_token() diff --git a/geodefi/utils/bls/main.py b/geodefi/utils/bls/main.py index e38b549..2778f2e 100644 --- a/geodefi/utils/bls/main.py +++ b/geodefi/utils/bls/main.py @@ -8,11 +8,11 @@ GENESIS_FORK_VERSION, ) from geodefi.exceptions import ( - DepositSizeException, - WithdrawalCredentialException, - GenesisForkException, - NetworkNameException, - DepositDataException, + DepositSizeError, + WithdrawalCredentialError, + GenesisForkError, + NetworkNameError, + DepositDataError, ) from .validate import validate_deposit @@ -47,16 +47,16 @@ def validate_deposit_data_file( deposit_data: t.List[t.Dict] = _get_deposit_data(deposit_data_path) for deposit in deposit_data: if deposit["amount"] != amount.value: - raise DepositSizeException + raise DepositSizeError if deposit["withdrawal_credentials"] != credential: - raise WithdrawalCredentialException + raise WithdrawalCredentialError if ( bytes.fromhex(deposit["fork_version"]) != GENESIS_FORK_VERSION[network.value] ): - raise GenesisForkException + raise GenesisForkError if deposit["network_name"] != DEPOSIT_NETWORK_NAME[network.value]: - raise NetworkNameException + raise NetworkNameError if not validate_deposit(deposit): - raise DepositDataException + raise DepositDataError return deposit_data diff --git a/geodefi/utils/wrappers.py b/geodefi/utils/wrappers.py index 3e1dae6..4f011c5 100644 --- a/geodefi/utils/wrappers.py +++ b/geodefi/utils/wrappers.py @@ -5,9 +5,9 @@ from geodefi.exceptions import ( - HTTPRequestException, - UnexpectedResponseException, - MaxAttemptException, + HTTPRequestError, + UnexpectedResponseError, + MaxAttemptError, ) from geodefi.globals import MAX_ATTEMPT, ATTEMPT_RATE @@ -24,9 +24,7 @@ def wrap(*args, **kwargs): sleep(ATTEMPT_RATE) count += 1 else: - raise MaxAttemptException( - f"{call_attempt} Call Error" - ) from exc + raise MaxAttemptError(f"{call_attempt} Call Error") from exc return wrap @@ -46,10 +44,8 @@ def wrap(*args, **kwargs): except JSONDecodeError: return res.content else: - raise HTTPRequestException( - res.status_code, res.reason, res.text - ) + raise HTTPRequestError(res.status_code, res.reason, res.text) except Exception as exc: - raise UnexpectedResponseException from exc + raise UnexpectedResponseError from exc return wrap diff --git a/tests/test_id.py b/tests/test_id.py index 380bd42..003f769 100644 --- a/tests/test_id.py +++ b/tests/test_id.py @@ -9,7 +9,7 @@ try: from geodefi import Geode from geodefi.classes.id import Id - from geodefi.exceptions import MaxAttemptException + from geodefi.exceptions import MaxAttemptError except ImportError: raise @@ -94,10 +94,10 @@ def test_readUint(): def test_invalid_readUint(): # test incorrect values - with pytest.raises(MaxAttemptException): + with pytest.raises(MaxAttemptError): id_portal._readUint(1231231) - with pytest.raises(MaxAttemptException): + with pytest.raises(MaxAttemptError): id_portal._readUint(list("maintainer")) @@ -125,7 +125,7 @@ def test_readBytesArray(): def test_invalid_readBytesArray(): # Negative index - with pytest.raises(MaxAttemptException): + with pytest.raises(MaxAttemptError): id_portal._readBytesArray( "validators", index=-1) diff --git a/tests/test_version.py b/tests/test_version.py index 527ffc3..7a6327a 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -2,13 +2,13 @@ import sys from pytest import MonkeyPatch -from geodefi.exceptions import PythonVersionException +from geodefi.exceptions import PythonVersionError from geodefi.geodefi import check_python_version def test_python_invalid_version_check(): # Mock sys.version_info to return a specific version (3.6 in this case) - with pytest.raises(PythonVersionException): + with pytest.raises(PythonVersionError): with pytest.raises(SystemExit): with MonkeyPatch.context() as m: m.setattr(sys, "version_info", (3, 6)) From 2da0180fde2c7e84df991dc6cf0233c2aad98bdb Mon Sep 17 00:00:00 2001 From: Ice Bear Date: Wed, 15 May 2024 22:10:12 +0300 Subject: [PATCH 3/3] Chores: update docs --- README.md | 2 +- docs/releases.rst | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 89593c3..3ebd1d3 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Whether you're looking to query contract data or execute transactions, **geodefi ## Features -- Supports Ethereum Holesky testnet (as of v2.0.0) where The Protocol is deployed. +- Supports Ethereum Holesky testnet (as of v2.1.0) where The Protocol is deployed. - Provides a simple and intuitive API for managing validators, operators, pools, tokens, and other smart contracts/packages. - Dynamically adapts to the contract upgrades. - Mostly chain agnostic. However, might differ according to the unique PoS implementations. diff --git a/docs/releases.rst b/docs/releases.rst index 6c211cd..a4dd038 100644 --- a/docs/releases.rst +++ b/docs/releases.rst @@ -4,6 +4,11 @@ Release Notes ============= +2.1.0 (2024-05-15) +------------------ +* New holesky deployment. +* Exception names improved. + 2.0.0 (2024-03-01) ------------------ * Added holesky deployment mirroring the mainnet deployment.