{"file_path":"modules/pool-permission-manager/contracts/MaplePoolPermissionManager.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.7;\n\nimport { NonTransparentProxied } from \"../modules/ntp/contracts/NonTransparentProxied.sol\";\n\nimport { IGlobalsLike }                from \"./interfaces/Interfaces.sol\";\nimport { IMaplePoolPermissionManager } from \"./interfaces/IMaplePoolPermissionManager.sol\";\n\nimport { MaplePoolPermissionManagerStorage } from \"./proxy/MaplePoolPermissionManagerStorage.sol\";\n\n/*\n\n    ███╗   ███╗ █████╗ ██████╗ ██╗     ███████╗\n    ████╗ ████║██╔══██╗██╔══██╗██║     ██╔════╝\n    ██╔████╔██║███████║██████╔╝██║     █████╗\n    ██║╚██╔╝██║██╔══██║██╔═══╝ ██║     ██╔══╝\n    ██║ ╚═╝ ██║██║  ██║██║     ███████╗███████╗\n    ╚═╝     ╚═╝╚═╝  ╚═╝╚═╝     ╚══════╝╚══════╝\n\n    ██████╗  ██████╗  ██████╗ ██╗\n    ██╔══██╗██╔═══██╗██╔═══██╗██║\n    ██████╔╝██║   ██║██║   ██║██║\n    ██╔═══╝ ██║   ██║██║   ██║██║\n    ██║     ╚██████╔╝╚██████╔╝███████╗\n    ╚═╝      ╚═════╝  ╚═════╝ ╚══════╝\n\n    ██████╗ ███████╗██████╗ ███╗   ███╗██╗███████╗███████╗██╗ ██████╗ ███╗   ██╗\n    ██╔══██╗██╔════╝██╔══██╗████╗ ████║██║██╔════╝██╔════╝██║██╔═══██╗████╗  ██║\n    ██████╔╝█████╗  ██████╔╝██╔████╔██║██║███████╗███████╗██║██║   ██║██╔██╗ ██║\n    ██╔═══╝ ██╔══╝  ██╔══██╗██║╚██╔╝██║██║╚════██║╚════██║██║██║   ██║██║╚██╗██║\n    ██║     ███████╗██║  ██║██║ ╚═╝ ██║██║███████║███████║██║╚██████╔╝██║ ╚████║\n    ╚═╝     ╚══════╝╚═╝  ╚═╝╚═╝     ╚═╝╚═╝╚══════╝╚══════╝╚═╝ ╚═════╝ ╚═╝  ╚═══╝\n\n    ███╗   ███╗ █████╗ ███╗   ██╗ █████╗  ██████╗ ███████╗██████╗\n    ████╗ ████║██╔══██╗████╗  ██║██╔══██╗██╔════╝ ██╔════╝██╔══██╗\n    ██╔████╔██║███████║██╔██╗ ██║███████║██║  ███╗█████╗  ██████╔╝\n    ██║╚██╔╝██║██╔══██║██║╚██╗██║██╔══██║██║   ██║██╔══╝  ██╔══██╗\n    ██║ ╚═╝ ██║██║  ██║██║ ╚████║██║  ██║╚██████╔╝███████╗██║  ██║\n    ╚═╝     ╚═╝╚═╝  ╚═╝╚═╝  ╚═══╝╚═╝  ╚═╝ ╚═════╝ ╚══════╝╚═╝  ╚═╝\n\n*/\n\ncontract MaplePoolPermissionManager is IMaplePoolPermissionManager, MaplePoolPermissionManagerStorage, NonTransparentProxied {\n\n    /**************************************************************************************************************************************/\n    /*** Permission Levels                                                                                                              ***/\n    /**************************************************************************************************************************************/\n\n    uint256 constant PRIVATE        = 0;  // Allow only when on the allowlist (default).\n    uint256 constant FUNCTION_LEVEL = 1;  // Allow when function-specific pool bitmaps match.\n    uint256 constant POOL_LEVEL     = 2;  // Allow when pool bitmaps match.\n    uint256 constant PUBLIC         = 3;  // Allow always.\n\n    /**************************************************************************************************************************************/\n    /*** Modifiers                                                                                                                      ***/\n    /**************************************************************************************************************************************/\n\n    modifier onlyPermissionAdminOrProtocolAdmins() {\n        require(\n            permissionAdmins[msg.sender]                         ||\n            msg.sender == admin()                                ||\n            msg.sender == IGlobalsLike(globals).operationalAdmin(),\n            \"PPM:NOT_PPM_ADMIN_GOV_OR_OA\"\n        );\n\n        _;\n    }\n\n    modifier onlyPoolDelegateOrProtocolAdmins(address poolManager_) {\n        ( address ownedPoolManager_, bool isPoolDelegate_ ) = IGlobalsLike(globals).poolDelegates(msg.sender);\n\n        require(\n            isPoolDelegate_ && ownedPoolManager_ == poolManager_ ||\n            msg.sender == admin()                                ||\n            msg.sender == IGlobalsLike(globals).operationalAdmin(),\n            \"PPM:NOT_PD_GOV_OR_OA\"\n        );\n\n        _;\n    }\n\n    modifier onlyGovernorOrOperationalAdmin() {\n        require(msg.sender == admin() || msg.sender == IGlobalsLike(globals).operationalAdmin(), \"PPM:NOT_GOV_OR_OA\");\n        _;\n    }\n\n    modifier whenProtocolNotPaused() {\n        require(!IGlobalsLike(globals).isFunctionPaused(msg.sig), \"PPM:PAUSED\");\n        _;\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Administrative Functions                                                                                                       ***/\n    /**************************************************************************************************************************************/\n\n    function setLenderBitmaps(address[] calldata lenders_,uint256[] calldata bitmaps_)\n        external override whenProtocolNotPaused onlyPermissionAdminOrProtocolAdmins\n    {\n        require(lenders_.length > 0,                \"PPM:SLB:NO_LENDERS\");\n        require(lenders_.length == bitmaps_.length, \"PPM:SLB:LENGTH_MISMATCH\");\n\n        for (uint256 i; i < lenders_.length; ++i) {\n            lenderBitmaps[lenders_[i]] = bitmaps_[i];\n        }\n\n        emit LenderBitmapsSet(lenders_, bitmaps_);\n    }\n\n    function setPermissionAdmin(address permissionAdmin_, bool isPermissionAdmin_)\n        external override whenProtocolNotPaused onlyGovernorOrOperationalAdmin\n    {\n        permissionAdmins[permissionAdmin_] = isPermissionAdmin_;\n\n        emit PermissionAdminSet(permissionAdmin_, isPermissionAdmin_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Pool Configuration Functions                                                                                                   ***/\n    /**************************************************************************************************************************************/\n\n    function configurePool(\n        address            poolManager_,\n        uint256            permissionLevel_,\n        bytes32[] calldata functionIds_,\n        uint256[] calldata poolBitmaps_\n    )\n        external override whenProtocolNotPaused onlyPoolDelegateOrProtocolAdmins(poolManager_)\n    {\n        require(permissionLevels[poolManager_] != PUBLIC,   \"PPM:CP:PUBLIC_POOL\");\n        require(permissionLevel_ <= PUBLIC,                 \"PPM:CP:INVALID_LEVEL\");\n        require(functionIds_.length > 0,                    \"PPM:CP:NO_FUNCTIONS\");\n        require(functionIds_.length == poolBitmaps_.length, \"PPM:CP:LENGTH_MISMATCH\");\n\n        for (uint256 i; i < functionIds_.length; ++i) {\n            poolBitmaps[poolManager_][functionIds_[i]] = poolBitmaps_[i];\n        }\n\n        permissionLevels[poolManager_] = permissionLevel_;\n\n        emit PoolPermissionLevelSet(poolManager_, permissionLevel_);\n        emit PoolBitmapsSet(poolManager_, functionIds_, poolBitmaps_);\n    }\n\n    function setLenderAllowlist(\n        address            poolManager_,\n        address[] calldata lenders_,\n        bool[]    calldata booleans_\n    )\n        external override whenProtocolNotPaused onlyPoolDelegateOrProtocolAdmins(poolManager_)\n    {\n        require(lenders_.length > 0,                 \"PPM:SLA:NO_LENDERS\");\n        require(lenders_.length == booleans_.length, \"PPM:SLA:LENGTH_MISMATCH\");\n\n        for (uint256 i; i < lenders_.length; ++i) {\n            lenderAllowlist[poolManager_][lenders_[i]] = booleans_[i];\n        }\n\n        emit LenderAllowlistSet(poolManager_, lenders_, booleans_);\n    }\n\n    function setPoolBitmaps(\n        address            poolManager_,\n        bytes32[] calldata functionIds_,\n        uint256[] calldata bitmaps_\n    )\n        external override whenProtocolNotPaused onlyPoolDelegateOrProtocolAdmins(poolManager_)\n    {\n        require(functionIds_.length > 0,                \"PPM:SPB:NO_FUNCTIONS\");\n        require(functionIds_.length == bitmaps_.length, \"PPM:SPB:LENGTH_MISMATCH\");\n\n        for (uint256 i; i < functionIds_.length; ++i) {\n            poolBitmaps[poolManager_][functionIds_[i]] = bitmaps_[i];\n        }\n\n        emit PoolBitmapsSet(poolManager_, functionIds_, bitmaps_);\n    }\n\n    function setPoolPermissionLevel(\n        address poolManager_,\n        uint256 permissionLevel_\n    )\n        external override whenProtocolNotPaused onlyPoolDelegateOrProtocolAdmins(poolManager_)\n    {\n        require(permissionLevels[poolManager_] != PUBLIC, \"PPM:SPPL:PUBLIC_POOL\");\n        require(permissionLevel_ <= PUBLIC,               \"PPM:SPPL:INVALID_LEVEL\");\n\n        permissionLevels[poolManager_] = permissionLevel_;\n\n        emit PoolPermissionLevelSet(poolManager_, permissionLevel_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Permission-related Functions                                                                                                   ***/\n    /**************************************************************************************************************************************/\n\n    function hasPermission(\n        address poolManager_,\n        address lender_,\n        bytes32 functionId_\n    )\n        external override view returns (bool hasPermission_)\n    {\n        // Allow only if the bitmaps match.\n        hasPermission_ = _hasPermission(poolManager_, lender_, permissionLevels[poolManager_], functionId_);\n    }\n\n    function hasPermission(\n        address            poolManager_,\n        address[] calldata lenders_,\n        bytes32            functionId_\n    )\n        external override view returns (bool hasPermission_)\n    {\n        require(lenders_.length > 0, \"PPM:HP:NO_LENDERS\");\n\n        uint256 permissionLevel_ = permissionLevels[poolManager_];\n\n        for (uint256 i; i < lenders_.length; ++i) {\n            if (!_hasPermission(poolManager_, lenders_[i], permissionLevel_, functionId_)) {\n                return false;\n            }\n        }\n\n        hasPermission_ = true;\n    }\n\n    function _hasPermission(\n        address poolManager_,\n        address lender_,\n        uint256 permissionLevel_,\n        bytes32 functionId_\n    )\n        internal view returns (bool hasPermission_)\n    {\n        // Always allow if the pool is public.\n        if (permissionLevel_ == PUBLIC) return true;\n\n        // Always allow if the lender is on the allow list.\n        if (lenderAllowlist[poolManager_][lender_]) return true;\n\n        // Always deny if the pool is private and the lender is not on the allow list.\n        if (permissionLevel_ == PRIVATE) return false;\n\n        // Ignore the function identifier if using pool-level bitmaps.\n        if (permissionLevel_ == POOL_LEVEL) functionId_ = bytes32(0);\n\n        uint256 poolBitmap_ = poolBitmaps[poolManager_][functionId_];\n\n        // Allow only if the bitmaps match.\n        hasPermission_ = (poolBitmap_ & lenderBitmaps[lender_]) == poolBitmap_;\n    }\n\n}\n","deployed_bytecode":"0x608060405234801561001057600080fd5b50600436106101005760003560e01c80639709d8e311610097578063dde9884011610066578063dde9884014610250578063e71b781f14610270578063f71331811461029e578063f851a440146102b157600080fd5b80639709d8e3146101ec578063a4c2d6be146101ff578063b36d13eb14610212578063c31245251461023d57600080fd5b80635c60da1b116100d35780635c60da1b146101785780636a8d05df146101985780636d6712d8146101c657806385513663146101d957600080fd5b8063016c7d5e1461010557806311b5ec591461011a57806329206d6f1461012d57806334dd0fbb14610165575b600080fd5b610118610113366004611b05565b6102b9565b005b6101186101283660046119c9565b6105f1565b61015061013b36600461190e565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b610150610173366004611a4c565b610985565b610180610a4b565b6040516001600160a01b03909116815260200161015c565b6101b86101a636600461190e565b60036020526000908152604090205481565b60405190815260200161015c565b6101506101d4366004611988565b610a84565b6101186101e7366004611bbd565b610aab565b6101186101fa366004611b31565b610dc2565b61011861020d3660046119c9565b61124b565b6101b8610220366004611b05565b600560209081526000928352604080842090915290825290205481565b600054610180906001600160a01b031681565b6101b861025e36600461190e565b60026020526000908152604090205481565b61015061027e36600461194f565b600460209081526000928352604080842090915290825290205460ff1681565b6101186102ac366004611aa8565b6115ee565b6101806117f0565b60008054604051634c532de160e01b81526001600160a01b0390911691634c532de1916102f491356001600160e01b03191690600401611d86565b60206040518083038186803b15801561030c57600080fd5b505afa158015610320573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103449190611c46565b1561036a5760405162461bcd60e51b815260040161036190611dc9565b60405180910390fd5b6000805460405163f12f1bbf60e01b815233600482015284929182916001600160a01b039091169063f12f1bbf90602401604080518083038186803b1580156103b257600080fd5b505afa1580156103c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ea9190611ad6565b9150915080801561040c5750826001600160a01b0316826001600160a01b0316145b8061042f575061041a6117f0565b6001600160a01b0316336001600160a01b0316145b806104ce575060008054906101000a90046001600160a01b03166001600160a01b0316630b52d12d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561048157600080fd5b505afa158015610495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b99190611932565b6001600160a01b0316336001600160a01b0316145b6104ea5760405162461bcd60e51b815260040161036190611d9b565b6001600160a01b038516600090815260036020819052604090912054141561054b5760405162461bcd60e51b81526020600482015260146024820152731414134e94d414130e941550931250d7d413d3d360621b6044820152606401610361565b60038411156105955760405162461bcd60e51b81526020600482015260166024820152751414134e94d414130e9253959053125117d31155915360521b6044820152606401610361565b6001600160a01b03851660008181526003602052604090819020869055517f98e24f711287999d1317447d7c5110c33e7e55589c6301f73998f0aa578e161e906105e29087815260200190565b60405180910390a25050505050565b60008054604051634c532de160e01b81526001600160a01b0390911691634c532de19161062c91356001600160e01b03191690600401611d86565b60206040518083038186803b15801561064457600080fd5b505afa158015610658573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067c9190611c46565b156106995760405162461bcd60e51b815260040161036190611dc9565b6000805460405163f12f1bbf60e01b815233600482015287929182916001600160a01b039091169063f12f1bbf90602401604080518083038186803b1580156106e157600080fd5b505afa1580156106f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107199190611ad6565b9150915080801561073b5750826001600160a01b0316826001600160a01b0316145b8061075e57506107496117f0565b6001600160a01b0316336001600160a01b0316145b806107fd575060008054906101000a90046001600160a01b03166001600160a01b0316630b52d12d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107b057600080fd5b505afa1580156107c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e89190611932565b6001600160a01b0316336001600160a01b0316145b6108195760405162461bcd60e51b815260040161036190611d9b565b8561085d5760405162461bcd60e51b815260206004820152601460248201527350504d3a5350423a4e4f5f46554e4354494f4e5360601b6044820152606401610361565b8584146108ac5760405162461bcd60e51b815260206004820152601760248201527f50504d3a5350423a4c454e4754485f4d49534d415443480000000000000000006044820152606401610361565b60005b86811015610933578585828181106108c9576108c9611e35565b90506020020135600560008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008a8a8581811061090957610909611e35565b905060200201358152602001908152602001600020819055508061092c90611e04565b90506108af565b50876001600160a01b03167f28097f1f794258ae9675337a1478a6d8340007144899be79c1fb4d42f3723580888888886040516109739493929190611d72565b60405180910390a25050505050505050565b6000826109c85760405162461bcd60e51b815260206004820152601160248201527050504d3a48503a4e4f5f4c454e4445525360781b6044820152606401610361565b6001600160a01b038516600090815260036020526040812054905b84811015610a3c57610a1d87878784818110610a0157610a01611e35565b9050602002016020810190610a16919061190e565b8487611820565b610a2c57600092505050610a43565b610a3581611e04565b90506109e3565b5060019150505b949350505050565b6000610a7f610a7b60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd611ded565b5490565b905090565b6001600160a01b038316600090815260036020526040812054610a43908590859085611820565b60008054604051634c532de160e01b81526001600160a01b0390911691634c532de191610ae691356001600160e01b03191690600401611d86565b60206040518083038186803b158015610afe57600080fd5b505afa158015610b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b369190611c46565b15610b535760405162461bcd60e51b815260040161036190611dc9565b3360009081526001602052604090205460ff1680610b895750610b746117f0565b6001600160a01b0316336001600160a01b0316145b80610c28575060008054906101000a90046001600160a01b03166001600160a01b0316630b52d12d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bdb57600080fd5b505afa158015610bef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c139190611932565b6001600160a01b0316336001600160a01b0316145b610c745760405162461bcd60e51b815260206004820152601b60248201527f50504d3a4e4f545f50504d5f41444d494e5f474f565f4f525f4f4100000000006044820152606401610361565b82610cb65760405162461bcd60e51b815260206004820152601260248201527150504d3a534c423a4e4f5f4c454e4445525360701b6044820152606401610361565b828114610d055760405162461bcd60e51b815260206004820152601760248201527f50504d3a534c423a4c454e4754485f4d49534d415443480000000000000000006044820152606401610361565b60005b83811015610d7e57828282818110610d2257610d22611e35565b9050602002013560026000878785818110610d3f57610d3f611e35565b9050602002016020810190610d54919061190e565b6001600160a01b03168152602081019190915260400160002055610d7781611e04565b9050610d08565b507f0bf181a16ef3208fcdb210ff60f6dee360f6486e45ae04e986a2f92dc57b2df784848484604051610db49493929190611d40565b60405180910390a150505050565b60008054604051634c532de160e01b81526001600160a01b0390911691634c532de191610dfd91356001600160e01b03191690600401611d86565b60206040518083038186803b158015610e1557600080fd5b505afa158015610e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4d9190611c46565b15610e6a5760405162461bcd60e51b815260040161036190611dc9565b6000805460405163f12f1bbf60e01b815233600482015288929182916001600160a01b039091169063f12f1bbf90602401604080518083038186803b158015610eb257600080fd5b505afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea9190611ad6565b91509150808015610f0c5750826001600160a01b0316826001600160a01b0316145b80610f2f5750610f1a6117f0565b6001600160a01b0316336001600160a01b0316145b80610fce575060008054906101000a90046001600160a01b03166001600160a01b0316630b52d12d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8157600080fd5b505afa158015610f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb99190611932565b6001600160a01b0316336001600160a01b0316145b610fea5760405162461bcd60e51b815260040161036190611d9b565b6001600160a01b03891660009081526003602081905260409091205414156110495760405162461bcd60e51b81526020600482015260126024820152711414134e90d40e941550931250d7d413d3d360721b6044820152606401610361565b60038811156110915760405162461bcd60e51b81526020600482015260146024820152731414134e90d40e9253959053125117d31155915360621b6044820152606401610361565b856110d45760405162461bcd60e51b815260206004820152601360248201527250504d3a43503a4e4f5f46554e4354494f4e5360681b6044820152606401610361565b85841461111c5760405162461bcd60e51b81526020600482015260166024820152750a0a09a7486a074988a9c8ea890be9a92a69a82a886960531b6044820152606401610361565b60005b868110156111a35785858281811061113957611139611e35565b90506020020135600560008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008a8a8581811061117957611179611e35565b905060200201358152602001908152602001600020819055508061119c90611e04565b905061111f565b506001600160a01b038916600081815260036020526040908190208a9055517f98e24f711287999d1317447d7c5110c33e7e55589c6301f73998f0aa578e161e906111f1908b815260200190565b60405180910390a2886001600160a01b03167f28097f1f794258ae9675337a1478a6d8340007144899be79c1fb4d42f3723580888888886040516112389493929190611d72565b60405180910390a2505050505050505050565b60008054604051634c532de160e01b81526001600160a01b0390911691634c532de19161128691356001600160e01b03191690600401611d86565b60206040518083038186803b15801561129e57600080fd5b505afa1580156112b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d69190611c46565b156112f35760405162461bcd60e51b815260040161036190611dc9565b6000805460405163f12f1bbf60e01b815233600482015287929182916001600160a01b039091169063f12f1bbf90602401604080518083038186803b15801561133b57600080fd5b505afa15801561134f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113739190611ad6565b915091508080156113955750826001600160a01b0316826001600160a01b0316145b806113b857506113a36117f0565b6001600160a01b0316336001600160a01b0316145b80611457575060008054906101000a90046001600160a01b03166001600160a01b0316630b52d12d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561140a57600080fd5b505afa15801561141e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114429190611932565b6001600160a01b0316336001600160a01b0316145b6114735760405162461bcd60e51b815260040161036190611d9b565b856114b55760405162461bcd60e51b815260206004820152601260248201527150504d3a534c413a4e4f5f4c454e4445525360701b6044820152606401610361565b8584146115045760405162461bcd60e51b815260206004820152601760248201527f50504d3a534c413a4c454e4754485f4d49534d415443480000000000000000006044820152606401610361565b60005b868110156115ae5785858281811061152157611521611e35565b90506020020160208101906115369190611c29565b6001600160a01b038a166000908152600460205260408120908a8a8581811061156157611561611e35565b9050602002016020810190611576919061190e565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556115a781611e04565b9050611507565b50876001600160a01b03167f23a8ff2c1134a2e1cad7b971afe1e92d4545e8871e8e12fae60e3bdce6a4dde4888888886040516109739493929190611ce2565b60008054604051634c532de160e01b81526001600160a01b0390911691634c532de19161162991356001600160e01b03191690600401611d86565b60206040518083038186803b15801561164157600080fd5b505afa158015611655573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116799190611c46565b156116965760405162461bcd60e51b815260040161036190611dc9565b61169e6117f0565b6001600160a01b0316336001600160a01b03161480611751575060008054906101000a90046001600160a01b03166001600160a01b0316630b52d12d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561170457600080fd5b505afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c9190611932565b6001600160a01b0316336001600160a01b0316145b6117915760405162461bcd60e51b815260206004820152601160248201527050504d3a4e4f545f474f565f4f525f4f4160781b6044820152606401610361565b6001600160a01b038216600081815260016020908152604091829020805460ff191685151590811790915591519182527f24a9c541c88fdc2d071ec9ec7065e96f270ce6611c4a588d312c765e034094ba910160405180910390a25050565b6000610a7f610a7b60017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104611ded565b6000600383141561183357506001610a43565b6001600160a01b0380861660009081526004602090815260408083209388168352929052205460ff161561186957506001610a43565b8261187657506000610a43565b600283141561188457600091505b506001600160a01b03808516600090815260056020908152604080832085845282528083205493871683526002909152902054811614949350505050565b60008083601f8401126118d457600080fd5b50813567ffffffffffffffff8111156118ec57600080fd5b6020830191508360208260051b850101111561190757600080fd5b9250929050565b60006020828403121561192057600080fd5b813561192b81611e4b565b9392505050565b60006020828403121561194457600080fd5b815161192b81611e4b565b6000806040838503121561196257600080fd5b823561196d81611e4b565b9150602083013561197d81611e4b565b809150509250929050565b60008060006060848603121561199d57600080fd5b83356119a881611e4b565b925060208401356119b881611e4b565b929592945050506040919091013590565b6000806000806000606086880312156119e157600080fd5b85356119ec81611e4b565b9450602086013567ffffffffffffffff80821115611a0957600080fd5b611a1589838a016118c2565b90965094506040880135915080821115611a2e57600080fd5b50611a3b888289016118c2565b969995985093965092949392505050565b60008060008060608587031215611a6257600080fd5b8435611a6d81611e4b565b9350602085013567ffffffffffffffff811115611a8957600080fd5b611a95878288016118c2565b9598909750949560400135949350505050565b60008060408385031215611abb57600080fd5b8235611ac681611e4b565b9150602083013561197d81611e63565b60008060408385031215611ae957600080fd5b8251611af481611e4b565b602084015190925061197d81611e63565b60008060408385031215611b1857600080fd5b8235611b2381611e4b565b946020939093013593505050565b60008060008060008060808789031215611b4a57600080fd5b8635611b5581611e4b565b955060208701359450604087013567ffffffffffffffff80821115611b7957600080fd5b611b858a838b016118c2565b90965094506060890135915080821115611b9e57600080fd5b50611bab89828a016118c2565b979a9699509497509295939492505050565b60008060008060408587031215611bd357600080fd5b843567ffffffffffffffff80821115611beb57600080fd5b611bf7888389016118c2565b90965094506020870135915080821115611c1057600080fd5b50611c1d878288016118c2565b95989497509550505050565b600060208284031215611c3b57600080fd5b813561192b81611e63565b600060208284031215611c5857600080fd5b815161192b81611e63565b8183526000602080850194508260005b85811015611ca1578135611c8681611e4b565b6001600160a01b031687529582019590820190600101611c73565b509495945050505050565b81835260006001600160fb1b03831115611cc557600080fd5b8260051b8083602087013760009401602001938452509192915050565b604081526000611cf6604083018688611c63565b8281036020848101919091528482528591810160005b86811015611d33578335611d1f81611e63565b151582529282019290820190600101611d0c565b5098975050505050505050565b604081526000611d54604083018688611c63565b8281036020840152611d67818587611cac565b979650505050505050565b604081526000611d54604083018688611cac565b6001600160e01b031991909116815260200190565b60208082526014908201527350504d3a4e4f545f50445f474f565f4f525f4f4160601b604082015260600190565b6020808252600a90820152691414134e94105554d15160b21b604082015260600190565b600082821015611dff57611dff611e1f565b500390565b6000600019821415611e1857611e18611e1f565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114611e6057600080fd5b50565b8015158114611e6057600080fdfea26469706673582212209c81b46b8cdf1dfdfed855effb0b22a4c6838ffd909956e810d66632938ce07764736f6c63430008070033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"london","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[":address-registry/=modules/address-registry/contracts/",":contract-test-utils/=modules/erc20/modules/contract-test-utils/contracts/",":ds-test/=modules/forge-std/lib/ds-test/src/",":erc20-helper/=modules/erc20-helper/src/",":erc20/=modules/erc20/",":fixed-term-loan-manager/=modules/fixed-term-loan-manager/contracts/",":fixed-term-loan/=modules/fixed-term-loan/contracts/",":forge-std/=modules/forge-std/src/",":globals/=modules/globals/contracts/",":liquidations/=modules/liquidations/contracts/",":maple-proxy-factory/=modules/open-term-loan/modules/maple-proxy-factory/",":non-transparent-proxy/=modules/globals/modules/non-transparent-proxy/",":ntp/=modules/pool-permission-manager/modules/ntp/",":open-term-loan-manager/=modules/open-term-loan-manager/contracts/",":open-term-loan/=modules/open-term-loan/contracts/",":pool-permission-manager/=modules/pool-permission-manager/contracts/",":pool/=modules/pool/contracts/",":proxy-factory/=modules/open-term-loan/modules/maple-proxy-factory/modules/proxy-factory/",":withdrawal-manager-cyclical/=modules/withdrawal-manager-cyclical/contracts/",":withdrawal-manager-queue/=modules/withdrawal-manager-queue/contracts/"]},"optimization_runs":200,"sourcify_repo_url":"https://repo.sourcify.dev/contracts/full_match/1/0xC3530358e54bC81EfCe4A2e12A898E996B091753/","decoded_constructor_args":null,"compiler_version":"0.8.7+commit.e28d00a7","is_verified_via_verifier_alliance":false,"verified_at":"2024-02-10T18:28:46.867999Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x608060405234801561001057600080fd5b50611ea7806100206000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80639709d8e311610097578063dde9884011610066578063dde9884014610250578063e71b781f14610270578063f71331811461029e578063f851a440146102b157600080fd5b80639709d8e3146101ec578063a4c2d6be146101ff578063b36d13eb14610212578063c31245251461023d57600080fd5b80635c60da1b116100d35780635c60da1b146101785780636a8d05df146101985780636d6712d8146101c657806385513663146101d957600080fd5b8063016c7d5e1461010557806311b5ec591461011a57806329206d6f1461012d57806334dd0fbb14610165575b600080fd5b610118610113366004611b05565b6102b9565b005b6101186101283660046119c9565b6105f1565b61015061013b36600461190e565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b610150610173366004611a4c565b610985565b610180610a4b565b6040516001600160a01b03909116815260200161015c565b6101b86101a636600461190e565b60036020526000908152604090205481565b60405190815260200161015c565b6101506101d4366004611988565b610a84565b6101186101e7366004611bbd565b610aab565b6101186101fa366004611b31565b610dc2565b61011861020d3660046119c9565b61124b565b6101b8610220366004611b05565b600560209081526000928352604080842090915290825290205481565b600054610180906001600160a01b031681565b6101b861025e36600461190e565b60026020526000908152604090205481565b61015061027e36600461194f565b600460209081526000928352604080842090915290825290205460ff1681565b6101186102ac366004611aa8565b6115ee565b6101806117f0565b60008054604051634c532de160e01b81526001600160a01b0390911691634c532de1916102f491356001600160e01b03191690600401611d86565b60206040518083038186803b15801561030c57600080fd5b505afa158015610320573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103449190611c46565b1561036a5760405162461bcd60e51b815260040161036190611dc9565b60405180910390fd5b6000805460405163f12f1bbf60e01b815233600482015284929182916001600160a01b039091169063f12f1bbf90602401604080518083038186803b1580156103b257600080fd5b505afa1580156103c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ea9190611ad6565b9150915080801561040c5750826001600160a01b0316826001600160a01b0316145b8061042f575061041a6117f0565b6001600160a01b0316336001600160a01b0316145b806104ce575060008054906101000a90046001600160a01b03166001600160a01b0316630b52d12d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561048157600080fd5b505afa158015610495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b99190611932565b6001600160a01b0316336001600160a01b0316145b6104ea5760405162461bcd60e51b815260040161036190611d9b565b6001600160a01b038516600090815260036020819052604090912054141561054b5760405162461bcd60e51b81526020600482015260146024820152731414134e94d414130e941550931250d7d413d3d360621b6044820152606401610361565b60038411156105955760405162461bcd60e51b81526020600482015260166024820152751414134e94d414130e9253959053125117d31155915360521b6044820152606401610361565b6001600160a01b03851660008181526003602052604090819020869055517f98e24f711287999d1317447d7c5110c33e7e55589c6301f73998f0aa578e161e906105e29087815260200190565b60405180910390a25050505050565b60008054604051634c532de160e01b81526001600160a01b0390911691634c532de19161062c91356001600160e01b03191690600401611d86565b60206040518083038186803b15801561064457600080fd5b505afa158015610658573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067c9190611c46565b156106995760405162461bcd60e51b815260040161036190611dc9565b6000805460405163f12f1bbf60e01b815233600482015287929182916001600160a01b039091169063f12f1bbf90602401604080518083038186803b1580156106e157600080fd5b505afa1580156106f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107199190611ad6565b9150915080801561073b5750826001600160a01b0316826001600160a01b0316145b8061075e57506107496117f0565b6001600160a01b0316336001600160a01b0316145b806107fd575060008054906101000a90046001600160a01b03166001600160a01b0316630b52d12d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107b057600080fd5b505afa1580156107c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e89190611932565b6001600160a01b0316336001600160a01b0316145b6108195760405162461bcd60e51b815260040161036190611d9b565b8561085d5760405162461bcd60e51b815260206004820152601460248201527350504d3a5350423a4e4f5f46554e4354494f4e5360601b6044820152606401610361565b8584146108ac5760405162461bcd60e51b815260206004820152601760248201527f50504d3a5350423a4c454e4754485f4d49534d415443480000000000000000006044820152606401610361565b60005b86811015610933578585828181106108c9576108c9611e35565b90506020020135600560008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008a8a8581811061090957610909611e35565b905060200201358152602001908152602001600020819055508061092c90611e04565b90506108af565b50876001600160a01b03167f28097f1f794258ae9675337a1478a6d8340007144899be79c1fb4d42f3723580888888886040516109739493929190611d72565b60405180910390a25050505050505050565b6000826109c85760405162461bcd60e51b815260206004820152601160248201527050504d3a48503a4e4f5f4c454e4445525360781b6044820152606401610361565b6001600160a01b038516600090815260036020526040812054905b84811015610a3c57610a1d87878784818110610a0157610a01611e35565b9050602002016020810190610a16919061190e565b8487611820565b610a2c57600092505050610a43565b610a3581611e04565b90506109e3565b5060019150505b949350505050565b6000610a7f610a7b60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd611ded565b5490565b905090565b6001600160a01b038316600090815260036020526040812054610a43908590859085611820565b60008054604051634c532de160e01b81526001600160a01b0390911691634c532de191610ae691356001600160e01b03191690600401611d86565b60206040518083038186803b158015610afe57600080fd5b505afa158015610b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b369190611c46565b15610b535760405162461bcd60e51b815260040161036190611dc9565b3360009081526001602052604090205460ff1680610b895750610b746117f0565b6001600160a01b0316336001600160a01b0316145b80610c28575060008054906101000a90046001600160a01b03166001600160a01b0316630b52d12d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bdb57600080fd5b505afa158015610bef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c139190611932565b6001600160a01b0316336001600160a01b0316145b610c745760405162461bcd60e51b815260206004820152601b60248201527f50504d3a4e4f545f50504d5f41444d494e5f474f565f4f525f4f4100000000006044820152606401610361565b82610cb65760405162461bcd60e51b815260206004820152601260248201527150504d3a534c423a4e4f5f4c454e4445525360701b6044820152606401610361565b828114610d055760405162461bcd60e51b815260206004820152601760248201527f50504d3a534c423a4c454e4754485f4d49534d415443480000000000000000006044820152606401610361565b60005b83811015610d7e57828282818110610d2257610d22611e35565b9050602002013560026000878785818110610d3f57610d3f611e35565b9050602002016020810190610d54919061190e565b6001600160a01b03168152602081019190915260400160002055610d7781611e04565b9050610d08565b507f0bf181a16ef3208fcdb210ff60f6dee360f6486e45ae04e986a2f92dc57b2df784848484604051610db49493929190611d40565b60405180910390a150505050565b60008054604051634c532de160e01b81526001600160a01b0390911691634c532de191610dfd91356001600160e01b03191690600401611d86565b60206040518083038186803b158015610e1557600080fd5b505afa158015610e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4d9190611c46565b15610e6a5760405162461bcd60e51b815260040161036190611dc9565b6000805460405163f12f1bbf60e01b815233600482015288929182916001600160a01b039091169063f12f1bbf90602401604080518083038186803b158015610eb257600080fd5b505afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea9190611ad6565b91509150808015610f0c5750826001600160a01b0316826001600160a01b0316145b80610f2f5750610f1a6117f0565b6001600160a01b0316336001600160a01b0316145b80610fce575060008054906101000a90046001600160a01b03166001600160a01b0316630b52d12d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8157600080fd5b505afa158015610f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb99190611932565b6001600160a01b0316336001600160a01b0316145b610fea5760405162461bcd60e51b815260040161036190611d9b565b6001600160a01b03891660009081526003602081905260409091205414156110495760405162461bcd60e51b81526020600482015260126024820152711414134e90d40e941550931250d7d413d3d360721b6044820152606401610361565b60038811156110915760405162461bcd60e51b81526020600482015260146024820152731414134e90d40e9253959053125117d31155915360621b6044820152606401610361565b856110d45760405162461bcd60e51b815260206004820152601360248201527250504d3a43503a4e4f5f46554e4354494f4e5360681b6044820152606401610361565b85841461111c5760405162461bcd60e51b81526020600482015260166024820152750a0a09a7486a074988a9c8ea890be9a92a69a82a886960531b6044820152606401610361565b60005b868110156111a35785858281811061113957611139611e35565b90506020020135600560008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008a8a8581811061117957611179611e35565b905060200201358152602001908152602001600020819055508061119c90611e04565b905061111f565b506001600160a01b038916600081815260036020526040908190208a9055517f98e24f711287999d1317447d7c5110c33e7e55589c6301f73998f0aa578e161e906111f1908b815260200190565b60405180910390a2886001600160a01b03167f28097f1f794258ae9675337a1478a6d8340007144899be79c1fb4d42f3723580888888886040516112389493929190611d72565b60405180910390a2505050505050505050565b60008054604051634c532de160e01b81526001600160a01b0390911691634c532de19161128691356001600160e01b03191690600401611d86565b60206040518083038186803b15801561129e57600080fd5b505afa1580156112b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d69190611c46565b156112f35760405162461bcd60e51b815260040161036190611dc9565b6000805460405163f12f1bbf60e01b815233600482015287929182916001600160a01b039091169063f12f1bbf90602401604080518083038186803b15801561133b57600080fd5b505afa15801561134f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113739190611ad6565b915091508080156113955750826001600160a01b0316826001600160a01b0316145b806113b857506113a36117f0565b6001600160a01b0316336001600160a01b0316145b80611457575060008054906101000a90046001600160a01b03166001600160a01b0316630b52d12d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561140a57600080fd5b505afa15801561141e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114429190611932565b6001600160a01b0316336001600160a01b0316145b6114735760405162461bcd60e51b815260040161036190611d9b565b856114b55760405162461bcd60e51b815260206004820152601260248201527150504d3a534c413a4e4f5f4c454e4445525360701b6044820152606401610361565b8584146115045760405162461bcd60e51b815260206004820152601760248201527f50504d3a534c413a4c454e4754485f4d49534d415443480000000000000000006044820152606401610361565b60005b868110156115ae5785858281811061152157611521611e35565b90506020020160208101906115369190611c29565b6001600160a01b038a166000908152600460205260408120908a8a8581811061156157611561611e35565b9050602002016020810190611576919061190e565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556115a781611e04565b9050611507565b50876001600160a01b03167f23a8ff2c1134a2e1cad7b971afe1e92d4545e8871e8e12fae60e3bdce6a4dde4888888886040516109739493929190611ce2565b60008054604051634c532de160e01b81526001600160a01b0390911691634c532de19161162991356001600160e01b03191690600401611d86565b60206040518083038186803b15801561164157600080fd5b505afa158015611655573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116799190611c46565b156116965760405162461bcd60e51b815260040161036190611dc9565b61169e6117f0565b6001600160a01b0316336001600160a01b03161480611751575060008054906101000a90046001600160a01b03166001600160a01b0316630b52d12d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561170457600080fd5b505afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c9190611932565b6001600160a01b0316336001600160a01b0316145b6117915760405162461bcd60e51b815260206004820152601160248201527050504d3a4e4f545f474f565f4f525f4f4160781b6044820152606401610361565b6001600160a01b038216600081815260016020908152604091829020805460ff191685151590811790915591519182527f24a9c541c88fdc2d071ec9ec7065e96f270ce6611c4a588d312c765e034094ba910160405180910390a25050565b6000610a7f610a7b60017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104611ded565b6000600383141561183357506001610a43565b6001600160a01b0380861660009081526004602090815260408083209388168352929052205460ff161561186957506001610a43565b8261187657506000610a43565b600283141561188457600091505b506001600160a01b03808516600090815260056020908152604080832085845282528083205493871683526002909152902054811614949350505050565b60008083601f8401126118d457600080fd5b50813567ffffffffffffffff8111156118ec57600080fd5b6020830191508360208260051b850101111561190757600080fd5b9250929050565b60006020828403121561192057600080fd5b813561192b81611e4b565b9392505050565b60006020828403121561194457600080fd5b815161192b81611e4b565b6000806040838503121561196257600080fd5b823561196d81611e4b565b9150602083013561197d81611e4b565b809150509250929050565b60008060006060848603121561199d57600080fd5b83356119a881611e4b565b925060208401356119b881611e4b565b929592945050506040919091013590565b6000806000806000606086880312156119e157600080fd5b85356119ec81611e4b565b9450602086013567ffffffffffffffff80821115611a0957600080fd5b611a1589838a016118c2565b90965094506040880135915080821115611a2e57600080fd5b50611a3b888289016118c2565b969995985093965092949392505050565b60008060008060608587031215611a6257600080fd5b8435611a6d81611e4b565b9350602085013567ffffffffffffffff811115611a8957600080fd5b611a95878288016118c2565b9598909750949560400135949350505050565b60008060408385031215611abb57600080fd5b8235611ac681611e4b565b9150602083013561197d81611e63565b60008060408385031215611ae957600080fd5b8251611af481611e4b565b602084015190925061197d81611e63565b60008060408385031215611b1857600080fd5b8235611b2381611e4b565b946020939093013593505050565b60008060008060008060808789031215611b4a57600080fd5b8635611b5581611e4b565b955060208701359450604087013567ffffffffffffffff80821115611b7957600080fd5b611b858a838b016118c2565b90965094506060890135915080821115611b9e57600080fd5b50611bab89828a016118c2565b979a9699509497509295939492505050565b60008060008060408587031215611bd357600080fd5b843567ffffffffffffffff80821115611beb57600080fd5b611bf7888389016118c2565b90965094506020870135915080821115611c1057600080fd5b50611c1d878288016118c2565b95989497509550505050565b600060208284031215611c3b57600080fd5b813561192b81611e63565b600060208284031215611c5857600080fd5b815161192b81611e63565b8183526000602080850194508260005b85811015611ca1578135611c8681611e4b565b6001600160a01b031687529582019590820190600101611c73565b509495945050505050565b81835260006001600160fb1b03831115611cc557600080fd5b8260051b8083602087013760009401602001938452509192915050565b604081526000611cf6604083018688611c63565b8281036020848101919091528482528591810160005b86811015611d33578335611d1f81611e63565b151582529282019290820190600101611d0c565b5098975050505050505050565b604081526000611d54604083018688611c63565b8281036020840152611d67818587611cac565b979650505050505050565b604081526000611d54604083018688611cac565b6001600160e01b031991909116815260200190565b60208082526014908201527350504d3a4e4f545f50445f474f565f4f525f4f4160601b604082015260600190565b6020808252600a90820152691414134e94105554d15160b21b604082015260600190565b600082821015611dff57611dff611e1f565b500390565b6000600019821415611e1857611e18611e1f565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114611e6057600080fd5b50565b8015158114611e6057600080fdfea26469706673582212209c81b46b8cdf1dfdfed855effb0b22a4c6838ffd909956e810d66632938ce07764736f6c63430008070033","name":"MaplePoolPermissionManager","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"london","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":true,"additional_sources":[{"file_path":"modules/pool-permission-manager/contracts/interfaces/IMaplePoolPermissionManager.sol","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.7;\n\nimport { INonTransparentProxied } from \"../../modules/ntp/contracts/interfaces/INonTransparentProxied.sol\";\n\nimport { IMaplePoolPermissionManagerStorage } from \"./IMaplePoolPermissionManagerStorage.sol\";\n\ninterface IMaplePoolPermissionManager is IMaplePoolPermissionManagerStorage, INonTransparentProxied {\n\n    /**************************************************************************************************************************************/\n    /*** Events                                                                                                                         ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Emitted when the lender allowlist is updated.\n     *  @param poolManager Address of the pool manager.\n     *  @param lenders     List of lender addresses to set the allowlist for.\n     *  @param booleans    List of boolean values.\n     */\n    event LenderAllowlistSet(address indexed poolManager, address[] lenders, bool[] booleans);\n\n    /**\n     *  @dev   Emitted when lender bitmaps are updated.\n     *  @param lenders List of lender addresses to set the bitmaps for.\n     *  @param bitmaps List of permission bitmaps.\n     */\n    event LenderBitmapsSet(address[] lenders, uint256[] bitmaps);\n\n    /**\n     *  @dev   Emitted when a permission admin has been updated.\n     *  @param account Address of the updated account.\n     *  @param isAdmin `true` if the account is a permission admin, `false` if not.\n     */\n    event PermissionAdminSet(address indexed account, bool isAdmin);\n\n    /**\n     *  @dev   Emitted when pool bitmaps are updated.\n     *  @param poolManager Address of the pool manager.\n     *  @param functionIds List of function identifiers to set the bitmaps for.\n     *  @param bitmaps     List of permission bitmaps.\n     */\n    event PoolBitmapsSet(address indexed poolManager, bytes32[] functionIds, uint256[] bitmaps);\n\n    /**\n     *  @dev   Emitted when the permission level of a pool is updated.\n     *  @param poolManager     Address of the pool manager.\n     *  @param permissionLevel Pool permission level.\n     */\n    event PoolPermissionLevelSet(address indexed poolManager, uint256 permissionLevel);\n\n    /**************************************************************************************************************************************/\n    /*** Functions                                                                                                                      ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Configures the permissions of a pool.\n     *  @param poolManager     Address of the pool manager.\n     *  @param permissionLevel Permission level of the pool.\n     *  @param functionIds     List of function identifiers to set the bitmaps for.\n     *  @param poolBitmaps     List of permission bitmaps.\n     */\n    function configurePool(\n        address poolManager,\n        uint256 permissionLevel,\n        bytes32[] calldata functionIds,\n        uint256[] calldata poolBitmaps\n    ) external;\n\n    /**\n     *  @dev    Checks if the lender has permission to interact with a pool.\n     *          The function identifier defines the function to check the permission for.\n     *  @param  poolManager   Address of the pool manager.\n     *  @param  lender        Address of the lender.\n     *  @param  functionId    Function identifier.\n     *  @return hasPermission `true` if the lender has permission, `false` if not.\n     */\n    function hasPermission(address poolManager, address lender, bytes32 functionId) external view returns (bool hasPermission);\n\n    /**\n     *  @dev    Checks if one or more lenders have permission to interact with a pool.\n     *          The function identifier defines the function to check the permission for.\n     *  @param  poolManager   Address of the pool manager.\n     *  @param  lenders       List of lender addresses.\n     *  @param  functionId    Function identifier.\n     *  @return hasPermission `true` if all lenders have permission, `false` if not.\n     */\n    function hasPermission(address poolManager, address[] calldata lenders, bytes32 functionId) external view returns (bool hasPermission);\n\n    /**\n     *  @dev   Sets the allowlist status of one or more lenders.\n     *  @param poolManager Address of the pool manager.\n     *  @param lenders     List of lender addresses to set the allowlist for.\n     *  @param booleans    List of boolean values.\n     */\n    function setLenderAllowlist(address poolManager, address[] calldata lenders, bool[] calldata booleans) external;\n\n    /**\n     *  @dev   Sets the permission bitmaps of one or more lenders.\n     *  @param lenders List of lender addresses to set the bitmaps for.\n     *  @param bitmaps List of permission bitmaps.\n     */\n    function setLenderBitmaps(address[] calldata lenders, uint256[] calldata bitmaps) external;\n\n    /**\n     *  @dev   Sets the permission admin status of an account.\n     *  @param account           Address of the account.\n     *  @param isPermissionAdmin `true` if the account is a permission admin, `false` if not.\n     */\n    function setPermissionAdmin(address account, bool isPermissionAdmin) external;\n\n    /**\n     *  @dev   Sets the permission bitmaps of a pool.\n     *  @param poolManager Address of the pool manager.\n     *  @param functionIds List of function identifiers to set the bitmaps for.\n     *  @param bitmaps     List of permission bitmaps.\n     */\n    function setPoolBitmaps(address poolManager, bytes32[] calldata functionIds, uint256[] calldata bitmaps) external;\n\n    /**\n     *  @dev    Sets the permission level of a pool.\n     *          Permission levels: private (0), function-level (1), pool-level (2), public (3)\n     *          NOTE: Bitmaps must be set before setting the permission level to function-level (1) or pool-level (2).\n     *                Otherwise, the pool will be permissionless by default to un-set lenders.\n     *  @param  poolManager     Address of the pool manager.\n     *  @param  permissionLevel Pool permission level.\n     */\n    function setPoolPermissionLevel(address poolManager, uint256 permissionLevel) external;\n\n}\n"},{"file_path":"modules/pool-permission-manager/contracts/interfaces/IMaplePoolPermissionManagerStorage.sol","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.7;\n\ninterface IMaplePoolPermissionManagerStorage {\n\n    /**************************************************************************************************************************************/\n    /*** Functions                                                                                                                      ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Returns the address of the `MapleGlobals` contract.\n     *  @return globals Address of the `MapleGlobals` contract.\n     */\n    function globals() external view returns (address globals);\n\n    /**\n     *  @dev    Checks if a pool has allowlisted a lender.\n     *  @param  poolManager   Address of the pool manager.\n     *  @param  lender        Address of the lender.\n     *  @return isAllowlisted `true` if the lender is allowlisted, `false` if not.\n     */\n    function lenderAllowlist(address poolManager, address lender) external view returns (bool isAllowlisted);\n\n    /**\n     *  @dev    Returns the permission bitmap of a lender.\n     *  @param  lender Address of the lender.\n     *  @return bitmap Permission bitmap of the lender.\n     */\n    function lenderBitmaps(address lender) external view returns (uint256 bitmap);\n\n    /**\n     *  @dev    Checks if the account is a permission admin.\n     *  @param  account Address of the account.\n     *  @return isAdmin `true` if the account is a permission admin, `false` if not.\n     */\n    function permissionAdmins(address account) external view returns (bool isAdmin);\n\n    /**\n     *  @dev    Returns the permission level of a pool.\n     *          Permission levels: private (0), function-level (1), pool-level (2), public (3)\n     *  @param  poolManager     Address of the pool manager.\n     *  @return permissionLevel Permission level of the pool.\n     */\n    function permissionLevels(address poolManager) external view returns (uint256 permissionLevel);\n\n    /**\n     *  @dev    Returns a function-specific pool permission bitmap.\n                Return the pool-level permission bitmap if the function identifier is zero.\n     *  @param  poolManager Address of the pool manager.\n     *  @param  functionId  Identifier of the function (zero if none).\n     *  @return bitmap      Permission bitmap of the pool.\n     */\n    function poolBitmaps(address poolManager, bytes32 functionId) external view returns (uint256 bitmap);\n\n}\n"},{"file_path":"modules/pool-permission-manager/contracts/interfaces/Interfaces.sol","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.7;\n\ninterface IGlobalsLike {\n\n    function governor() external view returns (address);\n\n    function isFunctionPaused(bytes4 sig_) external view returns (bool isFunctionPaused_);\n\n    function isInstanceOf(bytes32 key, address account) external view returns (bool);\n\n    function operationalAdmin() external view returns (address operationalAdmin);\n\n    function poolDelegates(address poolDelegate) external view returns (address ownedPoolManager, bool isPoolDelegate);\n\n}\n"},{"file_path":"modules/pool-permission-manager/contracts/proxy/MaplePoolPermissionManagerStorage.sol","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.7;\n\nimport { IMaplePoolPermissionManagerStorage } from \"../interfaces/IMaplePoolPermissionManagerStorage.sol\";\n\ncontract MaplePoolPermissionManagerStorage is IMaplePoolPermissionManagerStorage {\n\n    address public override globals;\n\n    mapping(address => bool) public override permissionAdmins;\n\n    mapping(address => uint256) public override lenderBitmaps;\n\n    mapping(address => uint256) public override permissionLevels;\n\n    mapping(address => mapping(address => bool)) public override lenderAllowlist;\n\n    mapping(address => mapping(bytes32 => uint256)) public override poolBitmaps;\n\n}\n"},{"file_path":"modules/pool-permission-manager/modules/ntp/contracts/NonTransparentProxied.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\npragma solidity ^0.8.7;\n\nimport { INonTransparentProxied } from \"./interfaces/INonTransparentProxied.sol\";\n\ncontract NonTransparentProxied is INonTransparentProxied {\n\n    bytes32 internal constant ADMIN_SLOT          = bytes32(uint256(keccak256(\"eip1967.proxy.admin\"))          - 1);\n    bytes32 internal constant IMPLEMENTATION_SLOT = bytes32(uint256(keccak256(\"eip1967.proxy.implementation\")) - 1);\n\n    function admin() public view override returns (address admin_) {\n        admin_ = _getAddress(ADMIN_SLOT);\n    }\n\n    function implementation() public view override returns (address implementation_) {\n        implementation_ = _getAddress(IMPLEMENTATION_SLOT);\n    }\n\n    function _getAddress(bytes32 slot_) internal view returns (address value_) {\n        assembly {\n            value_ := sload(slot_)\n        }\n    }\n\n}\n"},{"file_path":"modules/pool-permission-manager/modules/ntp/contracts/interfaces/INonTransparentProxied.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\npragma solidity ^0.8.7;\n\ninterface INonTransparentProxied {\n\n    /**\n     *  @dev    Returns the proxy's admin address.\n     *  @return admin_ The address of the admin.\n     */\n    function admin() external view returns (address admin_);\n\n    /**\n     *  @dev    Returns the proxy's implementation address.\n     *  @return implementation_ The address of the implementation.\n     */\n    function implementation() external view returns (address implementation_);\n\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolManager","type":"address"},{"indexed":false,"internalType":"address[]","name":"lenders","type":"address[]"},{"indexed":false,"internalType":"bool[]","name":"booleans","type":"bool[]"}],"name":"LenderAllowlistSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"lenders","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"bitmaps","type":"uint256[]"}],"name":"LenderBitmapsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isAdmin","type":"bool"}],"name":"PermissionAdminSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolManager","type":"address"},{"indexed":false,"internalType":"bytes32[]","name":"functionIds","type":"bytes32[]"},{"indexed":false,"internalType":"uint256[]","name":"bitmaps","type":"uint256[]"}],"name":"PoolBitmapsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolManager","type":"address"},{"indexed":false,"internalType":"uint256","name":"permissionLevel","type":"uint256"}],"name":"PoolPermissionLevelSet","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"admin_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"poolManager_","type":"address"},{"internalType":"uint256","name":"permissionLevel_","type":"uint256"},{"internalType":"bytes32[]","name":"functionIds_","type":"bytes32[]"},{"internalType":"uint256[]","name":"poolBitmaps_","type":"uint256[]"}],"name":"configurePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"globals","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"poolManager_","type":"address"},{"internalType":"address[]","name":"lenders_","type":"address[]"},{"internalType":"bytes32","name":"functionId_","type":"bytes32"}],"name":"hasPermission","outputs":[{"internalType":"bool","name":"hasPermission_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"poolManager_","type":"address"},{"internalType":"address","name":"lender_","type":"address"},{"internalType":"bytes32","name":"functionId_","type":"bytes32"}],"name":"hasPermission","outputs":[{"internalType":"bool","name":"hasPermission_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"implementation_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"lenderAllowlist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lenderBitmaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"permissionAdmins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"permissionLevels","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"poolBitmaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"poolManager_","type":"address"},{"internalType":"address[]","name":"lenders_","type":"address[]"},{"internalType":"bool[]","name":"booleans_","type":"bool[]"}],"name":"setLenderAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lenders_","type":"address[]"},{"internalType":"uint256[]","name":"bitmaps_","type":"uint256[]"}],"name":"setLenderBitmaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"permissionAdmin_","type":"address"},{"internalType":"bool","name":"isPermissionAdmin_","type":"bool"}],"name":"setPermissionAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolManager_","type":"address"},{"internalType":"bytes32[]","name":"functionIds_","type":"bytes32[]"},{"internalType":"uint256[]","name":"bitmaps_","type":"uint256[]"}],"name":"setPoolBitmaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolManager_","type":"address"},{"internalType":"uint256","name":"permissionLevel_","type":"uint256"}],"name":"setPoolPermissionLevel","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":false,"constructor_args":null}