creation_sourcecode: {{
    "language": "Solidity",
    "sources": {
      "src/factory/DestinyFactory.sol": {
        "content": "/*=======================================================================================================================\n#                                                           ..                                                          #\n#                                                           ::                                                          #\n#                                                           !!                                                          #\n#                                                          .77.                                                         #\n#                                                          ~77~                                                         #\n#                                                         .7777.                                                        #\n#                                                         !7777!                                                        #\n#                                                        ^777777^                                                       #\n#                                                       ^77777777^                                                      #\n#                                                      ^777!~~!777^                                                     #\n#                                                     ^7777!::!7777^                                                    #\n#                                                   .~77777!  !77777~.                                                  #\n#                                                  :!77777!:  :!77777!:                                                 #\n#                                                 ~777777!^    ^!777777~                                                #\n#                                               :!7777777^      ^7777777!:                                              #\n#                                             :!77777777:        :77777777!:                                            #\n#                                           :!77777777!.          .!77777777!:                                          #\n#                                        .^!77777777!^              ^!77777777!^.                                       #\n#                                      :~7777777777^.       ..       .^7777777777~:                                     #\n#                                   .^!777777777!^.         ^^         .^!777777777!^.                                  #\n#                               .:~!777777777!~:           :77:           :~!777777777!~:.                              #\n#                           .:^!7777777777!~:             ^7777^             :~!7777777777!^:.                          #\n#                     ..:^~!77777777!!~^:.             .^!777777!^.             .:^~!!77777777!~^:..                    #\n#           ...::^^~!!77777777~~^^:..              .:^!777777777777!^:.              ..:^^~~77777777!!~^^::...          #\n#           ...::^^~!!77777777~~^^:..              .:^!777777777777!^:.              ..:^^~~77777777!!~^^::...          #\n#                     ..:^~!77777777!!~^:.             .^!777777!^.             .:^~!!77777777!~^:..                    #\n#                           .:^!7777777777!~:             ^7777^             :~!7777777777!^:.                          #\n#                               .:~!777777777!~:           :77:           :~!777777777!~:.                              #\n#                                   .^!777777777!^.         ^^         .^!777777777!^.                                  #\n#                                      :~7777777777^.       ..       .^7777777777~:                                     #\n#                                        .^!77777777!^              ^!77777777!^.                                       #\n#                                           :!77777777!.          .!77777777!:                                          #\n#                                             :!77777777:        :77777777!:                                            #\n#                                               :!7777777^      ^7777777!:                                              #\n#                                                 ~777777!^    ^!777777~                                                #\n#                                                  :!77777!:  :!77777!:                                                 #\n#                                                   .~77777!  !77777~.                                                  #\n#                                                     ^7777!::!7777^                                                    #\n#                                                      ^777!~~!777^                                                     #\n#                                                       ^77777777^                                                      #\n#                                                        ^777777^                                                       #\n#                                                         !7777!                                                        #\n#                                                         .7777.                                                        #\n#                                                          ~77~                                                         #\n#                                                          .77.                                                         #\n#                                                           !!                                                          #\n#                                                           ::                                                          #\n#                                                           ..                                                          #\n#                                                                                                                       #\n/*=======================================================================================================================\n#                                                                                                                       #\n#     ██████╗ ███████╗███████╗████████╗██╗███╗   ██╗██╗   ██╗████████╗███████╗███╗   ███╗██████╗ ██╗     ███████╗       #   \n#     ██╔══██╗██╔════╝██╔════╝╚══██╔══╝██║████╗  ██║╚██╗ ██╔╝╚══██╔══╝██╔════╝████╗ ████║██╔══██╗██║     ██╔════╝       #\n#     ██║  ██║█████╗  ███████╗   ██║   ██║██╔██╗ ██║ ╚████╔╝    ██║   █████╗  ██╔████╔██║██████╔╝██║     █████╗         #\n#     ██║  ██║██╔══╝  ╚════██║   ██║   ██║██║╚██╗██║  ╚██╔╝     ██║   ██╔══╝  ██║╚██╔╝██║██╔═══╝ ██║     ██╔══╝         #\n#     ██████╔╝███████╗███████║   ██║   ██║██║ ╚████║   ██║      ██║   ███████╗██║ ╚═╝ ██║██║     ███████╗███████╗       #\n#     ╚═════╝ ╚══════╝╚══════╝   ╚═╝   ╚═╝╚═╝  ╚═══╝   ╚═╝      ╚═╝   ╚══════╝╚═╝     ╚═╝╚═╝     ╚══════╝╚══════╝       #\n#                                                                                                                       #\n=========================================================================================================================\n#            __                                 __                               __                                     #\n#           /  \\ |  o     _  ._ _  o     _.    /  \\  _  _  | _|_  _ |  _.       /  \\    o _  o                          #\n#          | (|/ |< | \\/ (_) | | | | \\/ (_|   | (|/ _> (_) |  |_ (_ | (_| \\/   | (|/ >< | /_ |                          #\n#           \\__       /              /         \\__                        /     \\__                                     #\n#            __                                  __                                    __                               #\n#           /  \\  _             _. o ._   _     /  \\  _|                    _. ._     /  \\  _ o  _  _.  _|  _.          #\n#          | (|/ _> |_| \\/ |_| (_| | | | (_|   | (|/ (_| |_| \\/ |_| >< |_| (_| | |   | (|/ (_ | (_ (_| (_| (_|          #\n#           \\__         /        |        _|    \\__          /                        \\__                               #\n#            __                             __                    __              __                                    #\n#           /  \\ o o  _. ._          _     /  \\     ._ _   _     /  \\     | o    /  \\ |_   _. ._    |   _.              #\n#          | (|/ | | (_| | | \\/ |_| (/_   | (|/ |_| | | | (_)   | (|/ |_| | |   | (|/ | | (_| | |_| |< (_|              #\n#           \\__ _|           /             \\__                   \\__             \\__                                    #\n#                                                                                                                       #\n#=======================================================================================================================*/\n// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.19;\n\n//common\nimport {IDestinyFactory} from \"factory/interfaces/IDestinyFactory.sol\";\nimport {DeployType} from \"factory/enum/DeployType.sol\";\nimport {ProxyType} from \"factory/enum/ProxyType.sol\";\nimport {CodeType} from \"factory/enum/CodeType.sol\";\nimport {Lib_DestinyFactory} from \"factory/libraries/Lib_DestinyFactory.sol\";\nimport {IOwnershipValidator} from \"interfaces/IOwnershipValidator.sol\";\nimport {Module} from \"struct/Module.sol\";\nimport {BytesLib_3} from \"libraries/BytesLib_3.sol\";\n//proxies\nimport {DestinyTempleV7ShadowProxy} from \"proxies/shadow/DestinyTempleV7ShadowProxy.sol\";\nimport {DestinyTempleV7BeaconProxy} from \"proxies/beacon/DestinyTempleV7BeaconProxy.sol\";\nimport {DestinyTempleV7DiamondProxy} from \"proxies/diamond/DestinyTempleV7DiamondProxy.sol\";\nimport {ERC1967UpgradeableBeacon} from \"proxies/beacon/ERC1967UpgradeableBeacon.sol\";\nimport {ERC1967UpgradeableBeaconProxy} from \"proxies/beacon/ERC1967UpgradeableBeaconProxy.sol\";\nimport {ERC1967UniversalUpgradableProxy} from \"proxies/uups/ERC1967UniversalUpgradableProxy.sol\";\n\n/**\n>>>EIP-6780:自毁将发送所有以太(wei),但不删除账户,除非其在部署的同一交易中使用;\n    >>>更新:仍然使用所有权分离-Create3模式,但为[最小[存在检查自毁创建者]合约(Creator)]增加字节码检查.\n    >>>理由:其他EVM兼容链可能不会实施EIP-6780.\n    >>>当在主网[解离]终端代理合约时,合约将不会被删除,但在其他EVM兼容链上,合约可能被删除.\n    >>>[最小[存在检查自毁创建者]合约(Creator)]将检查合约是否存在以决定是否跳过合约部署并直接以终端代理合约为受益人自毁.\n    >>>这可以保证无论链是否实施EIP-6780提案,工厂合约的行为相同.\n * @title 最小[存在检查自毁创建者]合约(Creator)\n * @author kiyomiya.eth\n * NOTE: 此合约将在被调用时\n            2.预计算部署目的地,检查其字节码大小,若不为0则跳过3\n            3.通过[create][nonce:1]创建合约,数据起始位置[0x00],数据大小[calldatasize()]\n            4.自毁并发送所有以太币至部署目的地.\n            >>>此合约不返回创建的合约地址,因为其已被SELFDESTRUCT弹出栈,应当自行计算.\n\n    ////////////////////////////////////////////////////////////////////////////////////////////////\n    RUNTIMECODE\n    PC      NAME            OPCODE  DATA    STACK                           OP\n    //在内存中存储'd694${creator自身地址}01'(地址与nonce1RLP编码结果)\n    0000    PUSH1           60      01      01                              入栈 01\n    0002    PUSH1           60      15      15 01                           入栈 0\n    0004    MSTORE          52                                              出栈 15 01 |将[01]存储到内存位置[0x15]\n    0005    ADDRESS         30              creator                         入栈 creator |加载自身地址入栈     \n    0006    PUSH1           60      14      14 creator                      入栈 14\n    0008    MSTORE          52                                              出栈 14 creator |将[creator]存储到内存位置[0x14]\n    \n    0009    PUSH2           61      d694    d694                            入栈 d694\n    000c    RETURNDATASIZE  3d                                              入栈 0b\n    000d    MSTORE          52                                              出栈 0 d694 |将[d964]存储到内存位置[0x0b]\n    60016015523060145261d6943d52\n    //计算create地址\n    000e    PUSH1           60      17      17                              入栈 17\n    0010    PUSH1           60      12      12 17                           入栈 12 \n    0012    SHA3            20              hash                            出栈 12 17 |入栈 hash |从内存位置[0x12]读取其后[0x17]字节数据进行keccak256哈希运算\n    //转换为地址\n    0013    PUSH1           60      60      60 hash                         入栈 60\n    0015    SHL             1b              shl_hash                        出栈 60 hash |入栈 shl_hash |将[hash]左移[0x60]位\n    0016    PUSH1           60      60      60 shl_hash                     入栈 60 \n    0018    SHR             1c              addr                            出栈 60 shl_hash |入栈 addr |将[shl_hash]右移[0x60]位\n    0019    DUP1            80              addr addr                       入栈 addr |复制栈中[第一个]元素[addr]入栈\n    //判断addr的字节码大小是否为0\n    001a    EXTCODESIZE     3b              codesize addr                   出栈 addr |入栈 codesize |加载地址[addr]的字节码大小入栈\n    001b    PUSH1           60      27      27 codesize addr                入栈 27\n    001d    JUMPI           57              addr>>>                         出栈 27 codesize |若[codesize]不为0(false)则跳转至第[0x27]个操作码,否则继续执行\n    //若addr的字节码为0则部署合约\n    001e    POP             50                                              出栈 addr |弹出栈顶元素\n    001f    CALLDATASIZE    36              cds                             入栈 cds |加载调用数据长度入栈\n    0020    RETURNDATASIZE  3d              0 cds                           入栈 rds |加载返回数据长度[0x00]入栈\n    0021    RETURNDATASIZE  3d              0 0 cds                         入栈 rds |加载返回数据长度[0x00]入栈\n    0022    CALLDATACOPY    37                                              出栈 0 0 cds |从调用数据索引[0x00]处复制[cds]长度到内存位置[0x00]\n    0023    CALLDATASIZE    36              cds                             入栈 cds |加载调用数据长度入栈\n    0024    RETURNDATASIZE  3d              0 cds                           入栈 rds |加载返回数据长度[0x00]入栈\n    0025    CALLVALUE       34              val 0 cds                       入栈 val |加载调用发送的wei入栈\n    0026    CREATE          f0              createAddr                      出栈 val 0 cds |入栈 createAddr|使用内存位置[0x00],长度[cds]的字节码创建合约并发送[val]wei,输出创建地址\n    //否则直接自毁\n    0027    JUMPDEST        5b              addr                            标记跳转目的地\n    0028    SELFDESTRUCT    ff                                              出栈 addr |停止执行,标记销毁合约并在整个交易结束后执行,强制向[addr]发送所有以太币(wei),不触发其回退函数 \n    ////////////////////////////////////////////////////////////////////////////////////////////////\n    CREATIONCODE\n    PC      NAME            OPCODE  DATA    STACK                           OP\n    0000    PUSH9           68      rtc2    rtc2                            入栈 rtc2[3d3d37363d34f05bff]\n    0001    PUSH1           60      09      09 rtc2                         入栈 09\n    0002    MSTORE          52                                              出栈 09 rtc1 |将[rtc1]存储到内存位置[0x09]\n    0000    PUSH32          7f      rtc1    rtc1                            入栈 rtc1[60016015523060145261d6943d526017601e2060601b60601c803b6027575036]\n    0001    RETURNDATASIZE  3d              0 rtc1                          入栈 0\n    0002    MSTORE          52                                              出栈 0 rtc1 |将[rtc1]存储到内存位置[0x00]\n    0004    PUSH1           60      29      29                              入栈 29\n    0003    RETURNDATASIZE  3d              0 29                            入栈 0\n    0026    RETURN          f3                                              出栈 0 29 |返回内存位置[0x00]长度[0x29]的数据 |此作为运行时字节码\n    ////////////////////////////////////////////////////////////////////////////////////////////////\n    RUNTIMECODE\n    0x\n    60016015523060145261d6943d526017601e2060601b60601c803b60275750363d3d37363d34f05bff\n    ////////////////////////////////////////////////////////////////////////////////////////////////\n    CREATIONCODE\n    0x\n    683d3d37363d34f05bff6009527f60016015523060145261d6943d526017601e2060601b60601c803b60275750363d5260293df3\n    ////////////////////////////////////////////////////////////////////////////////////////////////\n    //更新-所有权验证现在由工厂合约完成\n    >>>Sepolia测试交易\n        >>>部署[DestinyFactory]\n        https://sepolia.etherscan.io/tx/0x5cf8d7beba87ee6d9c20bd60dbeaee0bdafef22f7b72dc85279057b11c8596ac\n        >>>调用[DestinyFactory]选择[create3]方式部署[测试合约]\n            >>>其会使用[create2]部署[Creator]合约并调用[Creator]通过[create]部署[测试合约(另一个[Creator])]\n            https://sepolia.etherscan.io/tx/0x394e65ba2166c94744cbddb67430672f353cd9b08f5e2866b81d4b7e74cda11c\n        >>>此时[Creator]合约自毁,测试合约未自毁\n        >>>再次调用[DestinyFactory]选择[create3]方式部署[测试合约]\n            >>>其会重新召集[Creator]合约,[Creator]合约会检查到[测试合约]未自毁(字节码大小不为0),跳过部署而直接自毁,交易成功\n            https://sepolia.etherscan.io/tx/0x972c6b27c3a8ddcd37191bf9950bdf6a4c2d5a5128b52007ae86babc4e6bc237\n        >>>直接调用[测试合约](Creator),其(部署一个合约后)自毁\n        https://sepolia.etherscan.io/tx/0xcab1457cacedc9b2a81b1f5bab1264eeb73767d98555ad9ce3da34951162bc64\n        >>>再次使用相同数据调用[DestinyFactory]选择[create3]方式部署[测试合约]\n            >>>其会使用[create2]部署[Creator]合约,[Creator]合约会检查到[测试合约]已自毁(字节码大小为0)并通过[create]重新召集[测试合约]并自毁\n            https://sepolia.etherscan.io/tx/0x74ac536be2c6b18748f20b88402ca229fecc3f6f20ec9327f486a4e3df8a0648\n        >>>可以看到,[Creator]与[测试合约]部署在确定的地址上,随后[Creator]合约自毁,而无论[测试合约](在生产中为终端合约)是否能够自毁,用户都能重新部署并自毁[Creator]合约\n            >>>调用[DestinyFactory]在一笔交易中(如果链未实施EIP-6780提案则可以在不同的交易中)在相同的地址上重新部署[任意合约代码]\n            >>>需要通过所有权验证\n    ////////////////////////////////////////////////////////////////////////////////////////////////\n*/\ncontract DestinyFactory is IDestinyFactory{\n    bytes private constant CREATOR_CREATIONCODE = hex\"683d3d37363d34f05bff6009527f60016015523060145261d6943d526017601e2060601b60601c803b60275750363d5260293df3\";\n\n    constructor() payable {\n        Lib_DestinyFactory.storage_DestinyFactory().nonce = 1;\n    }\n\n    //create3专用\n    function verifyOwnership\n    (\n        address verifyContract,\n        bytes memory verifyData\n    )\n        public\n    {\n        address validator = Lib_DestinyFactory.storage_DestinyFactory()._verifyContract[msg.sender];\n        if(validator == address(0) && verifyContract != address(0)) validator =  verifyContract;\n        //只在验证合约不是0时进行\n        if(validator != address(0)) {\n            (bool s ,bytes memory r) = validator.call(abi.encodeCall(IOwnershipValidator.verifyOwnership,(verifyData)));\n            require(s,\"DestinyFactory:verifyOwnership Failed!\");\n            if(verifyContract != address(this)) {\n                Lib_DestinyFactory.storage_DestinyFactory()._verifyContract[msg.sender] = verifyContract;\n                emit ValidatorChanged(verifyContract);\n            }\n        }\n    }\n\n    function init(address addr,bytes memory initData) private returns(address) {\n        if(initData.length > 0) {\n            (bool s,) = addr.call(initData);\n            if(!s) revert(\"DestinyFactory:init fail\");\n        }\n        return addr;\n    }\n\n    function create\n    (\n        bytes memory creationCode\n    ) \n        private \n        returns(address addr) \n    {\n        assembly{ addr := create(callvalue(),add(creationCode,0x20),mload(creationCode)) }\n    }\n\n    function create2\n    (\n        bytes32 salt,\n        bytes memory creationCode\n    ) \n        private \n        returns(address addr) \n    {\n        assembly { addr := create2(callvalue(),add(creationCode,0x20),mload(creationCode),salt) }\n        if(keccak256(creationCode) == keccak256(CREATOR_CREATIONCODE)) revert(\"Disable create2 deploy creator!\");\n    }\n    \n    function create3\n    (\n        bytes32 salt,\n        address verifyContract,\n        bytes memory verifyData,\n        bytes memory creationCode\n    ) \n        private \n        returns(address addr) \n    {\n        bytes memory creatorCreationCode = CREATOR_CREATIONCODE;\n        (,address preDeployCreatorAddr) = create2Addr(salt,creatorCreationCode);\n        //creator必须被reinit,因为nonce必须为初始值\n        if(preDeployCreatorAddr.code.length > 0) revert(\"DestinyFactory:creator deployed!\");\n        //部署creator\n        address creator;\n        assembly { creator := create2(callvalue(),add(creatorCreationCode,0x20),mload(creatorCreationCode),salt) }\n        (,addr) = createAddr(creator,uint256(1));\n        //验证所有权\n        Lib_DestinyFactory.Storage_DestinyFactory storage ls = Lib_DestinyFactory.storage_DestinyFactory();\n        address validator = ls._verifyContract[addr];\n        if(validator == address(0) && verifyContract != address(0)) validator =  verifyContract;\n        //只在验证合约不是0时进行\n        if(validator != address(0)) {\n            (bool s ,bytes memory r) = validator.call(abi.encodeCall(IOwnershipValidator.verifyOwnership,(verifyData)));\n            require(s,\"DestinyFactory:verifyOwnership Failed!\");\n            //通过后,设置新验证合约\n            if(verifyContract != address(this)) {\n                ls._verifyContract[msg.sender] = verifyContract;\n            }\n        }\n        //调用creator部署creationCode\n        creator.call{value:msg.value}(creationCode);\n        emit Deployed(creator);\n    }\n\n    function createAddr(address _creator, uint256 _nonce)\n        private \n        pure\n        returns (address creator,address addr)\n    {\n        creator=_creator;\n        /// @solidity memory-safe-assembly\n        assembly {\n            for {} 1 {} {\n                // The integer zero is treated as an empty byte string,\n                // and as a result it only has a length prefix, 0x80,\n                // computed via `0x80 + 0`.\n\n                // A one-byte integer in the [0x00, 0x7f] range uses its\n                // own value as a length prefix,\n                // there is no additional `0x80 + length` prefix that precedes it.\n                if iszero(gt(_nonce, 0x7f)) {\n                    mstore(0x00, _creator)\n                    // Using `mstore8` instead of `or` naturally cleans\n                    // any dirty upper bits of `_creator`.\n                    mstore8(0x0b, 0x94)\n                    mstore8(0x0a, 0xd6)\n                    // `shl` 7 is equivalent to multiplying by 0x80.\n                    mstore8(0x20, or(shl(7, iszero(_nonce)), _nonce))\n                    addr := keccak256(0x0a, 0x17)\n                    break\n                }\n                let i := 8\n                // Just use a loop to generalize all the way with minimal bytecode size.\n                for {} shr(i, _nonce) { i := add(i, 8) } {}\n                // `shr` 3 is equivalent to dividing by 8.\n                i := shr(3, i)\n                // Store in descending slot sequence to overlap the values correctly.\n                mstore(i, _nonce)\n                mstore(0x00, shl(8, _creator))\n                mstore8(0x1f, add(0x80, i))\n                mstore8(0x0a, 0x94)\n                mstore8(0x09, add(0xd6, i))\n                addr := keccak256(0x09, add(0x17, i))\n                break\n            }\n        }\n    }\n\n    function create2Addr\n    (\n        bytes32 salt,\n        bytes memory creationCode\n    )\n        private\n        view\n        returns (\n            address creator,\n            address addr\n        )\n    {\n        creator = address(this);\n        addr = address(\n            uint160(\n                uint256(\n                    keccak256(\n                        abi.encodePacked(\n                            bytes1(0xff),\n                            address(this),\n                            salt,\n                            keccak256(creationCode)\n                        )\n                    )\n                )\n            )\n        );\n    }\n\n    function create3Addr\n    (\n        bytes32 salt\n    )\n        private\n        view\n        returns (\n            address creator,\n            address addr\n        )\n    {\n        (,creator) = create2Addr(salt,CREATOR_CREATIONCODE);\n        (,addr) = createAddr(creator,uint256(1));\n    }\n    ////////////////////////////////////////////////////////////////////////////////////////////////\n    function createDestinyTempleV7ShadowProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (address destinyTempleV7Beacon) = abi.decode(params,(address));\n        addr = create(\n            abi.encodePacked(\n                type(DestinyTempleV7ShadowProxy).creationCode,\n                abi.encode(destinyTempleV7Beacon)\n            )\n        );\n    }\n    function createDestinyTempleV7BeaconProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (address destinyTempleV7Beacon) = abi.decode(params,(address));\n        addr = create(\n            abi.encodePacked(\n                type(DestinyTempleV7BeaconProxy).creationCode,\n                abi.encode(destinyTempleV7Beacon)\n            )\n        );\n    }\n    function createDestinyTempleV7DiamondProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (Module[] memory mods) = abi.decode(params,(Module[]));\n        addr = create(\n            abi.encodePacked(\n                type(DestinyTempleV7DiamondProxy).creationCode,\n                abi.encode(abi.encode(mods))\n            )\n        );\n    }\n    function createERC1967UpgradeableBeacon\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            address admin,\n            address implementedAddr\n        ) = abi.decode(params,(address,address));\n        addr = create(\n            abi.encodePacked(\n                type(ERC1967UpgradeableBeacon).creationCode,\n                abi.encode(admin,implementedAddr)\n            )\n        );\n    }\n    function createERC1967UpgradeableBeaconProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            address admin,\n            address upgradeableBeaconAddr\n        ) = abi.decode(params,(address,address));\n        addr = create(\n            abi.encodePacked(\n                type(ERC1967UpgradeableBeaconProxy).creationCode,\n                abi.encode(admin,upgradeableBeaconAddr)\n            )\n        );\n    }\n    function createERC1967UniversalUpgradableProxy\n    (\n        bytes memory params \n    )\n        private\n        returns(address addr)\n    {\n        (address implementedAddr) = abi.decode(params,(address));\n        addr = create(\n            abi.encodePacked(\n                type(ERC1967UniversalUpgradableProxy).creationCode,\n                abi.encode(implementedAddr)\n            )\n        );\n    }\n\n    function createERC1167MinimalProxy\n    (\n        bytes memory params \n    )\n        private\n        returns(address addr)\n    {\n        (address implementedAddr) = abi.decode(params,(address));\n        addr = create(\n            getERC1167MinimalProxyCreationCode(implementedAddr)\n        );\n    }\n\n    function createERC7511MinimalProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (address implementedAddr) = abi.decode(params,(address));\n        addr = create(\n            getERC7511MinimalProxyCreationCode(implementedAddr)\n        );\n    }\n\n    function createDeploy\n    (\n        bytes memory creationCodeAndConstructorParameters_abiEncoded\n    )\n        private\n        returns(address addr)\n    {\n        addr = create(\n            creationCodeAndConstructorParameters_abiEncoded\n        );\n    }\n    ////////////////////////////////////////////////////////////////////////////////////////////////\n    function create2DestinyTempleV7ShadowProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address destinyTempleV7Beacon\n        ) = abi.decode(params,(bytes32,address));\n        addr = create2(\n            salt,\n            abi.encodePacked(\n                type(DestinyTempleV7ShadowProxy).creationCode,\n                abi.encode(destinyTempleV7Beacon)\n            )\n        );\n    }\n\n    function create2DestinyTempleV7BeaconProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address destinyTempleV7Beacon\n        ) = abi.decode(params,(bytes32,address));\n        addr = create2(\n            salt,\n            abi.encodePacked(\n                type(DestinyTempleV7BeaconProxy).creationCode,\n                abi.encode(destinyTempleV7Beacon)\n            )\n        );\n    }\n\n    function create2DestinyTempleV7DiamondProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            Module[] memory mods\n        ) = abi.decode(params,(bytes32,Module[]));\n        addr = create2(\n            salt,\n            abi.encodePacked(\n                type(DestinyTempleV7DiamondProxy).creationCode,\n                abi.encode(abi.encode(mods))\n            )\n        );\n    }\n\n    function create2ERC1967UpgradeableBeacon\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address admin,\n            address implementedAddr\n        ) = abi.decode(params,(bytes32,address,address));\n        addr = create2(\n            salt,\n            abi.encodePacked(\n                type(ERC1967UpgradeableBeacon).creationCode,\n                abi.encode(admin,implementedAddr)\n            )\n        );\n    }\n    function create2ERC1967UpgradeableBeaconProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address admin,\n            address upgradeableBeaconAddr\n        ) = abi.decode(params,(bytes32,address,address));\n        addr = create2(\n            salt,\n            abi.encodePacked(\n                type(ERC1967UpgradeableBeaconProxy).creationCode,\n                abi.encode(admin,upgradeableBeaconAddr)\n            )\n        );\n    }\n    function create2ERC1967UniversalUpgradableProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address implementedAddr\n        ) = abi.decode(params,(bytes32,address));\n        addr = create2(\n            salt,\n            abi.encodePacked(\n                type(ERC1967UniversalUpgradableProxy).creationCode,\n                abi.encode(implementedAddr)\n            )\n        );\n    }\n\n    function create2ERC1167MinimalProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address implementedAddr\n        ) = abi.decode(params,(bytes32,address));\n        addr = create2(\n            salt,\n            getERC1167MinimalProxyCreationCode(implementedAddr)\n        );\n    }\n\n    function create2ERC7511MinimalProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address implementedAddr\n        ) = abi.decode(params,(bytes32,address));\n        addr = create2(\n            salt,\n            getERC7511MinimalProxyCreationCode(implementedAddr)\n        );\n    }\n\n    function create2Deploy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            bytes memory creationCodeAndConstructorParameters_abiEncoded\n        ) = abi.decode(params,(bytes32,bytes));\n        addr = create2(\n            salt,\n            creationCodeAndConstructorParameters_abiEncoded\n        );\n    }\n    ////////////////////////////////////////////////////////////////////////////////////////////////\n    function create3DestinyTempleV7ShadowProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address verifyContract,\n            bytes memory verifyData,\n            address destinyTempleV7Beacon\n        ) = abi.decode(\n            params,\n            (\n                bytes32,\n                address,\n                bytes,\n                address\n            )\n        );\n        addr = create3(\n            salt,\n            verifyContract,\n            verifyData,\n            abi.encodePacked(\n                type(DestinyTempleV7ShadowProxy).creationCode,\n                abi.encode(destinyTempleV7Beacon)\n            )\n        );\n    }\n\n    function create3DestinyTempleV7BeaconProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address verifyContract,\n            bytes memory verifyData,\n            address destinyTempleV7Beacon\n        ) = abi.decode(\n            params,\n            (\n                bytes32,\n                address,\n                bytes,\n                address\n            )\n        );\n        addr = create3(\n            salt,\n            verifyContract,\n            verifyData,\n            abi.encodePacked(\n                type(DestinyTempleV7BeaconProxy).creationCode,\n                abi.encode(destinyTempleV7Beacon)\n            )\n        );\n    }\n\n    function create3DestinyTempleV7DiamondProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address verifyContract,\n            bytes memory verifyData,\n            Module[] memory mods\n        ) = abi.decode(\n            params,\n            (\n                bytes32,\n                address,\n                bytes,\n                Module[]\n            )\n        );\n        addr = create3(\n            salt,\n            verifyContract,\n            verifyData,\n            abi.encodePacked(\n                type(DestinyTempleV7DiamondProxy).creationCode,\n                abi.encode(abi.encode(mods))\n            )\n        );\n    }\n\n    function create3ERC1967UpgradeableBeacon\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address verifyContract,\n            bytes memory verifyData,\n            address admin,\n            address implementedAddr\n        ) = abi.decode(\n            params,\n            (\n                bytes32,\n                address,\n                bytes,\n                address,\n                address\n            )\n        );\n        addr = create3(\n            salt,\n            verifyContract,\n            verifyData,\n            abi.encodePacked(\n                type(ERC1967UpgradeableBeacon).creationCode,\n                abi.encode(admin,implementedAddr)\n            )\n        );\n    }\n\n    function create3ERC1967UpgradeableBeaconProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address verifyContract,\n            bytes memory verifyData,\n            address admin,\n            address implementedAddr\n        ) = abi.decode(\n            params,\n            (\n                bytes32,\n                address,\n                bytes,\n                address,\n                address\n            )\n        );\n        addr = create3(\n            salt,\n            verifyContract,\n            verifyData,\n            abi.encodePacked(\n                type(ERC1967UpgradeableBeacon).creationCode,\n                abi.encode(admin,implementedAddr)\n            )\n        );\n    }\n\n    function create3ERC1967UniversalUpgradableProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address verifyContract,\n            bytes memory verifyData,\n            address implementedAddr\n        ) = abi.decode(\n            params,\n            (\n                bytes32,\n                address,\n                bytes,\n                address\n            )\n        );\n        addr = create3(\n            salt,\n            verifyContract,\n            verifyData,\n            abi.encodePacked(\n                type(ERC1967UniversalUpgradableProxy).creationCode,\n                abi.encode(implementedAddr)\n            )\n        );\n    }\n\n    function create3ERC1167MinimalProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address verifyContract,\n            bytes memory verifyData,\n            address implementedAddr\n        ) = abi.decode(\n            params,\n            (\n                bytes32,\n                address,\n                bytes,\n                address\n            )\n        );\n        addr = create3(\n            salt,\n            verifyContract,\n            verifyData,\n            abi.encodePacked(\n                getERC1167MinimalProxyCreationCode(implementedAddr)\n            )\n        );\n    }\n\n    function create3ERC7511MinimalProxy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address verifyContract,\n            bytes memory verifyData,\n            address implementedAddr\n        ) = abi.decode(\n            params,\n            (\n                bytes32,\n                address,\n                bytes,\n                address\n            )\n        );\n        addr = create3(\n            salt,\n            verifyContract,\n            verifyData,\n            abi.encodePacked(\n                getERC7511MinimalProxyCreationCode(implementedAddr)\n            )\n        );\n    }\n\n    function create3Deploy\n    (\n        bytes memory params\n    )\n        private\n        returns(address addr)\n    {\n        (\n            bytes32 salt,\n            address verifyContract,\n            bytes memory verifyData,\n            bytes memory creationCodeAndConstructorParameters_abiEncoded\n        ) = abi.decode(\n            params,\n            (\n                bytes32,\n                address,\n                bytes,\n                bytes\n            )\n        );\n        addr = create3(\n            salt,\n            verifyContract,\n            verifyData,\n            creationCodeAndConstructorParameters_abiEncoded\n        );\n    }\n    ////////////////////////////////////////////////////////////////////////////////////////////////\n    function create2DestinyTempleV7ShadowProxyAddr\n    (\n        bytes memory params\n    )\n        private\n        view\n        returns(\n            address creator,\n            address addr\n        )\n    {\n        (\n            bytes32 salt,\n            address destinyTempleV7Beacon\n        ) = abi.decode(params,(bytes32,address));\n        (creator,addr) = create2Addr(\n            salt,\n            abi.encodePacked(\n                type(DestinyTempleV7ShadowProxy).creationCode,\n                abi.encode(destinyTempleV7Beacon)\n            )\n        );\n    }\n\n    function create2DestinyTempleV7BeaconProxyAddr\n    (\n        bytes memory params\n    )\n        private\n        view\n        returns(\n            address creator,\n            address addr\n        )\n    {\n        (\n            bytes32 salt,\n            address destinyTempleV7Beacon\n        ) = abi.decode(params,(bytes32,address));\n        (creator,addr) = create2Addr(\n            salt,\n            abi.encodePacked(\n                type(DestinyTempleV7BeaconProxy).creationCode,\n                abi.encode(destinyTempleV7Beacon)\n            )\n        );\n    }\n\n    function create2DestinyTempleV7DiamondProxyAddr\n    (\n        bytes memory params\n    )\n        private\n        view\n        returns(\n            address creator,\n            address addr\n        )\n    {\n        (\n            bytes32 salt,\n            Module[] memory mods\n        ) = abi.decode(params,(bytes32,Module[]));\n        (creator,addr) = create2Addr(\n            salt,\n            abi.encodePacked(\n                type(DestinyTempleV7DiamondProxy).creationCode,\n                abi.encode(abi.encode(mods))\n            )\n        );\n    }\n\n    function create2ERC1967UpgradeableBeaconAddr\n    (\n        bytes memory params\n    )\n        private\n        view\n        returns(\n            address creator,\n            address addr\n        )\n    {\n        (\n            bytes32 salt,\n            address admin,\n            address implementedAddr\n        ) = abi.decode(params,(bytes32,address,address));\n        (creator,addr) = create2Addr(\n            salt,\n            abi.encodePacked(\n                type(ERC1967UpgradeableBeacon).creationCode,\n                abi.encode(admin,implementedAddr)\n            )\n        );\n    }\n    function create2ERC1967UpgradeableBeaconProxyAddr\n    (\n        bytes memory params\n    )\n        private\n        view\n        returns(\n            address creator,\n            address addr\n        )\n    {\n        (\n            bytes32 salt,\n            address admin,\n            address upgradeableBeaconAddr\n        ) = abi.decode(params,(bytes32,address,address));\n        (creator,addr) = create2Addr(\n            salt,\n            abi.encodePacked(\n                type(ERC1967UpgradeableBeaconProxy).creationCode,\n                abi.encode(admin,upgradeableBeaconAddr)\n            )\n        );\n    }\n    function create2ERC1967UniversalUpgradableProxyAddr\n    (\n        bytes memory params\n    )\n        private\n        view\n        returns(\n            address creator,\n            address addr\n        )\n    {\n        (\n            bytes32 salt,\n            address implementedAddr\n        ) = abi.decode(params,(bytes32,address));\n        (creator,addr) = create2Addr(\n            salt,\n            abi.encodePacked(\n                type(ERC1967UniversalUpgradableProxy).creationCode,\n                abi.encode(implementedAddr)\n            )\n        );\n    }\n\n    function create2ERC1167MinimalProxyAddr\n    (\n        bytes memory params\n    )\n        private\n        view\n        returns(\n            address creator,\n            address addr\n        )\n    {\n        (\n            bytes32 salt,\n            address implementedAddr\n        ) = abi.decode(params,(bytes32,address));\n        (creator,addr) = create2Addr(\n            salt,\n            getERC1167MinimalProxyCreationCode(implementedAddr)\n        );\n    }\n\n    function create2ERC7511MinimalProxyAddr\n    (\n        bytes memory params\n    )\n        private\n        view\n        returns(\n            address creator,\n            address addr\n        )\n    {\n        (\n            bytes32 salt,\n            address implementedAddr\n        ) = abi.decode(params,(bytes32,address));\n        (creator,addr) = create2Addr(\n            salt,\n            getERC7511MinimalProxyCreationCode(implementedAddr)\n        );\n    }\n\n    function create2DeployAddr\n    (\n        bytes memory params\n    )\n        private\n        view\n        returns(\n            address creator,\n            address addr\n        )\n    {\n        (\n            bytes32 salt,\n            bytes memory creationCodeAndConstructorParameters_abiEncoded\n        ) = abi.decode(params,(bytes32,bytes));\n        (creator,addr) = create2Addr(\n            salt,\n            creationCodeAndConstructorParameters_abiEncoded\n        );\n    }\n    ////////////////////////////////////////////////////////////////////////////////////////////////\n    function deploy\n    (\n        DeployType deployType,\n        ProxyType proxyType,\n        address callbackAddr,\n        bytes memory initData,\n        bytes memory params\n    ) \n        external \n        payable\n        returns(address addr) \n    {\n        addr = (deployType == DeployType.Create3)\n        ? (\n            (proxyType == ProxyType.DestinyTempleV7ShadowProxy)\n            ? create3DestinyTempleV7ShadowProxy(params)\n            : (proxyType == ProxyType.DestinyTempleV7BeaconProxy)\n            ? create3DestinyTempleV7BeaconProxy(params)\n            : (proxyType == ProxyType.DestinyTempleV7DiamondProxy)\n            ? create3DestinyTempleV7DiamondProxy(params)\n            : (proxyType == ProxyType.ERC1967UpgradeableBeacon)\n            ? create3ERC1967UpgradeableBeacon(params)\n            : (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)\n            ? create3ERC1967UpgradeableBeaconProxy(params)\n            : (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)\n            ? create3ERC1967UniversalUpgradableProxy(params)\n            : (proxyType == ProxyType.ERC1167MinimalProxy)\n            ? create3ERC1167MinimalProxy(params)\n            : (proxyType == ProxyType.ERC7511MinimalProxy)\n            ? create3ERC7511MinimalProxy(params)\n            : create3Deploy(params)\n        )\n        : (deployType == DeployType.Create2)\n        ? (\n            (proxyType == ProxyType.DestinyTempleV7ShadowProxy)\n            ? create2DestinyTempleV7ShadowProxy(params)\n            : (proxyType == ProxyType.DestinyTempleV7BeaconProxy)\n            ? create2DestinyTempleV7BeaconProxy(params)\n            : (proxyType == ProxyType.DestinyTempleV7DiamondProxy)\n            ? create2DestinyTempleV7DiamondProxy(params)\n            : (proxyType == ProxyType.ERC1967UpgradeableBeacon)\n            ? create2ERC1967UpgradeableBeacon(params)\n            : (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)\n            ? create2ERC1967UpgradeableBeaconProxy(params)\n            : (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)\n            ? create2ERC1967UniversalUpgradableProxy(params)\n            : (proxyType == ProxyType.ERC1167MinimalProxy)\n            ? create2ERC1167MinimalProxy(params)\n            : (proxyType == ProxyType.ERC7511MinimalProxy)\n            ? create2ERC7511MinimalProxy(params)\n            : create2Deploy(params)\n        )\n        : (\n            (proxyType == ProxyType.DestinyTempleV7ShadowProxy)\n            ? createDestinyTempleV7ShadowProxy(params)\n            : (proxyType == ProxyType.DestinyTempleV7BeaconProxy)\n            ? createDestinyTempleV7BeaconProxy(params)\n            : (proxyType == ProxyType.DestinyTempleV7DiamondProxy)\n            ? createDestinyTempleV7DiamondProxy(params)\n            : (proxyType == ProxyType.ERC1967UpgradeableBeacon)\n            ? createERC1967UpgradeableBeacon(params)\n            : (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)\n            ? createERC1967UpgradeableBeaconProxy(params)\n            : (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)\n            ? createERC1967UniversalUpgradableProxy(params)\n            : (proxyType == ProxyType.ERC1167MinimalProxy)\n            ? createERC1167MinimalProxy(params)\n            : (proxyType == ProxyType.ERC7511MinimalProxy)\n            ? createERC7511MinimalProxy(params)\n            : createDeploy(params)\n        )\n        ;\n        if(addr.code.length == 0) revert(\"DestinyFactory:deploy failed!\");\n        init(addr,initData);\n        if(callbackAddr != address(0)){\n            (bool s,)=callbackAddr.call(abi.encodeWithSignature(\"destinyDeployed(address,uint8,uint8,bytes,bytes)\",addr,deployType,proxyType,initData,params));\n            if(!s) revert(\"DestinyFactory:callback failed!\");\n        }\n        emit Deployed(addr);\n        emit Nonce(Lib_DestinyFactory.storage_DestinyFactory().nonce);\n        unchecked{ ++Lib_DestinyFactory.storage_DestinyFactory().nonce; }\n    }\n\n    function deployAddr\n    (\n        DeployType deployType,\n        ProxyType proxyType,\n        bytes memory params,\n        bytes32 salt,\n        uint256 nonce\n    ) \n        public \n        view\n        returns(\n            address creator,\n            address addr\n        )\n    {\n        (creator,addr) = (deployType == DeployType.Create3)\n        ? create3Addr(salt)\n        : (deployType == DeployType.Create)\n        ? createAddr(\n            address(this),\n            nonce > 0 ? nonce : Lib_DestinyFactory.storage_DestinyFactory().nonce\n        )\n        : (\n            (proxyType == ProxyType.DestinyTempleV7ShadowProxy)\n            ? create2DestinyTempleV7ShadowProxyAddr(params)\n            : (proxyType == ProxyType.DestinyTempleV7BeaconProxy)\n            ? create2DestinyTempleV7BeaconProxyAddr(params)\n            : (proxyType == ProxyType.DestinyTempleV7DiamondProxy)\n            ? create2DestinyTempleV7DiamondProxyAddr(params)\n            : (proxyType == ProxyType.ERC1967UpgradeableBeacon)\n            ? create2ERC1967UpgradeableBeaconAddr(params)\n            : (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)\n            ? create2ERC1967UpgradeableBeaconProxyAddr(params)\n            : (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)\n            ? create2ERC1967UniversalUpgradableProxyAddr(params)\n            : (proxyType == ProxyType.ERC1167MinimalProxy)\n            ? create2ERC1167MinimalProxyAddr(params)\n            : (proxyType == ProxyType.ERC7511MinimalProxy)\n            ? create2ERC7511MinimalProxyAddr(params)\n            : create2DeployAddr(params)\n        )\n        ;\n    }\n\n    function deployCode\n    (\n        ProxyType proxyType,\n        CodeType codeType,\n        bytes memory constructorParametersABI_Encoded\n    )\n        external\n        pure\n        returns(bytes memory code)\n    {\n        code = (proxyType == ProxyType.DestinyTempleV7ShadowProxy)\n        ? (\n            (codeType == CodeType.CreationCode)\n            ? abi.encodePacked(\n                type(DestinyTempleV7ShadowProxy).creationCode,\n                constructorParametersABI_Encoded\n            )\n            : type(DestinyTempleV7ShadowProxy).runtimeCode\n        )\n        : (proxyType == ProxyType.DestinyTempleV7BeaconProxy)\n        ? (\n            (codeType == CodeType.CreationCode)\n            ? abi.encodePacked(\n                type(DestinyTempleV7BeaconProxy).creationCode,\n                constructorParametersABI_Encoded\n            )\n            : type(DestinyTempleV7BeaconProxy).runtimeCode\n        )\n        : (proxyType == ProxyType.DestinyTempleV7DiamondProxy)\n        ? (\n            (codeType == CodeType.CreationCode)\n            ? abi.encodePacked(\n                type(DestinyTempleV7DiamondProxy).creationCode,\n                abi.encode(constructorParametersABI_Encoded)\n            )\n            : type(DestinyTempleV7DiamondProxy).runtimeCode\n        )\n        : (proxyType == ProxyType.ERC1967UpgradeableBeacon)\n        ? (\n            (codeType == CodeType.CreationCode)\n            ? abi.encodePacked(\n                type(ERC1967UpgradeableBeacon).creationCode,\n                abi.encode(constructorParametersABI_Encoded)\n            )\n            : type(ERC1967UpgradeableBeacon).runtimeCode\n        )\n        : (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)\n        ? (\n            (codeType == CodeType.CreationCode)\n            ? abi.encodePacked(\n                type(ERC1967UpgradeableBeaconProxy).creationCode,\n                abi.encode(constructorParametersABI_Encoded)\n            )\n            : type(ERC1967UpgradeableBeaconProxy).runtimeCode\n        )\n        : (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)\n        ? (\n            (codeType == CodeType.CreationCode)\n            ? abi.encodePacked(\n                type(ERC1967UniversalUpgradableProxy).creationCode,\n                abi.encode(constructorParametersABI_Encoded)\n            )\n            : type(ERC1967UniversalUpgradableProxy).runtimeCode\n        )\n        : (proxyType == ProxyType.ERC1167MinimalProxy)\n        ? (\n            (codeType == CodeType.CreationCode)\n            ? getERC1167MinimalProxyCreationCode(BytesLib_3.toAddress(constructorParametersABI_Encoded,0))\n            : getERC1167MinimalProxyRuntimeCode(BytesLib_3.toAddress(constructorParametersABI_Encoded,0))\n        )\n        : (proxyType == ProxyType.ERC7511MinimalProxy)\n        ? (\n            (codeType == CodeType.CreationCode)\n            ? getERC7511MinimalProxyCreationCode(BytesLib_3.toAddress(constructorParametersABI_Encoded,0))\n            : getERC7511MinimalProxyRuntimeCode(BytesLib_3.toAddress(constructorParametersABI_Encoded,0))\n        )\n        : (\n            constructorParametersABI_Encoded\n        )\n        ;\n    }\n\n    function getERC1167MinimalProxyCreationCode\n    (\n        address implementedAddr\n    )\n        private\n        pure\n        returns(bytes memory code)\n    {\n        code = abi.encodePacked(hex\"3d602d80600a3d3981f3\",hex\"363d3d373d3d3d363d73\",implementedAddr,hex\"5af43d82803e903d91602b57fd5bf3\");\n    }\n\n    function getERC1167MinimalProxyRuntimeCode\n    (\n        address implementedAddr\n    )\n        private\n        pure\n        returns(bytes memory code)\n    {\n        code = abi.encodePacked(hex\"363d3d373d3d3d363d73\",implementedAddr,hex\"5af43d82803e903d91602b57fd5bf3\");\n    }\n\n    function getERC7511MinimalProxyCreationCode\n    (\n        address implementedAddr\n    )\n        private\n        pure\n        returns(bytes memory code)\n    {\n        code = abi.encodePacked(hex\"602c8060095f395ff3\",hex\"365f5f375f5f365f73\",implementedAddr,hex\"5af43d5f5f3e5f3d91602a57fd5bf3\");\n    }\n\n    function getERC7511MinimalProxyRuntimeCode\n    (\n        address implementedAddr\n    )\n        private\n        pure\n        returns(bytes memory code)\n    {\n        code = abi.encodePacked(hex\"365f5f375f5f365f73\",implementedAddr,hex\"5af43d5f5f3e5f3d91602a57fd5bf3\");\n    }\n}\n/*=======================================================================================================================\n#            __                                 __                               __                                     #\n#           /  \\ |  o     _  ._ _  o     _.    /  \\  _  _  | _|_  _ |  _.       /  \\    o _  o                          #\n#          | (|/ |< | \\/ (_) | | | | \\/ (_|   | (|/ _> (_) |  |_ (_ | (_| \\/   | (|/ >< | /_ |                          #\n#           \\__       /              /         \\__                        /     \\__                                     #\n#            __                                  __                                    __                               #\n#           /  \\  _             _. o ._   _     /  \\  _|                    _. ._     /  \\  _ o  _  _.  _|  _.          #\n#          | (|/ _> |_| \\/ |_| (_| | | | (_|   | (|/ (_| |_| \\/ |_| >< |_| (_| | |   | (|/ (_ | (_ (_| (_| (_|          #\n#           \\__         /        |        _|    \\__          /                        \\__                               #\n#            __                             __                    __              __                                    #\n#           /  \\ o o  _. ._          _     /  \\     ._ _   _     /  \\     | o    /  \\ |_   _. ._    |   _.              #\n#          | (|/ | | (_| | | \\/ |_| (/_   | (|/ |_| | | | (_)   | (|/ |_| | |   | (|/ | | (_| | |_| |< (_|              #\n#           \\__ _|           /             \\__                   \\__             \\__                                    #\n#                                                                                                                       #\n/*======================================================================================================================*\n#                                                                                                                       #\n#     ██████╗ ███████╗███████╗████████╗██╗███╗   ██╗██╗   ██╗████████╗███████╗███╗   ███╗██████╗ ██╗     ███████╗       #\n#     ██╔══██╗██╔════╝██╔════╝╚══██╔══╝██║████╗  ██║╚██╗ ██╔╝╚══██╔══╝██╔════╝████╗ ████║██╔══██╗██║     ██╔════╝       #\n#     ██║  ██║█████╗  ███████╗   ██║   ██║██╔██╗ ██║ ╚████╔╝    ██║   █████╗  ██╔████╔██║██████╔╝██║     █████╗         #\n#     ██║  ██║██╔══╝  ╚════██║   ██║   ██║██║╚██╗██║  ╚██╔╝     ██║   ██╔══╝  ██║╚██╔╝██║██╔═══╝ ██║     ██╔══╝         #\n#     ██████╔╝███████╗███████║   ██║   ██║██║ ╚████║   ██║      ██║   ███████╗██║ ╚═╝ ██║██║     ███████╗███████╗       #\n#     ╚═════╝ ╚══════╝╚══════╝   ╚═╝   ╚═╝╚═╝  ╚═══╝   ╚═╝      ╚═╝   ╚══════╝╚═╝     ╚═╝╚═╝     ╚══════╝╚══════╝       #\n#                                                                                                                       #\n*=======================================================================================================================*\n#                                                           ..                                                          #\n#                                                           ::                                                          #\n#                                                           !!                                                          #\n#                                                          .77.                                                         #\n#                                                          ~77~                                                         #\n#                                                         .7777.                                                        #\n#                                                         !7777!                                                        #\n#                                                        ^777777^                                                       #\n#                                                       ^77777777^                                                      #\n#                                                      ^777!~~!777^                                                     #\n#                                                     ^7777!::!7777^                                                    #\n#                                                   .~77777!  !77777~.                                                  #\n#                                                  :!77777!:  :!77777!:                                                 #\n#                                                 ~777777!^    ^!777777~                                                #\n#                                               :!7777777^      ^7777777!:                                              #\n#                                             :!77777777:        :77777777!:                                            #\n#                                           :!77777777!.          .!77777777!:                                          #\n#                                        .^!77777777!^              ^!77777777!^.                                       #\n#                                      :~7777777777^.       ..       .^7777777777~:                                     #\n#                                   .^!777777777!^.         ^^         .^!777777777!^.                                  #\n#                               .:~!777777777!~:           :77:           :~!777777777!~:.                              #\n#                           .:^!7777777777!~:             ^7777^             :~!7777777777!^:.                          #\n#                     ..:^~!77777777!!~^:.             .^!777777!^.             .:^~!!77777777!~^:..                    #\n#           ...::^^~!!77777777~~^^:..              .:^!777777777777!^:.              ..:^^~~77777777!!~^^::...          #\n#           ...::^^~!!77777777~~^^:..              .:^!777777777777!^:.              ..:^^~~77777777!!~^^::...          #\n#                     ..:^~!77777777!!~^:.             .^!777777!^.             .:^~!!77777777!~^:..                    #\n#                           .:^!7777777777!~:             ^7777^             :~!7777777777!^:.                          #\n#                               .:~!777777777!~:           :77:           :~!777777777!~:.                              #\n#                                   .^!777777777!^.         ^^         .^!777777777!^.                                  #\n#                                      :~7777777777^.       ..       .^7777777777~:                                     #\n#                                        .^!77777777!^              ^!77777777!^.                                       #\n#                                           :!77777777!.          .!77777777!:                                          #\n#                                             :!77777777:        :77777777!:                                            #\n#                                               :!7777777^      ^7777777!:                                              #\n#                                                 ~777777!^    ^!777777~                                                #\n#                                                  :!77777!:  :!77777!:                                                 #\n#                                                   .~77777!  !77777~.                                                  #\n#                                                     ^7777!::!7777^                                                    #\n#                                                      ^777!~~!777^                                                     #\n#                                                       ^77777777^                                                      #\n#                                                        ^777777^                                                       #\n#                                                         !7777!                                                        #\n#                                                         .7777.                                                        #\n#                                                          ~77~                                                         #\n#                                                          .77.                                                         #\n#                                                           !!                                                          #\n#                                                           ::                                                          #\n#                                                           ..                                                          #\n#                                                                                                                       #\n========================================================================================================================*/"
      },
      "src/factory/interfaces/IDestinyFactory.sol": {
        "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.19;\n\nimport {DeployType} from \"factory/enum/DeployType.sol\";\nimport {ProxyType} from \"factory/enum/ProxyType.sol\";\nimport {CodeType} from \"factory/enum/CodeType.sol\";\n\ninterface IDestinyFactory {\n    event Deployed(address addr);\n    event Nonce(uint256 nonce);\n    event ValidatorChanged(address newValidator);\n    function verifyOwnership(address verifyContract,bytes memory verifyData ) external;\n    function deployAddr(DeployType deployType,ProxyType proxyType,bytes memory params,bytes32 salt,uint256 nonce) external view returns(address creator,address addr);\n    function deploy(DeployType deployType,ProxyType proxyType,address callbackAddr,bytes memory initData,bytes memory params) external payable returns(address addr);\n    function deployCode(ProxyType proxyType,CodeType codeType,bytes memory constructorParametersABI_Encoded) external pure returns(bytes memory code);\n}"
      },
      "src/factory/enum/DeployType.sol": {
        "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.19;\n\nenum DeployType {\n    Create3,\n    Create2,\n    Create\n}"
      },
      "src/factory/enum/ProxyType.sol": {
        "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.19;\n\nenum ProxyType {\n    DestinyTempleV7ShadowProxy,\n    DestinyTempleV7BeaconProxy,\n    DestinyTempleV7DiamondProxy,\n    ERC1967UpgradeableBeacon,\n    ERC1967UpgradeableBeaconProxy,\n    ERC1967UniversalUpgradableProxy,\n    ERC1167MinimalProxy,\n    ERC7511MinimalProxy,\n    Contract\n}"
      },
      "src/factory/enum/CodeType.sol": {
        "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.19;\n\nenum CodeType {\n    CreationCode,\n    RuntimeCode\n}"
      },
      "src/factory/libraries/Lib_DestinyFactory.sol": {
        "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.19;\n\nlibrary Lib_DestinyFactory {\n    //storage>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n    bytes32 internal constant STORAGE_SLOT_DESTINYFACTORY = bytes32(uint256(keccak256(\"STORAGE_SLOT_DESTINYFACTORY\"))-7);\n\n    struct Storage_DestinyFactory {\n        uint256 nonce;\n        mapping(address => address) _verifyContract;\n    }\n\n    function storage_DestinyFactory() internal pure returns (Storage_DestinyFactory storage s) {\n        bytes32 solt = STORAGE_SLOT_DESTINYFACTORY;\n        assembly {\n            s.slot := solt\n        }\n    }\n}"
      },
      "src/interfaces/IOwnershipValidator.sol": {
        "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.19;\n\ninterface IOwnershipValidator {\n    function DESTINYTEMPLE_OWNERSHIP_STATE_CONTRACT_1() external view returns(address);\n    function DESTINYEXECUTOR_OWNERSHIP_STATE_CONTRACT_2() external view returns(address);\n    function OWNERSHIP_OWNERSHIP_STATE_CONTRACT_3() external view returns(address);\n    function verifyOwnership(bytes memory verifyData) external;\n}"
      },
      "src/struct/Module.sol": {
        "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.19;\n\nstruct Module {\n    address addr;\n    bytes4[] selectors;\n}"
      },
      "src/libraries/BytesLib_3.sol": {
        "content": "// SPDX-License-Identifier: LGPL-3.0-only\n/*\n * @title Solidity Bytes Arrays Utils\n * @author Gonçalo Sá <goncalo.sa@consensys.net>\n *\n * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.\n *      The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.\n */\npragma solidity ^0.8.19;\n\nlibrary BytesLib_3 {\n    function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\n        require(_bytes.length >= _start + 20, \"toAddress_outOfBounds\");\n        address tempAddress;\n\n        assembly {\n            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\n        }\n\n        return tempAddress;\n    }\n}\n"
      },
      "src/proxies/shadow/DestinyTempleV7ShadowProxy.sol": {
        "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.19;\n\ncontract DestinyTempleV7ShadowProxy {\n    constructor (address addr) payable {\n        assembly {\n            sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb,addr)\n            sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc,addr)\n        }\n    }\n\n    fallback() external payable {\n        assembly {\n            mstore(0x00,0x00)\n            calldatacopy(0x04,0x00,0x04)\n            pop(staticcall(gas(),sload(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb),0x00,0x24,0x08,0x20))\n            let addr := mload(0x08)\n            if iszero(addr) {\n                calldatacopy(0x00,0x00,0x04)\n                mstore(0x20,0xd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b)\n                addr := sload(keccak256(0x00,0x40))\n                if iszero(addr) {\n                    mstore(0x00,0x08c379a000000000000000000000000000000000000000000000000000000000)\n                    mstore(0x04,0x0000000000000000000000000000000000000000000000000000000000000020)\n                    mstore(0x24,0x000000000000000000000000000000000000000000000000000000000000001e)\n                    mstore(0x44,0x44657374696e793a204d6f64756c6520343034206e6f7420666f756e64210000)\n                    revert(0x00,0x64)\n                }\n            }\n            calldatacopy(0x00,0x00,calldatasize())\n            let r := delegatecall(gas(),addr,0x00,calldatasize(),0x00,0x00)\n            returndatacopy(0x00,0x00,returndatasize())\n            switch r\n            case 0x00 {\n                revert(0x00,returndatasize())\n            }\n            default {\n                return(0x00,returndatasize())\n            }\n        }\n    }\n}"
      },
      "src/proxies/beacon/DestinyTempleV7BeaconProxy.sol": {
        "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.19;\n\ncontract DestinyTempleV7BeaconProxy {\n    constructor (address addr) payable {\n        assembly {\n            sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb,addr)\n            sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc,address())\n        }\n    }\n\n    fallback() external payable {\n        assembly {\n            mstore(0x00,0x00)\n            calldatacopy(0x04,0x00,0x04)\n            pop(staticcall(gas(),sload(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb),0x00,0x24,0x08,0x20))\n            let addr := mload(0x08)\n            if iszero(addr) {\n                calldatacopy(0x00,0x00,0x04)\n                mstore(0x20,0xd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b)\n                addr := sload(keccak256(0x00,0x40))\n                if iszero(addr) {\n                    mstore(0x00,0x08c379a000000000000000000000000000000000000000000000000000000000)\n                    mstore(0x04,0x0000000000000000000000000000000000000000000000000000000000000020)\n                    mstore(0x24,0x000000000000000000000000000000000000000000000000000000000000001e)\n                    mstore(0x44,0x44657374696e793a204d6f64756c6520343034206e6f7420666f756e64210000)\n                    revert(0x00,0x64)\n                }\n            }\n            calldatacopy(0x00,0x00,calldatasize())\n            let r := delegatecall(gas(),addr,0x00,calldatasize(),0x00,0x00)\n            returndatacopy(0x00,0x00,returndatasize())\n            switch r\n            case 0x00 {\n                revert(0x00,returndatasize())\n            }\n            default {\n                return(0x00,returndatasize())\n            }\n        }\n    }\n}"
      },
      "src/proxies/diamond/DestinyTempleV7DiamondProxy.sol": {
        "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.19;\n\ncontract DestinyTempleV7DiamondProxy {\n    constructor(bytes memory mods) payable {\n        assembly {\n            for { let i := 0x00 } lt(i, mload(0xe0)) { i := add(i,0x01) } {\n                for { let j := 0x00 } lt(j, mload(add(0x140,mload(add(0x100,mul(0x20,i)))))) { j := add(j,0x01) } {\n                    mstore(mload(0x40),mload(add(add(add(0x140,mload(add(0x100,mul(0x20,i)))),0x20),mul(j,0x20))))\n                    mstore(add(mload(0x40),0x20), 0xd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b)\n                    sstore(keccak256(mload(0x40),0x40),mload(add(0x100,mload(add(0x100,mul(0x20,i))))))\n                }\n            }\n            sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb,address())\n            sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc,address())\n        }\n    }\n\n    fallback() external payable {\n        assembly {\n            calldatacopy(0x00,0x00,0x04)\n            mstore(0x20,0xd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b)\n            let addr := sload(keccak256(0x00,0x40))\n            if iszero(addr) {\n                mstore(0x00,0x08c379a000000000000000000000000000000000000000000000000000000000)\n                mstore(0x04,0x0000000000000000000000000000000000000000000000000000000000000020)\n                mstore(0x24,0x000000000000000000000000000000000000000000000000000000000000001e)\n                mstore(0x44,0x44657374696e793a204d6f64756c6520343034206e6f7420666f756e64210000)\n                revert(0x00,0x64)\n            }\n            calldatacopy(0x00,0x00,calldatasize())\n            let r := delegatecall(gas(),addr,0x00,calldatasize(),0x00,0x00)\n            returndatacopy(0x00,0x00,returndatasize())\n            switch r\n            case 0x00 {\n                revert(0x00,returndatasize())\n            }\n            default {\n                return(0x00,returndatasize())\n            }\n        }\n    }\n\n    receive() external payable {}\n}"
      },
      "src/proxies/beacon/ERC1967UpgradeableBeacon.sol": {
        "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.19;\n\ncontract ERC1967UpgradeableBeacon {\n    event AdminChanged(address previousAdmin, address newAdmin);\n    event Upgraded(address indexed implementation);\n    constructor(address admin, address implementedAddr) payable {\n        assembly {\n            sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103,admin)\n            sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc,implementedAddr)\n        }\n    }\n    function upgrade(address newImplementedAddr) external {\n        assembly {\n            if iszero(eq(caller(),sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103))) {\n                revert(0x00, 0x00)\n            }\n            sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementedAddr)\n        }\n        emit Upgraded(newImplementedAddr);\n    }\n\n    function setAdmin(address newAdmin) external {\n        address oldAdmin;\n        assembly {\n            oldAdmin := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\n            if iszero(eq(caller(),oldAdmin)) {\n                revert(0x00, 0x00)\n            }\n            sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newAdmin)\n        }\n        emit AdminChanged(oldAdmin,newAdmin);\n    }\n\n    function implementation() external view returns(address) {\n        assembly {\n            mstore(0x00,sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc))\n            return(0x00, 0x20)\n        }\n    }\n}\n"
      },
      "src/proxies/beacon/ERC1967UpgradeableBeaconProxy.sol": {
        "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.19;\n\ncontract ERC1967UpgradeableBeaconProxy {\n    event AdminChanged(address previousAdmin, address newAdmin);\n    event BeaconUpgraded(address indexed beacon);\n    constructor(address admin,address upgradeableBeaconAddr) payable {\n        assembly {\n            sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103,admin)\n            sstore(0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50,upgradeableBeaconAddr)\n        }\n    }\n    function upgrade(address newBeacon) external {\n        assembly {\n            if iszero(eq(caller(),sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103))) {\n                revert(0x00, 0x00)\n            }\n            sstore(0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50, newBeacon)\n        }\n        emit BeaconUpgraded(newBeacon);\n    }\n\n    function setAdmin(address newAdmin) external {\n        address oldAdmin;\n        assembly {\n            oldAdmin := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\n            if iszero(eq(caller(),oldAdmin)) {\n                revert(0x00, 0x00)\n            }\n            sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newAdmin)\n        }\n        emit AdminChanged(oldAdmin,newAdmin);\n    }\n\n    fallback() external payable {\n        assembly {\n            mstore(0x00,0x5c60da1b)\n            let implementedAddr := staticcall(gas(),sload(0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50),0x00,0x04,0x00,0x00)\n            calldatacopy(0x00, 0x00, calldatasize())\n            let result := delegatecall(gas(),implementedAddr,0x00,calldatasize(),0x00,0x00)\n            returndatacopy(0x00, 0x00, returndatasize())\n            switch result\n            case 0x00 {\n                revert(0x00, returndatasize())\n            }\n            default {\n                return(0x00, returndatasize())\n            }\n        }\n    }\n}\n"
      },
      "src/proxies/uups/ERC1967UniversalUpgradableProxy.sol": {
        "content": "// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.19;\n\ncontract ERC1967UniversalUpgradableProxy {\n    constructor(address implementedAddr) payable {\n        assembly{\n            sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc,implementedAddr)\n        }\n    }\n    fallback() external payable {\n        assembly {\n            calldatacopy(0x00,0x00,calldatasize())\n            let r := delegatecall(gas(),sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc),0x00,calldatasize(),0x00,0x00)\n            returndatacopy(0x00,0x00,returndatasize())\n            switch r\n            case 0x00 {\n                revert(0x00,returndatasize())\n            }\n            default {\n                return(0x00,returndatasize())\n            }\n        }\n    }\n}"
      }
    },
    "settings": {
      "remappings": [
        "ds-test/=lib/forge-std/lib/ds-test/src/",
        "forge-std/=lib/forge-std/src/",
        "interfaces/=src/interfaces/",
        "libraries/=src/libraries/",
        "constant/=src/constant/",
        "enum/=src/enum/",
        "struct/=src/struct/",
        "freeFunctions/=src/freeFunctions/",
        "ownershipState/=src/ownershipState/",
        "ownership/=src/ownershipState/ownership/",
        "DestinyExecutor/=src/tokens/DestinyExecutor/",
        "modules/=src/modules/",
        "Integrated_2/=src/modules/Integrated_2/",
        "ECDSA_2/=src/modules/Integrated_2/ECDSA_2/",
        "Reserve_2/=src/modules/Integrated_2/Reserve_2/",
        "GenesisIntegrated/=src/modules/GenesisIntegrated/",
        "Initialize/=src/modules/Initialize/",
        "Disable/=src/modules/GenesisIntegrated/Disable/",
        "Dissociate/=src/modules/GenesisIntegrated/Dissociate/",
        "ECDSA/=src/modules/GenesisIntegrated/ECDSA/",
        "ERC712/=src/modules/GenesisIntegrated/ERC712/",
        "Fallback/=src/modules/GenesisIntegrated/Fallback/",
        "ERC1271/=src/modules/GenesisIntegrated/Fallback/ERC1271/",
        "Receiver/=src/modules/GenesisIntegrated/Fallback/Receiver/",
        "FlashLoan/=src/modules/GenesisIntegrated/Fallback/FlashLoan/",
        "GuardManager/=src/modules/GenesisIntegrated/GuardManager/",
        "ModuleManager/=src/modules/GenesisIntegrated/ModuleManager/",
        "Permit/=src/modules/GenesisIntegrated/Permit/",
        "Reserve/=src/modules/GenesisIntegrated/Reserve/",
        "StorageAccessible/=src/modules/GenesisIntegrated/StorageAccessible/",
        "Twitter/=src/modules/GenesisIntegrated/Twitter/",
        "guards/=src/guards/",
        "PraetorianGuard/=src/guards/PraetorianGuard/",
        "TimeLockGuard/=src/guards/TimeLockGuard/",
        "DissociateGuard/=src/guards/DissociateGuard/",
        "permit/=src/permit/",
        "tokens/=src/tokens/",
        "proxies/=src/proxies/",
        "factory/=src/factory/",
        "test_DestinyFactory/=test/test_DestinyFactory/",
        "test_guards/=test/test_guards/",
        "test_modules/=test/test_modules/",
        "test_proxies/=test/test_proxies/",
        "test_tokens/=test/test_tokens/",
        "test_utils/=test/test_utils/"
      ],
      "optimizer": {
        "enabled": true,
        "runs": 200
      },
      "metadata": {
        "useLiteralContent": false,
        "bytecodeHash": "ipfs",
        "appendCBOR": true
      },
      "outputSelection": {
        "*": {
          "*": [
            "evm.bytecode",
            "evm.deployedBytecode",
            "devdoc",
            "userdoc",
            "metadata",
            "abi"
          ]
        }
      },
      "evmVersion": "cancun",
      "viaIR": false,
      "libraries": {}
    }
  }}