ETH Price: $2,000.76 (-1.12%)

Contract

0x777777CBE0188fe890e0824c0645ecCBe6BC7777
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x60806040200941612024-06-15 2:15:35652 days ago1718417735  Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DestinyFactory

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion
File 1 of 15 : DestinyFactory.sol
/*=======================================================================================================================
#                                                           ..                                                          #
#                                                           ::                                                          #
#                                                           !!                                                          #
#                                                          .77.                                                         #
#                                                          ~77~                                                         #
#                                                         .7777.                                                        #
#                                                         !7777!                                                        #
#                                                        ^777777^                                                       #
#                                                       ^77777777^                                                      #
#                                                      ^777!~~!777^                                                     #
#                                                     ^7777!::!7777^                                                    #
#                                                   .~77777!  !77777~.                                                  #
#                                                  :!77777!:  :!77777!:                                                 #
#                                                 ~777777!^    ^!777777~                                                #
#                                               :!7777777^      ^7777777!:                                              #
#                                             :!77777777:        :77777777!:                                            #
#                                           :!77777777!.          .!77777777!:                                          #
#                                        .^!77777777!^              ^!77777777!^.                                       #
#                                      :~7777777777^.       ..       .^7777777777~:                                     #
#                                   .^!777777777!^.         ^^         .^!777777777!^.                                  #
#                               .:~!777777777!~:           :77:           :~!777777777!~:.                              #
#                           .:^!7777777777!~:             ^7777^             :~!7777777777!^:.                          #
#                     ..:^~!77777777!!~^:.             .^!777777!^.             .:^~!!77777777!~^:..                    #
#           ...::^^~!!77777777~~^^:..              .:^!777777777777!^:.              ..:^^~~77777777!!~^^::...          #
#           ...::^^~!!77777777~~^^:..              .:^!777777777777!^:.              ..:^^~~77777777!!~^^::...          #
#                     ..:^~!77777777!!~^:.             .^!777777!^.             .:^~!!77777777!~^:..                    #
#                           .:^!7777777777!~:             ^7777^             :~!7777777777!^:.                          #
#                               .:~!777777777!~:           :77:           :~!777777777!~:.                              #
#                                   .^!777777777!^.         ^^         .^!777777777!^.                                  #
#                                      :~7777777777^.       ..       .^7777777777~:                                     #
#                                        .^!77777777!^              ^!77777777!^.                                       #
#                                           :!77777777!.          .!77777777!:                                          #
#                                             :!77777777:        :77777777!:                                            #
#                                               :!7777777^      ^7777777!:                                              #
#                                                 ~777777!^    ^!777777~                                                #
#                                                  :!77777!:  :!77777!:                                                 #
#                                                   .~77777!  !77777~.                                                  #
#                                                     ^7777!::!7777^                                                    #
#                                                      ^777!~~!777^                                                     #
#                                                       ^77777777^                                                      #
#                                                        ^777777^                                                       #
#                                                         !7777!                                                        #
#                                                         .7777.                                                        #
#                                                          ~77~                                                         #
#                                                          .77.                                                         #
#                                                           !!                                                          #
#                                                           ::                                                          #
#                                                           ..                                                          #
#                                                                                                                       #
/*=======================================================================================================================
#                                                                                                                       #
#     ██████╗ ███████╗███████╗████████╗██╗███╗   ██╗██╗   ██╗████████╗███████╗███╗   ███╗██████╗ ██╗     ███████╗       #   
#     ██╔══██╗██╔════╝██╔════╝╚══██╔══╝██║████╗  ██║╚██╗ ██╔╝╚══██╔══╝██╔════╝████╗ ████║██╔══██╗██║     ██╔════╝       #
#     ██║  ██║█████╗  ███████╗   ██║   ██║██╔██╗ ██║ ╚████╔╝    ██║   █████╗  ██╔████╔██║██████╔╝██║     █████╗         #
#     ██║  ██║██╔══╝  ╚════██║   ██║   ██║██║╚██╗██║  ╚██╔╝     ██║   ██╔══╝  ██║╚██╔╝██║██╔═══╝ ██║     ██╔══╝         #
#     ██████╔╝███████╗███████║   ██║   ██║██║ ╚████║   ██║      ██║   ███████╗██║ ╚═╝ ██║██║     ███████╗███████╗       #
#     ╚═════╝ ╚══════╝╚══════╝   ╚═╝   ╚═╝╚═╝  ╚═══╝   ╚═╝      ╚═╝   ╚══════╝╚═╝     ╚═╝╚═╝     ╚══════╝╚══════╝       #
#                                                                                                                       #
=========================================================================================================================
#            __                                 __                               __                                     #
#           /  \ |  o     _  ._ _  o     _.    /  \  _  _  | _|_  _ |  _.       /  \    o _  o                          #
#          | (|/ |< | \/ (_) | | | | \/ (_|   | (|/ _> (_) |  |_ (_ | (_| \/   | (|/ >< | /_ |                          #
#           \__       /              /         \__                        /     \__                                     #
#            __                                  __                                    __                               #
#           /  \  _             _. o ._   _     /  \  _|                    _. ._     /  \  _ o  _  _.  _|  _.          #
#          | (|/ _> |_| \/ |_| (_| | | | (_|   | (|/ (_| |_| \/ |_| >< |_| (_| | |   | (|/ (_ | (_ (_| (_| (_|          #
#           \__         /        |        _|    \__          /                        \__                               #
#            __                             __                    __              __                                    #
#           /  \ o o  _. ._          _     /  \     ._ _   _     /  \     | o    /  \ |_   _. ._    |   _.              #
#          | (|/ | | (_| | | \/ |_| (/_   | (|/ |_| | | | (_)   | (|/ |_| | |   | (|/ | | (_| | |_| |< (_|              #
#           \__ _|           /             \__                   \__             \__                                    #
#                                                                                                                       #
#=======================================================================================================================*/
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;

//common
import {IDestinyFactory} from "factory/interfaces/IDestinyFactory.sol";
import {DeployType} from "factory/enum/DeployType.sol";
import {ProxyType} from "factory/enum/ProxyType.sol";
import {CodeType} from "factory/enum/CodeType.sol";
import {Lib_DestinyFactory} from "factory/libraries/Lib_DestinyFactory.sol";
import {IOwnershipValidator} from "interfaces/IOwnershipValidator.sol";
import {Module} from "struct/Module.sol";
import {BytesLib_3} from "libraries/BytesLib_3.sol";
//proxies
import {DestinyTempleV7ShadowProxy} from "proxies/shadow/DestinyTempleV7ShadowProxy.sol";
import {DestinyTempleV7BeaconProxy} from "proxies/beacon/DestinyTempleV7BeaconProxy.sol";
import {DestinyTempleV7DiamondProxy} from "proxies/diamond/DestinyTempleV7DiamondProxy.sol";
import {ERC1967UpgradeableBeacon} from "proxies/beacon/ERC1967UpgradeableBeacon.sol";
import {ERC1967UpgradeableBeaconProxy} from "proxies/beacon/ERC1967UpgradeableBeaconProxy.sol";
import {ERC1967UniversalUpgradableProxy} from "proxies/uups/ERC1967UniversalUpgradableProxy.sol";

/**
>>>EIP-6780:自毁将发送所有以太(wei),但不删除账户,除非其在部署的同一交易中使用;
    >>>更新:仍然使用所有权分离-Create3模式,但为[最小[存在检查自毁创建者]合约(Creator)]增加字节码检查.
    >>>理由:其他EVM兼容链可能不会实施EIP-6780.
    >>>当在主网[解离]终端代理合约时,合约将不会被删除,但在其他EVM兼容链上,合约可能被删除.
    >>>[最小[存在检查自毁创建者]合约(Creator)]将检查合约是否存在以决定是否跳过合约部署并直接以终端代理合约为受益人自毁.
    >>>这可以保证无论链是否实施EIP-6780提案,工厂合约的行为相同.
 * @title 最小[存在检查自毁创建者]合约(Creator)
 * @author kiyomiya.eth
 * NOTE: 此合约将在被调用时
            2.预计算部署目的地,检查其字节码大小,若不为0则跳过3
            3.通过[create][nonce:1]创建合约,数据起始位置[0x00],数据大小[calldatasize()]
            4.自毁并发送所有以太币至部署目的地.
            >>>此合约不返回创建的合约地址,因为其已被SELFDESTRUCT弹出栈,应当自行计算.

    ////////////////////////////////////////////////////////////////////////////////////////////////
    RUNTIMECODE
    PC      NAME            OPCODE  DATA    STACK                           OP
    //在内存中存储'd694${creator自身地址}01'(地址与nonce1RLP编码结果)
    0000    PUSH1           60      01      01                              入栈 01
    0002    PUSH1           60      15      15 01                           入栈 0
    0004    MSTORE          52                                              出栈 15 01 |将[01]存储到内存位置[0x15]
    0005    ADDRESS         30              creator                         入栈 creator |加载自身地址入栈     
    0006    PUSH1           60      14      14 creator                      入栈 14
    0008    MSTORE          52                                              出栈 14 creator |将[creator]存储到内存位置[0x14]
    
    0009    PUSH2           61      d694    d694                            入栈 d694
    000c    RETURNDATASIZE  3d                                              入栈 0b
    000d    MSTORE          52                                              出栈 0 d694 |将[d964]存储到内存位置[0x0b]
    60016015523060145261d6943d52
    //计算create地址
    000e    PUSH1           60      17      17                              入栈 17
    0010    PUSH1           60      12      12 17                           入栈 12 
    0012    SHA3            20              hash                            出栈 12 17 |入栈 hash |从内存位置[0x12]读取其后[0x17]字节数据进行keccak256哈希运算
    //转换为地址
    0013    PUSH1           60      60      60 hash                         入栈 60
    0015    SHL             1b              shl_hash                        出栈 60 hash |入栈 shl_hash |将[hash]左移[0x60]位
    0016    PUSH1           60      60      60 shl_hash                     入栈 60 
    0018    SHR             1c              addr                            出栈 60 shl_hash |入栈 addr |将[shl_hash]右移[0x60]位
    0019    DUP1            80              addr addr                       入栈 addr |复制栈中[第一个]元素[addr]入栈
    //判断addr的字节码大小是否为0
    001a    EXTCODESIZE     3b              codesize addr                   出栈 addr |入栈 codesize |加载地址[addr]的字节码大小入栈
    001b    PUSH1           60      27      27 codesize addr                入栈 27
    001d    JUMPI           57              addr>>>                         出栈 27 codesize |若[codesize]不为0(false)则跳转至第[0x27]个操作码,否则继续执行
    //若addr的字节码为0则部署合约
    001e    POP             50                                              出栈 addr |弹出栈顶元素
    001f    CALLDATASIZE    36              cds                             入栈 cds |加载调用数据长度入栈
    0020    RETURNDATASIZE  3d              0 cds                           入栈 rds |加载返回数据长度[0x00]入栈
    0021    RETURNDATASIZE  3d              0 0 cds                         入栈 rds |加载返回数据长度[0x00]入栈
    0022    CALLDATACOPY    37                                              出栈 0 0 cds |从调用数据索引[0x00]处复制[cds]长度到内存位置[0x00]
    0023    CALLDATASIZE    36              cds                             入栈 cds |加载调用数据长度入栈
    0024    RETURNDATASIZE  3d              0 cds                           入栈 rds |加载返回数据长度[0x00]入栈
    0025    CALLVALUE       34              val 0 cds                       入栈 val |加载调用发送的wei入栈
    0026    CREATE          f0              createAddr                      出栈 val 0 cds |入栈 createAddr|使用内存位置[0x00],长度[cds]的字节码创建合约并发送[val]wei,输出创建地址
    //否则直接自毁
    0027    JUMPDEST        5b              addr                            标记跳转目的地
    0028    SELFDESTRUCT    ff                                              出栈 addr |停止执行,标记销毁合约并在整个交易结束后执行,强制向[addr]发送所有以太币(wei),不触发其回退函数 
    ////////////////////////////////////////////////////////////////////////////////////////////////
    CREATIONCODE
    PC      NAME            OPCODE  DATA    STACK                           OP
    0000    PUSH9           68      rtc2    rtc2                            入栈 rtc2[3d3d37363d34f05bff]
    0001    PUSH1           60      09      09 rtc2                         入栈 09
    0002    MSTORE          52                                              出栈 09 rtc1 |将[rtc1]存储到内存位置[0x09]
    0000    PUSH32          7f      rtc1    rtc1                            入栈 rtc1[60016015523060145261d6943d526017601e2060601b60601c803b6027575036]
    0001    RETURNDATASIZE  3d              0 rtc1                          入栈 0
    0002    MSTORE          52                                              出栈 0 rtc1 |将[rtc1]存储到内存位置[0x00]
    0004    PUSH1           60      29      29                              入栈 29
    0003    RETURNDATASIZE  3d              0 29                            入栈 0
    0026    RETURN          f3                                              出栈 0 29 |返回内存位置[0x00]长度[0x29]的数据 |此作为运行时字节码
    ////////////////////////////////////////////////////////////////////////////////////////////////
    RUNTIMECODE
    0x
    60016015523060145261d6943d526017601e2060601b60601c803b60275750363d3d37363d34f05bff
    ////////////////////////////////////////////////////////////////////////////////////////////////
    CREATIONCODE
    0x
    683d3d37363d34f05bff6009527f60016015523060145261d6943d526017601e2060601b60601c803b60275750363d5260293df3
    ////////////////////////////////////////////////////////////////////////////////////////////////
    //更新-所有权验证现在由工厂合约完成
    >>>Sepolia测试交易
        >>>部署[DestinyFactory]
        https://sepolia.etherscan.io/tx/0x5cf8d7beba87ee6d9c20bd60dbeaee0bdafef22f7b72dc85279057b11c8596ac
        >>>调用[DestinyFactory]选择[create3]方式部署[测试合约]
            >>>其会使用[create2]部署[Creator]合约并调用[Creator]通过[create]部署[测试合约(另一个[Creator])]
            https://sepolia.etherscan.io/tx/0x394e65ba2166c94744cbddb67430672f353cd9b08f5e2866b81d4b7e74cda11c
        >>>此时[Creator]合约自毁,测试合约未自毁
        >>>再次调用[DestinyFactory]选择[create3]方式部署[测试合约]
            >>>其会重新召集[Creator]合约,[Creator]合约会检查到[测试合约]未自毁(字节码大小不为0),跳过部署而直接自毁,交易成功
            https://sepolia.etherscan.io/tx/0x972c6b27c3a8ddcd37191bf9950bdf6a4c2d5a5128b52007ae86babc4e6bc237
        >>>直接调用[测试合约](Creator),其(部署一个合约后)自毁
        https://sepolia.etherscan.io/tx/0xcab1457cacedc9b2a81b1f5bab1264eeb73767d98555ad9ce3da34951162bc64
        >>>再次使用相同数据调用[DestinyFactory]选择[create3]方式部署[测试合约]
            >>>其会使用[create2]部署[Creator]合约,[Creator]合约会检查到[测试合约]已自毁(字节码大小为0)并通过[create]重新召集[测试合约]并自毁
            https://sepolia.etherscan.io/tx/0x74ac536be2c6b18748f20b88402ca229fecc3f6f20ec9327f486a4e3df8a0648
        >>>可以看到,[Creator]与[测试合约]部署在确定的地址上,随后[Creator]合约自毁,而无论[测试合约](在生产中为终端合约)是否能够自毁,用户都能重新部署并自毁[Creator]合约
            >>>调用[DestinyFactory]在一笔交易中(如果链未实施EIP-6780提案则可以在不同的交易中)在相同的地址上重新部署[任意合约代码]
            >>>需要通过所有权验证
    ////////////////////////////////////////////////////////////////////////////////////////////////
*/
contract DestinyFactory is IDestinyFactory{
    bytes private constant CREATOR_CREATIONCODE = hex"683d3d37363d34f05bff6009527f60016015523060145261d6943d526017601e2060601b60601c803b60275750363d5260293df3";

    constructor() payable {
        Lib_DestinyFactory.storage_DestinyFactory().nonce = 1;
    }

    //create3专用
    function verifyOwnership
    (
        address verifyContract,
        bytes memory verifyData
    )
        public
    {
        address validator = Lib_DestinyFactory.storage_DestinyFactory()._verifyContract[msg.sender];
        if(validator == address(0) && verifyContract != address(0)) validator =  verifyContract;
        //只在验证合约不是0时进行
        if(validator != address(0)) {
            (bool s ,bytes memory r) = validator.call(abi.encodeCall(IOwnershipValidator.verifyOwnership,(verifyData)));
            require(s,"DestinyFactory:verifyOwnership Failed!");
            if(verifyContract != address(this)) {
                Lib_DestinyFactory.storage_DestinyFactory()._verifyContract[msg.sender] = verifyContract;
                emit ValidatorChanged(verifyContract);
            }
        }
    }

    function init(address addr,bytes memory initData) private returns(address) {
        if(initData.length > 0) {
            (bool s,) = addr.call(initData);
            if(!s) revert("DestinyFactory:init fail");
        }
        return addr;
    }

    function create
    (
        bytes memory creationCode
    ) 
        private 
        returns(address addr) 
    {
        assembly{ addr := create(callvalue(),add(creationCode,0x20),mload(creationCode)) }
    }

    function create2
    (
        bytes32 salt,
        bytes memory creationCode
    ) 
        private 
        returns(address addr) 
    {
        assembly { addr := create2(callvalue(),add(creationCode,0x20),mload(creationCode),salt) }
        if(keccak256(creationCode) == keccak256(CREATOR_CREATIONCODE)) revert("Disable create2 deploy creator!");
    }
    
    function create3
    (
        bytes32 salt,
        address verifyContract,
        bytes memory verifyData,
        bytes memory creationCode
    ) 
        private 
        returns(address addr) 
    {
        bytes memory creatorCreationCode = CREATOR_CREATIONCODE;
        (,address preDeployCreatorAddr) = create2Addr(salt,creatorCreationCode);
        //creator必须被reinit,因为nonce必须为初始值
        if(preDeployCreatorAddr.code.length > 0) revert("DestinyFactory:creator deployed!");
        //部署creator
        address creator;
        assembly { creator := create2(callvalue(),add(creatorCreationCode,0x20),mload(creatorCreationCode),salt) }
        (,addr) = createAddr(creator,uint256(1));
        //验证所有权
        Lib_DestinyFactory.Storage_DestinyFactory storage ls = Lib_DestinyFactory.storage_DestinyFactory();
        address validator = ls._verifyContract[addr];
        if(validator == address(0) && verifyContract != address(0)) validator =  verifyContract;
        //只在验证合约不是0时进行
        if(validator != address(0)) {
            (bool s ,bytes memory r) = validator.call(abi.encodeCall(IOwnershipValidator.verifyOwnership,(verifyData)));
            require(s,"DestinyFactory:verifyOwnership Failed!");
            //通过后,设置新验证合约
            if(verifyContract != address(this)) {
                ls._verifyContract[msg.sender] = verifyContract;
            }
        }
        //调用creator部署creationCode
        creator.call{value:msg.value}(creationCode);
        emit Deployed(creator);
    }

    function createAddr(address _creator, uint256 _nonce)
        private 
        pure
        returns (address creator,address addr)
    {
        creator=_creator;
        /// @solidity memory-safe-assembly
        assembly {
            for {} 1 {} {
                // The integer zero is treated as an empty byte string,
                // and as a result it only has a length prefix, 0x80,
                // computed via `0x80 + 0`.

                // A one-byte integer in the [0x00, 0x7f] range uses its
                // own value as a length prefix,
                // there is no additional `0x80 + length` prefix that precedes it.
                if iszero(gt(_nonce, 0x7f)) {
                    mstore(0x00, _creator)
                    // Using `mstore8` instead of `or` naturally cleans
                    // any dirty upper bits of `_creator`.
                    mstore8(0x0b, 0x94)
                    mstore8(0x0a, 0xd6)
                    // `shl` 7 is equivalent to multiplying by 0x80.
                    mstore8(0x20, or(shl(7, iszero(_nonce)), _nonce))
                    addr := keccak256(0x0a, 0x17)
                    break
                }
                let i := 8
                // Just use a loop to generalize all the way with minimal bytecode size.
                for {} shr(i, _nonce) { i := add(i, 8) } {}
                // `shr` 3 is equivalent to dividing by 8.
                i := shr(3, i)
                // Store in descending slot sequence to overlap the values correctly.
                mstore(i, _nonce)
                mstore(0x00, shl(8, _creator))
                mstore8(0x1f, add(0x80, i))
                mstore8(0x0a, 0x94)
                mstore8(0x09, add(0xd6, i))
                addr := keccak256(0x09, add(0x17, i))
                break
            }
        }
    }

    function create2Addr
    (
        bytes32 salt,
        bytes memory creationCode
    )
        private
        view
        returns (
            address creator,
            address addr
        )
    {
        creator = address(this);
        addr = address(
            uint160(
                uint256(
                    keccak256(
                        abi.encodePacked(
                            bytes1(0xff),
                            address(this),
                            salt,
                            keccak256(creationCode)
                        )
                    )
                )
            )
        );
    }

    function create3Addr
    (
        bytes32 salt
    )
        private
        view
        returns (
            address creator,
            address addr
        )
    {
        (,creator) = create2Addr(salt,CREATOR_CREATIONCODE);
        (,addr) = createAddr(creator,uint256(1));
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    function createDestinyTempleV7ShadowProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (address destinyTempleV7Beacon) = abi.decode(params,(address));
        addr = create(
            abi.encodePacked(
                type(DestinyTempleV7ShadowProxy).creationCode,
                abi.encode(destinyTempleV7Beacon)
            )
        );
    }
    function createDestinyTempleV7BeaconProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (address destinyTempleV7Beacon) = abi.decode(params,(address));
        addr = create(
            abi.encodePacked(
                type(DestinyTempleV7BeaconProxy).creationCode,
                abi.encode(destinyTempleV7Beacon)
            )
        );
    }
    function createDestinyTempleV7DiamondProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (Module[] memory mods) = abi.decode(params,(Module[]));
        addr = create(
            abi.encodePacked(
                type(DestinyTempleV7DiamondProxy).creationCode,
                abi.encode(abi.encode(mods))
            )
        );
    }
    function createERC1967UpgradeableBeacon
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            address admin,
            address implementedAddr
        ) = abi.decode(params,(address,address));
        addr = create(
            abi.encodePacked(
                type(ERC1967UpgradeableBeacon).creationCode,
                abi.encode(admin,implementedAddr)
            )
        );
    }
    function createERC1967UpgradeableBeaconProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            address admin,
            address upgradeableBeaconAddr
        ) = abi.decode(params,(address,address));
        addr = create(
            abi.encodePacked(
                type(ERC1967UpgradeableBeaconProxy).creationCode,
                abi.encode(admin,upgradeableBeaconAddr)
            )
        );
    }
    function createERC1967UniversalUpgradableProxy
    (
        bytes memory params 
    )
        private
        returns(address addr)
    {
        (address implementedAddr) = abi.decode(params,(address));
        addr = create(
            abi.encodePacked(
                type(ERC1967UniversalUpgradableProxy).creationCode,
                abi.encode(implementedAddr)
            )
        );
    }

    function createERC1167MinimalProxy
    (
        bytes memory params 
    )
        private
        returns(address addr)
    {
        (address implementedAddr) = abi.decode(params,(address));
        addr = create(
            getERC1167MinimalProxyCreationCode(implementedAddr)
        );
    }

    function createERC7511MinimalProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (address implementedAddr) = abi.decode(params,(address));
        addr = create(
            getERC7511MinimalProxyCreationCode(implementedAddr)
        );
    }

    function createDeploy
    (
        bytes memory creationCodeAndConstructorParameters_abiEncoded
    )
        private
        returns(address addr)
    {
        addr = create(
            creationCodeAndConstructorParameters_abiEncoded
        );
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    function create2DestinyTempleV7ShadowProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address destinyTempleV7Beacon
        ) = abi.decode(params,(bytes32,address));
        addr = create2(
            salt,
            abi.encodePacked(
                type(DestinyTempleV7ShadowProxy).creationCode,
                abi.encode(destinyTempleV7Beacon)
            )
        );
    }

    function create2DestinyTempleV7BeaconProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address destinyTempleV7Beacon
        ) = abi.decode(params,(bytes32,address));
        addr = create2(
            salt,
            abi.encodePacked(
                type(DestinyTempleV7BeaconProxy).creationCode,
                abi.encode(destinyTempleV7Beacon)
            )
        );
    }

    function create2DestinyTempleV7DiamondProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            Module[] memory mods
        ) = abi.decode(params,(bytes32,Module[]));
        addr = create2(
            salt,
            abi.encodePacked(
                type(DestinyTempleV7DiamondProxy).creationCode,
                abi.encode(abi.encode(mods))
            )
        );
    }

    function create2ERC1967UpgradeableBeacon
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address admin,
            address implementedAddr
        ) = abi.decode(params,(bytes32,address,address));
        addr = create2(
            salt,
            abi.encodePacked(
                type(ERC1967UpgradeableBeacon).creationCode,
                abi.encode(admin,implementedAddr)
            )
        );
    }
    function create2ERC1967UpgradeableBeaconProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address admin,
            address upgradeableBeaconAddr
        ) = abi.decode(params,(bytes32,address,address));
        addr = create2(
            salt,
            abi.encodePacked(
                type(ERC1967UpgradeableBeaconProxy).creationCode,
                abi.encode(admin,upgradeableBeaconAddr)
            )
        );
    }
    function create2ERC1967UniversalUpgradableProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address implementedAddr
        ) = abi.decode(params,(bytes32,address));
        addr = create2(
            salt,
            abi.encodePacked(
                type(ERC1967UniversalUpgradableProxy).creationCode,
                abi.encode(implementedAddr)
            )
        );
    }

    function create2ERC1167MinimalProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address implementedAddr
        ) = abi.decode(params,(bytes32,address));
        addr = create2(
            salt,
            getERC1167MinimalProxyCreationCode(implementedAddr)
        );
    }

    function create2ERC7511MinimalProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address implementedAddr
        ) = abi.decode(params,(bytes32,address));
        addr = create2(
            salt,
            getERC7511MinimalProxyCreationCode(implementedAddr)
        );
    }

    function create2Deploy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            bytes memory creationCodeAndConstructorParameters_abiEncoded
        ) = abi.decode(params,(bytes32,bytes));
        addr = create2(
            salt,
            creationCodeAndConstructorParameters_abiEncoded
        );
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    function create3DestinyTempleV7ShadowProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address verifyContract,
            bytes memory verifyData,
            address destinyTempleV7Beacon
        ) = abi.decode(
            params,
            (
                bytes32,
                address,
                bytes,
                address
            )
        );
        addr = create3(
            salt,
            verifyContract,
            verifyData,
            abi.encodePacked(
                type(DestinyTempleV7ShadowProxy).creationCode,
                abi.encode(destinyTempleV7Beacon)
            )
        );
    }

    function create3DestinyTempleV7BeaconProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address verifyContract,
            bytes memory verifyData,
            address destinyTempleV7Beacon
        ) = abi.decode(
            params,
            (
                bytes32,
                address,
                bytes,
                address
            )
        );
        addr = create3(
            salt,
            verifyContract,
            verifyData,
            abi.encodePacked(
                type(DestinyTempleV7BeaconProxy).creationCode,
                abi.encode(destinyTempleV7Beacon)
            )
        );
    }

    function create3DestinyTempleV7DiamondProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address verifyContract,
            bytes memory verifyData,
            Module[] memory mods
        ) = abi.decode(
            params,
            (
                bytes32,
                address,
                bytes,
                Module[]
            )
        );
        addr = create3(
            salt,
            verifyContract,
            verifyData,
            abi.encodePacked(
                type(DestinyTempleV7DiamondProxy).creationCode,
                abi.encode(abi.encode(mods))
            )
        );
    }

    function create3ERC1967UpgradeableBeacon
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address verifyContract,
            bytes memory verifyData,
            address admin,
            address implementedAddr
        ) = abi.decode(
            params,
            (
                bytes32,
                address,
                bytes,
                address,
                address
            )
        );
        addr = create3(
            salt,
            verifyContract,
            verifyData,
            abi.encodePacked(
                type(ERC1967UpgradeableBeacon).creationCode,
                abi.encode(admin,implementedAddr)
            )
        );
    }

    function create3ERC1967UpgradeableBeaconProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address verifyContract,
            bytes memory verifyData,
            address admin,
            address implementedAddr
        ) = abi.decode(
            params,
            (
                bytes32,
                address,
                bytes,
                address,
                address
            )
        );
        addr = create3(
            salt,
            verifyContract,
            verifyData,
            abi.encodePacked(
                type(ERC1967UpgradeableBeacon).creationCode,
                abi.encode(admin,implementedAddr)
            )
        );
    }

    function create3ERC1967UniversalUpgradableProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address verifyContract,
            bytes memory verifyData,
            address implementedAddr
        ) = abi.decode(
            params,
            (
                bytes32,
                address,
                bytes,
                address
            )
        );
        addr = create3(
            salt,
            verifyContract,
            verifyData,
            abi.encodePacked(
                type(ERC1967UniversalUpgradableProxy).creationCode,
                abi.encode(implementedAddr)
            )
        );
    }

    function create3ERC1167MinimalProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address verifyContract,
            bytes memory verifyData,
            address implementedAddr
        ) = abi.decode(
            params,
            (
                bytes32,
                address,
                bytes,
                address
            )
        );
        addr = create3(
            salt,
            verifyContract,
            verifyData,
            abi.encodePacked(
                getERC1167MinimalProxyCreationCode(implementedAddr)
            )
        );
    }

    function create3ERC7511MinimalProxy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address verifyContract,
            bytes memory verifyData,
            address implementedAddr
        ) = abi.decode(
            params,
            (
                bytes32,
                address,
                bytes,
                address
            )
        );
        addr = create3(
            salt,
            verifyContract,
            verifyData,
            abi.encodePacked(
                getERC7511MinimalProxyCreationCode(implementedAddr)
            )
        );
    }

    function create3Deploy
    (
        bytes memory params
    )
        private
        returns(address addr)
    {
        (
            bytes32 salt,
            address verifyContract,
            bytes memory verifyData,
            bytes memory creationCodeAndConstructorParameters_abiEncoded
        ) = abi.decode(
            params,
            (
                bytes32,
                address,
                bytes,
                bytes
            )
        );
        addr = create3(
            salt,
            verifyContract,
            verifyData,
            creationCodeAndConstructorParameters_abiEncoded
        );
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    function create2DestinyTempleV7ShadowProxyAddr
    (
        bytes memory params
    )
        private
        view
        returns(
            address creator,
            address addr
        )
    {
        (
            bytes32 salt,
            address destinyTempleV7Beacon
        ) = abi.decode(params,(bytes32,address));
        (creator,addr) = create2Addr(
            salt,
            abi.encodePacked(
                type(DestinyTempleV7ShadowProxy).creationCode,
                abi.encode(destinyTempleV7Beacon)
            )
        );
    }

    function create2DestinyTempleV7BeaconProxyAddr
    (
        bytes memory params
    )
        private
        view
        returns(
            address creator,
            address addr
        )
    {
        (
            bytes32 salt,
            address destinyTempleV7Beacon
        ) = abi.decode(params,(bytes32,address));
        (creator,addr) = create2Addr(
            salt,
            abi.encodePacked(
                type(DestinyTempleV7BeaconProxy).creationCode,
                abi.encode(destinyTempleV7Beacon)
            )
        );
    }

    function create2DestinyTempleV7DiamondProxyAddr
    (
        bytes memory params
    )
        private
        view
        returns(
            address creator,
            address addr
        )
    {
        (
            bytes32 salt,
            Module[] memory mods
        ) = abi.decode(params,(bytes32,Module[]));
        (creator,addr) = create2Addr(
            salt,
            abi.encodePacked(
                type(DestinyTempleV7DiamondProxy).creationCode,
                abi.encode(abi.encode(mods))
            )
        );
    }

    function create2ERC1967UpgradeableBeaconAddr
    (
        bytes memory params
    )
        private
        view
        returns(
            address creator,
            address addr
        )
    {
        (
            bytes32 salt,
            address admin,
            address implementedAddr
        ) = abi.decode(params,(bytes32,address,address));
        (creator,addr) = create2Addr(
            salt,
            abi.encodePacked(
                type(ERC1967UpgradeableBeacon).creationCode,
                abi.encode(admin,implementedAddr)
            )
        );
    }
    function create2ERC1967UpgradeableBeaconProxyAddr
    (
        bytes memory params
    )
        private
        view
        returns(
            address creator,
            address addr
        )
    {
        (
            bytes32 salt,
            address admin,
            address upgradeableBeaconAddr
        ) = abi.decode(params,(bytes32,address,address));
        (creator,addr) = create2Addr(
            salt,
            abi.encodePacked(
                type(ERC1967UpgradeableBeaconProxy).creationCode,
                abi.encode(admin,upgradeableBeaconAddr)
            )
        );
    }
    function create2ERC1967UniversalUpgradableProxyAddr
    (
        bytes memory params
    )
        private
        view
        returns(
            address creator,
            address addr
        )
    {
        (
            bytes32 salt,
            address implementedAddr
        ) = abi.decode(params,(bytes32,address));
        (creator,addr) = create2Addr(
            salt,
            abi.encodePacked(
                type(ERC1967UniversalUpgradableProxy).creationCode,
                abi.encode(implementedAddr)
            )
        );
    }

    function create2ERC1167MinimalProxyAddr
    (
        bytes memory params
    )
        private
        view
        returns(
            address creator,
            address addr
        )
    {
        (
            bytes32 salt,
            address implementedAddr
        ) = abi.decode(params,(bytes32,address));
        (creator,addr) = create2Addr(
            salt,
            getERC1167MinimalProxyCreationCode(implementedAddr)
        );
    }

    function create2ERC7511MinimalProxyAddr
    (
        bytes memory params
    )
        private
        view
        returns(
            address creator,
            address addr
        )
    {
        (
            bytes32 salt,
            address implementedAddr
        ) = abi.decode(params,(bytes32,address));
        (creator,addr) = create2Addr(
            salt,
            getERC7511MinimalProxyCreationCode(implementedAddr)
        );
    }

    function create2DeployAddr
    (
        bytes memory params
    )
        private
        view
        returns(
            address creator,
            address addr
        )
    {
        (
            bytes32 salt,
            bytes memory creationCodeAndConstructorParameters_abiEncoded
        ) = abi.decode(params,(bytes32,bytes));
        (creator,addr) = create2Addr(
            salt,
            creationCodeAndConstructorParameters_abiEncoded
        );
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    function deploy
    (
        DeployType deployType,
        ProxyType proxyType,
        address callbackAddr,
        bytes memory initData,
        bytes memory params
    ) 
        external 
        payable
        returns(address addr) 
    {
        addr = (deployType == DeployType.Create3)
        ? (
            (proxyType == ProxyType.DestinyTempleV7ShadowProxy)
            ? create3DestinyTempleV7ShadowProxy(params)
            : (proxyType == ProxyType.DestinyTempleV7BeaconProxy)
            ? create3DestinyTempleV7BeaconProxy(params)
            : (proxyType == ProxyType.DestinyTempleV7DiamondProxy)
            ? create3DestinyTempleV7DiamondProxy(params)
            : (proxyType == ProxyType.ERC1967UpgradeableBeacon)
            ? create3ERC1967UpgradeableBeacon(params)
            : (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)
            ? create3ERC1967UpgradeableBeaconProxy(params)
            : (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)
            ? create3ERC1967UniversalUpgradableProxy(params)
            : (proxyType == ProxyType.ERC1167MinimalProxy)
            ? create3ERC1167MinimalProxy(params)
            : (proxyType == ProxyType.ERC7511MinimalProxy)
            ? create3ERC7511MinimalProxy(params)
            : create3Deploy(params)
        )
        : (deployType == DeployType.Create2)
        ? (
            (proxyType == ProxyType.DestinyTempleV7ShadowProxy)
            ? create2DestinyTempleV7ShadowProxy(params)
            : (proxyType == ProxyType.DestinyTempleV7BeaconProxy)
            ? create2DestinyTempleV7BeaconProxy(params)
            : (proxyType == ProxyType.DestinyTempleV7DiamondProxy)
            ? create2DestinyTempleV7DiamondProxy(params)
            : (proxyType == ProxyType.ERC1967UpgradeableBeacon)
            ? create2ERC1967UpgradeableBeacon(params)
            : (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)
            ? create2ERC1967UpgradeableBeaconProxy(params)
            : (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)
            ? create2ERC1967UniversalUpgradableProxy(params)
            : (proxyType == ProxyType.ERC1167MinimalProxy)
            ? create2ERC1167MinimalProxy(params)
            : (proxyType == ProxyType.ERC7511MinimalProxy)
            ? create2ERC7511MinimalProxy(params)
            : create2Deploy(params)
        )
        : (
            (proxyType == ProxyType.DestinyTempleV7ShadowProxy)
            ? createDestinyTempleV7ShadowProxy(params)
            : (proxyType == ProxyType.DestinyTempleV7BeaconProxy)
            ? createDestinyTempleV7BeaconProxy(params)
            : (proxyType == ProxyType.DestinyTempleV7DiamondProxy)
            ? createDestinyTempleV7DiamondProxy(params)
            : (proxyType == ProxyType.ERC1967UpgradeableBeacon)
            ? createERC1967UpgradeableBeacon(params)
            : (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)
            ? createERC1967UpgradeableBeaconProxy(params)
            : (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)
            ? createERC1967UniversalUpgradableProxy(params)
            : (proxyType == ProxyType.ERC1167MinimalProxy)
            ? createERC1167MinimalProxy(params)
            : (proxyType == ProxyType.ERC7511MinimalProxy)
            ? createERC7511MinimalProxy(params)
            : createDeploy(params)
        )
        ;
        if(addr.code.length == 0) revert("DestinyFactory:deploy failed!");
        init(addr,initData);
        if(callbackAddr != address(0)){
            (bool s,)=callbackAddr.call(abi.encodeWithSignature("destinyDeployed(address,uint8,uint8,bytes,bytes)",addr,deployType,proxyType,initData,params));
            if(!s) revert("DestinyFactory:callback failed!");
        }
        emit Deployed(addr);
        emit Nonce(Lib_DestinyFactory.storage_DestinyFactory().nonce);
        unchecked{ ++Lib_DestinyFactory.storage_DestinyFactory().nonce; }
    }

    function deployAddr
    (
        DeployType deployType,
        ProxyType proxyType,
        bytes memory params,
        bytes32 salt,
        uint256 nonce
    ) 
        public 
        view
        returns(
            address creator,
            address addr
        )
    {
        (creator,addr) = (deployType == DeployType.Create3)
        ? create3Addr(salt)
        : (deployType == DeployType.Create)
        ? createAddr(
            address(this),
            nonce > 0 ? nonce : Lib_DestinyFactory.storage_DestinyFactory().nonce
        )
        : (
            (proxyType == ProxyType.DestinyTempleV7ShadowProxy)
            ? create2DestinyTempleV7ShadowProxyAddr(params)
            : (proxyType == ProxyType.DestinyTempleV7BeaconProxy)
            ? create2DestinyTempleV7BeaconProxyAddr(params)
            : (proxyType == ProxyType.DestinyTempleV7DiamondProxy)
            ? create2DestinyTempleV7DiamondProxyAddr(params)
            : (proxyType == ProxyType.ERC1967UpgradeableBeacon)
            ? create2ERC1967UpgradeableBeaconAddr(params)
            : (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)
            ? create2ERC1967UpgradeableBeaconProxyAddr(params)
            : (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)
            ? create2ERC1967UniversalUpgradableProxyAddr(params)
            : (proxyType == ProxyType.ERC1167MinimalProxy)
            ? create2ERC1167MinimalProxyAddr(params)
            : (proxyType == ProxyType.ERC7511MinimalProxy)
            ? create2ERC7511MinimalProxyAddr(params)
            : create2DeployAddr(params)
        )
        ;
    }

    function deployCode
    (
        ProxyType proxyType,
        CodeType codeType,
        bytes memory constructorParametersABI_Encoded
    )
        external
        pure
        returns(bytes memory code)
    {
        code = (proxyType == ProxyType.DestinyTempleV7ShadowProxy)
        ? (
            (codeType == CodeType.CreationCode)
            ? abi.encodePacked(
                type(DestinyTempleV7ShadowProxy).creationCode,
                constructorParametersABI_Encoded
            )
            : type(DestinyTempleV7ShadowProxy).runtimeCode
        )
        : (proxyType == ProxyType.DestinyTempleV7BeaconProxy)
        ? (
            (codeType == CodeType.CreationCode)
            ? abi.encodePacked(
                type(DestinyTempleV7BeaconProxy).creationCode,
                constructorParametersABI_Encoded
            )
            : type(DestinyTempleV7BeaconProxy).runtimeCode
        )
        : (proxyType == ProxyType.DestinyTempleV7DiamondProxy)
        ? (
            (codeType == CodeType.CreationCode)
            ? abi.encodePacked(
                type(DestinyTempleV7DiamondProxy).creationCode,
                abi.encode(constructorParametersABI_Encoded)
            )
            : type(DestinyTempleV7DiamondProxy).runtimeCode
        )
        : (proxyType == ProxyType.ERC1967UpgradeableBeacon)
        ? (
            (codeType == CodeType.CreationCode)
            ? abi.encodePacked(
                type(ERC1967UpgradeableBeacon).creationCode,
                abi.encode(constructorParametersABI_Encoded)
            )
            : type(ERC1967UpgradeableBeacon).runtimeCode
        )
        : (proxyType == ProxyType.ERC1967UpgradeableBeaconProxy)
        ? (
            (codeType == CodeType.CreationCode)
            ? abi.encodePacked(
                type(ERC1967UpgradeableBeaconProxy).creationCode,
                abi.encode(constructorParametersABI_Encoded)
            )
            : type(ERC1967UpgradeableBeaconProxy).runtimeCode
        )
        : (proxyType == ProxyType.ERC1967UniversalUpgradableProxy)
        ? (
            (codeType == CodeType.CreationCode)
            ? abi.encodePacked(
                type(ERC1967UniversalUpgradableProxy).creationCode,
                abi.encode(constructorParametersABI_Encoded)
            )
            : type(ERC1967UniversalUpgradableProxy).runtimeCode
        )
        : (proxyType == ProxyType.ERC1167MinimalProxy)
        ? (
            (codeType == CodeType.CreationCode)
            ? getERC1167MinimalProxyCreationCode(BytesLib_3.toAddress(constructorParametersABI_Encoded,0))
            : getERC1167MinimalProxyRuntimeCode(BytesLib_3.toAddress(constructorParametersABI_Encoded,0))
        )
        : (proxyType == ProxyType.ERC7511MinimalProxy)
        ? (
            (codeType == CodeType.CreationCode)
            ? getERC7511MinimalProxyCreationCode(BytesLib_3.toAddress(constructorParametersABI_Encoded,0))
            : getERC7511MinimalProxyRuntimeCode(BytesLib_3.toAddress(constructorParametersABI_Encoded,0))
        )
        : (
            constructorParametersABI_Encoded
        )
        ;
    }

    function getERC1167MinimalProxyCreationCode
    (
        address implementedAddr
    )
        private
        pure
        returns(bytes memory code)
    {
        code = abi.encodePacked(hex"3d602d80600a3d3981f3",hex"363d3d373d3d3d363d73",implementedAddr,hex"5af43d82803e903d91602b57fd5bf3");
    }

    function getERC1167MinimalProxyRuntimeCode
    (
        address implementedAddr
    )
        private
        pure
        returns(bytes memory code)
    {
        code = abi.encodePacked(hex"363d3d373d3d3d363d73",implementedAddr,hex"5af43d82803e903d91602b57fd5bf3");
    }

    function getERC7511MinimalProxyCreationCode
    (
        address implementedAddr
    )
        private
        pure
        returns(bytes memory code)
    {
        code = abi.encodePacked(hex"602c8060095f395ff3",hex"365f5f375f5f365f73",implementedAddr,hex"5af43d5f5f3e5f3d91602a57fd5bf3");
    }

    function getERC7511MinimalProxyRuntimeCode
    (
        address implementedAddr
    )
        private
        pure
        returns(bytes memory code)
    {
        code = abi.encodePacked(hex"365f5f375f5f365f73",implementedAddr,hex"5af43d5f5f3e5f3d91602a57fd5bf3");
    }
}
/*=======================================================================================================================
#            __                                 __                               __                                     #
#           /  \ |  o     _  ._ _  o     _.    /  \  _  _  | _|_  _ |  _.       /  \    o _  o                          #
#          | (|/ |< | \/ (_) | | | | \/ (_|   | (|/ _> (_) |  |_ (_ | (_| \/   | (|/ >< | /_ |                          #
#           \__       /              /         \__                        /     \__                                     #
#            __                                  __                                    __                               #
#           /  \  _             _. o ._   _     /  \  _|                    _. ._     /  \  _ o  _  _.  _|  _.          #
#          | (|/ _> |_| \/ |_| (_| | | | (_|   | (|/ (_| |_| \/ |_| >< |_| (_| | |   | (|/ (_ | (_ (_| (_| (_|          #
#           \__         /        |        _|    \__          /                        \__                               #
#            __                             __                    __              __                                    #
#           /  \ o o  _. ._          _     /  \     ._ _   _     /  \     | o    /  \ |_   _. ._    |   _.              #
#          | (|/ | | (_| | | \/ |_| (/_   | (|/ |_| | | | (_)   | (|/ |_| | |   | (|/ | | (_| | |_| |< (_|              #
#           \__ _|           /             \__                   \__             \__                                    #
#                                                                                                                       #
/*======================================================================================================================*
#                                                                                                                       #
#     ██████╗ ███████╗███████╗████████╗██╗███╗   ██╗██╗   ██╗████████╗███████╗███╗   ███╗██████╗ ██╗     ███████╗       #
#     ██╔══██╗██╔════╝██╔════╝╚══██╔══╝██║████╗  ██║╚██╗ ██╔╝╚══██╔══╝██╔════╝████╗ ████║██╔══██╗██║     ██╔════╝       #
#     ██║  ██║█████╗  ███████╗   ██║   ██║██╔██╗ ██║ ╚████╔╝    ██║   █████╗  ██╔████╔██║██████╔╝██║     █████╗         #
#     ██║  ██║██╔══╝  ╚════██║   ██║   ██║██║╚██╗██║  ╚██╔╝     ██║   ██╔══╝  ██║╚██╔╝██║██╔═══╝ ██║     ██╔══╝         #
#     ██████╔╝███████╗███████║   ██║   ██║██║ ╚████║   ██║      ██║   ███████╗██║ ╚═╝ ██║██║     ███████╗███████╗       #
#     ╚═════╝ ╚══════╝╚══════╝   ╚═╝   ╚═╝╚═╝  ╚═══╝   ╚═╝      ╚═╝   ╚══════╝╚═╝     ╚═╝╚═╝     ╚══════╝╚══════╝       #
#                                                                                                                       #
*=======================================================================================================================*
#                                                           ..                                                          #
#                                                           ::                                                          #
#                                                           !!                                                          #
#                                                          .77.                                                         #
#                                                          ~77~                                                         #
#                                                         .7777.                                                        #
#                                                         !7777!                                                        #
#                                                        ^777777^                                                       #
#                                                       ^77777777^                                                      #
#                                                      ^777!~~!777^                                                     #
#                                                     ^7777!::!7777^                                                    #
#                                                   .~77777!  !77777~.                                                  #
#                                                  :!77777!:  :!77777!:                                                 #
#                                                 ~777777!^    ^!777777~                                                #
#                                               :!7777777^      ^7777777!:                                              #
#                                             :!77777777:        :77777777!:                                            #
#                                           :!77777777!.          .!77777777!:                                          #
#                                        .^!77777777!^              ^!77777777!^.                                       #
#                                      :~7777777777^.       ..       .^7777777777~:                                     #
#                                   .^!777777777!^.         ^^         .^!777777777!^.                                  #
#                               .:~!777777777!~:           :77:           :~!777777777!~:.                              #
#                           .:^!7777777777!~:             ^7777^             :~!7777777777!^:.                          #
#                     ..:^~!77777777!!~^:.             .^!777777!^.             .:^~!!77777777!~^:..                    #
#           ...::^^~!!77777777~~^^:..              .:^!777777777777!^:.              ..:^^~~77777777!!~^^::...          #
#           ...::^^~!!77777777~~^^:..              .:^!777777777777!^:.              ..:^^~~77777777!!~^^::...          #
#                     ..:^~!77777777!!~^:.             .^!777777!^.             .:^~!!77777777!~^:..                    #
#                           .:^!7777777777!~:             ^7777^             :~!7777777777!^:.                          #
#                               .:~!777777777!~:           :77:           :~!777777777!~:.                              #
#                                   .^!777777777!^.         ^^         .^!777777777!^.                                  #
#                                      :~7777777777^.       ..       .^7777777777~:                                     #
#                                        .^!77777777!^              ^!77777777!^.                                       #
#                                           :!77777777!.          .!77777777!:                                          #
#                                             :!77777777:        :77777777!:                                            #
#                                               :!7777777^      ^7777777!:                                              #
#                                                 ~777777!^    ^!777777~                                                #
#                                                  :!77777!:  :!77777!:                                                 #
#                                                   .~77777!  !77777~.                                                  #
#                                                     ^7777!::!7777^                                                    #
#                                                      ^777!~~!777^                                                     #
#                                                       ^77777777^                                                      #
#                                                        ^777777^                                                       #
#                                                         !7777!                                                        #
#                                                         .7777.                                                        #
#                                                          ~77~                                                         #
#                                                          .77.                                                         #
#                                                           !!                                                          #
#                                                           ::                                                          #
#                                                           ..                                                          #
#                                                                                                                       #
========================================================================================================================*/

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;

import {DeployType} from "factory/enum/DeployType.sol";
import {ProxyType} from "factory/enum/ProxyType.sol";
import {CodeType} from "factory/enum/CodeType.sol";

interface IDestinyFactory {
    event Deployed(address addr);
    event Nonce(uint256 nonce);
    event ValidatorChanged(address newValidator);
    function verifyOwnership(address verifyContract,bytes memory verifyData ) external;
    function deployAddr(DeployType deployType,ProxyType proxyType,bytes memory params,bytes32 salt,uint256 nonce) external view returns(address creator,address addr);
    function deploy(DeployType deployType,ProxyType proxyType,address callbackAddr,bytes memory initData,bytes memory params) external payable returns(address addr);
    function deployCode(ProxyType proxyType,CodeType codeType,bytes memory constructorParametersABI_Encoded) external pure returns(bytes memory code);
}

File 3 of 15 : DeployType.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;

enum DeployType {
    Create3,
    Create2,
    Create
}

File 4 of 15 : ProxyType.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;

enum ProxyType {
    DestinyTempleV7ShadowProxy,
    DestinyTempleV7BeaconProxy,
    DestinyTempleV7DiamondProxy,
    ERC1967UpgradeableBeacon,
    ERC1967UpgradeableBeaconProxy,
    ERC1967UniversalUpgradableProxy,
    ERC1167MinimalProxy,
    ERC7511MinimalProxy,
    Contract
}

File 5 of 15 : CodeType.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;

enum CodeType {
    CreationCode,
    RuntimeCode
}

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;

library Lib_DestinyFactory {
    //storage>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    bytes32 internal constant STORAGE_SLOT_DESTINYFACTORY = bytes32(uint256(keccak256("STORAGE_SLOT_DESTINYFACTORY"))-7);

    struct Storage_DestinyFactory {
        uint256 nonce;
        mapping(address => address) _verifyContract;
    }

    function storage_DestinyFactory() internal pure returns (Storage_DestinyFactory storage s) {
        bytes32 solt = STORAGE_SLOT_DESTINYFACTORY;
        assembly {
            s.slot := solt
        }
    }
}

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;

interface IOwnershipValidator {
    function DESTINYTEMPLE_OWNERSHIP_STATE_CONTRACT_1() external view returns(address);
    function DESTINYEXECUTOR_OWNERSHIP_STATE_CONTRACT_2() external view returns(address);
    function OWNERSHIP_OWNERSHIP_STATE_CONTRACT_3() external view returns(address);
    function verifyOwnership(bytes memory verifyData) external;
}

File 8 of 15 : Module.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;

struct Module {
    address addr;
    bytes4[] selectors;
}

// SPDX-License-Identifier: LGPL-3.0-only
/*
 * @title Solidity Bytes Arrays Utils
 * @author Gonçalo Sá <goncalo.sa@consensys.net>
 *
 * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
 *      The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
 */
pragma solidity ^0.8.19;

library BytesLib_3 {
    function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {
        require(_bytes.length >= _start + 20, "toAddress_outOfBounds");
        address tempAddress;

        assembly {
            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
        }

        return tempAddress;
    }
}

File 10 of 15 : DestinyTempleV7ShadowProxy.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;

contract DestinyTempleV7ShadowProxy {
    constructor (address addr) payable {
        assembly {
            sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb,addr)
            sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc,addr)
        }
    }

    fallback() external payable {
        assembly {
            mstore(0x00,0x00)
            calldatacopy(0x04,0x00,0x04)
            pop(staticcall(gas(),sload(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb),0x00,0x24,0x08,0x20))
            let addr := mload(0x08)
            if iszero(addr) {
                calldatacopy(0x00,0x00,0x04)
                mstore(0x20,0xd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b)
                addr := sload(keccak256(0x00,0x40))
                if iszero(addr) {
                    mstore(0x00,0x08c379a000000000000000000000000000000000000000000000000000000000)
                    mstore(0x04,0x0000000000000000000000000000000000000000000000000000000000000020)
                    mstore(0x24,0x000000000000000000000000000000000000000000000000000000000000001e)
                    mstore(0x44,0x44657374696e793a204d6f64756c6520343034206e6f7420666f756e64210000)
                    revert(0x00,0x64)
                }
            }
            calldatacopy(0x00,0x00,calldatasize())
            let r := delegatecall(gas(),addr,0x00,calldatasize(),0x00,0x00)
            returndatacopy(0x00,0x00,returndatasize())
            switch r
            case 0x00 {
                revert(0x00,returndatasize())
            }
            default {
                return(0x00,returndatasize())
            }
        }
    }
}

File 11 of 15 : DestinyTempleV7BeaconProxy.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;

contract DestinyTempleV7BeaconProxy {
    constructor (address addr) payable {
        assembly {
            sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb,addr)
            sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc,address())
        }
    }

    fallback() external payable {
        assembly {
            mstore(0x00,0x00)
            calldatacopy(0x04,0x00,0x04)
            pop(staticcall(gas(),sload(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb),0x00,0x24,0x08,0x20))
            let addr := mload(0x08)
            if iszero(addr) {
                calldatacopy(0x00,0x00,0x04)
                mstore(0x20,0xd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b)
                addr := sload(keccak256(0x00,0x40))
                if iszero(addr) {
                    mstore(0x00,0x08c379a000000000000000000000000000000000000000000000000000000000)
                    mstore(0x04,0x0000000000000000000000000000000000000000000000000000000000000020)
                    mstore(0x24,0x000000000000000000000000000000000000000000000000000000000000001e)
                    mstore(0x44,0x44657374696e793a204d6f64756c6520343034206e6f7420666f756e64210000)
                    revert(0x00,0x64)
                }
            }
            calldatacopy(0x00,0x00,calldatasize())
            let r := delegatecall(gas(),addr,0x00,calldatasize(),0x00,0x00)
            returndatacopy(0x00,0x00,returndatasize())
            switch r
            case 0x00 {
                revert(0x00,returndatasize())
            }
            default {
                return(0x00,returndatasize())
            }
        }
    }
}

File 12 of 15 : DestinyTempleV7DiamondProxy.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;

contract DestinyTempleV7DiamondProxy {
    constructor(bytes memory mods) payable {
        assembly {
            for { let i := 0x00 } lt(i, mload(0xe0)) { i := add(i,0x01) } {
                for { let j := 0x00 } lt(j, mload(add(0x140,mload(add(0x100,mul(0x20,i)))))) { j := add(j,0x01) } {
                    mstore(mload(0x40),mload(add(add(add(0x140,mload(add(0x100,mul(0x20,i)))),0x20),mul(j,0x20))))
                    mstore(add(mload(0x40),0x20), 0xd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b)
                    sstore(keccak256(mload(0x40),0x40),mload(add(0x100,mload(add(0x100,mul(0x20,i))))))
                }
            }
            sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb,address())
            sstore(0x3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc,address())
        }
    }

    fallback() external payable {
        assembly {
            calldatacopy(0x00,0x00,0x04)
            mstore(0x20,0xd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b)
            let addr := sload(keccak256(0x00,0x40))
            if iszero(addr) {
                mstore(0x00,0x08c379a000000000000000000000000000000000000000000000000000000000)
                mstore(0x04,0x0000000000000000000000000000000000000000000000000000000000000020)
                mstore(0x24,0x000000000000000000000000000000000000000000000000000000000000001e)
                mstore(0x44,0x44657374696e793a204d6f64756c6520343034206e6f7420666f756e64210000)
                revert(0x00,0x64)
            }
            calldatacopy(0x00,0x00,calldatasize())
            let r := delegatecall(gas(),addr,0x00,calldatasize(),0x00,0x00)
            returndatacopy(0x00,0x00,returndatasize())
            switch r
            case 0x00 {
                revert(0x00,returndatasize())
            }
            default {
                return(0x00,returndatasize())
            }
        }
    }

    receive() external payable {}
}

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;

contract ERC1967UpgradeableBeacon {
    event AdminChanged(address previousAdmin, address newAdmin);
    event Upgraded(address indexed implementation);
    constructor(address admin, address implementedAddr) payable {
        assembly {
            sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103,admin)
            sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc,implementedAddr)
        }
    }
    function upgrade(address newImplementedAddr) external {
        assembly {
            if iszero(eq(caller(),sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103))) {
                revert(0x00, 0x00)
            }
            sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementedAddr)
        }
        emit Upgraded(newImplementedAddr);
    }

    function setAdmin(address newAdmin) external {
        address oldAdmin;
        assembly {
            oldAdmin := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)
            if iszero(eq(caller(),oldAdmin)) {
                revert(0x00, 0x00)
            }
            sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newAdmin)
        }
        emit AdminChanged(oldAdmin,newAdmin);
    }

    function implementation() external view returns(address) {
        assembly {
            mstore(0x00,sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc))
            return(0x00, 0x20)
        }
    }
}

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;

contract ERC1967UpgradeableBeaconProxy {
    event AdminChanged(address previousAdmin, address newAdmin);
    event BeaconUpgraded(address indexed beacon);
    constructor(address admin,address upgradeableBeaconAddr) payable {
        assembly {
            sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103,admin)
            sstore(0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50,upgradeableBeaconAddr)
        }
    }
    function upgrade(address newBeacon) external {
        assembly {
            if iszero(eq(caller(),sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103))) {
                revert(0x00, 0x00)
            }
            sstore(0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50, newBeacon)
        }
        emit BeaconUpgraded(newBeacon);
    }

    function setAdmin(address newAdmin) external {
        address oldAdmin;
        assembly {
            oldAdmin := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)
            if iszero(eq(caller(),oldAdmin)) {
                revert(0x00, 0x00)
            }
            sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newAdmin)
        }
        emit AdminChanged(oldAdmin,newAdmin);
    }

    fallback() external payable {
        assembly {
            mstore(0x00,0x5c60da1b)
            let implementedAddr := staticcall(gas(),sload(0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50),0x00,0x04,0x00,0x00)
            calldatacopy(0x00, 0x00, calldatasize())
            let result := delegatecall(gas(),implementedAddr,0x00,calldatasize(),0x00,0x00)
            returndatacopy(0x00, 0x00, returndatasize())
            switch result
            case 0x00 {
                revert(0x00, returndatasize())
            }
            default {
                return(0x00, returndatasize())
            }
        }
    }
}

File 15 of 15 : ERC1967UniversalUpgradableProxy.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.19;

contract ERC1967UniversalUpgradableProxy {
    constructor(address implementedAddr) payable {
        assembly{
            sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc,implementedAddr)
        }
    }
    fallback() external payable {
        assembly {
            calldatacopy(0x00,0x00,calldatasize())
            let r := delegatecall(gas(),sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc),0x00,calldatasize(),0x00,0x00)
            returndatacopy(0x00,0x00,returndatasize())
            switch r
            case 0x00 {
                revert(0x00,returndatasize())
            }
            default {
                return(0x00,returndatasize())
            }
        }
    }
}

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": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"Deployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"Nonce","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newValidator","type":"address"}],"name":"ValidatorChanged","type":"event"},{"inputs":[{"internalType":"enum DeployType","name":"deployType","type":"uint8"},{"internalType":"enum ProxyType","name":"proxyType","type":"uint8"},{"internalType":"address","name":"callbackAddr","type":"address"},{"internalType":"bytes","name":"initData","type":"bytes"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"deploy","outputs":[{"internalType":"address","name":"addr","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"enum DeployType","name":"deployType","type":"uint8"},{"internalType":"enum ProxyType","name":"proxyType","type":"uint8"},{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"deployAddr","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"addr","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum ProxyType","name":"proxyType","type":"uint8"},{"internalType":"enum CodeType","name":"codeType","type":"uint8"},{"internalType":"bytes","name":"constructorParametersABI_Encoded","type":"bytes"}],"name":"deployCode","outputs":[{"internalType":"bytes","name":"code","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"verifyContract","type":"address"},{"internalType":"bytes","name":"verifyData","type":"bytes"}],"name":"verifyOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600c6011565b556060565b5f80603c60077f8fc89b1793e5d3153375a09940e56c9a1019f9ef47f9952fbe41180570601c386042565b92915050565b81810381811115603c57634e487b7160e01b5f52601160045260245ffd5b613c958061006d5f395ff3fe60806040526004361061003e575f3560e01c80633b714a0a14610042578063ade34be514610063578063d65652d514610098578063eb10f3ca146100d7575b5f80fd5b34801561004d575f80fd5b5061006161005c366004611ef3565b610102565b005b34801561006e575f80fd5b5061008261007d366004611f52565b610295565b60405161008f9190611fde565b60405180910390f35b3480156100a3575f80fd5b506100b76100b2366004611ffe565b6105f2565b604080516001600160a01b0393841681529290911660208301520161008f565b6100ea6100e5366004612068565b610778565b6040516001600160a01b03909116815260200161008f565b5f61010b610cdc565b335f90815260019190910160205260409020546001600160a01b031690508015801561013f57506001600160a01b03831615155b156101475750815b6001600160a01b03811615610290575f80826001600160a01b0316846040516024016101739190611fde565b60408051601f198184030181529181526020820180516001600160e01b0316637dfc7b0360e11b179052516101a89190612110565b5f604051808303815f865af19150503d805f81146101e1576040519150601f19603f3d011682016040523d82523d5f602084013e6101e6565b606091505b5091509150816102115760405162461bcd60e51b81526004016102089061211b565b60405180910390fd5b6001600160a01b038516301461028d578461022a610cdc565b335f908152600191909101602090815260409182902080546001600160a01b0319166001600160a01b03948516179055905191871682527f0d3a3dda2c3164bbc4898485ffa0b984c414d664538d3b99df23202077f72c9b910160405180910390a15b50505b505050565b60605f8460088111156102aa576102aa612161565b146105805760018460088111156102c3576102c3612161565b146105265760028460088111156102dc576102dc612161565b146104f05760038460088111156102f5576102f5612161565b146104ba57600484600881111561030e5761030e612161565b1461048457600584600881111561032757610327612161565b146103e157600684600881111561034057610340612161565b146103a557600784600881111561035957610359612161565b1461036457816105ea565b5f83600181111561037757610377612161565b146103935761038e610389835f610d0f565b610d73565b6105ea565b61038e6103a0835f610d0f565b610dcf565b5f8360018111156103b8576103b8612161565b146103cf5761038e6103ca835f610d0f565b610e2b565b61038e6103dc835f610d0f565b610e76565b5f8360018111156103f4576103f4612161565b146104205760405161040860208201611d5f565b601f1982820381018352601f909101166040526105ea565b60405161042f60208201611d6b565b601f1982820381018352601f909101166040819052610452908490602001611fde565b60408051601f19818403018152908290526104709291602001612175565b6040516020818303038152906040526105ea565b5f83600181111561049757610497612161565b146104ab5760405161040860208201611d77565b60405161042f60208201611d84565b5f8360018111156104cd576104cd612161565b146104e15760405161040860208201611d91565b60405161042f60208201611d9e565b5f83600181111561050357610503612161565b146105175760405161040860208201611dab565b60405161042f60208201611db7565b5f83600181111561053957610539612161565b1461054d5760405161040860208201611dc4565b60405161055c60208201611dd1565b601f1982820381018352601f90910116604081905261047091908490602001612175565b5f83600181111561059357610593612161565b146105a75760405161040860208201611dde565b6040516105b660208201611deb565b601f1982820381018352601f9091011660408190526105da91908490602001612175565b6040516020818303038152906040525b949350505050565b5f808087600281111561060757610607612161565b1461076157600287600281111561062057610620612161565b14610742575f86600881111561063857610638612161565b1461073957600186600881111561065157610651612161565b1461073057600286600881111561066a5761066a612161565b1461072757600386600881111561068357610683612161565b1461071e57600486600881111561069c5761069c612161565b146107155760058660088111156106b5576106b5612161565b1461070c5760068660088111156106ce576106ce612161565b146107035760078660088111156106e7576106e7612161565b146106fa576106f585610ed4565b61076a565b6106f585610f06565b6106f585610f34565b6106f585610f5d565b6106f585610fe5565b6106f585611058565b6106f58561108b565b6106f5856110fb565b6106f58561112b565b6106f5305f851161075b57610755610cdc565b5461115b565b8461115b565b61076a846111ca565b909890975095505050505050565b5f8086600281111561078c5761078c612161565b146109df5760018660028111156107a5576107a5612161565b146108c7575f8560088111156107bd576107bd612161565b146108be5760018560088111156107d6576107d6612161565b146108b55760028560088111156107ef576107ef612161565b146108ac57600385600881111561080857610808612161565b146108a357600485600881111561082157610821612161565b1461089a57600585600881111561083a5761083a612161565b1461089157600685600881111561085357610853612161565b1461088857600785600881111561086c5761086c612161565b1461087f5761087a82611206565b610aee565b61087a82611210565b61087a82611240565b61087a82611264565b61087a826112e7565b61087a82611348565b61087a82611376565b61087a826113e1565b61087a8261140c565b5f8560088111156108da576108da612161565b146109d65760018560088111156108f3576108f3612161565b146109cd57600285600881111561090c5761090c612161565b146109c457600385600881111561092557610925612161565b146109bb57600485600881111561093e5761093e612161565b146109b257600585600881111561095757610957612161565b146109a957600685600881111561097057610970612161565b146109a057600785600881111561098957610989612161565b146109975761087a82611437565b61087a8261145c565b61087a82611489565b61087a826114b1565b61087a82611538565b61087a826115a6565b61087a826115d8565b61087a82611647565b61087a82611676565b5f8560088111156109f2576109f2612161565b14610ae5576001856008811115610a0b57610a0b612161565b14610adc576002856008811115610a2457610a24612161565b14610ad3576003856008811115610a3d57610a3d612161565b14610aca576004856008811115610a5657610a56612161565b14610aca576005856008811115610a6f57610a6f612161565b14610ac1576006856008811115610a8857610a88612161565b14610ab8576007856008811115610aa157610aa1612161565b14610aaf5761087a826116a5565b61087a826116dc565b61087a82611730565b61087a82611760565b61087a826117db565b61087a82611853565b61087a826118ca565b610aee82611901565b9050806001600160a01b03163b5f03610b495760405162461bcd60e51b815260206004820152601d60248201527f44657374696e79466163746f72793a6465706c6f79206661696c6564210000006044820152606401610208565b610b538184611938565b506001600160a01b03841615610c4d575f846001600160a01b03168288888787604051602401610b87959493929190612189565b60408051601f198184030181529181526020820180516001600160e01b031663022d35b760e31b17905251610bbc9190612110565b5f604051808303815f865af19150503d805f8114610bf5576040519150601f19603f3d011682016040523d82523d5f602084013e610bfa565b606091505b5050905080610c4b5760405162461bcd60e51b815260206004820152601f60248201527f44657374696e79466163746f72793a63616c6c6261636b206661696c656421006044820152606401610208565b505b6040516001600160a01b03821681527ff40fcec21964ffb566044d083b4073f29f7f7929110ea19e1b3ebe375d89055e9060200160405180910390a17fe335c04c904a95df658ab3e6bb90e9f8f42b8d7b0dd1c5ec3c3000eff7562bc3610cb2610cdc565b5460405190815260200160405180910390a1610ccc610cdc565b8054600101905595945050505050565b5f80610d0960077f8fc89b1793e5d3153375a09940e56c9a1019f9ef47f9952fbe41180570601c38612208565b92915050565b5f610d1b82601461221b565b83511015610d635760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610208565b500160200151600160601b900490565b60405168365f5f375f5f365f7360b81b6020820152606082811b6001600160601b03191660298301526e5af43d5f5f3e5f3d91602a57fd5bf360881b603d83015290604c015b6040516020818303038152906040529050919050565b60405168602c8060095f395ff360b81b602082015268365f5f375f5f365f7360b81b6029820152606082811b6001600160601b03191660328301526e5af43d5f5f3e5f3d91602a57fd5bf360881b604683015290605501610db9565b60405169363d3d373d3d3d363d7360b01b6020820152606082811b6001600160601b031916602a8301526e5af43d82803e903d91602b57fd5bf360881b603e83015290604d01610db9565b604051693d602d80600a3d3981f360b01b602082015269363d3d373d3d3d363d7360b01b602a820152606082811b6001600160601b03191660348301526e5af43d82803e903d91602b57fd5bf360881b604883015290605701610db9565b5f805f8084806020019051810190610eec919061227b565b91509150610efa82826119f2565b90969095509350505050565b5f805f8084806020019051810190610f1e91906122b4565b91509150610efa82610f2f83610dcf565b6119f2565b5f805f8084806020019051810190610f4c91906122b4565b91509150610efa82610f2f83610e76565b5f805f8084806020019051810190610f7591906122b4565b91509150610efa8260405180602001610f8d90611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0386166020830152015b60408051601f1981840301815290829052610fd19291602001612175565b6040516020818303038152906040526119f2565b5f805f805f85806020019051810190610ffe91906122e2565b92509250925061104b836040518060200161101890611d84565b601f1982820381018352601f9091011660408181526001600160a01b038781166020840152861690820152606001610fb3565b9097909650945050505050565b5f805f805f8580602001905181019061107191906122e2565b92509250925061104b836040518060200161101890611d9e565b5f805f80848060200190518101906110a3919061247b565b91509150610efa82604051806020016110bb90611db7565b601f1982820381018352601f9091011660408190526110de9085906020016124b4565b60408051601f1981840301815290829052610fb391602001611fde565b5f805f808480602001905181019061111391906122b4565b91509150610efa8260405180602001610f8d90611dd1565b5f805f808480602001905181019061114391906122b4565b91509150610efa8260405180602001610f8d90611deb565b815f607f831161118757835f526094600b5360d6600a5382831560071b17602053506017600a206111c3565b60085b83811c1561119a5760080161118a565b60031c838152600885901b5f5260808101601f536094600a538060d60160095360170160092090505b9250929050565b5f806111ee83604051806060016040528060348152602001613c2c603491396119f2565b92506111fd905082600161115b565b92949293505050565b5f610d0982611a49565b5f80828060200190518101906112269190612565565b905061123961123482610dcf565b611a49565b9392505050565b5f80828060200190518101906112569190612565565b905061123961123482610e76565b5f808280602001905181019061127a9190612565565b90506112396040518060200161128f90611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0385166020830152015b60408051601f19818403018152908290526112d39291602001612175565b604051602081830303815290604052611a49565b5f805f838060200190518101906112fe9190612580565b915091506105ea6040518060200161131590611d84565b601f1982820381018352601f9091011660408181526001600160a01b0386811660208401528516908201526060016112b5565b5f805f8380602001905181019061135f9190612580565b915091506105ea6040518060200161131590611d9e565b5f808280602001905181019061138c91906125ad565b9050611239604051806020016113a190611db7565b601f1982820381018352601f9091011660408190526113c49084906020016124b4565b60408051601f19818403018152908290526112b591602001611fde565b5f80828060200190518101906113f79190612565565b90506112396040518060200161128f90611dd1565b5f80828060200190518101906114229190612565565b90506112396040518060200161128f90611deb565b5f805f8380602001905181019061144e919061227b565b915091506105ea8282611a58565b5f805f8380602001905181019061147391906122b4565b915091506105ea8261148483610dcf565b611a58565b5f805f838060200190518101906114a091906122b4565b915091506105ea8261148483610e76565b5f805f838060200190518101906114c891906122b4565b915091506105ea82604051806020016114e090611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0386166020830152015b60408051601f19818403018152908290526115249291602001612175565b604051602081830303815290604052611a58565b5f805f808480602001905181019061155091906122e2565b92509250925061159d836040518060200161156a90611d84565b601f1982820381018352601f9091011660408181526001600160a01b038781166020840152861690820152606001611506565b95945050505050565b5f805f80848060200190518101906115be91906122e2565b92509250925061159d836040518060200161156a90611d9e565b5f805f838060200190518101906115ef919061247b565b915091506105ea826040518060200161160790611db7565b601f1982820381018352601f90910116604081905261162a9085906020016124b4565b60408051601f198184030181529082905261150691602001611fde565b5f805f8380602001905181019061165e91906122b4565b915091506105ea82604051806020016114e090611dd1565b5f805f8380602001905181019061168d91906122b4565b915091506105ea82604051806020016114e090611deb565b5f805f805f858060200190518101906116be91906125de565b93509350935093506116d284848484611ad9565b9695505050505050565b5f805f805f858060200190518101906116f59190612659565b93509350935093506116d284848461170c85610dcf565b60405160200161171c9190612110565b604051602081830303815290604052611ad9565b5f805f805f858060200190518101906117499190612659565b93509350935093506116d284848461170c85610e76565b5f805f805f858060200190518101906117799190612659565b93509350935093506116d28484846040518060200161179790611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0388166020830152015b60408051601f198184030181529082905261171c9291602001612175565b5f805f805f80868060200190518101906117f591906126c1565b945094509450945094506118488585856040518060200161181590611d9e565b601f1982820381018352601f9091011660408181526001600160a01b0389811660208401528816908201526060016117bd565b979650505050505050565b5f805f805f8580602001905181019061186c919061273e565b93509350935093506116d28484846040518060200161188a90611db7565b601f1982820381018352601f9091011660408190526118ad9087906020016124b4565b60408051601f19818403018152908290526117bd91602001611fde565b5f805f805f858060200190518101906118e39190612659565b93509350935093506116d28484846040518060200161179790611dd1565b5f805f805f8580602001905181019061191a9190612659565b93509350935093506116d28484846040518060200161179790611deb565b80515f90156119eb575f836001600160a01b03168360405161195a9190612110565b5f604051808303815f865af19150503d805f8114611993576040519150601f19603f3d011682016040523d82523d5f602084013e611998565b606091505b50509050806119e95760405162461bcd60e51b815260206004820152601860248201527f44657374696e79466163746f72793a696e6974206661696c00000000000000006044820152606401610208565b505b5090919050565b8051602091820120604080516001600160f81b03198185015230606081901b6001600160601b0319166021830152603582019590955260558082019390935281518082039093018352607501905280519101209091565b5f81516020830134f092915050565b5f8282516020840134f59050604051806060016040528060348152602001613c2c6034913980519060200120828051906020012003610d095760405162461bcd60e51b815260206004820152601f60248201527f44697361626c652063726561746532206465706c6f792063726561746f7221006044820152606401610208565b5f80604051806060016040528060348152602001613c2c6034913990505f611b0187836119f2565b9150506001600160a01b0381163b15611b5c5760405162461bcd60e51b815260206004820181905260248201527f44657374696e79466163746f72793a63726561746f72206465706c6f796564216044820152606401610208565b5f8783516020850134f59050611b7381600161115b565b94505f9050611b80610cdc565b6001600160a01b038087165f9081526001830160205260409020549192501680158015611bb557506001600160a01b03891615155b15611bbd5750875b6001600160a01b03811615611cbb575f80826001600160a01b03168a604051602401611be99190611fde565b60408051601f198184030181529181526020820180516001600160e01b0316637dfc7b0360e11b17905251611c1e9190612110565b5f604051808303815f865af19150503d805f8114611c57576040519150601f19603f3d011682016040523d82523d5f602084013e611c5c565b606091505b509150915081611c7e5760405162461bcd60e51b81526004016102089061211b565b6001600160a01b038b163014611cb857335f908152600185016020526040902080546001600160a01b0319166001600160a01b038d161790555b50505b826001600160a01b03163488604051611cd49190612110565b5f6040518083038185875af1925050503d805f8114611d0e576040519150601f19603f3d011682016040523d82523d5f602084013e611d13565b606091505b50506040516001600160a01b03851681527ff40fcec21964ffb566044d083b4073f29f7f7929110ea19e1b3ebe375d89055e915060200160405180910390a15050505050949350505050565b6078806127ae83390190565b60f58061282683390190565b6102398061291b83390190565b6102f780612b5483390190565b61023a80612e4b83390190565b6102f88061308583390190565b60cd8061337d83390190565b61028f8061344a83390190565b610104806136d983390190565b6101a5806137dd83390190565b6101048061398283390190565b6101a680613a8683390190565b6001600160a01b0381168114611e0c575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b0381118282101715611e4557611e45611e0f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611e7357611e73611e0f565b604052919050565b5f6001600160401b03821115611e9357611e93611e0f565b50601f01601f191660200190565b5f82601f830112611eb0575f80fd5b8135611ec3611ebe82611e7b565b611e4b565b818152846020838601011115611ed7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215611f04575f80fd5b8235611f0f81611df8565b915060208301356001600160401b03811115611f29575f80fd5b611f3585828601611ea1565b9150509250929050565b803560098110611f4d575f80fd5b919050565b5f805f60608486031215611f64575f80fd5b611f6d84611f3f565b9250602084013560028110611f80575f80fd5b915060408401356001600160401b03811115611f9a575f80fd5b611fa686828701611ea1565b9150509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112396020830184611fb0565b803560038110611f4d575f80fd5b5f805f805f60a08688031215612012575f80fd5b61201b86611ff0565b945061202960208701611f3f565b935060408601356001600160401b03811115612043575f80fd5b61204f88828901611ea1565b9598949750949560608101359550608001359392505050565b5f805f805f60a0868803121561207c575f80fd5b61208586611ff0565b945061209360208701611f3f565b935060408601356120a381611df8565b925060608601356001600160401b03808211156120be575f80fd5b6120ca89838a01611ea1565b935060808801359150808211156120df575f80fd5b506120ec88828901611ea1565b9150509295509295909350565b5f81518060208401855e5f93019283525090919050565b5f61123982846120f9565b60208082526026908201527f44657374696e79466163746f72793a7665726966794f776e657273686970204660408201526561696c65642160d01b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b5f6105ea61218383866120f9565b846120f9565b6001600160a01b03861681525f600386106121a6576121a6612161565b856020830152600985106121bc576121bc612161565b84604083015260a060608301526121d660a0830185611fb0565b82810360808401526121e88185611fb0565b98975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610d0957610d096121f4565b80820180821115610d0957610d096121f4565b5f82601f83011261223d575f80fd5b815161224b611ebe82611e7b565b81815284602083860101111561225f575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f806040838503121561228c575f80fd5b8251915060208301516001600160401b038111156122a8575f80fd5b611f358582860161222e565b5f80604083850312156122c5575f80fd5b8251915060208301516122d781611df8565b809150509250929050565b5f805f606084860312156122f4575f80fd5b83519250602084015161230681611df8565b604085015190925061231781611df8565b809150509250925092565b5f6001600160401b0382111561233a5761233a611e0f565b5060051b60200190565b5f82601f830112612353575f80fd5b81516020612363611ebe83612322565b828152600592831b8501820192828201919087851115612381575f80fd5b8387015b8581101561246e5780516001600160401b03808211156123a3575f80fd5b908901906040828c03601f19018113156123bb575f80fd5b6123c3611e23565b888401516123d081611df8565b815283820151838111156123e2575f80fd5b8085019450508c603f8501126123f6575f80fd5b888401519250612408611ebe84612322565b83815292861b8401820192898101908e851115612423575f80fd5b948301945b8486101561245957855193506001600160e01b031984168414612449575f80fd5b838252948a0194908a0190612428565b828b0152508752505050928401928401612385565b5090979650505050505050565b5f806040838503121561248c575f80fd5b8251915060208301516001600160401b038111156124a8575f80fd5b611f3585828601612344565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b8381101561255757888303603f19018552815180516001600160a01b031684528701518784018790528051878501819052908801905f9060608601905b808310156125425783516001600160e01b0319168252928a019260019290920191908a0190612518565b509689019694505050908601906001016124db565b509098975050505050505050565b5f60208284031215612575575f80fd5b815161123981611df8565b5f8060408385031215612591575f80fd5b825161259c81611df8565b60208401519092506122d781611df8565b5f602082840312156125bd575f80fd5b81516001600160401b038111156125d2575f80fd5b6105ea84828501612344565b5f805f80608085870312156125f1575f80fd5b84519350602085015161260381611df8565b60408601519093506001600160401b038082111561261f575f80fd5b61262b8883890161222e565b93506060870151915080821115612640575f80fd5b5061264d8782880161222e565b91505092959194509250565b5f805f806080858703121561266c575f80fd5b84519350602085015161267e81611df8565b60408601519093506001600160401b03811115612699575f80fd5b6126a58782880161222e565b92505060608501516126b681611df8565b939692955090935050565b5f805f805f60a086880312156126d5575f80fd5b8551945060208601516126e781611df8565b60408701519094506001600160401b03811115612702575f80fd5b61270e8882890161222e565b935050606086015161271f81611df8565b608087015190925061273081611df8565b809150509295509295909350565b5f805f8060808587031215612751575f80fd5b84519350602085015161276381611df8565b60408601519093506001600160401b038082111561277f575f80fd5b61278b8883890161222e565b935060608701519150808211156127a0575f80fd5b5061264d8782880161234456fe6080604052365f80375f80365f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545af43d5f803e808015603e573d5ff35b3d5ffdfea26469706673582212203865e7b18a71a3eb7a449ca94cb0b27eb52e26caaa068aad34930d717910a80564736f6c6343000819003360806040526040516100f53803806100f58339810160408190526020916046565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc556071565b5f602082840312156055575f80fd5b81516001600160a01b0381168114606a575f80fd5b9392505050565b60788061007d5f395ff3fe6080604052365f80375f80365f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545af43d5f803e808015603e573d5ff35b3d5ffdfea26469706673582212203865e7b18a71a3eb7a449ca94cb0b27eb52e26caaa068aad34930d717910a80564736f6c63430008190033608060405260043610610028575f3560e01c80630900f0101461007a578063704b6c0214610099575b635c60da1b5f525f8060045f7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50545afa365f80375f80365f845af490503d5f803e808015610074573d5ff35b3d5ffd5b005b348015610085575f80fd5b506100786100943660046101d6565b6100b8565b3480156100a4575f80fd5b506100786100b33660046101d6565b61013e565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100e4575f80fd5b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d508190556040516001600160a01b038216907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016b575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e6575f80fd5b81356001600160a01b03811681146101fc575f80fd5b939250505056fea2646970667358221220d1a00185ea5353a0df281429b9539e3e097cfaa88624d3e2867d1600498e4dff64736f6c6343000819003360806040526040516102f73803806102f78339810160408190526020916085565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103919091557fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d505560b1565b80516001600160a01b03811681146080575f80fd5b919050565b5f80604083850312156095575f80fd5b609c83606b565b915060a860208401606b565b90509250929050565b610239806100be5f395ff3fe608060405260043610610028575f3560e01c80630900f0101461007a578063704b6c0214610099575b635c60da1b5f525f8060045f7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50545afa365f80375f80365f845af490503d5f803e808015610074573d5ff35b3d5ffd5b005b348015610085575f80fd5b506100786100943660046101d6565b6100b8565b3480156100a4575f80fd5b506100786100b33660046101d6565b61013e565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100e4575f80fd5b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d508190556040516001600160a01b038216907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016b575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e6575f80fd5b81356001600160a01b03811681146101fc575f80fd5b939250505056fea2646970667358221220d1a00185ea5353a0df281429b9539e3e097cfaa88624d3e2867d1600498e4dff64736f6c63430008190033608060405234801561000f575f80fd5b506004361061003f575f3560e01c80630900f010146100435780635c60da1b14610058578063704b6c021461007c575b5f80fd5b6100566100513660046101d7565b61008f565b005b610060610115565b6040516001600160a01b03909116815260200160405180910390f35b61005661008a3660046101d7565b61013f565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100bb575f80fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545f5260205ff35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016c575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e7575f80fd5b81356001600160a01b03811681146101fd575f80fd5b939250505056fea26469706673582212206c603c6fffefb9570bd5408bca3f7b35d3fb8c3635348e3f848b4ee5ec33a5b664736f6c6343000819003360806040526040516102f83803806102f88339810160408190526020916085565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103919091557f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5560b1565b80516001600160a01b03811681146080575f80fd5b919050565b5f80604083850312156095575f80fd5b609c83606b565b915060a860208401606b565b90509250929050565b61023a806100be5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80630900f010146100435780635c60da1b14610058578063704b6c021461007c575b5f80fd5b6100566100513660046101d7565b61008f565b005b610060610115565b6040516001600160a01b03909116815260200160405180910390f35b61005661008a3660046101d7565b61013f565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100bb575f80fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545f5260205ff35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016c575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e7575f80fd5b81356001600160a01b03811681146101fd575f80fd5b939250505056fea26469706673582212206c603c6fffefb9570bd5408bca3f7b35d3fb8c3635348e3f848b4ee5ec33a5b664736f6c63430008190033608060405236600a57005b60045f80377fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060785762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e8080156093573d5ff35b3d5ffdfea2646970667358221220298b47807eeab7e6551ef056f5c4dae3490faa2dfd2320034a3bbdaf1cce5d1564736f6c63430008190033608060405260405161028f38038061028f8339810160408190526100229161010c565b5f5b60e0518110156100ab575f5b600561010083821b81018051806101400151851061005157505050506100a2565b6101609385901b019290920151604080519190915280517fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b6020909101529151015181519190912055600101610030565b50600101610024565b50307f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb55307f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc55506101b6565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561011c575f80fd5b81516001600160401b0380821115610132575f80fd5b818401915084601f830112610145575f80fd5b815181811115610157576101576100f8565b604051601f8201601f19908116603f0116810190838211818310171561017f5761017f6100f8565b81604052828152876020848701011115610197575f80fd5b8260208601602083015e5f928101602001929092525095945050505050565b60cd806101c25f395ff3fe608060405236600a57005b60045f80377fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060785762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e8080156093573d5ff35b3d5ffdfea2646970667358221220298b47807eeab7e6551ef056f5c4dae3490faa2dfd2320034a3bbdaf1cce5d1564736f6c6343000819003360806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220dcc00c9af50e14d34131b0fe806cec288679f6a7d99538f0f6f60bef05ebecfa64736f6c6343000819003360806040526040516101a53803806101a58339810160408190526020916069565b7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb55307f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc556094565b5f602082840312156078575f80fd5b81516001600160a01b0381168114608d575f80fd5b9392505050565b610104806100a15f395ff3fe60806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220dcc00c9af50e14d34131b0fe806cec288679f6a7d99538f0f6f60bef05ebecfa64736f6c6343000819003360806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220e7bcd350f7a434240fc1cad87ab8180ac6b29a3a3406d746e798af3d37ed77d764736f6c6343000819003360806040526040516101a63803806101a6833981016040819052602091606a565b7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb8190557f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc556095565b5f602082840312156079575f80fd5b81516001600160a01b0381168114608e575f80fd5b9392505050565b610104806100a25f395ff3fe60806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220e7bcd350f7a434240fc1cad87ab8180ac6b29a3a3406d746e798af3d37ed77d764736f6c63430008190033683d3d37363d34f05bff6009527f60016015523060145261d6943d526017601e2060601b60601c803b60275750363d5260293df3a2646970667358221220e6d00bffe980b8bc55720dcdbac7564ea1a6bd5f841b0297e38e8d5e32fe2b8464736f6c63430008190033

Deployed Bytecode

0x60806040526004361061003e575f3560e01c80633b714a0a14610042578063ade34be514610063578063d65652d514610098578063eb10f3ca146100d7575b5f80fd5b34801561004d575f80fd5b5061006161005c366004611ef3565b610102565b005b34801561006e575f80fd5b5061008261007d366004611f52565b610295565b60405161008f9190611fde565b60405180910390f35b3480156100a3575f80fd5b506100b76100b2366004611ffe565b6105f2565b604080516001600160a01b0393841681529290911660208301520161008f565b6100ea6100e5366004612068565b610778565b6040516001600160a01b03909116815260200161008f565b5f61010b610cdc565b335f90815260019190910160205260409020546001600160a01b031690508015801561013f57506001600160a01b03831615155b156101475750815b6001600160a01b03811615610290575f80826001600160a01b0316846040516024016101739190611fde565b60408051601f198184030181529181526020820180516001600160e01b0316637dfc7b0360e11b179052516101a89190612110565b5f604051808303815f865af19150503d805f81146101e1576040519150601f19603f3d011682016040523d82523d5f602084013e6101e6565b606091505b5091509150816102115760405162461bcd60e51b81526004016102089061211b565b60405180910390fd5b6001600160a01b038516301461028d578461022a610cdc565b335f908152600191909101602090815260409182902080546001600160a01b0319166001600160a01b03948516179055905191871682527f0d3a3dda2c3164bbc4898485ffa0b984c414d664538d3b99df23202077f72c9b910160405180910390a15b50505b505050565b60605f8460088111156102aa576102aa612161565b146105805760018460088111156102c3576102c3612161565b146105265760028460088111156102dc576102dc612161565b146104f05760038460088111156102f5576102f5612161565b146104ba57600484600881111561030e5761030e612161565b1461048457600584600881111561032757610327612161565b146103e157600684600881111561034057610340612161565b146103a557600784600881111561035957610359612161565b1461036457816105ea565b5f83600181111561037757610377612161565b146103935761038e610389835f610d0f565b610d73565b6105ea565b61038e6103a0835f610d0f565b610dcf565b5f8360018111156103b8576103b8612161565b146103cf5761038e6103ca835f610d0f565b610e2b565b61038e6103dc835f610d0f565b610e76565b5f8360018111156103f4576103f4612161565b146104205760405161040860208201611d5f565b601f1982820381018352601f909101166040526105ea565b60405161042f60208201611d6b565b601f1982820381018352601f909101166040819052610452908490602001611fde565b60408051601f19818403018152908290526104709291602001612175565b6040516020818303038152906040526105ea565b5f83600181111561049757610497612161565b146104ab5760405161040860208201611d77565b60405161042f60208201611d84565b5f8360018111156104cd576104cd612161565b146104e15760405161040860208201611d91565b60405161042f60208201611d9e565b5f83600181111561050357610503612161565b146105175760405161040860208201611dab565b60405161042f60208201611db7565b5f83600181111561053957610539612161565b1461054d5760405161040860208201611dc4565b60405161055c60208201611dd1565b601f1982820381018352601f90910116604081905261047091908490602001612175565b5f83600181111561059357610593612161565b146105a75760405161040860208201611dde565b6040516105b660208201611deb565b601f1982820381018352601f9091011660408190526105da91908490602001612175565b6040516020818303038152906040525b949350505050565b5f808087600281111561060757610607612161565b1461076157600287600281111561062057610620612161565b14610742575f86600881111561063857610638612161565b1461073957600186600881111561065157610651612161565b1461073057600286600881111561066a5761066a612161565b1461072757600386600881111561068357610683612161565b1461071e57600486600881111561069c5761069c612161565b146107155760058660088111156106b5576106b5612161565b1461070c5760068660088111156106ce576106ce612161565b146107035760078660088111156106e7576106e7612161565b146106fa576106f585610ed4565b61076a565b6106f585610f06565b6106f585610f34565b6106f585610f5d565b6106f585610fe5565b6106f585611058565b6106f58561108b565b6106f5856110fb565b6106f58561112b565b6106f5305f851161075b57610755610cdc565b5461115b565b8461115b565b61076a846111ca565b909890975095505050505050565b5f8086600281111561078c5761078c612161565b146109df5760018660028111156107a5576107a5612161565b146108c7575f8560088111156107bd576107bd612161565b146108be5760018560088111156107d6576107d6612161565b146108b55760028560088111156107ef576107ef612161565b146108ac57600385600881111561080857610808612161565b146108a357600485600881111561082157610821612161565b1461089a57600585600881111561083a5761083a612161565b1461089157600685600881111561085357610853612161565b1461088857600785600881111561086c5761086c612161565b1461087f5761087a82611206565b610aee565b61087a82611210565b61087a82611240565b61087a82611264565b61087a826112e7565b61087a82611348565b61087a82611376565b61087a826113e1565b61087a8261140c565b5f8560088111156108da576108da612161565b146109d65760018560088111156108f3576108f3612161565b146109cd57600285600881111561090c5761090c612161565b146109c457600385600881111561092557610925612161565b146109bb57600485600881111561093e5761093e612161565b146109b257600585600881111561095757610957612161565b146109a957600685600881111561097057610970612161565b146109a057600785600881111561098957610989612161565b146109975761087a82611437565b61087a8261145c565b61087a82611489565b61087a826114b1565b61087a82611538565b61087a826115a6565b61087a826115d8565b61087a82611647565b61087a82611676565b5f8560088111156109f2576109f2612161565b14610ae5576001856008811115610a0b57610a0b612161565b14610adc576002856008811115610a2457610a24612161565b14610ad3576003856008811115610a3d57610a3d612161565b14610aca576004856008811115610a5657610a56612161565b14610aca576005856008811115610a6f57610a6f612161565b14610ac1576006856008811115610a8857610a88612161565b14610ab8576007856008811115610aa157610aa1612161565b14610aaf5761087a826116a5565b61087a826116dc565b61087a82611730565b61087a82611760565b61087a826117db565b61087a82611853565b61087a826118ca565b610aee82611901565b9050806001600160a01b03163b5f03610b495760405162461bcd60e51b815260206004820152601d60248201527f44657374696e79466163746f72793a6465706c6f79206661696c6564210000006044820152606401610208565b610b538184611938565b506001600160a01b03841615610c4d575f846001600160a01b03168288888787604051602401610b87959493929190612189565b60408051601f198184030181529181526020820180516001600160e01b031663022d35b760e31b17905251610bbc9190612110565b5f604051808303815f865af19150503d805f8114610bf5576040519150601f19603f3d011682016040523d82523d5f602084013e610bfa565b606091505b5050905080610c4b5760405162461bcd60e51b815260206004820152601f60248201527f44657374696e79466163746f72793a63616c6c6261636b206661696c656421006044820152606401610208565b505b6040516001600160a01b03821681527ff40fcec21964ffb566044d083b4073f29f7f7929110ea19e1b3ebe375d89055e9060200160405180910390a17fe335c04c904a95df658ab3e6bb90e9f8f42b8d7b0dd1c5ec3c3000eff7562bc3610cb2610cdc565b5460405190815260200160405180910390a1610ccc610cdc565b8054600101905595945050505050565b5f80610d0960077f8fc89b1793e5d3153375a09940e56c9a1019f9ef47f9952fbe41180570601c38612208565b92915050565b5f610d1b82601461221b565b83511015610d635760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610208565b500160200151600160601b900490565b60405168365f5f375f5f365f7360b81b6020820152606082811b6001600160601b03191660298301526e5af43d5f5f3e5f3d91602a57fd5bf360881b603d83015290604c015b6040516020818303038152906040529050919050565b60405168602c8060095f395ff360b81b602082015268365f5f375f5f365f7360b81b6029820152606082811b6001600160601b03191660328301526e5af43d5f5f3e5f3d91602a57fd5bf360881b604683015290605501610db9565b60405169363d3d373d3d3d363d7360b01b6020820152606082811b6001600160601b031916602a8301526e5af43d82803e903d91602b57fd5bf360881b603e83015290604d01610db9565b604051693d602d80600a3d3981f360b01b602082015269363d3d373d3d3d363d7360b01b602a820152606082811b6001600160601b03191660348301526e5af43d82803e903d91602b57fd5bf360881b604883015290605701610db9565b5f805f8084806020019051810190610eec919061227b565b91509150610efa82826119f2565b90969095509350505050565b5f805f8084806020019051810190610f1e91906122b4565b91509150610efa82610f2f83610dcf565b6119f2565b5f805f8084806020019051810190610f4c91906122b4565b91509150610efa82610f2f83610e76565b5f805f8084806020019051810190610f7591906122b4565b91509150610efa8260405180602001610f8d90611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0386166020830152015b60408051601f1981840301815290829052610fd19291602001612175565b6040516020818303038152906040526119f2565b5f805f805f85806020019051810190610ffe91906122e2565b92509250925061104b836040518060200161101890611d84565b601f1982820381018352601f9091011660408181526001600160a01b038781166020840152861690820152606001610fb3565b9097909650945050505050565b5f805f805f8580602001905181019061107191906122e2565b92509250925061104b836040518060200161101890611d9e565b5f805f80848060200190518101906110a3919061247b565b91509150610efa82604051806020016110bb90611db7565b601f1982820381018352601f9091011660408190526110de9085906020016124b4565b60408051601f1981840301815290829052610fb391602001611fde565b5f805f808480602001905181019061111391906122b4565b91509150610efa8260405180602001610f8d90611dd1565b5f805f808480602001905181019061114391906122b4565b91509150610efa8260405180602001610f8d90611deb565b815f607f831161118757835f526094600b5360d6600a5382831560071b17602053506017600a206111c3565b60085b83811c1561119a5760080161118a565b60031c838152600885901b5f5260808101601f536094600a538060d60160095360170160092090505b9250929050565b5f806111ee83604051806060016040528060348152602001613c2c603491396119f2565b92506111fd905082600161115b565b92949293505050565b5f610d0982611a49565b5f80828060200190518101906112269190612565565b905061123961123482610dcf565b611a49565b9392505050565b5f80828060200190518101906112569190612565565b905061123961123482610e76565b5f808280602001905181019061127a9190612565565b90506112396040518060200161128f90611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0385166020830152015b60408051601f19818403018152908290526112d39291602001612175565b604051602081830303815290604052611a49565b5f805f838060200190518101906112fe9190612580565b915091506105ea6040518060200161131590611d84565b601f1982820381018352601f9091011660408181526001600160a01b0386811660208401528516908201526060016112b5565b5f805f8380602001905181019061135f9190612580565b915091506105ea6040518060200161131590611d9e565b5f808280602001905181019061138c91906125ad565b9050611239604051806020016113a190611db7565b601f1982820381018352601f9091011660408190526113c49084906020016124b4565b60408051601f19818403018152908290526112b591602001611fde565b5f80828060200190518101906113f79190612565565b90506112396040518060200161128f90611dd1565b5f80828060200190518101906114229190612565565b90506112396040518060200161128f90611deb565b5f805f8380602001905181019061144e919061227b565b915091506105ea8282611a58565b5f805f8380602001905181019061147391906122b4565b915091506105ea8261148483610dcf565b611a58565b5f805f838060200190518101906114a091906122b4565b915091506105ea8261148483610e76565b5f805f838060200190518101906114c891906122b4565b915091506105ea82604051806020016114e090611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0386166020830152015b60408051601f19818403018152908290526115249291602001612175565b604051602081830303815290604052611a58565b5f805f808480602001905181019061155091906122e2565b92509250925061159d836040518060200161156a90611d84565b601f1982820381018352601f9091011660408181526001600160a01b038781166020840152861690820152606001611506565b95945050505050565b5f805f80848060200190518101906115be91906122e2565b92509250925061159d836040518060200161156a90611d9e565b5f805f838060200190518101906115ef919061247b565b915091506105ea826040518060200161160790611db7565b601f1982820381018352601f90910116604081905261162a9085906020016124b4565b60408051601f198184030181529082905261150691602001611fde565b5f805f8380602001905181019061165e91906122b4565b915091506105ea82604051806020016114e090611dd1565b5f805f8380602001905181019061168d91906122b4565b915091506105ea82604051806020016114e090611deb565b5f805f805f858060200190518101906116be91906125de565b93509350935093506116d284848484611ad9565b9695505050505050565b5f805f805f858060200190518101906116f59190612659565b93509350935093506116d284848461170c85610dcf565b60405160200161171c9190612110565b604051602081830303815290604052611ad9565b5f805f805f858060200190518101906117499190612659565b93509350935093506116d284848461170c85610e76565b5f805f805f858060200190518101906117799190612659565b93509350935093506116d28484846040518060200161179790611d6b565b601f1982820381018352601f9091011660408181526001600160a01b0388166020830152015b60408051601f198184030181529082905261171c9291602001612175565b5f805f805f80868060200190518101906117f591906126c1565b945094509450945094506118488585856040518060200161181590611d9e565b601f1982820381018352601f9091011660408181526001600160a01b0389811660208401528816908201526060016117bd565b979650505050505050565b5f805f805f8580602001905181019061186c919061273e565b93509350935093506116d28484846040518060200161188a90611db7565b601f1982820381018352601f9091011660408190526118ad9087906020016124b4565b60408051601f19818403018152908290526117bd91602001611fde565b5f805f805f858060200190518101906118e39190612659565b93509350935093506116d28484846040518060200161179790611dd1565b5f805f805f8580602001905181019061191a9190612659565b93509350935093506116d28484846040518060200161179790611deb565b80515f90156119eb575f836001600160a01b03168360405161195a9190612110565b5f604051808303815f865af19150503d805f8114611993576040519150601f19603f3d011682016040523d82523d5f602084013e611998565b606091505b50509050806119e95760405162461bcd60e51b815260206004820152601860248201527f44657374696e79466163746f72793a696e6974206661696c00000000000000006044820152606401610208565b505b5090919050565b8051602091820120604080516001600160f81b03198185015230606081901b6001600160601b0319166021830152603582019590955260558082019390935281518082039093018352607501905280519101209091565b5f81516020830134f092915050565b5f8282516020840134f59050604051806060016040528060348152602001613c2c6034913980519060200120828051906020012003610d095760405162461bcd60e51b815260206004820152601f60248201527f44697361626c652063726561746532206465706c6f792063726561746f7221006044820152606401610208565b5f80604051806060016040528060348152602001613c2c6034913990505f611b0187836119f2565b9150506001600160a01b0381163b15611b5c5760405162461bcd60e51b815260206004820181905260248201527f44657374696e79466163746f72793a63726561746f72206465706c6f796564216044820152606401610208565b5f8783516020850134f59050611b7381600161115b565b94505f9050611b80610cdc565b6001600160a01b038087165f9081526001830160205260409020549192501680158015611bb557506001600160a01b03891615155b15611bbd5750875b6001600160a01b03811615611cbb575f80826001600160a01b03168a604051602401611be99190611fde565b60408051601f198184030181529181526020820180516001600160e01b0316637dfc7b0360e11b17905251611c1e9190612110565b5f604051808303815f865af19150503d805f8114611c57576040519150601f19603f3d011682016040523d82523d5f602084013e611c5c565b606091505b509150915081611c7e5760405162461bcd60e51b81526004016102089061211b565b6001600160a01b038b163014611cb857335f908152600185016020526040902080546001600160a01b0319166001600160a01b038d161790555b50505b826001600160a01b03163488604051611cd49190612110565b5f6040518083038185875af1925050503d805f8114611d0e576040519150601f19603f3d011682016040523d82523d5f602084013e611d13565b606091505b50506040516001600160a01b03851681527ff40fcec21964ffb566044d083b4073f29f7f7929110ea19e1b3ebe375d89055e915060200160405180910390a15050505050949350505050565b6078806127ae83390190565b60f58061282683390190565b6102398061291b83390190565b6102f780612b5483390190565b61023a80612e4b83390190565b6102f88061308583390190565b60cd8061337d83390190565b61028f8061344a83390190565b610104806136d983390190565b6101a5806137dd83390190565b6101048061398283390190565b6101a680613a8683390190565b6001600160a01b0381168114611e0c575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b0381118282101715611e4557611e45611e0f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611e7357611e73611e0f565b604052919050565b5f6001600160401b03821115611e9357611e93611e0f565b50601f01601f191660200190565b5f82601f830112611eb0575f80fd5b8135611ec3611ebe82611e7b565b611e4b565b818152846020838601011115611ed7575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215611f04575f80fd5b8235611f0f81611df8565b915060208301356001600160401b03811115611f29575f80fd5b611f3585828601611ea1565b9150509250929050565b803560098110611f4d575f80fd5b919050565b5f805f60608486031215611f64575f80fd5b611f6d84611f3f565b9250602084013560028110611f80575f80fd5b915060408401356001600160401b03811115611f9a575f80fd5b611fa686828701611ea1565b9150509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112396020830184611fb0565b803560038110611f4d575f80fd5b5f805f805f60a08688031215612012575f80fd5b61201b86611ff0565b945061202960208701611f3f565b935060408601356001600160401b03811115612043575f80fd5b61204f88828901611ea1565b9598949750949560608101359550608001359392505050565b5f805f805f60a0868803121561207c575f80fd5b61208586611ff0565b945061209360208701611f3f565b935060408601356120a381611df8565b925060608601356001600160401b03808211156120be575f80fd5b6120ca89838a01611ea1565b935060808801359150808211156120df575f80fd5b506120ec88828901611ea1565b9150509295509295909350565b5f81518060208401855e5f93019283525090919050565b5f61123982846120f9565b60208082526026908201527f44657374696e79466163746f72793a7665726966794f776e657273686970204660408201526561696c65642160d01b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b5f6105ea61218383866120f9565b846120f9565b6001600160a01b03861681525f600386106121a6576121a6612161565b856020830152600985106121bc576121bc612161565b84604083015260a060608301526121d660a0830185611fb0565b82810360808401526121e88185611fb0565b98975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610d0957610d096121f4565b80820180821115610d0957610d096121f4565b5f82601f83011261223d575f80fd5b815161224b611ebe82611e7b565b81815284602083860101111561225f575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f806040838503121561228c575f80fd5b8251915060208301516001600160401b038111156122a8575f80fd5b611f358582860161222e565b5f80604083850312156122c5575f80fd5b8251915060208301516122d781611df8565b809150509250929050565b5f805f606084860312156122f4575f80fd5b83519250602084015161230681611df8565b604085015190925061231781611df8565b809150509250925092565b5f6001600160401b0382111561233a5761233a611e0f565b5060051b60200190565b5f82601f830112612353575f80fd5b81516020612363611ebe83612322565b828152600592831b8501820192828201919087851115612381575f80fd5b8387015b8581101561246e5780516001600160401b03808211156123a3575f80fd5b908901906040828c03601f19018113156123bb575f80fd5b6123c3611e23565b888401516123d081611df8565b815283820151838111156123e2575f80fd5b8085019450508c603f8501126123f6575f80fd5b888401519250612408611ebe84612322565b83815292861b8401820192898101908e851115612423575f80fd5b948301945b8486101561245957855193506001600160e01b031984168414612449575f80fd5b838252948a0194908a0190612428565b828b0152508752505050928401928401612385565b5090979650505050505050565b5f806040838503121561248c575f80fd5b8251915060208301516001600160401b038111156124a8575f80fd5b611f3585828601612344565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b8381101561255757888303603f19018552815180516001600160a01b031684528701518784018790528051878501819052908801905f9060608601905b808310156125425783516001600160e01b0319168252928a019260019290920191908a0190612518565b509689019694505050908601906001016124db565b509098975050505050505050565b5f60208284031215612575575f80fd5b815161123981611df8565b5f8060408385031215612591575f80fd5b825161259c81611df8565b60208401519092506122d781611df8565b5f602082840312156125bd575f80fd5b81516001600160401b038111156125d2575f80fd5b6105ea84828501612344565b5f805f80608085870312156125f1575f80fd5b84519350602085015161260381611df8565b60408601519093506001600160401b038082111561261f575f80fd5b61262b8883890161222e565b93506060870151915080821115612640575f80fd5b5061264d8782880161222e565b91505092959194509250565b5f805f806080858703121561266c575f80fd5b84519350602085015161267e81611df8565b60408601519093506001600160401b03811115612699575f80fd5b6126a58782880161222e565b92505060608501516126b681611df8565b939692955090935050565b5f805f805f60a086880312156126d5575f80fd5b8551945060208601516126e781611df8565b60408701519094506001600160401b03811115612702575f80fd5b61270e8882890161222e565b935050606086015161271f81611df8565b608087015190925061273081611df8565b809150509295509295909350565b5f805f8060808587031215612751575f80fd5b84519350602085015161276381611df8565b60408601519093506001600160401b038082111561277f575f80fd5b61278b8883890161222e565b935060608701519150808211156127a0575f80fd5b5061264d8782880161234456fe6080604052365f80375f80365f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545af43d5f803e808015603e573d5ff35b3d5ffdfea26469706673582212203865e7b18a71a3eb7a449ca94cb0b27eb52e26caaa068aad34930d717910a80564736f6c6343000819003360806040526040516100f53803806100f58339810160408190526020916046565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc556071565b5f602082840312156055575f80fd5b81516001600160a01b0381168114606a575f80fd5b9392505050565b60788061007d5f395ff3fe6080604052365f80375f80365f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545af43d5f803e808015603e573d5ff35b3d5ffdfea26469706673582212203865e7b18a71a3eb7a449ca94cb0b27eb52e26caaa068aad34930d717910a80564736f6c63430008190033608060405260043610610028575f3560e01c80630900f0101461007a578063704b6c0214610099575b635c60da1b5f525f8060045f7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50545afa365f80375f80365f845af490503d5f803e808015610074573d5ff35b3d5ffd5b005b348015610085575f80fd5b506100786100943660046101d6565b6100b8565b3480156100a4575f80fd5b506100786100b33660046101d6565b61013e565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100e4575f80fd5b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d508190556040516001600160a01b038216907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016b575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e6575f80fd5b81356001600160a01b03811681146101fc575f80fd5b939250505056fea2646970667358221220d1a00185ea5353a0df281429b9539e3e097cfaa88624d3e2867d1600498e4dff64736f6c6343000819003360806040526040516102f73803806102f78339810160408190526020916085565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103919091557fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d505560b1565b80516001600160a01b03811681146080575f80fd5b919050565b5f80604083850312156095575f80fd5b609c83606b565b915060a860208401606b565b90509250929050565b610239806100be5f395ff3fe608060405260043610610028575f3560e01c80630900f0101461007a578063704b6c0214610099575b635c60da1b5f525f8060045f7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50545afa365f80375f80365f845af490503d5f803e808015610074573d5ff35b3d5ffd5b005b348015610085575f80fd5b506100786100943660046101d6565b6100b8565b3480156100a4575f80fd5b506100786100b33660046101d6565b61013e565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100e4575f80fd5b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d508190556040516001600160a01b038216907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016b575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e6575f80fd5b81356001600160a01b03811681146101fc575f80fd5b939250505056fea2646970667358221220d1a00185ea5353a0df281429b9539e3e097cfaa88624d3e2867d1600498e4dff64736f6c63430008190033608060405234801561000f575f80fd5b506004361061003f575f3560e01c80630900f010146100435780635c60da1b14610058578063704b6c021461007c575b5f80fd5b6100566100513660046101d7565b61008f565b005b610060610115565b6040516001600160a01b03909116815260200160405180910390f35b61005661008a3660046101d7565b61013f565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100bb575f80fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545f5260205ff35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016c575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e7575f80fd5b81356001600160a01b03811681146101fd575f80fd5b939250505056fea26469706673582212206c603c6fffefb9570bd5408bca3f7b35d3fb8c3635348e3f848b4ee5ec33a5b664736f6c6343000819003360806040526040516102f83803806102f88339810160408190526020916085565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103919091557f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5560b1565b80516001600160a01b03811681146080575f80fd5b919050565b5f80604083850312156095575f80fd5b609c83606b565b915060a860208401606b565b90509250929050565b61023a806100be5f395ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80630900f010146100435780635c60da1b14610058578063704b6c021461007c575b5f80fd5b6100566100513660046101d7565b61008f565b005b610060610115565b6040516001600160a01b03909116815260200160405180910390f35b61005661008a3660046101d7565b61013f565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433146100bb575f80fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545f5260205ff35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035433811461016c575f80fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103829055604080516001600160a01b038084168252841660208201527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b5f602082840312156101e7575f80fd5b81356001600160a01b03811681146101fd575f80fd5b939250505056fea26469706673582212206c603c6fffefb9570bd5408bca3f7b35d3fb8c3635348e3f848b4ee5ec33a5b664736f6c63430008190033608060405236600a57005b60045f80377fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060785762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e8080156093573d5ff35b3d5ffdfea2646970667358221220298b47807eeab7e6551ef056f5c4dae3490faa2dfd2320034a3bbdaf1cce5d1564736f6c63430008190033608060405260405161028f38038061028f8339810160408190526100229161010c565b5f5b60e0518110156100ab575f5b600561010083821b81018051806101400151851061005157505050506100a2565b6101609385901b019290920151604080519190915280517fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b6020909101529151015181519190912055600101610030565b50600101610024565b50307f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb55307f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc55506101b6565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561011c575f80fd5b81516001600160401b0380821115610132575f80fd5b818401915084601f830112610145575f80fd5b815181811115610157576101576100f8565b604051601f8201601f19908116603f0116810190838211818310171561017f5761017f6100f8565b81604052828152876020848701011115610197575f80fd5b8260208601602083015e5f928101602001929092525095945050505050565b60cd806101c25f395ff3fe608060405236600a57005b60045f80377fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060785762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e8080156093573d5ff35b3d5ffdfea2646970667358221220298b47807eeab7e6551ef056f5c4dae3490faa2dfd2320034a3bbdaf1cce5d1564736f6c6343000819003360806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220dcc00c9af50e14d34131b0fe806cec288679f6a7d99538f0f6f60bef05ebecfa64736f6c6343000819003360806040526040516101a53803806101a58339810160408190526020916069565b7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb55307f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc556094565b5f602082840312156078575f80fd5b81516001600160a01b0381168114608d575f80fd5b9392505050565b610104806100a15f395ff3fe60806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220dcc00c9af50e14d34131b0fe806cec288679f6a7d99538f0f6f60bef05ebecfa64736f6c6343000819003360806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220e7bcd350f7a434240fc1cad87ab8180ac6b29a3a3406d746e798af3d37ed77d764736f6c6343000819003360806040526040516101a63803806101a6833981016040819052602091606a565b7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb8190557f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cc556095565b5f602082840312156079575f80fd5b81516001600160a01b0381168114608e575f80fd5b9392505050565b610104806100a25f395ff3fe60806040525f805260045f6004376020600860245f7f3418148758b1f9e91a7d35447272be5d6ae049a7e84e742f66587a44d93e29cb545afa506008518060af5760045f8037507fd337f855a71558e35b1ec3d991eab0dfca9dba8c925272bac802632b4e45f57b60205260405f20548060af5762461bcd60e51b5f526020600452601e6024527f44657374696e793a204d6f64756c6520343034206e6f7420666f756e6421000060445260645ffd5b365f80375f80365f845af490503d5f803e80801560ca573d5ff35b3d5ffdfea2646970667358221220e7bcd350f7a434240fc1cad87ab8180ac6b29a3a3406d746e798af3d37ed77d764736f6c63430008190033683d3d37363d34f05bff6009527f60016015523060145261d6943d526017601e2060601b60601c803b60275750363d5260293df3a2646970667358221220e6d00bffe980b8bc55720dcdbac7564ea1a6bd5f841b0297e38e8d5e32fe2b8464736f6c63430008190033

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.