{"file_path":"contracts/library/AccessRegistry/DenyList.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (C) 2024 Fireblocks <support@fireblocks.com>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program.  If not, see <https://www.gnu.org/licenses/>.\npragma solidity 0.8.20;\n\nimport {EnumerableSetUpgradeable} from \"@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol\";\n\nimport {AccessListUpgradeable} from \"./AccessListUpgradeable.sol\";\n\n/**\n * @title Denylist\n * @author Fireblocks\n * @notice The Denylist Service establishes an on-chain Denylist for the Fireblocks ecosystem of smart contracts. It\n * maintains a registry of addresses barred to participate in the system by implementing {AccessListUpgradeable} and\n * {IAccessRegistry}. Thereby allowing other contracts in the system to check if an address is allowed to participate.\n *\n * @dev Denylist Service features.\n *\n * The Denylist Service contract Role Based Access Control employs the following roles:\n *\n * - UPGRADER_ROLE (via {AccessListUpgradeable})\n * - PAUSER_ROLE (via {AccessListUpgradeable})\n * - CONTRACT_ADMIN_ROLE (via {AccessListUpgradeable})\n * - ACCESS_LIST_ADMIN_ROLE (via {AccessListUpgradeable})\n */\ncontract DenyList is AccessListUpgradeable {\n\tusing EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet;\n\n\t/// Functions\n\n\t/**\n\t * @notice This function acts as the constructor of the contract.\n\t * @dev This function disables the initializers.\n\t */\n\t/// @custom:oz-upgrades-unsafe-allow constructor\n\tconstructor() {\n\t\t_disableInitializers();\n\t}\n\n\t/**\n\t * @notice This function configures the Deny List contract with the initial state and granting\n\t * privileged roles.\n\t *\n\t * @dev This function uses the {AccessListUpgradeable.__AccessList_init} function to grant roles.\n\t *\n\t * Calling Conditions:\n\t *\n\t * - Can only be invoked once (controlled via the {initializer} modifier).\n\t * - Non-zero address `defaultAdmin` (checked internally by {AccessListUpgradeable.__AccessList_init}).\n\t * - Non-zero address `pauser` (checked internally by {AccessListUpgradeable.__AccessList_init}).\n\t * - Non-zero address `upgrader`(checked internally by {AccessListUpgradeable.__AccessList_init}).\n\t *\n\t * @param defaultAdmin The account to be granted the \"DEFAULT_ADMIN_ROLE\".\n\t * @param pauser The account to be granted the \"PAUSER_ROLE\".\n\t * @param upgrader The account to be granted the \"UPGRADER_ROLE\".\n\t */\n\tfunction initialize(address defaultAdmin, address pauser, address upgrader) external initializer {\n\t\t__AccessList_init(defaultAdmin, pauser, upgrader);\n\t}\n\n\t/**\n\t * @notice This function checks if an address is present in the Access list. By doing so, it confirms that whether\n\t * the  address is denied to participate in the system.\n\t * @dev This function returns `false` if the address is present in the Denylist, otherwise it returns `true`.\n\t * The parameter `data` is ignored in this implementation of the interface as it serves as a placeholder for\n\t * future implementations.\n\t *\n\t * @param account The address to be checked.\n\t * @return `false` if the address is present in the Denylist, otherwise it returns `true`.\n\t */\n\tfunction hasAccess(address account, address, bytes calldata) external view virtual override returns (bool) {\n\t\treturn !_accessList.contains(account);\n\t}\n}\n","deployed_bytecode":"0x6080604052600436106101815760003560e01c80635c975abb116100d1578063ac9650d81161008a578063d547741f11610064578063d547741f14610475578063e63ab1e914610495578063eefb7e9a146104c9578063f72c0d8b146104e957600080fd5b8063ac9650d814610406578063c0c53b8b14610433578063c0e24d5e1461045357600080fd5b80635c975abb146103625780637ffc5a5c1461037a5780638456cb591461039a5780638d5ddbb3146103af57806391d14854146103d1578063a217fddf146103f157600080fd5b80633659cfe61161013e57806347fdaa691161011857806347fdaa69146102e45780634f1ef2861461031857806352d1902d1461032b57806354fd4d501461034057600080fd5b80633659cfe61461028f5780633e26fb1c146102af5780633f4ba83a146102cf57600080fd5b806301ffc9a7146101865780631da03312146101bb578063248a9ca3146101fd5780632eca959e1461022d5780632f2ff15d1461024f57806336568abe1461026f575b600080fd5b34801561019257600080fd5b506101a66101a1366004611b91565b61051d565b60405190151581526020015b60405180910390f35b3480156101c757600080fd5b506101ef7f2ce8d04a9c35987429af538825cd2438cc5c5bb5dc427955f84daaa3ea10501681565b6040519081526020016101b2565b34801561020957600080fd5b506101ef610218366004611bbb565b600090815260fb602052604090206001015490565b34801561023957600080fd5b5061024d610248366004611c20565b610576565b005b34801561025b57600080fd5b5061024d61026a366004611c7e565b61066a565b34801561027b57600080fd5b5061024d61028a366004611c7e565b610680565b34801561029b57600080fd5b5061024d6102aa366004611caa565b6106b0565b3480156102bb57600080fd5b5061024d6102ca366004611c20565b610798565b3480156102db57600080fd5b5061024d6108d5565b3480156102f057600080fd5b506101ef7f823dfd844b3cee1079828aee01bbe788b5154056f17c46ce6830122b6a4ebaaa81565b61024d610326366004611cdb565b6108e7565b34801561033757600080fd5b506101ef6109b3565b34801561034c57600080fd5b5060005460405160ff90911681526020016101b2565b34801561036e57600080fd5b5060655460ff166101a6565b34801561038657600080fd5b5061024d610395366004611ddf565b610a66565b3480156103a657600080fd5b5061024d610aad565b3480156103bb57600080fd5b506103c4610abd565b6040516101b29190611e15565b3480156103dd57600080fd5b506101a66103ec366004611c7e565b610acf565b3480156103fd57600080fd5b506101ef600081565b34801561041257600080fd5b50610426610421366004611c20565b610afa565b6040516101b29190611eb2565b34801561043f57600080fd5b5061024d61044e366004611f14565b610bef565b34801561045f57600080fd5b50610468610d06565b6040516101b29190611f57565b34801561048157600080fd5b5061024d610490366004611c7e565b610d94565b3480156104a157600080fd5b506101ef7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b3480156104d557600080fd5b506101a66104e4366004611f6a565b610dda565b3480156104f557600080fd5b506101ef7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b60006001600160e01b0319821663777dbf4d60e11b148061054657506001600160e01b03198216155b8061056157506001600160e01b031982166352d1902d60e01b145b80610570575061057082610df4565b92915050565b61057e610e29565b7f823dfd844b3cee1079828aee01bbe788b5154056f17c46ce6830122b6a4ebaaa6105a881610e6f565b8160005b81811015610663576105e78585838181106105c9576105c9611fcb565b90506020020160208101906105de9190611caa565b6101f590610e79565b15610653578484828181106105fe576105fe611fcb565b90506020020160208101906106139190611caa565b6001600160a01b0316336001600160a01b03167fc995326435808f031ae8f623df2ed4e111ffd7b1b11eb2e304c79b34e8fe6de460405160405180910390a35b61065c81611ff7565b90506105ac565b5050505050565b610672610e95565b61067c8282610e9d565b5050565b8161069e57604051630461f45f60e11b815260040160405180910390fd5b6106a6610e95565b61067c8282610ec7565b6001600160a01b037f000000000000000000000000ae6c65b08de05c75ee7c9c19ac11ba2da6fb6a421630036107015760405162461bcd60e51b81526004016106f890612010565b60405180910390fd5b7f000000000000000000000000ae6c65b08de05c75ee7c9c19ac11ba2da6fb6a426001600160a01b031661074a600080516020612436833981519152546001600160a01b031690565b6001600160a01b0316146107705760405162461bcd60e51b81526004016106f89061205c565b61077981610f41565b6040805160008082526020820190925261079591839190610f6b565b50565b6107a0610e29565b7f823dfd844b3cee1079828aee01bbe788b5154056f17c46ce6830122b6a4ebaaa6107ca81610e6f565b8160005b818110156106635760008585838181106107ea576107ea611fcb565b90506020020160208101906107ff9190611caa565b6001600160a01b0316036108265760405163e6c4247b60e01b815260040160405180910390fd5b61085985858381811061083b5761083b611fcb565b90506020020160208101906108509190611caa565b6101f5906110d6565b156108c55784848281811061087057610870611fcb565b90506020020160208101906108859190611caa565b6001600160a01b0316336001600160a01b03167f9e4bdc8a7c7f3f04fb1c5bcf304c65d4fc3466cdcb30f2da012579bf214e354360405160405180910390a35b6108ce81611ff7565b90506107ce565b6108dd6110eb565b6108e5611115565b565b6001600160a01b037f000000000000000000000000ae6c65b08de05c75ee7c9c19ac11ba2da6fb6a4216300361092f5760405162461bcd60e51b81526004016106f890612010565b7f000000000000000000000000ae6c65b08de05c75ee7c9c19ac11ba2da6fb6a426001600160a01b0316610978600080516020612436833981519152546001600160a01b031690565b6001600160a01b03161461099e5760405162461bcd60e51b81526004016106f89061205c565b6109a782610f41565b61067c82826001610f6b565b6000306001600160a01b037f000000000000000000000000ae6c65b08de05c75ee7c9c19ac11ba2da6fb6a421614610a535760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016106f8565b5060008051602061243683398151915290565b610a6e611167565b61067c82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061119992505050565b610ab56110eb565b6108e56111e9565b6060610aca6101f5611226565b905090565b600091825260fb602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60608167ffffffffffffffff811115610b1557610b15611cc5565b604051908082528060200260200182016040528015610b4857816020015b6060815260200190600190039081610b335790505b50905060005b82811015610be857610bb830858584818110610b6c57610b6c611fcb565b9050602002810190610b7e91906120a8565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061123392505050565b828281518110610bca57610bca611fcb565b60200260200101819052508080610be090611ff7565b915050610b4e565b5092915050565b600054610100900460ff1615808015610c0f5750600054600160ff909116105b80610c295750303b158015610c29575060005460ff166001145b610c8c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106f8565b6000805460ff191660011790558015610caf576000805461ff0019166101001790555b610cba848484611258565b8015610d00576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60338054610d13906120ef565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3f906120ef565b8015610d8c5780601f10610d6157610100808354040283529160200191610d8c565b820191906000526020600020905b815481529060010190602001808311610d6f57829003601f168201915b505050505081565b81158015610daa57506001600160a01b03811633145b15610dc857604051630461f45f60e11b815260040160405180910390fd5b610dd0610e95565b61067c828261136b565b6000610de86101f586611390565b1590505b949350505050565b60006001600160e01b03198216637965db0b60e01b148061057057506301ffc9a760e01b6001600160e01b0319831614610570565b60655460ff16156108e55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106f8565b61079581336113b2565b6000610e8e836001600160a01b03841661140b565b9392505050565b6108e5610e29565b600082815260fb6020526040902060010154610eb881610e6f565b610ec283836114fe565b505050565b6001600160a01b0381163314610f375760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016106f8565b61067c8282611584565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e361067c81610e6f565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610f9e57610ec2836115eb565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610ff8575060408051601f3d908101601f19168201909252610ff591810190612129565b60015b61105b5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016106f8565b60008051602061243683398151915281146110ca5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016106f8565b50610ec2838383611687565b6000610e8e836001600160a01b0384166116ac565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61079581610e6f565b61111d6116fb565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b61116f610e29565b7f2ce8d04a9c35987429af538825cd2438cc5c5bb5dc427955f84daaa3ea10501661079581610e6f565b336001600160a01b03167fe41f7f53dffb3e1410dab0f9f6a27c670b48ad40ccc47a64537100e1f3809e8a6033836040516111d5929190612142565b60405180910390a2603361067c828261222f565b6111f1610e29565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861114a3390565b60606000610e8e83611744565b6060610e8e8383604051806060016040528060278152602001612456602791396117a0565b600054610100900460ff1661127f5760405162461bcd60e51b81526004016106f8906122ef565b6001600160a01b038316158061129c57506001600160a01b038216155b806112ae57506001600160a01b038116155b156112cc5760405163e6c4247b60e01b815260040160405180910390fd5b6112d4611818565b6112ec60405180602001604052806000815250611847565b6112f4611877565b6112fc611818565b61130461189e565b61130c611877565b6113176000846114fe565b6113417f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e3826114fe565b610ec27f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a836114fe565b600082815260fb602052604090206001015461138681610e6f565b610ec28383611584565b6001600160a01b03811660009081526001830160205260408120541515610e8e565b6113bc8282610acf565b61067c576113c9816118cd565b6113d48360206118df565b6040516020016113e592919061233a565b60408051601f198184030181529082905262461bcd60e51b82526106f891600401611f57565b600081815260018301602052604081205480156114f457600061142f6001836123af565b8554909150600090611443906001906123af565b90508181146114a857600086600001828154811061146357611463611fcb565b906000526020600020015490508087600001848154811061148657611486611fcb565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806114b9576114b96123c2565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610570565b6000915050610570565b6115088282610acf565b61067c57600082815260fb602090815260408083206001600160a01b03851684529091529020805460ff191660011790556115403390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61158e8282610acf565b1561067c57600082815260fb602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b0381163b6116585760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016106f8565b60008051602061243683398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61169083611a7b565b60008251118061169d5750805b15610ec257610d008383611233565b60008181526001830160205260408120546116f357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610570565b506000610570565b60655460ff166108e55760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106f8565b60608160000180548060200260200160405190810160405280929190818152602001828054801561179457602002820191906000526020600020905b815481526020019060010190808311611780575b50505050509050919050565b6060600080856001600160a01b0316856040516117bd91906123d8565b600060405180830381855af49150503d80600081146117f8576040519150601f19603f3d011682016040523d82523d6000602084013e6117fd565b606091505b509150915061180e86838387611abb565b9695505050505050565b600054610100900460ff1661183f5760405162461bcd60e51b81526004016106f8906122ef565b6108e5611b34565b600054610100900460ff1661186e5760405162461bcd60e51b81526004016106f8906122ef565b61079581611199565b600054610100900460ff166108e55760405162461bcd60e51b81526004016106f8906122ef565b600054610100900460ff166118c55760405162461bcd60e51b81526004016106f8906122ef565b6108e5611877565b60606105706001600160a01b03831660145b606060006118ee8360026123f4565b6118f990600261240b565b67ffffffffffffffff81111561191157611911611cc5565b6040519080825280601f01601f19166020018201604052801561193b576020820181803683370190505b509050600360fc1b8160008151811061195657611956611fcb565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061198557611985611fcb565b60200101906001600160f81b031916908160001a90535060006119a98460026123f4565b6119b490600161240b565b90505b6001811115611a2c576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106119e8576119e8611fcb565b1a60f81b8282815181106119fe576119fe611fcb565b60200101906001600160f81b031916908160001a90535060049490941c93611a258161241e565b90506119b7565b508315610e8e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016106f8565b611a84816115eb565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60608315611b2a578251600003611b23576001600160a01b0385163b611b235760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f8565b5081610dec565b610dec8383611b67565b600054610100900460ff16611b5b5760405162461bcd60e51b81526004016106f8906122ef565b6065805460ff19169055565b815115611b775781518083602001fd5b8060405162461bcd60e51b81526004016106f89190611f57565b600060208284031215611ba357600080fd5b81356001600160e01b031981168114610e8e57600080fd5b600060208284031215611bcd57600080fd5b5035919050565b60008083601f840112611be657600080fd5b50813567ffffffffffffffff811115611bfe57600080fd5b6020830191508360208260051b8501011115611c1957600080fd5b9250929050565b60008060208385031215611c3357600080fd5b823567ffffffffffffffff811115611c4a57600080fd5b611c5685828601611bd4565b90969095509350505050565b80356001600160a01b0381168114611c7957600080fd5b919050565b60008060408385031215611c9157600080fd5b82359150611ca160208401611c62565b90509250929050565b600060208284031215611cbc57600080fd5b610e8e82611c62565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215611cee57600080fd5b611cf783611c62565b9150602083013567ffffffffffffffff80821115611d1457600080fd5b818501915085601f830112611d2857600080fd5b813581811115611d3a57611d3a611cc5565b604051601f8201601f19908116603f01168101908382118183101715611d6257611d62611cc5565b81604052828152886020848701011115611d7b57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008083601f840112611daf57600080fd5b50813567ffffffffffffffff811115611dc757600080fd5b602083019150836020828501011115611c1957600080fd5b60008060208385031215611df257600080fd5b823567ffffffffffffffff811115611e0957600080fd5b611c5685828601611d9d565b6020808252825182820181905260009190848201906040850190845b81811015611e565783516001600160a01b031683529284019291840191600101611e31565b50909695505050505050565b60005b83811015611e7d578181015183820152602001611e65565b50506000910152565b60008151808452611e9e816020860160208601611e62565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611f0757603f19888603018452611ef5858351611e86565b94509285019290850190600101611ed9565b5092979650505050505050565b600080600060608486031215611f2957600080fd5b611f3284611c62565b9250611f4060208501611c62565b9150611f4e60408501611c62565b90509250925092565b602081526000610e8e6020830184611e86565b60008060008060608587031215611f8057600080fd5b611f8985611c62565b9350611f9760208601611c62565b9250604085013567ffffffffffffffff811115611fb357600080fd5b611fbf87828801611d9d565b95989497509550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161200957612009611fe1565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6000808335601e198436030181126120bf57600080fd5b83018035915067ffffffffffffffff8211156120da57600080fd5b602001915036819003821315611c1957600080fd5b600181811c9082168061210357607f821691505b60208210810361212357634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561213b57600080fd5b5051919050565b604081526000808454612154816120ef565b80604086015260606001808416600081146121765760018114612190576121c1565b60ff1985168884015283151560051b8801830195506121c1565b8960005260208060002060005b868110156121b85781548b820187015290840190820161219d565b8a018501975050505b505050505082810360208401526121d88185611e86565b95945050505050565b601f821115610ec257600081815260208120601f850160051c810160208610156122085750805b601f850160051c820191505b8181101561222757828155600101612214565b505050505050565b815167ffffffffffffffff81111561224957612249611cc5565b61225d8161225784546120ef565b846121e1565b602080601f831160018114612292576000841561227a5750858301515b600019600386901b1c1916600185901b178555612227565b600085815260208120601f198616915b828110156122c1578886015182559484019460019091019084016122a2565b50858210156122df5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612372816017850160208801611e62565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516123a3816028840160208801611e62565b01602801949350505050565b8181038181111561057057610570611fe1565b634e487b7160e01b600052603160045260246000fd5b600082516123ea818460208701611e62565b9190910192915050565b808202811582820484141761057057610570611fe1565b8082018082111561057057610570611fe1565b60008161242d5761242d611fe1565b50600019019056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208b8d6e747b13b7306fda088716f46e81cc6d26286aba12bf0b6ea943ed28b48f64736f6c63430008140033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"paris","libraries":{},"metadata":{"appendCBOR":true,"bytecodeHash":"ipfs","useLiteralContent":false},"optimizer":{"enabled":true,"runs":200},"outputSelection":{"*":{"":["*"],"*":["*"]}},"remappings":["@openzeppelin/=node_modules/@openzeppelin/","eth-gas-reporter/=node_modules/eth-gas-reporter/","forge-std/=lib/forge-std/src/","hardhat/=node_modules/hardhat/"],"viaIR":false},"optimization_runs":200,"sourcify_repo_url":null,"decoded_constructor_args":null,"compiler_version":"v0.8.20+commit.a1b79de6","is_verified_via_verifier_alliance":false,"verified_at":"2026-05-13T17:41:46.971903Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e1565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100df576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516124b262000119600039600081816106ba01528181610703015281816108f10152818161093101526109c001526124b26000f3fe6080604052600436106101815760003560e01c80635c975abb116100d1578063ac9650d81161008a578063d547741f11610064578063d547741f14610475578063e63ab1e914610495578063eefb7e9a146104c9578063f72c0d8b146104e957600080fd5b8063ac9650d814610406578063c0c53b8b14610433578063c0e24d5e1461045357600080fd5b80635c975abb146103625780637ffc5a5c1461037a5780638456cb591461039a5780638d5ddbb3146103af57806391d14854146103d1578063a217fddf146103f157600080fd5b80633659cfe61161013e57806347fdaa691161011857806347fdaa69146102e45780634f1ef2861461031857806352d1902d1461032b57806354fd4d501461034057600080fd5b80633659cfe61461028f5780633e26fb1c146102af5780633f4ba83a146102cf57600080fd5b806301ffc9a7146101865780631da03312146101bb578063248a9ca3146101fd5780632eca959e1461022d5780632f2ff15d1461024f57806336568abe1461026f575b600080fd5b34801561019257600080fd5b506101a66101a1366004611b91565b61051d565b60405190151581526020015b60405180910390f35b3480156101c757600080fd5b506101ef7f2ce8d04a9c35987429af538825cd2438cc5c5bb5dc427955f84daaa3ea10501681565b6040519081526020016101b2565b34801561020957600080fd5b506101ef610218366004611bbb565b600090815260fb602052604090206001015490565b34801561023957600080fd5b5061024d610248366004611c20565b610576565b005b34801561025b57600080fd5b5061024d61026a366004611c7e565b61066a565b34801561027b57600080fd5b5061024d61028a366004611c7e565b610680565b34801561029b57600080fd5b5061024d6102aa366004611caa565b6106b0565b3480156102bb57600080fd5b5061024d6102ca366004611c20565b610798565b3480156102db57600080fd5b5061024d6108d5565b3480156102f057600080fd5b506101ef7f823dfd844b3cee1079828aee01bbe788b5154056f17c46ce6830122b6a4ebaaa81565b61024d610326366004611cdb565b6108e7565b34801561033757600080fd5b506101ef6109b3565b34801561034c57600080fd5b5060005460405160ff90911681526020016101b2565b34801561036e57600080fd5b5060655460ff166101a6565b34801561038657600080fd5b5061024d610395366004611ddf565b610a66565b3480156103a657600080fd5b5061024d610aad565b3480156103bb57600080fd5b506103c4610abd565b6040516101b29190611e15565b3480156103dd57600080fd5b506101a66103ec366004611c7e565b610acf565b3480156103fd57600080fd5b506101ef600081565b34801561041257600080fd5b50610426610421366004611c20565b610afa565b6040516101b29190611eb2565b34801561043f57600080fd5b5061024d61044e366004611f14565b610bef565b34801561045f57600080fd5b50610468610d06565b6040516101b29190611f57565b34801561048157600080fd5b5061024d610490366004611c7e565b610d94565b3480156104a157600080fd5b506101ef7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b3480156104d557600080fd5b506101a66104e4366004611f6a565b610dda565b3480156104f557600080fd5b506101ef7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b60006001600160e01b0319821663777dbf4d60e11b148061054657506001600160e01b03198216155b8061056157506001600160e01b031982166352d1902d60e01b145b80610570575061057082610df4565b92915050565b61057e610e29565b7f823dfd844b3cee1079828aee01bbe788b5154056f17c46ce6830122b6a4ebaaa6105a881610e6f565b8160005b81811015610663576105e78585838181106105c9576105c9611fcb565b90506020020160208101906105de9190611caa565b6101f590610e79565b15610653578484828181106105fe576105fe611fcb565b90506020020160208101906106139190611caa565b6001600160a01b0316336001600160a01b03167fc995326435808f031ae8f623df2ed4e111ffd7b1b11eb2e304c79b34e8fe6de460405160405180910390a35b61065c81611ff7565b90506105ac565b5050505050565b610672610e95565b61067c8282610e9d565b5050565b8161069e57604051630461f45f60e11b815260040160405180910390fd5b6106a6610e95565b61067c8282610ec7565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036107015760405162461bcd60e51b81526004016106f890612010565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661074a600080516020612436833981519152546001600160a01b031690565b6001600160a01b0316146107705760405162461bcd60e51b81526004016106f89061205c565b61077981610f41565b6040805160008082526020820190925261079591839190610f6b565b50565b6107a0610e29565b7f823dfd844b3cee1079828aee01bbe788b5154056f17c46ce6830122b6a4ebaaa6107ca81610e6f565b8160005b818110156106635760008585838181106107ea576107ea611fcb565b90506020020160208101906107ff9190611caa565b6001600160a01b0316036108265760405163e6c4247b60e01b815260040160405180910390fd5b61085985858381811061083b5761083b611fcb565b90506020020160208101906108509190611caa565b6101f5906110d6565b156108c55784848281811061087057610870611fcb565b90506020020160208101906108859190611caa565b6001600160a01b0316336001600160a01b03167f9e4bdc8a7c7f3f04fb1c5bcf304c65d4fc3466cdcb30f2da012579bf214e354360405160405180910390a35b6108ce81611ff7565b90506107ce565b6108dd6110eb565b6108e5611115565b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361092f5760405162461bcd60e51b81526004016106f890612010565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610978600080516020612436833981519152546001600160a01b031690565b6001600160a01b03161461099e5760405162461bcd60e51b81526004016106f89061205c565b6109a782610f41565b61067c82826001610f6b565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a535760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016106f8565b5060008051602061243683398151915290565b610a6e611167565b61067c82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061119992505050565b610ab56110eb565b6108e56111e9565b6060610aca6101f5611226565b905090565b600091825260fb602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60608167ffffffffffffffff811115610b1557610b15611cc5565b604051908082528060200260200182016040528015610b4857816020015b6060815260200190600190039081610b335790505b50905060005b82811015610be857610bb830858584818110610b6c57610b6c611fcb565b9050602002810190610b7e91906120a8565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061123392505050565b828281518110610bca57610bca611fcb565b60200260200101819052508080610be090611ff7565b915050610b4e565b5092915050565b600054610100900460ff1615808015610c0f5750600054600160ff909116105b80610c295750303b158015610c29575060005460ff166001145b610c8c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106f8565b6000805460ff191660011790558015610caf576000805461ff0019166101001790555b610cba848484611258565b8015610d00576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60338054610d13906120ef565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3f906120ef565b8015610d8c5780601f10610d6157610100808354040283529160200191610d8c565b820191906000526020600020905b815481529060010190602001808311610d6f57829003601f168201915b505050505081565b81158015610daa57506001600160a01b03811633145b15610dc857604051630461f45f60e11b815260040160405180910390fd5b610dd0610e95565b61067c828261136b565b6000610de86101f586611390565b1590505b949350505050565b60006001600160e01b03198216637965db0b60e01b148061057057506301ffc9a760e01b6001600160e01b0319831614610570565b60655460ff16156108e55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106f8565b61079581336113b2565b6000610e8e836001600160a01b03841661140b565b9392505050565b6108e5610e29565b600082815260fb6020526040902060010154610eb881610e6f565b610ec283836114fe565b505050565b6001600160a01b0381163314610f375760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016106f8565b61067c8282611584565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e361067c81610e6f565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610f9e57610ec2836115eb565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610ff8575060408051601f3d908101601f19168201909252610ff591810190612129565b60015b61105b5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016106f8565b60008051602061243683398151915281146110ca5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016106f8565b50610ec2838383611687565b6000610e8e836001600160a01b0384166116ac565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61079581610e6f565b61111d6116fb565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b61116f610e29565b7f2ce8d04a9c35987429af538825cd2438cc5c5bb5dc427955f84daaa3ea10501661079581610e6f565b336001600160a01b03167fe41f7f53dffb3e1410dab0f9f6a27c670b48ad40ccc47a64537100e1f3809e8a6033836040516111d5929190612142565b60405180910390a2603361067c828261222f565b6111f1610e29565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861114a3390565b60606000610e8e83611744565b6060610e8e8383604051806060016040528060278152602001612456602791396117a0565b600054610100900460ff1661127f5760405162461bcd60e51b81526004016106f8906122ef565b6001600160a01b038316158061129c57506001600160a01b038216155b806112ae57506001600160a01b038116155b156112cc5760405163e6c4247b60e01b815260040160405180910390fd5b6112d4611818565b6112ec60405180602001604052806000815250611847565b6112f4611877565b6112fc611818565b61130461189e565b61130c611877565b6113176000846114fe565b6113417f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e3826114fe565b610ec27f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a836114fe565b600082815260fb602052604090206001015461138681610e6f565b610ec28383611584565b6001600160a01b03811660009081526001830160205260408120541515610e8e565b6113bc8282610acf565b61067c576113c9816118cd565b6113d48360206118df565b6040516020016113e592919061233a565b60408051601f198184030181529082905262461bcd60e51b82526106f891600401611f57565b600081815260018301602052604081205480156114f457600061142f6001836123af565b8554909150600090611443906001906123af565b90508181146114a857600086600001828154811061146357611463611fcb565b906000526020600020015490508087600001848154811061148657611486611fcb565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806114b9576114b96123c2565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610570565b6000915050610570565b6115088282610acf565b61067c57600082815260fb602090815260408083206001600160a01b03851684529091529020805460ff191660011790556115403390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61158e8282610acf565b1561067c57600082815260fb602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b0381163b6116585760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016106f8565b60008051602061243683398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61169083611a7b565b60008251118061169d5750805b15610ec257610d008383611233565b60008181526001830160205260408120546116f357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610570565b506000610570565b60655460ff166108e55760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106f8565b60608160000180548060200260200160405190810160405280929190818152602001828054801561179457602002820191906000526020600020905b815481526020019060010190808311611780575b50505050509050919050565b6060600080856001600160a01b0316856040516117bd91906123d8565b600060405180830381855af49150503d80600081146117f8576040519150601f19603f3d011682016040523d82523d6000602084013e6117fd565b606091505b509150915061180e86838387611abb565b9695505050505050565b600054610100900460ff1661183f5760405162461bcd60e51b81526004016106f8906122ef565b6108e5611b34565b600054610100900460ff1661186e5760405162461bcd60e51b81526004016106f8906122ef565b61079581611199565b600054610100900460ff166108e55760405162461bcd60e51b81526004016106f8906122ef565b600054610100900460ff166118c55760405162461bcd60e51b81526004016106f8906122ef565b6108e5611877565b60606105706001600160a01b03831660145b606060006118ee8360026123f4565b6118f990600261240b565b67ffffffffffffffff81111561191157611911611cc5565b6040519080825280601f01601f19166020018201604052801561193b576020820181803683370190505b509050600360fc1b8160008151811061195657611956611fcb565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061198557611985611fcb565b60200101906001600160f81b031916908160001a90535060006119a98460026123f4565b6119b490600161240b565b90505b6001811115611a2c576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106119e8576119e8611fcb565b1a60f81b8282815181106119fe576119fe611fcb565b60200101906001600160f81b031916908160001a90535060049490941c93611a258161241e565b90506119b7565b508315610e8e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016106f8565b611a84816115eb565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60608315611b2a578251600003611b23576001600160a01b0385163b611b235760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106f8565b5081610dec565b610dec8383611b67565b600054610100900460ff16611b5b5760405162461bcd60e51b81526004016106f8906122ef565b6065805460ff19169055565b815115611b775781518083602001fd5b8060405162461bcd60e51b81526004016106f89190611f57565b600060208284031215611ba357600080fd5b81356001600160e01b031981168114610e8e57600080fd5b600060208284031215611bcd57600080fd5b5035919050565b60008083601f840112611be657600080fd5b50813567ffffffffffffffff811115611bfe57600080fd5b6020830191508360208260051b8501011115611c1957600080fd5b9250929050565b60008060208385031215611c3357600080fd5b823567ffffffffffffffff811115611c4a57600080fd5b611c5685828601611bd4565b90969095509350505050565b80356001600160a01b0381168114611c7957600080fd5b919050565b60008060408385031215611c9157600080fd5b82359150611ca160208401611c62565b90509250929050565b600060208284031215611cbc57600080fd5b610e8e82611c62565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215611cee57600080fd5b611cf783611c62565b9150602083013567ffffffffffffffff80821115611d1457600080fd5b818501915085601f830112611d2857600080fd5b813581811115611d3a57611d3a611cc5565b604051601f8201601f19908116603f01168101908382118183101715611d6257611d62611cc5565b81604052828152886020848701011115611d7b57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008083601f840112611daf57600080fd5b50813567ffffffffffffffff811115611dc757600080fd5b602083019150836020828501011115611c1957600080fd5b60008060208385031215611df257600080fd5b823567ffffffffffffffff811115611e0957600080fd5b611c5685828601611d9d565b6020808252825182820181905260009190848201906040850190845b81811015611e565783516001600160a01b031683529284019291840191600101611e31565b50909695505050505050565b60005b83811015611e7d578181015183820152602001611e65565b50506000910152565b60008151808452611e9e816020860160208601611e62565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611f0757603f19888603018452611ef5858351611e86565b94509285019290850190600101611ed9565b5092979650505050505050565b600080600060608486031215611f2957600080fd5b611f3284611c62565b9250611f4060208501611c62565b9150611f4e60408501611c62565b90509250925092565b602081526000610e8e6020830184611e86565b60008060008060608587031215611f8057600080fd5b611f8985611c62565b9350611f9760208601611c62565b9250604085013567ffffffffffffffff811115611fb357600080fd5b611fbf87828801611d9d565b95989497509550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161200957612009611fe1565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6000808335601e198436030181126120bf57600080fd5b83018035915067ffffffffffffffff8211156120da57600080fd5b602001915036819003821315611c1957600080fd5b600181811c9082168061210357607f821691505b60208210810361212357634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561213b57600080fd5b5051919050565b604081526000808454612154816120ef565b80604086015260606001808416600081146121765760018114612190576121c1565b60ff1985168884015283151560051b8801830195506121c1565b8960005260208060002060005b868110156121b85781548b820187015290840190820161219d565b8a018501975050505b505050505082810360208401526121d88185611e86565b95945050505050565b601f821115610ec257600081815260208120601f850160051c810160208610156122085750805b601f850160051c820191505b8181101561222757828155600101612214565b505050505050565b815167ffffffffffffffff81111561224957612249611cc5565b61225d8161225784546120ef565b846121e1565b602080601f831160018114612292576000841561227a5750858301515b600019600386901b1c1916600185901b178555612227565b600085815260208120601f198616915b828110156122c1578886015182559484019460019091019084016122a2565b50858210156122df5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612372816017850160208801611e62565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516123a3816028840160208801611e62565b01602801949350505050565b8181038181111561057057610570611fe1565b634e487b7160e01b600052603160045260246000fd5b600082516123ea818460208701611e62565b9190910192915050565b808202811582820484141761057057610570611fe1565b8082018082111561057057610570611fe1565b60008161242d5761242d611fe1565b50600019019056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212208b8d6e747b13b7306fda088716f46e81cc6d26286aba12bf0b6ea943ed28b48f64736f6c63430008140033","name":"DenyList","is_blueprint":false,"license_type":"none","is_fully_verified":false,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"paris","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[{"file_path":"contracts/library/AccessRegistry/AccessListUpgradeable.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (C) 2024 Fireblocks <support@fireblocks.com>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program.  If not, see <https://www.gnu.org/licenses/>.\npragma solidity 0.8.20;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {EnumerableSetUpgradeable} from \"@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol\";\nimport {IERC1822ProxiableUpgradeable} from \"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\";\nimport {IERC1967Upgradeable} from \"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol\";\nimport {MulticallUpgradeable} from \"@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol\";\nimport {IAccessRegistry} from \"./interface/IAccessRegistry.sol\";\nimport {ContractUriUpgradeable} from \"../Utils/ContractUriUpgradeable.sol\";\nimport {PauseUpgradeable} from \"../Utils/PauseUpgradeable.sol\";\nimport {RoleAccessUpgradeable} from \"../Utils/RoleAccessUpgradeable.sol\";\nimport {LibErrors} from \"../Errors/LibErrors.sol\";\n\n/**\n * @title AccessList Upgradeable\n * @author Fireblocks\n * @notice The AccessList Upgradeable establishes an on-chain AccessList for the Fireblocks ecosystem of smart contracts.\n * It maintains a registry of addresses allowed to participate in the system. It is also capable of verifying more\n * complex conditions using the data provided from the function call.\n *\n * @dev AccessList Service features.\n *\n * The AccessList Service contract Role Based Access Control employs the following roles:\n *\n * - UPGRADER_ROLE\n * - PAUSER_ROLE\n * - CONTRACT_ADMIN_ROLE\n * - ACCESS_LIST_ADMIN_ROLE\n */\nabstract contract AccessListUpgradeable is\n\tInitializable,\n\tIAccessRegistry,\n\tContractUriUpgradeable,\n\tPauseUpgradeable,\n\tRoleAccessUpgradeable,\n\tMulticallUpgradeable,\n\tUUPSUpgradeable\n{\n\tusing EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet;\n\n\t/// Constants\n\n\t/**\n\t * @notice The Access Control identifier for the Upgrader Role.\n\t * An account with \"UPGRADER_ROLE\" can upgrade the implementation contract address.\n\t *\n\t * @dev This constant holds the hash of the string \"UPGRADER_ROLE\".\n\t */\n\tbytes32 public constant UPGRADER_ROLE = keccak256(\"UPGRADER_ROLE\");\n\n\t/**\n\t * @notice The Access Control identifier for the Pauser Role.\n\t * An account with \"PAUSER_ROLE\" can pause and unpause the {AccessLis} contract.\n\t *\n\t * @dev This constant holds the hash of the string \"PAUSER_ROLE\".\n\t */\n\tbytes32 public constant PAUSER_ROLE = keccak256(\"PAUSER_ROLE\");\n\n\t/**\n\t * @notice The Access Control identifier for the Contract Admin Role.\n\t * An account with \"CONTRACT_ADMIN_ROLE\" can upgrade the contract uri.\n\t *\n\t * @dev This constant holds the hash of the string \"CONTRACT_ADMIN_ROLE\".\n\t */\n\tbytes32 public constant CONTRACT_ADMIN_ROLE = keccak256(\"CONTRACT_ADMIN_ROLE\");\n\n\t/**\n\t * @notice The Access Control identifier for the Access List Admin Role.\n\t * An account with \"ACCESS_LIST_ADMIN_ROLE\" can add or remove addresses from the Access List.\n\t *\n\t * @dev This constant holds the hash of the string \"ACCESS_LIST_ADMIN_ROLE\".\n\t */\n\tbytes32 public constant ACCESS_LIST_ADMIN_ROLE = keccak256(\"ACCESS_LIST_ADMIN_ROLE\");\n\n\t/// State\n\n\t/**\n\t * @notice A set that tracks address Access List membership.\n\t * @dev Default `false` indicates that an address is not in the Access List. A value of `true`\n\t * indicates the address is in the Access List.\n\t */\n\tEnumerableSetUpgradeable.AddressSet internal _accessList;\n\n\t/// Events\n\n\t/**\n\t * @notice This event is logged when an address is added to the Access list.\n\t *\n\t * @dev Notifies that the ability of logged address to participant is changed as per the implementation contract.\n\t *\n\t * @param caller The (indexed) account which called the {accessListAdd} function to add the address to the\n\t * `_accessList`.\n\t * @param account The (indexed) address which was added to the Access list.\n\t */\n\tevent AccessListAddressAdded(address indexed caller, address indexed account);\n\n\t/**\n\t * @notice This event is logged when an address is removed from the Access list.\n\t * @dev Notifies that the ability of logged address to participant is changed as per the implementation contract.\n\t *\n\t * @param caller The (indexed) account which called the {accessListRemove} function to remove the address from the\n\t * `_accessList`.\n\t * @param account The (indexed) address which was removed from the Access list.\n\t */\n\tevent AccessListAddressRemoved(address indexed caller, address indexed account);\n\n\t/// Functions\n\n\t/**\n\t * @notice Assigns Admin roles for the AccessList, initializes the contract and its inherited base contracts.\n\t *\n\t * @dev  Calling Conditions:\n\t *\n\t * - Can only be invoked by functions with the {initializer} or {reinitializer} modifiers.\n\t * - Non-zero address `defaultAdmin`.\n\t * - Non-zero address `pauser`.\n\t * - Non-zero address `upgrader`.\n\t *\n\t * @param defaultAdmin The account to be granted the \"DEFAULT_ADMIN_ROLE\".\n\t * @param pauser The account to be granted the \"PAUSER_ROLE\".\n\t * @param upgrader Account to be granted the \"UPGRADER_ROLE\".\n\t */\n\t/* solhint-disable func-name-mixedcase */\n\tfunction __AccessList_init(address defaultAdmin, address pauser, address upgrader) internal virtual onlyInitializing {\n\t\tif (defaultAdmin == address(0) || pauser == address(0) || upgrader == address(0)) {\n\t\t\trevert LibErrors.InvalidAddress();\n\t\t}\n\n\t\t__Pausable_init();\n\t\t__ContractUri_init(\"\");\n\t\t__Multicall_init();\n\t\t__Pausable_init();\n\t\t__RoleAccess_init();\n\t\t__UUPSUpgradeable_init();\n\n\t\t_grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);\n\t\t_grantRole(UPGRADER_ROLE, upgrader);\n\t\t_grantRole(PAUSER_ROLE, pauser);\n\t}\n\n\t/**\n\t * @notice This function adds a list of given address to the AccessList. This will allow the specified addresses\n\t * to interact with other contracts within the Fireblocks ecosystem of smart contracts. The function can be\n\t * called by the address which has the \"ACCESS_LIST_ADMIN_ROLE\".\n\t *\n\t * @dev Calling Conditions:\n\t *\n\t * - {AccessListUpgradeable} is not paused.\n\t * - The caller must hold the \"ACCESS_LIST_ADMIN_ROLE\" role.\n\t * - All the addresses in the`accounts` array must be a non-zero address.\n\t *\n\t * This function emits a {AccessListAddressAdded} event only when it successfully adds an address to\n\t * the `_accessList` mapping, given that the address was previously not present on AccessList.\n\t *\n\t * @param accounts The list addresses to be added to the AccessList.\n\t */\n\tfunction accessListAdd(address[] calldata accounts) external virtual whenNotPaused onlyRole(ACCESS_LIST_ADMIN_ROLE) {\n\t\tuint256 length = accounts.length;\n\t\tfor (uint256 i = 0; i < length; ++i) {\n\t\t\tif (accounts[i] == address(0)) {\n\t\t\t\trevert LibErrors.InvalidAddress();\n\t\t\t}\n\t\t\tif (_accessList.add(accounts[i])) {\n\t\t\t\temit AccessListAddressAdded(_msgSender(), accounts[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @notice This function removes a list of given address from the AccessList. The function can be\n\t * called by the address which has the \"ACCESS_LIST_ADMIN_ROLE\".\n\t *\n\t * @dev Calling Conditions:\n\t *\n\t * - {AccessListUpgradeable} is not paused.\n\t * - The caller must hold the \"ACCESS_LIST_ADMIN_ROLE\" role.\n\t *\n\t * This function emits a {AccessListAddressRemoved} event only when it successfully removes an address from\n\t * the `_accessList` mapping, given that the address was previously present on AccessList.\n\t *\n\t * @param accounts The list addresses to be removed from the AccessList.\n\t */\n\tfunction accessListRemove(\n\t\taddress[] calldata accounts\n\t) external virtual whenNotPaused onlyRole(ACCESS_LIST_ADMIN_ROLE) {\n\t\tuint256 length = accounts.length;\n\t\tfor (uint256 i = 0; i < length; ++i) {\n\t\t\tif (_accessList.remove(accounts[i])) {\n\t\t\t\temit AccessListAddressRemoved(_msgSender(), accounts[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @notice This function returns the list of addresses that are in the access list.\n\t *\n\t * @dev This function returns the list of addresses that are in the `_accessList`.\n\t *\n\t * Note: This is designed to be a helper function that is called from off-chain.\n\t * If the `_accessList` is large, this function will consume a lot of gas or revert.\n\t *\n\t * @return The list of addresses that are in the access list.\n\t */\n\tfunction getAccessList() external view virtual returns (address[] memory) {\n\t\treturn _accessList.values();\n\t}\n\n\t/**\n\t * @notice This function informs about the address's access to the system.\n\t *\n\t * @dev This function returns `true` if the address is allowed, otherwise it returns `false`.\n\t * The parameter `data` is ignored in this implementation of the interface as it serves as a placeholder for\n\t * future implementations.\n\t *\n\t * @param account The address to be checked.\n\t * @param caller The address calling the function requiring an access check.\n\t * @param data The data associated with the function call\n\t * @return `true` if the address is allowed, otherwise it returns `false`.\n\t */\n\tfunction hasAccess(\n\t\taddress account,\n\t\taddress caller,\n\t\tbytes calldata data\n\t) external view virtual override returns (bool);\n\n\t/**\n\t * @notice This is a function used to get the version of the contract.\n\t * @dev This function get the latest deployment version from the {Initializable}.{_getInitializedVersion}.\n\t * With every new deployment, the version number will be incremented.\n\t * @return The version of the contract.\n\t */\n\tfunction version() external view virtual returns (uint64) {\n\t\treturn uint64(super._getInitializedVersion());\n\t}\n\n\t/**\n\t * @notice Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding\n\t * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about\n\t * how these ids are created.\n\t *\n\t * @dev This function verifies that the {AccessList} implements {IAccessRegistry} and parent interfaces.\n\t * @param interfaceId The interface identifier, as specified in ERC-165\n\t * @return `true` if the contract implements `interfaceID` , `false` otherwise\n\t */\n\tfunction supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n\t\treturn\n\t\t\tinterfaceId == type(IAccessRegistry).interfaceId ||\n\t\t\tinterfaceId == type(IERC1967Upgradeable).interfaceId ||\n\t\t\tinterfaceId == type(IERC1822ProxiableUpgradeable).interfaceId ||\n\t\t\tsuper.supportsInterface(interfaceId);\n\t}\n\n\t/**\n\t * @notice This is a function that applies any validations required to allow upgrade operations.\n\t *\n\t * @dev Reverts when the caller does not have the \"UPGRADER_ROLE\".\n\t *\n\t * Calling Conditions:\n\t *\n\t * - Only the \"UPGRADER_ROLE\" can execute.\n\t *\n\t * @param newImplementation The address of the new logic contract.\n\t */\n\t/* solhint-disable no-empty-blocks */\n\tfunction _authorizeUpgrade(address newImplementation) internal virtual override onlyRole(UPGRADER_ROLE) {}\n\n\t/**\n\t * @notice This is a function that applies any validations required to allow Contract Uri updates.\n\t *\n\t * @dev Reverts when the caller does not have the \"CONTRACT_ADMIN_ROLE\".\n\t *\n\t * Calling Conditions:\n\t *\n\t * - Only the \"CONTRACT_ADMIN_ROLE\" can execute.\n\t */\n\t/* solhint-disable no-empty-blocks */\n\tfunction _authorizeContractUriUpdate() internal virtual override whenNotPaused onlyRole(CONTRACT_ADMIN_ROLE) {}\n\n\t/**\n\t * @notice This is a function that applies any validations required to allow Pause operations (like pause or unpause) to be executed.\n\t *\n\t * @dev Reverts when the caller does not have the \"PAUSER_ROLE\".\n\t *\n\t * Calling Conditions:\n\t *\n\t * - Only the \"PAUSER_ROLE\" can execute.\n\t */\n\t/* solhint-disable no-empty-blocks */\n\tfunction _authorizePause() internal virtual override onlyRole(PAUSER_ROLE) {}\n\n\t/**\n\t * @notice This is a function that applies any validations required to allow Role Access operation (like grantRole or revokeRole ) to be executed.\n\t *\n\t * @dev Reverts when the contract is paused.\n\t */\n\t/* solhint-disable no-empty-blocks */\n\tfunction _authorizeRoleAccess() internal virtual override whenNotPaused {}\n\n\t/* solhint-enable func-name-mixedcase */\n\t/**\n\t * @dev This empty reserved space is put in place to allow future versions to add new\n\t * variables without shifting down storage in the inheritance chain.\n\t * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n\t */\n\t//slither-disable-next-line naming-convention\n\tuint256[48] private __gap;\n}\n"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol","source_code":"// 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 IBeaconUpgradeable {\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"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since 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 Indicates that the contract has been initialized.\n     * @custom:oz-retyped-from bool\n     */\n    uint8 private _initialized;\n\n    /**\n     * @dev Indicates that the contract is in the process of being initialized.\n     */\n    bool private _initializing;\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint8 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 functions marked with `initializer` can be nested in the context of a\n     * constructor.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        bool isTopLevelCall = !_initializing;\n        require(\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n            \"Initializable: contract is already initialized\"\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 255 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint8 version) {\n        require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\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        require(_initializing, \"Initializable: contract is not initializing\");\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        require(!_initializing, \"Initializable: contract is initializing\");\n        if (_initialized != type(uint8).max) {\n            _initialized = type(uint8).max;\n            emit Initialized(type(uint8).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint8) {\n        return _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 _initializing;\n    }\n}\n"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../interfaces/draft-IERC1822Upgradeable.sol\";\nimport \"../ERC1967/ERC1967UpgradeUpgradeable.sol\";\nimport \"./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 *\n * _Available since v4.1._\n */\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\n    function __UUPSUpgradeable_init() internal onlyInitializing {\n    }\n\n    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\n    }\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n    address private immutable __self = address(this);\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        require(address(this) != __self, \"Function must be called through delegatecall\");\n        require(_getImplementation() == __self, \"Function must be called through active proxy\");\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        require(address(this) == __self, \"UUPSUpgradeable: must not be called through delegatecall\");\n        _;\n    }\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 override notDelegated returns (bytes32) {\n        return _IMPLEMENTATION_SLOT;\n    }\n\n    /**\n     * @dev Upgrade the implementation of the proxy to `newImplementation`.\n     *\n     * Calls {_authorizeUpgrade}.\n     *\n     * Emits an {Upgraded} event.\n     *\n     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n     */\n    function upgradeTo(address newImplementation) public virtual onlyProxy {\n        _authorizeUpgrade(newImplementation);\n        _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\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, true);\n    }\n\n    /**\n     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n     * {upgradeTo} and {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 override onlyOwner {}\n     * ```\n     */\n    function _authorizeUpgrade(address newImplementation) internal virtual;\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.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 IERC1822ProxiableUpgradeable {\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"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeaconUpgradeable.sol\";\nimport \"../../interfaces/IERC1967Upgradeable.sol\";\nimport \"../../interfaces/draft-IERC1822Upgradeable.sol\";\nimport \"../../utils/AddressUpgradeable.sol\";\nimport \"../../utils/StorageSlotUpgradeable.sol\";\nimport \"../utils/Initializable.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 */\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\n    function __ERC1967Upgrade_init() internal onlyInitializing {\n    }\n\n    function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\n    }\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 Returns the current implementation address.\n     */\n    function _getImplementation() internal view returns (address) {\n        return StorageSlotUpgradeable.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(AddressUpgradeable.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n        StorageSlotUpgradeable.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(address newImplementation, bytes memory data, bool forceCall) internal {\n        _upgradeTo(newImplementation);\n        if (data.length > 0 || forceCall) {\n            AddressUpgradeable.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(address newImplementation, bytes memory data, bool forceCall) 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 (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\n            _setImplementation(newImplementation);\n        } else {\n            try IERC1822ProxiableUpgradeable(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 Returns the current admin.\n     */\n    function _getAdmin() internal view returns (address) {\n        return StorageSlotUpgradeable.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        StorageSlotUpgradeable.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 Returns the current beacon.\n     */\n    function _getBeacon() internal view returns (address) {\n        return StorageSlotUpgradeable.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(AddressUpgradeable.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n        require(\n            AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\n            \"ERC1967: beacon implementation is not a contract\"\n        );\n        StorageSlotUpgradeable.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(address newBeacon, bytes memory data, bool forceCall) internal {\n        _setBeacon(newBeacon);\n        emit BeaconUpgraded(newBeacon);\n        if (data.length > 0 || forceCall) {\n            AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\n        }\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},{"file_path":"contracts/library/AccessRegistry/interface/IAccessRegistry.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (C) 2024 Fireblocks <support@fireblocks.com>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program.  If not, see <https://www.gnu.org/licenses/>.\npragma solidity 0.8.20;\n\n/**\n * @title Access Registry Interface\n * @author Fireblocks\n * @notice Access Registry Interface serves as a generalized interface for interacting with the Access Registry.\n *\n * @dev Interface for the Access Registry features.\n */\ninterface IAccessRegistry {\n\t/**\n\t * @notice This function is used to check if the account has necessary permissions to access the system.\n\t * @param account The account to be checked.\n\t * @param caller The account calling the function requiring an access check.\n\t * @param data The data associated with the function call\n\t * @return true if the account is allowed to access the system (false otherwise).\n\t */\n\tfunction hasAccess(address account, address caller, bytes calldata data) external view returns (bool);\n}\n"},{"file_path":"contracts/library/Errors/LibErrors.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (C) 2024 Fireblocks <support@fireblocks.com>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program.  If not, see <https://www.gnu.org/licenses/>.\npragma solidity 0.8.20;\n\n/**\n * @title Errors Library\n * @author Fireblocks\n * @notice The Errors Library provides error messages for the Fireblocks ecosystem of smart contracts.\n */\nlibrary LibErrors {\n\t/// Errors\n\n\t/**\n\t * @notice Thrown when the account is barred to participate in the system.\n\t * @param account The account to be checked.\n\t */\n\terror AccountUnauthorized(address account);\n\n\t/**\n\t * @notice Thrown when a Renounce Role is called.\n\t */\n\terror RenounceRoleDisabled();\n\n\t/**\n\t * @dev Indicates a failure that an address is not valid.\n\t */\n\terror InvalidAddress();\n\n\t/**\n\t * @dev Indicates that there was an attempt to recover tokens from an account that can participate in the system.\n\t * @param account The address from which token recovery was attempted.\n\t */\n\terror RecoveryOnActiveAccount(address account);\n\n\t/**\n\t * @dev Indicates that a contract does not implement a required interface.\n\t */\n\terror InvalidImplementation();\n\n\t/**\n\t * @dev Indicates that tokenId is not valid.\n\t */\n\terror InvalidTokenId();\n\n\t/**\n\t * @dev Indicates that the user is not allowed to perform the action for that token.\n\t */\n\terror UnauthorizedTokenManagement();\n\n\t/**\n\t * @dev Indicates a failure that a value is not valid.\n\t */\n\terror ZeroAmount();\n\n\t/**\n\t * @dev Indicates a failure while rescuing gas.\n\t */\n\terror SalvageGasFailed();\n\n\t/**\n\t * @dev Indicates a failure because \"DEFAULT_ADMIN_ROLE\" was tried to be revoked.\n\t */\n\terror DefaultAdminError();\n\n\t/**\n\t * @dev Indicates that registry is not set.\n\t */\n\terror AccessRegistryNotSet();\n\n\t/**\n\t * @dev Indicates that the URI has already been set.\n\t * @param tokenId The id of the token.\n\t */\n\terror URIAlreadySet(uint256 tokenId);\n\n\t/**\n\t * @dev Indicates that the lengths of the arrays do not match.\n\t */\n\terror ArrayLengthMismatch();\n}\n"},{"file_path":"contracts/library/Utils/ContractUriUpgradeable.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (C) 2024 Fireblocks <support@fireblocks.com>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program.  If not, see <https://www.gnu.org/licenses/>.\npragma solidity 0.8.20;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {ContextUpgradeable} from \"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\";\n\n/**\n * @title Contract Uri Upgradeable\n * @author Fireblocks\n * @dev This abstract contract provides internal contract logic for upgrading the contract URI.\n */\nabstract contract ContractUriUpgradeable is Initializable, ContextUpgradeable {\n\t/// State\n\n\t/**\n\t * @notice This field is a URI (Uniform Resource Identifier) that points to a JSON file with metadata about the contract.\n\t * @dev This state variable is queried by the contractUri() function.\n\t */\n\tstring public contractUri;\n\n\t/// Events\n\n\t/**\n\t * @notice This event is logged when the contract URI is updated.\n\t *\n\t * @param caller The (indexed) address of the entity that triggered the update.\n\t * @param oldUri The URI previously associated with the contract.\n\t * @param newUri The new URI associated with the contract.\n\t */\n\tevent ContractUriUpdated(address indexed caller, string oldUri, string newUri);\n\n\t// Functions\n\n\t/**\n\t * @notice This is an initializer function for the abstract contract.\n\t * @dev Standard Initializable contract behavior.\n\t *\n\t * Calling Conditions:\n\t *\n\t * - Can only be invoked by functions with the {initializer} or {reinitializer} modifiers.\n\t */\n\t/* solhint-disable func-name-mixedcase */\n\tfunction __ContractUri_init(string memory _uri) internal onlyInitializing {\n\t\t_updateContractUri(_uri);\n\t}\n\n\t/**\n\t * @notice This is a function used to update `contractUri` field.\n\t * @dev This function emits a {ContractUriUpdated} event.\n\t *\n\t * @param _uri A URI link pointing to the current URI associated with the contract.\n\t */\n\tfunction contractUriUpdate(string calldata _uri) external virtual {\n\t\t_authorizeContractUriUpdate();\n\t\t_updateContractUri(_uri);\n\t}\n\n\t/**\n\t * @notice This is a function used to update `contractUri` field.\n\t * @dev This function emits a {ContractUriUpdated} event.\n\t *\n\t * @param _uri A URI link pointing to the current URI associated with the contract.\n\t */\n\tfunction _updateContractUri(string memory _uri) internal virtual {\n\t\temit ContractUriUpdated(_msgSender(), contractUri, _uri);\n\t\tcontractUri = _uri;\n\t}\n\n\t/**\n\t * @notice This function is designed to be overridden in inheriting contracts.\n\t * @dev Override this function to implement RBAC control.\n\t */\n\tfunction _authorizeContractUriUpdate() internal virtual;\n\n\t/* solhint-enable func-name-mixedcase */\n\t/**\n\t * @dev This empty reserved space is put in place to allow future versions to add new\n\t * variables without shifting down storage in the inheritance chain.\n\t * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n\t */\n\t//slither-disable-next-line naming-convention\n\tuint256[49] private __gap;\n}\n"},{"file_path":"contracts/library/Utils/PauseUpgradeable.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (C) 2024 Fireblocks <support@fireblocks.com>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program.  If not, see <https://www.gnu.org/licenses/>.\npragma solidity 0.8.20;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {PausableUpgradeable} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\n\n/**\n * @title Pause Upgradeable\n * @author Fireblocks\n * @dev This abstract contract provides internal contract logic for pausing and unpausing the contract.\n */\nabstract contract PauseUpgradeable is Initializable, PausableUpgradeable {\n\t/// Functions\n\n\t/**\n\t * @notice This is an initializer function for the abstract contract.\n\t * @dev Standard Initializable contract behavior.\n\t *\n\t * Calling Conditions:\n\t *\n\t * - Can only be invoked by functions with the {initializer} or {reinitializer} modifiers.\n\t */\n\tfunction __Pause_init() internal onlyInitializing {\n\t\t__Pausable_init();\n\t}\n\n\t/**\n\t * @notice This is a function used to pause the contract.\n\t *\n\t * @dev Calling Conditions:\n\t *\n\t * - Contract is not paused. (checked internally by {Pausable._pause})\n\t *\n\t * This function emits a {Paused} event as part of {PausableUpgradeable._pause}.\n\t */\n\tfunction pause() external virtual {\n\t\t_authorizePause();\n\t\t_pause();\n\t}\n\n\t/**\n\t * @notice This is a function used to unpause the contract.\n\t *\n\t * @dev Calling Conditions:\n\t *\n\t * - Contract is paused. (checked internally by {Pausable._unpause})\n\t *\n\t * This function emits an {Unpaused} event as part of {PausableUpgradeable._unpause}.\n\t */\n\tfunction unpause() external virtual {\n\t\t_authorizePause();\n\t\t_unpause();\n\t}\n\n\t/**\n\t * @notice This function is designed to be overridden in inheriting contracts.\n\t * @dev Override this function to implement RBAC control.\n\t */\n\tfunction _authorizePause() internal virtual;\n\n\t/* solhint-enable func-name-mixedcase */\n\t/**\n\t * @dev This empty reserved space is put in place to allow future versions to add new\n\t * variables without shifting down storage in the inheritance chain.\n\t * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n\t */\n\t//slither-disable-next-line naming-convention\n\tuint256[50] private __gap;\n}\n"},{"file_path":"contracts/library/Utils/RoleAccessUpgradeable.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\n// Copyright (C) 2024 Fireblocks <support@fireblocks.com>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program.  If not, see <https://www.gnu.org/licenses/>.\npragma solidity 0.8.20;\n\nimport {AccessControlUpgradeable} from \"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol\";\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport {ContextUpgradeable} from \"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\";\n\nimport {LibErrors} from \"../Errors/LibErrors.sol\";\n\n/**\n * @title Role Access Upgradeable\n * @author Fireblocks\n * @dev This abstract contract provides internal contract logic for managing access control roles.\n */\nabstract contract RoleAccessUpgradeable is Initializable, AccessControlUpgradeable {\n\t/// Functions\n\n\t/**\n\t * @notice This is an initializer function for the abstract contract.\n\t * @dev Standard Initializable contract behavior.\n\t *\n\t * Calling Conditions:\n\t *\n\t * - Can only be invoked by functions with the {initializer} or {reinitializer} modifiers.\n\t */\n\tfunction __RoleAccess_init() internal onlyInitializing {\n\t\t__AccessControl_init();\n\t}\n\n\t/**\n\t * @notice This function revokes an Access Control role from an account\n\t * @dev Calling Conditions:\n\t *\n\t * - Caller must be the role admin of the `role`.\n\t * - Non-zero address `account`.\n\t *\n\t * This function emits a {RoleRevoked} event as part of {AccessControlUpgradeable._revokeRole}.\n\t *\n\t * @param role The role that will be revoked.\n\t * @param account The address from which role is revoked\n\t */\n\tfunction revokeRole(bytes32 role, address account) public virtual override {\n\t\tif (role == DEFAULT_ADMIN_ROLE && account == _msgSender()) {\n\t\t\trevert LibErrors.DefaultAdminError();\n\t\t}\n\n\t\t_authorizeRoleAccess();\n\t\tsuper.revokeRole(role, account); // In {AccessControlUpgradeable}\n\t}\n\n\t/**\n\t * @notice  This function renounces an Access Control role from an account, except for the \"DEFAULT_ADMIN_ROLE\".\n\t *\n\t * @dev Only the account itself can renounce its own roles, and not any other account.\n\t * Calling Conditions:\n\t * - Cannot renounce DEFAULT_ADMIN_ROLE.\n\t * - 'account' is the caller of the transaction.\n\t */\n\tfunction renounceRole(bytes32 role, address account) public virtual override {\n\t\tif (role == DEFAULT_ADMIN_ROLE) {\n\t\t\trevert LibErrors.DefaultAdminError();\n\t\t}\n\t\t_authorizeRoleAccess();\n\t\tsuper.renounceRole(role, account); // In {AccessControlUpgradeable}\n\t}\n\n\t/**\n\t * @notice This function grants an Access Control role to an account\n\t * @dev Calling Conditions:\n\t *\n\t * - Caller must be the role admin of the `role`.\n\t * - Non-zero address `account`.\n\t *\n\t * This function emits a {RoleGranted} event as part of {AccessControlUpgradeable._grantRole}.\n\t *\n\t * @param role The role that will be granted.\n\t * @param account The address to which role is granted\n\t */\n\tfunction grantRole(bytes32 role, address account) public virtual override {\n\t\t_authorizeRoleAccess();\n\t\tsuper.grantRole(role, account); // In {AccessControlUpgradeable}\n\t}\n\n\t/**\n\t * @notice This function is designed to be overridden in inheriting contracts.\n\t * @dev Override this function to implement RBAC control.\n\t */\n\tfunction _authorizeRoleAccess() internal virtual;\n\n\t/* solhint-enable func-name-mixedcase */\n\t/**\n\t * @dev This empty reserved space is put in place to allow future versions to add new\n\t * variables without shifting down storage in the inheritance chain.\n\t * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n\t */\n\t//slither-disable-next-line naming-convention\n\tuint256[50] private __gap;\n}\n"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControlUpgradeable.sol\";\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../utils/StringsUpgradeable.sol\";\nimport \"../utils/introspection/ERC165Upgradeable.sol\";\nimport \"../proxy/utils/Initializable.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 AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {\n    function __AccessControl_init() internal onlyInitializing {\n    }\n\n    function __AccessControl_init_unchained() internal onlyInitializing {\n    }\n    struct RoleData {\n        mapping(address => bool) members;\n        bytes32 adminRole;\n    }\n\n    mapping(bytes32 => 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 a standardized message including the required role.\n     *\n     * The format of the revert reason is given by the following regular expression:\n     *\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n     *\n     * _Available since v4.1._\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(IAccessControlUpgradeable).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 override returns (bool) {\n        return _roles[role].members[account];\n    }\n\n    /**\n     * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n     * Overriding this function changes the behavior of the {onlyRole} modifier.\n     *\n     * Format of the revert message is described in {_checkRole}.\n     *\n     * _Available since v4.6._\n     */\n    function _checkRole(bytes32 role) internal view virtual {\n        _checkRole(role, _msgSender());\n    }\n\n    /**\n     * @dev Revert with a standard message if `account` is missing `role`.\n     *\n     * The format of the revert reason is given by the following regular expression:\n     *\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n     */\n    function _checkRole(bytes32 role, address account) internal view virtual {\n        if (!hasRole(role, account)) {\n            revert(\n                string(\n                    abi.encodePacked(\n                        \"AccessControl: account \",\n                        StringsUpgradeable.toHexString(account),\n                        \" is missing role \",\n                        StringsUpgradeable.toHexString(uint256(role), 32)\n                    )\n                )\n            );\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 override 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 override 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 override 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 `account`.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function renounceRole(bytes32 role, address account) public virtual override {\n        require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event. Note that unlike {grantRole}, this function doesn't perform any\n     * checks on the calling account.\n     *\n     * May emit a {RoleGranted} event.\n     *\n     * [WARNING]\n     * ====\n     * This function should only be called from the constructor when setting\n     * up the initial roles for the system.\n     *\n     * Using this function in any other way is effectively circumventing the admin\n     * system imposed by {AccessControl}.\n     * ====\n     *\n     * NOTE: This function is deprecated in favor of {_grantRole}.\n     */\n    function _setupRole(bytes32 role, address account) internal virtual {\n        _grantRole(role, account);\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 Grants `role` to `account`.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function _grantRole(bytes32 role, address account) internal virtual {\n        if (!hasRole(role, account)) {\n            _roles[role].members[account] = true;\n            emit RoleGranted(role, account, _msgSender());\n        }\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function _revokeRole(bytes32 role, address account) internal virtual {\n        if (hasRole(role, account)) {\n            _roles[role].members[account] = false;\n            emit RoleRevoked(role, account, _msgSender());\n        }\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[49] private __gap;\n}\n"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControlUpgradeable {\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     * _Available since v3.1._\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 `account`.\n     */\n    function renounceRole(bytes32 role, address account) external;\n}\n"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n *\n * _Available since v4.8.3._\n */\ninterface IERC1967Upgradeable {\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"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../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    /**\n     * @dev Emitted when the pause is triggered by `account`.\n     */\n    event Paused(address account);\n\n    /**\n     * @dev Emitted when the pause is lifted by `account`.\n     */\n    event Unpaused(address account);\n\n    bool private _paused;\n\n    /**\n     * @dev Initializes the contract in unpaused state.\n     */\n    function __Pausable_init() internal onlyInitializing {\n        __Pausable_init_unchained();\n    }\n\n    function __Pausable_init_unchained() internal onlyInitializing {\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        require(!paused(), \"Pausable: paused\");\n    }\n\n    /**\n     * @dev Throws if the contract is not paused.\n     */\n    function _requirePaused() internal view virtual {\n        require(paused(), \"Pausable: not paused\");\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    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[49] private __gap;\n}\n"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\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://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.0/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 functionCallWithValue(target, data, 0, \"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(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\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        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, 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        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, 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        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or 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            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage);\n        }\n    }\n}\n"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../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    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/utils/MulticallUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Multicall.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./AddressUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides a function to batch together multiple calls in a single external call.\n *\n * _Available since v4.1._\n */\nabstract contract MulticallUpgradeable is Initializable {\n    function __Multicall_init() internal onlyInitializing {\n    }\n\n    function __Multicall_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Receives and executes a batch of function calls on this contract.\n     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n     */\n    function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) {\n        results = new bytes[](data.length);\n        for (uint256 i = 0; i < data.length; i++) {\n            results[i] = AddressUpgradeable.functionDelegateCall(address(this), data[i]);\n        }\n        return results;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\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 * ```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(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`, `uint256`._\n * _Available since v4.9 for `string`, `bytes`._\n */\nlibrary StorageSlotUpgradeable {\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"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/MathUpgradeable.sol\";\nimport \"./math/SignedMathUpgradeable.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary StringsUpgradeable {\n    bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n    uint8 private constant _ADDRESS_LENGTH = 20;\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 = MathUpgradeable.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), _SYMBOLS))\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 toString(int256 value) internal pure returns (string memory) {\n        return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMathUpgradeable.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, MathUpgradeable.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        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] = _SYMBOLS[value & 0xf];\n            value >>= 4;\n        }\n        require(value == 0, \"Strings: hex length insufficient\");\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 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 keccak256(bytes(a)) == keccak256(bytes(b));\n    }\n}\n"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165Upgradeable.sol\";\nimport \"../../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 *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\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 override returns (bool) {\n        return interfaceId == type(IERC165Upgradeable).interfaceId;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\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 IERC165Upgradeable {\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"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary MathUpgradeable {\n    enum Rounding {\n        Down, // Toward negative infinity\n        Up, // Toward infinity\n        Zero // Toward zero\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 up instead\n     * of rounding down.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\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 denominator == 0\n     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n     * with further edits by 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; // 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                prod0 := mul(x, y)\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            require(denominator > prod1, \"Math: mulDiv overflow\");\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. Always >= 1.\n            // See https://cs.stackexchange.com/q/138556/92363.\n\n            // Does not overflow because the denominator cannot be zero at this stage in the function.\n            uint256 twos = denominator & (~denominator + 1);\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 works\n            // 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 (rounding == Rounding.Up && 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 down.\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        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n        // → `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 + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2, rounded down, of a positive value.\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 + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10, rounded down, of a positive value.\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 + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256, rounded down, of a positive value.\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 + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n        }\n    }\n}\n"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/utils/math/SignedMathUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMathUpgradeable {\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"},{"file_path":"node_modules/@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for managing\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\n * types.\n *\n * Sets have the following properties:\n *\n * - Elements are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```solidity\n * contract Example {\n *     // Add the library methods\n *     using EnumerableSet for EnumerableSet.AddressSet;\n *\n *     // Declare a set state variable\n *     EnumerableSet.AddressSet private mySet;\n * }\n * ```\n *\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\n * and `uint256` (`UintSet`) are supported.\n *\n * [WARNING]\n * ====\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\n * unusable.\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\n *\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\n * array of EnumerableSet.\n * ====\n */\nlibrary EnumerableSetUpgradeable {\n    // To implement this library for multiple types with as little code\n    // repetition as possible, we write it in terms of a generic Set type with\n    // bytes32 values.\n    // The Set implementation uses private functions, and user-facing\n    // implementations (such as AddressSet) are just wrappers around the\n    // underlying Set.\n    // This means that we can only create new EnumerableSets for types that fit\n    // in bytes32.\n\n    struct Set {\n        // Storage of set values\n        bytes32[] _values;\n        // Position of the value in the `values` array, plus 1 because index 0\n        // means a value is not in the set.\n        mapping(bytes32 => uint256) _indexes;\n    }\n\n    /**\n     * @dev Add a value to a set. O(1).\n     *\n     * Returns true if the value was added to the set, that is if it was not\n     * already present.\n     */\n    function _add(Set storage set, bytes32 value) private returns (bool) {\n        if (!_contains(set, value)) {\n            set._values.push(value);\n            // The value is stored at length-1, but we add 1 to all indexes\n            // and use 0 as a sentinel value\n            set._indexes[value] = set._values.length;\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * @dev Removes a value from a set. O(1).\n     *\n     * Returns true if the value was removed from the set, that is if it was\n     * present.\n     */\n    function _remove(Set storage set, bytes32 value) private returns (bool) {\n        // We read and store the value's index to prevent multiple reads from the same storage slot\n        uint256 valueIndex = set._indexes[value];\n\n        if (valueIndex != 0) {\n            // Equivalent to contains(set, value)\n            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\n            // the array, and then remove the last element (sometimes called as 'swap and pop').\n            // This modifies the order of the array, as noted in {at}.\n\n            uint256 toDeleteIndex = valueIndex - 1;\n            uint256 lastIndex = set._values.length - 1;\n\n            if (lastIndex != toDeleteIndex) {\n                bytes32 lastValue = set._values[lastIndex];\n\n                // Move the last value to the index where the value to delete is\n                set._values[toDeleteIndex] = lastValue;\n                // Update the index for the moved value\n                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\n            }\n\n            // Delete the slot where the moved value was stored\n            set._values.pop();\n\n            // Delete the index for the deleted slot\n            delete set._indexes[value];\n\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * @dev Returns true if the value is in the set. O(1).\n     */\n    function _contains(Set storage set, bytes32 value) private view returns (bool) {\n        return set._indexes[value] != 0;\n    }\n\n    /**\n     * @dev Returns the number of values on the set. O(1).\n     */\n    function _length(Set storage set) private view returns (uint256) {\n        return set._values.length;\n    }\n\n    /**\n     * @dev Returns the value stored at position `index` in the set. O(1).\n     *\n     * Note that there are no guarantees on the ordering of values inside the\n     * array, and it may change when more values are added or removed.\n     *\n     * Requirements:\n     *\n     * - `index` must be strictly less than {length}.\n     */\n    function _at(Set storage set, uint256 index) private view returns (bytes32) {\n        return set._values[index];\n    }\n\n    /**\n     * @dev Return the entire set in an array\n     *\n     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n     * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n     */\n    function _values(Set storage set) private view returns (bytes32[] memory) {\n        return set._values;\n    }\n\n    // Bytes32Set\n\n    struct Bytes32Set {\n        Set _inner;\n    }\n\n    /**\n     * @dev Add a value to a set. O(1).\n     *\n     * Returns true if the value was added to the set, that is if it was not\n     * already present.\n     */\n    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n        return _add(set._inner, value);\n    }\n\n    /**\n     * @dev Removes a value from a set. O(1).\n     *\n     * Returns true if the value was removed from the set, that is if it was\n     * present.\n     */\n    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n        return _remove(set._inner, value);\n    }\n\n    /**\n     * @dev Returns true if the value is in the set. O(1).\n     */\n    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\n        return _contains(set._inner, value);\n    }\n\n    /**\n     * @dev Returns the number of values in the set. O(1).\n     */\n    function length(Bytes32Set storage set) internal view returns (uint256) {\n        return _length(set._inner);\n    }\n\n    /**\n     * @dev Returns the value stored at position `index` in the set. O(1).\n     *\n     * Note that there are no guarantees on the ordering of values inside the\n     * array, and it may change when more values are added or removed.\n     *\n     * Requirements:\n     *\n     * - `index` must be strictly less than {length}.\n     */\n    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\n        return _at(set._inner, index);\n    }\n\n    /**\n     * @dev Return the entire set in an array\n     *\n     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n     * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n     */\n    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\n        bytes32[] memory store = _values(set._inner);\n        bytes32[] memory result;\n\n        /// @solidity memory-safe-assembly\n        assembly {\n            result := store\n        }\n\n        return result;\n    }\n\n    // AddressSet\n\n    struct AddressSet {\n        Set _inner;\n    }\n\n    /**\n     * @dev Add a value to a set. O(1).\n     *\n     * Returns true if the value was added to the set, that is if it was not\n     * already present.\n     */\n    function add(AddressSet storage set, address value) internal returns (bool) {\n        return _add(set._inner, bytes32(uint256(uint160(value))));\n    }\n\n    /**\n     * @dev Removes a value from a set. O(1).\n     *\n     * Returns true if the value was removed from the set, that is if it was\n     * present.\n     */\n    function remove(AddressSet storage set, address value) internal returns (bool) {\n        return _remove(set._inner, bytes32(uint256(uint160(value))));\n    }\n\n    /**\n     * @dev Returns true if the value is in the set. O(1).\n     */\n    function contains(AddressSet storage set, address value) internal view returns (bool) {\n        return _contains(set._inner, bytes32(uint256(uint160(value))));\n    }\n\n    /**\n     * @dev Returns the number of values in the set. O(1).\n     */\n    function length(AddressSet storage set) internal view returns (uint256) {\n        return _length(set._inner);\n    }\n\n    /**\n     * @dev Returns the value stored at position `index` in the set. O(1).\n     *\n     * Note that there are no guarantees on the ordering of values inside the\n     * array, and it may change when more values are added or removed.\n     *\n     * Requirements:\n     *\n     * - `index` must be strictly less than {length}.\n     */\n    function at(AddressSet storage set, uint256 index) internal view returns (address) {\n        return address(uint160(uint256(_at(set._inner, index))));\n    }\n\n    /**\n     * @dev Return the entire set in an array\n     *\n     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n     * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n     */\n    function values(AddressSet storage set) internal view returns (address[] memory) {\n        bytes32[] memory store = _values(set._inner);\n        address[] memory result;\n\n        /// @solidity memory-safe-assembly\n        assembly {\n            result := store\n        }\n\n        return result;\n    }\n\n    // UintSet\n\n    struct UintSet {\n        Set _inner;\n    }\n\n    /**\n     * @dev Add a value to a set. O(1).\n     *\n     * Returns true if the value was added to the set, that is if it was not\n     * already present.\n     */\n    function add(UintSet storage set, uint256 value) internal returns (bool) {\n        return _add(set._inner, bytes32(value));\n    }\n\n    /**\n     * @dev Removes a value from a set. O(1).\n     *\n     * Returns true if the value was removed from the set, that is if it was\n     * present.\n     */\n    function remove(UintSet storage set, uint256 value) internal returns (bool) {\n        return _remove(set._inner, bytes32(value));\n    }\n\n    /**\n     * @dev Returns true if the value is in the set. O(1).\n     */\n    function contains(UintSet storage set, uint256 value) internal view returns (bool) {\n        return _contains(set._inner, bytes32(value));\n    }\n\n    /**\n     * @dev Returns the number of values in the set. O(1).\n     */\n    function length(UintSet storage set) internal view returns (uint256) {\n        return _length(set._inner);\n    }\n\n    /**\n     * @dev Returns the value stored at position `index` in the set. O(1).\n     *\n     * Note that there are no guarantees on the ordering of values inside the\n     * array, and it may change when more values are added or removed.\n     *\n     * Requirements:\n     *\n     * - `index` must be strictly less than {length}.\n     */\n    function at(UintSet storage set, uint256 index) internal view returns (uint256) {\n        return uint256(_at(set._inner, index));\n    }\n\n    /**\n     * @dev Return the entire set in an array\n     *\n     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n     * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n     */\n    function values(UintSet storage set) internal view returns (uint256[] memory) {\n        bytes32[] memory store = _values(set._inner);\n        uint256[] memory result;\n\n        /// @solidity memory-safe-assembly\n        assembly {\n            result := store\n        }\n\n        return result;\n    }\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DefaultAdminError","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccessListAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccessListAddressRemoved","type":"event"},{"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":"caller","type":"address"},{"indexed":false,"internalType":"string","name":"oldUri","type":"string"},{"indexed":false,"internalType":"string","name":"newUri","type":"string"}],"name":"ContractUriUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":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":"ACCESS_LIST_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONTRACT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_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":"UPGRADER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"accessListAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"accessListRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"contractUriUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAccessList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"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":"address","name":"account","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"hasAccess","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"defaultAdmin","type":"address"},{"internalType":"address","name":"pauser","type":"address"},{"internalType":"address","name":"upgrader","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"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":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","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":[],"name":"version","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":true,"constructor_args":null}