ETH Price: $2,441.54 (+1.64%)

Contract

0x00000000000d351E7Df55d1A7E8045daf6C998E2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Contract Bas...184709232023-10-31 15:12:23346 days ago1698765143IN
0x00000000...af6C998E2
0 ETH0.005318337.05360472

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
176592482023-07-09 22:55:11459 days ago1688943311  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LayerrRenderer

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 33333 runs

Other Settings:
default evmVersion, BSL 1.1 license
File 1 of 4 : LayerrRenderer.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.20;

import {ILayerrRenderer} from "./interfaces/ILayerrRenderer.sol";
import {IOwnable} from "./interfaces/IOwnable.sol";

/**
 * @title LayerrRenderer
 * @author 0xth0mas (Layerr)
 * @notice LayerrRenderer handles contractURI and tokenURI generation for contracts
 *         deployed on the Layerr platform. Contract owners have complete control of 
 *         their tokens with the ability to set their own renderer, host their tokens
 *         with Layerr, set all tokens to a prereveal image, or set a base URI that
 *         token ids will be appended to.
 *         Tokens hosted with Layerr will automatically generate a tokenURI with the
 *         `layerrBaseTokenUri`/{chainId}/{contractAddress}/{tokenId} to allow new tokens
 *         to be minted without updating a base uri.
 *         For long term storage, Layerr-hosted tokens can be swept onto Layerr's IPFS
 *         solution.
 */
contract LayerrRenderer is ILayerrRenderer {

    /// @dev Layerr-owned EOA that is allowed to update the base token and base contract URIs for Layerr-hosted non-IPFS tokens
    address public owner;

    /// @dev Layerr's signature account for checking parameters of tokens swept to Layerr IPFS
    address public layerrSigner = 0xc44355A57368C22D01A8a146C0a2669B504B25A0;

    /// @dev The base token URI that chainId, contractAddress and tokenId are added to for rendering
    string public layerrBaseTokenUri = 'https://metadata.layerr.art';

    /// @dev The base contract URI that chainId and contractAddress are added to for rendering
    string public layerrBaseContractUri = 'https://contract-metadata.layerr.art';

    /// @dev The rendering type for a token contract, defaults to LAYERR_HOSTED
    mapping(address => RenderType) public contractRenderType;

    /// @dev Base token URI set by the token contract owner for BASE_PLUS_TOKEN render type and LAYERR_HOSTED tokens on IPFS
    mapping(address => string) public contractBaseTokenUri;

    /// @dev Token contract URI set by the token contract owner
    mapping(address => string) public contractContractUri;

    /// @dev mapping of token contract addresses that flag a token contract as having all of its tokens hosted on Layerr IPFS
    mapping(address => bool) public layerrHostedAllTokensOnIPFS;

    /// @dev bitmap of token ids for a token contract that have been moved to Layerr hosted IPFS
    mapping(address => mapping(uint256 => uint256)) public layerrHostedTokensOnIPFS;

    /// @dev mapping of token contract addresses with the UTC timestamp of when the IPFS hosting is paid through
    mapping(address => uint256) public layerrHostedIPFSExpiration;

    modifier onlyOwner() {
        if (msg.sender != owner) {
            revert NotContractOwner();
        }
        _;
    }

    constructor() {
        owner = 0x0000000000799dfE79Ed462822EC68eF9a6199e6;
    }

    /**
     * @inheritdoc ILayerrRenderer
     */
    function tokenURI(
        address contractAddress,
        uint256 tokenId
    ) external view returns (string memory _tokenURI) {
        RenderType renderType = contractRenderType[contractAddress];
        if (renderType == RenderType.LAYERR_HOSTED) {
            if(_isLayerrHostedIPFS(contractAddress, tokenId)) {
                _tokenURI = string(
                    abi.encodePacked(contractBaseTokenUri[contractAddress], _toString(tokenId))
                );
            } else {
                _tokenURI = string(
                    abi.encodePacked(
                        layerrBaseTokenUri,
                        "/",
                        _toString(block.chainid),
                        "/",
                        _toString(contractAddress),
                        "/",
                        _toString(tokenId)
                    )
                );
            }
        } else if (renderType == RenderType.PREREVEAL) {
            _tokenURI = contractBaseTokenUri[contractAddress];
        } else if (renderType == RenderType.BASE_PLUS_TOKEN) {
            _tokenURI = string(
                abi.encodePacked(contractBaseTokenUri[contractAddress], _toString(tokenId))
            );
        }
    }

    /**
     * @inheritdoc ILayerrRenderer
     */
    function contractURI(
        address contractAddress
    ) external view returns (string memory _contractURI) {
        _contractURI = contractContractUri[contractAddress];
        if (bytes(_contractURI).length == 0) {
            _contractURI = string(
                abi.encodePacked(
                    layerrBaseContractUri,
                    "/",
                    _toString(block.chainid),
                    "/",
                    _toString(contractAddress)
                )
            );
        }
    }

    /**
     * @notice Updates rendering settings for a contract. Must be the ERC173 owner for the token contract to call.
     * @param contractAddress address of the contract to set the base token URI for
     * @param baseTokenUri base token URI to set for `contractAddress`
     * @param renderType sets the current render type for the contract
     */
    function setContractBaseTokenUri(
        address contractAddress,
        string calldata baseTokenUri,
        RenderType renderType
    ) external {
        if (IOwnable(contractAddress).owner() != msg.sender) {
            revert NotContractOwner();
        }
        contractBaseTokenUri[contractAddress] = baseTokenUri;
        contractRenderType[contractAddress] = renderType;
    }

    /**
     * @notice Updates rendering settings for a contract. Must be the ERC173 owner for the token contract to call.
     * @param contractAddress address of the contract to set the base token URI for
     * @param contractUri contract URI to set for `contractAddress`
     */
    function setContractUri(
        address contractAddress,
        string calldata contractUri
    ) external {
        if (IOwnable(contractAddress).owner() != msg.sender) {
            revert NotContractOwner();
        }
        contractContractUri[contractAddress] = contractUri;
    }

    /**
     * @notice Updates the base token URI to sweep tokens to IPFS for Layerr hosted tokens
     *         This allows new tokens to continue to be minted on the contract with the default
     *         rendering address while existing tokens are moved onto IPFS for long term storage.
     * @param contractAddress address of the token contract
     * @param baseTokenUri base token URI to set for the contract's tokens
     * @param allTokens set to true for larger collections that are done minting
     *                  avoids setting each token id in the bitmap for gas savings but new tokens
     *                  will not render with the default rendering address
     * @param tokenIds array of token ids that are being swept to Layerr hosted IPFS
     * @param ipfsExpiration UTC timestamp that the IPFS hosting is paid through
     * @param signature signature by Layerr account to confirm the parameters supplied
     */
    function setContractBaseTokenUriForLayerrHostedIPFS(
        address contractAddress,
        string calldata baseTokenUri,
        bool allTokens,
        uint256[] calldata tokenIds,
        uint256 ipfsExpiration,
        bytes calldata signature
    ) external payable {
        if (IOwnable(contractAddress).owner() != msg.sender) {
            revert NotContractOwner();
        }

        bytes32 hash = keccak256(abi.encodePacked(contractAddress, baseTokenUri, ipfsExpiration, msg.value));
        address signer = _recover(hash, signature);
        if(signer != layerrSigner) revert InvalidSignature();

        (bool sent, ) = payable(owner).call{value: msg.value}("");
        if (!sent) {
            revert PaymentFailed();
        }

        layerrHostedIPFSExpiration[contractAddress] = ipfsExpiration;
        layerrHostedAllTokensOnIPFS[contractAddress] = allTokens;
        contractBaseTokenUri[contractAddress] = baseTokenUri;
        contractRenderType[contractAddress] = RenderType.LAYERR_HOSTED;

        for(uint256 i = 0;i < tokenIds.length;) {
            _setLayerrHostedIPFS(contractAddress, tokenIds[i]);
            unchecked { ++i; }
        }
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(ILayerrRenderer).interfaceId;
    }

    /* OWNER FUNCTIONS */
    
    /**
     * @notice Owner function to set the Layerr signature account
     * @param _layerrSigner address that will be used to check signatures
     */
    function setLayerrSigner(
        address _layerrSigner
    ) external onlyOwner {
        layerrSigner = _layerrSigner;
    }

    /**
     * @notice Owner function to set the default token rendering URI
     * @param _layerrBaseTokenUri base token uri to be used for default token rendering
     */
    function setLayerrBaseTokenUri(
        string calldata _layerrBaseTokenUri
    ) external onlyOwner {
        layerrBaseTokenUri = _layerrBaseTokenUri;
    }

    /**
     * @notice Owner function to set the default contract rendering URI
     * @param _layerrBaseContractUri base contract uri to be used for default rendering
     */

    function setLayerrBaseContractUri(
        string calldata _layerrBaseContractUri
    ) external onlyOwner {
        layerrBaseContractUri = _layerrBaseContractUri;
    }

    /* INTERNAL FUNCTIONS */

    /**
     * @notice Checks to see if a token has been flagged as being hosted on Layerr IPFS
     * @param contractAddress token contract address to check
     * @param tokenId id of the token to check
     * @return isIPFS if token has been flagged as being hosted on Layerr IPFS
     */
    function _isLayerrHostedIPFS(address contractAddress, uint256 tokenId) internal view returns(bool isIPFS) {
        isIPFS = layerrHostedAllTokensOnIPFS[contractAddress] || layerrHostedTokensOnIPFS[contractAddress][tokenId >> 8] & (1 << (tokenId & 0xFF)) != 0;
    }

    /**
     * @notice Flags a token as being hosted on Layerr IPFS in a bitmap
     * @param contractAddress token contract address
     * @param tokenId id of the token
     */
    function _setLayerrHostedIPFS(address contractAddress, uint256 tokenId) internal {
        layerrHostedTokensOnIPFS[contractAddress][tokenId >> 8] |= (1 << (tokenId & 0xFF));
    }

    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        /// @solidity memory-safe-assembly
        assembly {
            let m := add(mload(0x40), 0xa0)
            mstore(0x40, m)
            str := sub(m, 0x20)
            mstore(str, 0)
            let end := str

            for { let temp := value } 1 {} {
                str := sub(str, 1)
                mstore8(str, add(48, mod(temp, 10)))
                temp := div(temp, 10)
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            str := sub(str, 0x20)
            mstore(str, length)
        }
    }

    function _toString(address value) internal pure returns (string memory) {
        bytes memory s = new bytes(40);
        for (uint i = 0; i < 20; ) {
            bytes1 b = bytes1(uint8(uint(uint160(value)) / (2**(8*(19 - i)))));
            bytes1 hi = bytes1(uint8(b) / 16);
            bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
            s[2*i] = _char(hi);
            s[2*i+1] = _char(lo);
            unchecked { ++i; }
        }
        return string(s);
    }

    function _char(bytes1 b) internal pure returns (bytes1 c) {
        if (uint8(b) < 10) return bytes1(uint8(b) + 0x30);
        else return bytes1(uint8(b) + 0x57);
    }

    /**
     * @dev Recover signer address from a message by using their signature
     * @param hash bytes32 message, the hash is the signed message. What is recovered is the signer address.
     * @param sig bytes signature, the signature is generated using web3.eth.sign()
     */
    function _recover(
        bytes32 hash,
        bytes calldata sig
    ) internal pure returns (address) {
        bytes32 r;
        bytes32 s;
        uint8 v;

        // Check the signature length
        if (sig.length != 65) {
            return (address(0));
        }

        // Divide the signature in r, s and v variables
        /// @solidity memory-safe-assembly
        assembly {
            r := calldataload(sig.offset)
            s := calldataload(add(sig.offset, 32))
            v := byte(0, calldataload(add(sig.offset, 64)))
        }

        // If the version is correct return the signer address
        if (v != 27 && v != 28) {
            return (address(0));
        } else {
            return ecrecover(hash, v, r, s);
        }
    }
}

File 2 of 4 : ILayerrRenderer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import {ERC165} from "./IERC165.sol";

/**
 * @title ILayerrRenderer
 * @author 0xth0mas (Layerr)
 * @notice ILayerrRenderer interface defines functions required in LayerrRenderer to be callable by token contracts
 */
interface ILayerrRenderer is ERC165 {

    enum RenderType {
        LAYERR_HOSTED,
        PREREVEAL,
        BASE_PLUS_TOKEN
    }

    /// @dev Thrown when a payment fails for Layerr-hosted IPFS
    error PaymentFailed();

    /// @dev Thrown when a call is made for an owner-function by a non-contract owner
    error NotContractOwner();

    /// @dev Thrown when a signature is not made by the authorized account
    error InvalidSignature();

    /**
     * @notice Generates a tokenURI for the `contractAddress` and `tokenId`
     * @param contractAddress token contract address to render a token URI for
     * @param tokenId token id to render
     * @return uri for the token metadata
     */
    function tokenURI(
        address contractAddress,
        uint256 tokenId
    ) external view returns (string memory);

    /**
     * @notice Generates a contractURI for the `contractAddress`
     * @param contractAddress contract address to render a contract URI for
     * @return uri for the contract metadata
     */
    function contractURI(
        address contractAddress
    ) external view returns (string memory);
}

File 3 of 4 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface ERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. 
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

File 4 of 4 : IOwnable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import {ERC165} from './IERC165.sol';

interface IOwnable is ERC165 {

    /// @dev Thrown when a non-owner is attempting to perform an owner function
    error NotContractOwner();

    /// @dev Emitted when contract ownership is transferred to a new owner
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /// @notice Get the address of the owner    
    /// @return The address of the owner.
    function owner() view external returns(address);
	
    /// @notice Set the address of the new owner of the contract
    /// @dev Set _newOwner to address(0) to renounce any ownership.
    /// @param _newOwner The address of the new owner of the contract    
    function transferOwnership(address _newOwner) external;	
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 33333
  },
  "evmVersion": "paris",
  "viaIR": true,
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"PaymentFailed","type":"error"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contractBaseTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contractContractUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contractRenderType","outputs":[{"internalType":"enum ILayerrRenderer.RenderType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"contractURI","outputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"layerrBaseContractUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"layerrBaseTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"layerrHostedAllTokensOnIPFS","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"layerrHostedIPFSExpiration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"layerrHostedTokensOnIPFS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"layerrSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"string","name":"baseTokenUri","type":"string"},{"internalType":"enum ILayerrRenderer.RenderType","name":"renderType","type":"uint8"}],"name":"setContractBaseTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"string","name":"baseTokenUri","type":"string"},{"internalType":"bool","name":"allTokens","type":"bool"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"ipfsExpiration","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"setContractBaseTokenUriForLayerrHostedIPFS","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"string","name":"contractUri","type":"string"}],"name":"setContractUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_layerrBaseContractUri","type":"string"}],"name":"setLayerrBaseContractUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_layerrBaseTokenUri","type":"string"}],"name":"setLayerrBaseTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_layerrSigner","type":"address"}],"name":"setLayerrSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"stateMutability":"view","type":"function"}]

6080604052346200019057600180546001600160a01b031990811673c44355a57368c22d01a8a146c0a2669b504b25a0178255600254620000409062000195565b601f81116200015d575b507f68747470733a2f2f6d657461646174612e6c61796572722e61727400000000366002556003546200007d9062000195565b601f8111620000ed575b50630b985c9d60e21b6e799dfe79ed462822ec68ef9a6199e6926049600355600360005260206000207f68747470733a2f2f636f6e74726163742d6d657461646174612e6c6179657272815501556000541617600055604051611f2b9081620001d38239f35b60036000908152601f9190910160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d5b8281106200015257505062000087565b818155840162000142565b60006002815283601f60208320930160051c8301925b83811062000184575050506200004a565b82815501849062000173565b600080fd5b90600182811c92168015620001c7575b6020831014620001b157565b634e487b7160e01b600052602260045260246000fd5b91607f1691620001a556fe6080604052600436101561001257600080fd5b60003560e01c8062844d13146116c857806301ffc9a71461165d5780630a08ce51146113ec57806312f96a7514610eaf5780631598e5a314610e685780635cc0b33a14610c285780636dcca55014610a465780638246f1db14610835578063898096c3146107ee5780638da5cb5b146107ba578063995af44914610773578063a1a91bff146106cd578063af0413f114610699578063bdbb116a14610644578063d048355914610558578063d1433dde14610505578063e9dc6375146101d0578063f6230708146101845763f9a555ca146100ec57600080fd5b3461017f57602060031936011261017f5761010561187d565b73ffffffffffffffffffffffffffffffffffffffff908160005416330361015557167fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155600080f35b60046040517fbfcafd37000000000000000000000000000000000000000000000000000000008152fd5b600080fd5b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff6101b261187d565b166000526007602052602060ff604060002054166040519015158152f35b3461017f57604060031936011261017f576101e961187d565b60243560609173ffffffffffffffffffffffffffffffffffffffff811690816000526020936004855260ff6040600020541660038110156104d6578061046f575050816000526007845260ff604060002054168015610447575b156102c6575061027c916102c2936102b6926000526005815261026a604060002092611b61565b61028960405195869484860190611a94565b91828151948592016118a0565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261198e565b604051918291826118c3565b0390f35b90506102e36102dd6102d746611b61565b92611c44565b92611b61565b90604051926000600254906102f78261193b565b60019280841690811561040e57506001146103ba575b50926103876102c29787946103b597946003977f2f00000000000000000000000000000000000000000000000000000000000000958187809352610359825180938887850191016118a0565b019182015261037182518093856002850191016118a0565b01926002840152835193849187850191016118a0565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe381018452018261198e565b6102b6565b905060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace6000905b8282106103fb5750508501860161038761030d565b80548883018a01529088019083016103e6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016888a0152508015150286018701905061038761030d565b506008845260406000208360081c6000528452604060002054600160ff85161b161515610243565b90929391506001811460001461049a5750505090600591600052526102c26103b560406000206119cf565b9360026102c295146104b0575b505090506102b6565b6104ce925061027c936000526005815261026a604060002092611b61565b8083806104a7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff61053361187d565b16600052600460205260ff6040600020541660405160038210156104d6576020918152f35b3461017f57600060031936011261017f57604051600060035461057a8161193b565b808452906001908181169081156105ff57506001146105a4575b6102c2846102b68186038261198e565b6003600090815292507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8284106105e75750505081016020016102b682610594565b805460208587018101919091529093019281016105cf565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208087019190915292151560051b850190920192506102b69150839050610594565b3461017f57604060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff61067261187d565b16600052600860205260406000206024356000526020526020604060002054604051908152f35b3461017f57600060031936011261017f57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b3461017f57600060031936011261017f5760405160006002546106ef8161193b565b808452906001908181169081156105ff5750600114610718576102c2846102b68186038261198e565b6002600090815292507f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b82841061075b5750505081016020016102b682610594565b80546020858701810191909152909301928101610743565b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff6107a161187d565b1660005260096020526020604060002054604051908152f35b3461017f57600060031936011261017f57602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff61081c61187d565b1660005260056020526102c26102b660406000206119cf565b3461017f5760208060031936011261017f5767ffffffffffffffff60043581811161017f5761086890369060040161190d565b9173ffffffffffffffffffffffffffffffffffffffff600054163303610155578211610a175761089960035461193b565b601f81116109b8575b50600092601f83116001146108ff57509181926000926108f4575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617600355600080f35b0135905082806108bd565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b926000905b8682106109a05750508360019510610968575b505050811b01600355005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905582808061095d565b8060018496829495870135815501950192019061094a565b7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c810191858510610a0d575b601f0160051c01905b818110610a0157506108a2565b600081556001016109f4565b90915081906109eb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461017f5760208060031936011261017f5767ffffffffffffffff60043581811161017f57610a7990369060040161190d565b9173ffffffffffffffffffffffffffffffffffffffff600054163303610155578211610a1757610aaa60025461193b565b601f8111610bc9575b50600092601f8311600114610b105750918192600092610b05575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617600255600080f35b013590508280610ace565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316937f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace926000905b868210610bb15750508360019510610b79575b505050811b01600255005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055828080610b6e565b80600184968294958701358155019501920190610b5b565b7f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f840160051c810191858510610c1e575b601f0160051c01905b818110610c125750610ab3565b60008155600101610c05565b9091508190610bfc565b3461017f57604060031936011261017f57610c4161187d565b67ffffffffffffffff60243581811161017f57610c6290369060040161190d565b9073ffffffffffffffffffffffffffffffffffffffff8094166040517f8da5cb5b0000000000000000000000000000000000000000000000000000000081526020958682600481865afa918215610e5c57600092610e2d575b503391160361015557600052600684526040600020928211610a1757610ce1835461193b565b601f8111610de7575b50600093601f8311600114610d47575092819293600092610d3c575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b013590508380610d06565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316948460005282600020926000905b878210610dcf575050836001959610610d97575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055838080610d8d565b80600184968294958701358155019501920190610d79565b8360005284600020601f840160051c810191868510610e23575b601f0160051c01905b818110610e175750610cea565b60008155600101610e0a565b9091508190610e01565b610e4e919250873d8911610e55575b610e46818361198e565b810190611b35565b9087610cbb565b503d610e3c565b6040513d6000823e3d90fd5b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff610e9661187d565b1660005260066020526102c26102b660406000206119cf565b60c060031936011261017f57610ec361187d565b60243567ffffffffffffffff811161017f57610ee390369060040161190d565b604435801515810361017f5767ffffffffffffffff6064351161017f5736602360643501121561017f5767ffffffffffffffff606435600401351161017f573660246064356004013560051b60643501011161017f5760a43567ffffffffffffffff811161017f57610f5990369060040161190d565b6040517f8da5cb5b00000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff8b165afa908115610e5c576000916113cd575b5073ffffffffffffffffffffffffffffffffffffffff33911603610155576110339160405160208101907fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008960601b1682528688603483013761102b607482898101608435603482015234605482015203605481018452018261198e565b519020611e7c565b73ffffffffffffffffffffffffffffffffffffffff80600154169116036113a35760008080803473ffffffffffffffffffffffffffffffffffffffff8254165af13d1561139e573d67ffffffffffffffff8111610a1757604051906110c060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018361198e565b8152600060203d92013e5b156113745773ffffffffffffffffffffffffffffffffffffffff84166000526009602052608435604060002055600760205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055600560205260406000209167ffffffffffffffff8211610a17578190611156845461193b565b601f8111611324575b50600090601f831160011461126257600092611257575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b73ffffffffffffffffffffffffffffffffffffffff8116600052600460205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905560005b60643560040135811061120457005b80602460019260051b60643501013573ffffffffffffffffffffffffffffffffffffffff8416600052600880602052816040600020911c6000526020528260ff604060002092161b8154179055016111f5565b013590508480611176565b600085815260208120909450915b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416851061130c5760019450837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08116106112d4575b505050811b0190556111a8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558480806112c7565b81810135835560209485019460019093019201611270565b909150836000526020600020601f840160051c81016020851061136d575b90849392915b601f830160051c8201811061135e57505061115f565b60008155859450600101611348565b5080611342565b60046040517ff499da20000000000000000000000000000000000000000000000000000000008152fd5b6110cb565b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6113e6915060203d602011610e5557610e46818361198e565b87610fad565b3461017f57606060031936011261017f5761140561187d565b67ffffffffffffffff60243581811161017f5761142690369060040161190d565b929060443592600384101561017f5773ffffffffffffffffffffffffffffffffffffffff809316916040517f8da5cb5b0000000000000000000000000000000000000000000000000000000081526020948582600481885afa918215610e5c5760009261163e575b50339116036101555782600052600584526040600020918611610a17576114b5825461193b565b601f81116115f8575b50600090601f87116001146115535795809160049697600092611548575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b6000525260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008354169116179055600080f35b0135905087806114dc565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087169183600052856000209260005b8181106115e157509160019391896004999a94106115a9575b505050811b01905561150e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905587808061159c565b919387600181928787013581550195019201611583565b8260005284600020601f880160051c810191868910611634575b601f0160051c01905b81811061162857506114be565b6000815560010161161b565b9091508190611612565b611656919250863d8811610e5557610e46818361198e565b908861148e565b3461017f57602060031936011261017f576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361017f576020907fe9582e660000000000000000000000000000000000000000000000000000000060405191148152f35b3461017f5760208060031936011261017f576116e261187d565b9073ffffffffffffffffffffffffffffffffffffffff82166000526006815261170e60406000206119cf565b90815115611725575b604051806102c284826118c3565b90506117336102d746611b61565b91604051916000600354926117478461193b565b60019480861690811561184457506001146117ee575b50946117e8936117ba60029487946102c2997f2f00000000000000000000000000000000000000000000000000000000000000918281526117a6825180938689850191016118a0565b0193840152835193849187850191016118a0565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe281018452018261198e565b82611717565b90915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b6000905b82821061183157505084018201906117e861175d565b805487830186015290840190850161181b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168588015250801515028501830191506117e861175d565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361017f57565b60005b8381106118b35750506000910152565b81810151838201526020016118a3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6040936020845261190681518092816020880152602088880191016118a0565b0116010190565b9181601f8401121561017f5782359167ffffffffffffffff831161017f576020838186019501011161017f57565b90600182811c92168015611984575b602083101461195557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161194a565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610a1757604052565b90604051918260008254926119e38461193b565b908184526001948581169081600014611a525750600114611a0f575b5050611a0d9250038361198e565b565b9093915060005260209081600020936000915b818310611a3a575050611a0d935082010138806119ff565b85548884018501529485019487945091830191611a22565b9050611a0d9550602093507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138806119ff565b600092918154611aa38161193b565b92600191808316908115611afc5750600114611ac0575b50505050565b90919293945060005260209081600020906000915b858310611aeb5750505050019038808080611aba565b805485840152918301918101611ad5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016845250505081151590910201915038808080611aba565b9081602091031261017f575173ffffffffffffffffffffffffffffffffffffffff8116810361017f5790565b9060405160a081016040527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608082019360008552935b0192600a90818106603001855304928315611bd4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90611b98565b92506080837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09203019201918252565b908151811015611c15570160200190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b604051906060820182811067ffffffffffffffff821117610a175760405260288252604036602084013760005b60148110611c7e57505090565b601390808203918211611dac578160031b917f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811603611dac5760ff808311611dac5760019283811b15611ddb5773ffffffffffffffffffffffffffffffffffffffff8516901c60f0811682821603918211611dac577f0f00000000000000000000000000000000000000000000000000000000000000611d229160f41b16611e0a565b9082841b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84168403611dac57611d8d917fff000000000000000000000000000000000000000000000000000000000000009160001a611d83858a611c04565b5360f81b16611e0a565b838201809211611dac57611da59060001a9186611c04565b5301611c71565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60f81c600a811015611e495760300160ff8111611dac5760f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b60570160ff8111611dac5760f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b9091604103611eee57600082604082940135821a92601b84141580611ee3575b15611ea8575050505090565b6020608092819560405193845282840152803560408401520135606082015282805260015afa15611ed7575190565b604051903d90823e3d90fd5b50601c841415611e9c565b505060009056fea26469706673582212206bc15351f18d369ad8114fef889337e19224acfe27fc86a5c6465257e33eef7f64736f6c63430008140033

Deployed Bytecode

0x6080604052600436101561001257600080fd5b60003560e01c8062844d13146116c857806301ffc9a71461165d5780630a08ce51146113ec57806312f96a7514610eaf5780631598e5a314610e685780635cc0b33a14610c285780636dcca55014610a465780638246f1db14610835578063898096c3146107ee5780638da5cb5b146107ba578063995af44914610773578063a1a91bff146106cd578063af0413f114610699578063bdbb116a14610644578063d048355914610558578063d1433dde14610505578063e9dc6375146101d0578063f6230708146101845763f9a555ca146100ec57600080fd5b3461017f57602060031936011261017f5761010561187d565b73ffffffffffffffffffffffffffffffffffffffff908160005416330361015557167fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155600080f35b60046040517fbfcafd37000000000000000000000000000000000000000000000000000000008152fd5b600080fd5b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff6101b261187d565b166000526007602052602060ff604060002054166040519015158152f35b3461017f57604060031936011261017f576101e961187d565b60243560609173ffffffffffffffffffffffffffffffffffffffff811690816000526020936004855260ff6040600020541660038110156104d6578061046f575050816000526007845260ff604060002054168015610447575b156102c6575061027c916102c2936102b6926000526005815261026a604060002092611b61565b61028960405195869484860190611a94565b91828151948592016118a0565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261198e565b604051918291826118c3565b0390f35b90506102e36102dd6102d746611b61565b92611c44565b92611b61565b90604051926000600254906102f78261193b565b60019280841690811561040e57506001146103ba575b50926103876102c29787946103b597946003977f2f00000000000000000000000000000000000000000000000000000000000000958187809352610359825180938887850191016118a0565b019182015261037182518093856002850191016118a0565b01926002840152835193849187850191016118a0565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe381018452018261198e565b6102b6565b905060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace6000905b8282106103fb5750508501860161038761030d565b80548883018a01529088019083016103e6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016888a0152508015150286018701905061038761030d565b506008845260406000208360081c6000528452604060002054600160ff85161b161515610243565b90929391506001811460001461049a5750505090600591600052526102c26103b560406000206119cf565b9360026102c295146104b0575b505090506102b6565b6104ce925061027c936000526005815261026a604060002092611b61565b8083806104a7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff61053361187d565b16600052600460205260ff6040600020541660405160038210156104d6576020918152f35b3461017f57600060031936011261017f57604051600060035461057a8161193b565b808452906001908181169081156105ff57506001146105a4575b6102c2846102b68186038261198e565b6003600090815292507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8284106105e75750505081016020016102b682610594565b805460208587018101919091529093019281016105cf565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208087019190915292151560051b850190920192506102b69150839050610594565b3461017f57604060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff61067261187d565b16600052600860205260406000206024356000526020526020604060002054604051908152f35b3461017f57600060031936011261017f57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b3461017f57600060031936011261017f5760405160006002546106ef8161193b565b808452906001908181169081156105ff5750600114610718576102c2846102b68186038261198e565b6002600090815292507f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b82841061075b5750505081016020016102b682610594565b80546020858701810191909152909301928101610743565b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff6107a161187d565b1660005260096020526020604060002054604051908152f35b3461017f57600060031936011261017f57602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff61081c61187d565b1660005260056020526102c26102b660406000206119cf565b3461017f5760208060031936011261017f5767ffffffffffffffff60043581811161017f5761086890369060040161190d565b9173ffffffffffffffffffffffffffffffffffffffff600054163303610155578211610a175761089960035461193b565b601f81116109b8575b50600092601f83116001146108ff57509181926000926108f4575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617600355600080f35b0135905082806108bd565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b926000905b8682106109a05750508360019510610968575b505050811b01600355005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905582808061095d565b8060018496829495870135815501950192019061094a565b7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c810191858510610a0d575b601f0160051c01905b818110610a0157506108a2565b600081556001016109f4565b90915081906109eb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461017f5760208060031936011261017f5767ffffffffffffffff60043581811161017f57610a7990369060040161190d565b9173ffffffffffffffffffffffffffffffffffffffff600054163303610155578211610a1757610aaa60025461193b565b601f8111610bc9575b50600092601f8311600114610b105750918192600092610b05575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617600255600080f35b013590508280610ace565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316937f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace926000905b868210610bb15750508360019510610b79575b505050811b01600255005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055828080610b6e565b80600184968294958701358155019501920190610b5b565b7f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f840160051c810191858510610c1e575b601f0160051c01905b818110610c125750610ab3565b60008155600101610c05565b9091508190610bfc565b3461017f57604060031936011261017f57610c4161187d565b67ffffffffffffffff60243581811161017f57610c6290369060040161190d565b9073ffffffffffffffffffffffffffffffffffffffff8094166040517f8da5cb5b0000000000000000000000000000000000000000000000000000000081526020958682600481865afa918215610e5c57600092610e2d575b503391160361015557600052600684526040600020928211610a1757610ce1835461193b565b601f8111610de7575b50600093601f8311600114610d47575092819293600092610d3c575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b013590508380610d06565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316948460005282600020926000905b878210610dcf575050836001959610610d97575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055838080610d8d565b80600184968294958701358155019501920190610d79565b8360005284600020601f840160051c810191868510610e23575b601f0160051c01905b818110610e175750610cea565b60008155600101610e0a565b9091508190610e01565b610e4e919250873d8911610e55575b610e46818361198e565b810190611b35565b9087610cbb565b503d610e3c565b6040513d6000823e3d90fd5b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff610e9661187d565b1660005260066020526102c26102b660406000206119cf565b60c060031936011261017f57610ec361187d565b60243567ffffffffffffffff811161017f57610ee390369060040161190d565b604435801515810361017f5767ffffffffffffffff6064351161017f5736602360643501121561017f5767ffffffffffffffff606435600401351161017f573660246064356004013560051b60643501011161017f5760a43567ffffffffffffffff811161017f57610f5990369060040161190d565b6040517f8da5cb5b00000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff8b165afa908115610e5c576000916113cd575b5073ffffffffffffffffffffffffffffffffffffffff33911603610155576110339160405160208101907fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008960601b1682528688603483013761102b607482898101608435603482015234605482015203605481018452018261198e565b519020611e7c565b73ffffffffffffffffffffffffffffffffffffffff80600154169116036113a35760008080803473ffffffffffffffffffffffffffffffffffffffff8254165af13d1561139e573d67ffffffffffffffff8111610a1757604051906110c060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018361198e565b8152600060203d92013e5b156113745773ffffffffffffffffffffffffffffffffffffffff84166000526009602052608435604060002055600760205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055600560205260406000209167ffffffffffffffff8211610a17578190611156845461193b565b601f8111611324575b50600090601f831160011461126257600092611257575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b73ffffffffffffffffffffffffffffffffffffffff8116600052600460205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905560005b60643560040135811061120457005b80602460019260051b60643501013573ffffffffffffffffffffffffffffffffffffffff8416600052600880602052816040600020911c6000526020528260ff604060002092161b8154179055016111f5565b013590508480611176565b600085815260208120909450915b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416851061130c5760019450837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08116106112d4575b505050811b0190556111a8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558480806112c7565b81810135835560209485019460019093019201611270565b909150836000526020600020601f840160051c81016020851061136d575b90849392915b601f830160051c8201811061135e57505061115f565b60008155859450600101611348565b5080611342565b60046040517ff499da20000000000000000000000000000000000000000000000000000000008152fd5b6110cb565b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6113e6915060203d602011610e5557610e46818361198e565b87610fad565b3461017f57606060031936011261017f5761140561187d565b67ffffffffffffffff60243581811161017f5761142690369060040161190d565b929060443592600384101561017f5773ffffffffffffffffffffffffffffffffffffffff809316916040517f8da5cb5b0000000000000000000000000000000000000000000000000000000081526020948582600481885afa918215610e5c5760009261163e575b50339116036101555782600052600584526040600020918611610a17576114b5825461193b565b601f81116115f8575b50600090601f87116001146115535795809160049697600092611548575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b6000525260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008354169116179055600080f35b0135905087806114dc565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087169183600052856000209260005b8181106115e157509160019391896004999a94106115a9575b505050811b01905561150e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905587808061159c565b919387600181928787013581550195019201611583565b8260005284600020601f880160051c810191868910611634575b601f0160051c01905b81811061162857506114be565b6000815560010161161b565b9091508190611612565b611656919250863d8811610e5557610e46818361198e565b908861148e565b3461017f57602060031936011261017f576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361017f576020907fe9582e660000000000000000000000000000000000000000000000000000000060405191148152f35b3461017f5760208060031936011261017f576116e261187d565b9073ffffffffffffffffffffffffffffffffffffffff82166000526006815261170e60406000206119cf565b90815115611725575b604051806102c284826118c3565b90506117336102d746611b61565b91604051916000600354926117478461193b565b60019480861690811561184457506001146117ee575b50946117e8936117ba60029487946102c2997f2f00000000000000000000000000000000000000000000000000000000000000918281526117a6825180938689850191016118a0565b0193840152835193849187850191016118a0565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe281018452018261198e565b82611717565b90915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b6000905b82821061183157505084018201906117e861175d565b805487830186015290840190850161181b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168588015250801515028501830191506117e861175d565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361017f57565b60005b8381106118b35750506000910152565b81810151838201526020016118a3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6040936020845261190681518092816020880152602088880191016118a0565b0116010190565b9181601f8401121561017f5782359167ffffffffffffffff831161017f576020838186019501011161017f57565b90600182811c92168015611984575b602083101461195557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161194a565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610a1757604052565b90604051918260008254926119e38461193b565b908184526001948581169081600014611a525750600114611a0f575b5050611a0d9250038361198e565b565b9093915060005260209081600020936000915b818310611a3a575050611a0d935082010138806119ff565b85548884018501529485019487945091830191611a22565b9050611a0d9550602093507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138806119ff565b600092918154611aa38161193b565b92600191808316908115611afc5750600114611ac0575b50505050565b90919293945060005260209081600020906000915b858310611aeb5750505050019038808080611aba565b805485840152918301918101611ad5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016845250505081151590910201915038808080611aba565b9081602091031261017f575173ffffffffffffffffffffffffffffffffffffffff8116810361017f5790565b9060405160a081016040527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608082019360008552935b0192600a90818106603001855304928315611bd4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90611b98565b92506080837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09203019201918252565b908151811015611c15570160200190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b604051906060820182811067ffffffffffffffff821117610a175760405260288252604036602084013760005b60148110611c7e57505090565b601390808203918211611dac578160031b917f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811603611dac5760ff808311611dac5760019283811b15611ddb5773ffffffffffffffffffffffffffffffffffffffff8516901c60f0811682821603918211611dac577f0f00000000000000000000000000000000000000000000000000000000000000611d229160f41b16611e0a565b9082841b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84168403611dac57611d8d917fff000000000000000000000000000000000000000000000000000000000000009160001a611d83858a611c04565b5360f81b16611e0a565b838201809211611dac57611da59060001a9186611c04565b5301611c71565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60f81c600a811015611e495760300160ff8111611dac5760f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b60570160ff8111611dac5760f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b9091604103611eee57600082604082940135821a92601b84141580611ee3575b15611ea8575050505090565b6020608092819560405193845282840152803560408401520135606082015282805260015afa15611ed7575190565b604051903d90823e3d90fd5b50601c841415611e9c565b505060009056fea26469706673582212206bc15351f18d369ad8114fef889337e19224acfe27fc86a5c6465257e33eef7f64736f6c63430008140033

Deployed Bytecode Sourcemap

982:12097:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;:::i;:::-;;;;;;;2788:10;:19;2784:77;;982:12097;;8900:28;982:12097;;;8900:28;982:12097;;;;2784:77;982:12097;;;2831:18;;;;982:12097;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;:::i;:::-;;;;2314:59;982:12097;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3251:38;;;982:12097;;;;;10111:27;982:12097;;;;;;;;10111:134;;;;3247:1042;3309:45;;;982:12097;;;;;3416:75;982:12097;;;3433:20;982:12097;;3472:18;982:12097;;;3472:18;;:::i;:::-;982:12097;;;3416:75;;;;;;982:12097;;:::i;:::-;;;;;;;;;;:::i;:::-;;3416:75;;;;;;;;:::i;:::-;982:12097;;;;;;;:::i;:::-;;;;3306:644;3720:13;;3874:18;3791:26;3710:24;3720:13;3710:24;:::i;:::-;3791:26;;:::i;:::-;3874:18;;:::i;:::-;982:12097;;;;;3635:18;982:12097;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;3592:323;982:12097;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;3635:18;982:12097;;;;;:::i;:::-;;;3635:18;982:12097;;;;;;;;;;;;;;:::i;:::-;;3592:323;;;;;;;;;:::i;:::-;3306:644;;982:12097;;;3635:18;982:12097;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3592:323;;;982:12097;-1:-1:-1;982:12097:0;;;;;;;;;-1:-1:-1;982:12097:0;;;10111:134;982:12097;10159:24;982:12097;;;;;;10159:24;982:12097;;;;;;;;;;;10224:14;;982:12097;10159:81;:86;;10111:134;;3247:1042;3971:34;;;;;982:12097;3971:34;;3967:322;982:12097;;;;;;;4034:20;982:12097;;;;;;;;;;:::i;3967:322::-;4093:40;4107:26;982:12097;4093:40;;4089:200;;3967:322;;;;;3247:1042;;4089:200;4187:75;982:12097;;;;;;4204:20;982:12097;;4243:18;982:12097;;;4243:18;;:::i;4187:75::-;4089:200;;;;;982:12097;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;1640:76;982:12097;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1640:76;982:12097;;;;;-1:-1:-1;982:12097:0;;;;;;;-1:-1:-1;;;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;-1:-1:-1;982:12097:0;;-1:-1:-1;982:12097:0;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;:::i;:::-;;;;2480:79;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;1288:72;982:12097;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;1471:64;982:12097;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1471:64;982:12097;;;;;-1:-1:-1;982:12097:0;;;;;;;-1:-1:-1;;;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;:::i;:::-;;;;2682:61;982:12097;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;:::i;:::-;;;;1997:54;982:12097;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;2788:10;:19;2784:77;;982:12097;;;;;9593:46;982:12097;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9593:46;982:12097;;;;;9593:46;982:12097;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;982:12097:0;;;9593:46;982:12097;;;;;;9593:46;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;2788:10;:19;2784:77;;982:12097;;;;;9235:40;982:12097;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9235:40;982:12097;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;982:12097:0;;;9235:40;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;6090:33;;982:12097;6090:33;;;982:12097;6090:33;;;;;;;;;982:12097;6090:33;;;982:12097;6127:10;;982:12097;;6090:47;6086:105;;982:12097;;6201:19;982:12097;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;6090:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;982:12097;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;:::i;:::-;;;;2125:53;982:12097;;;;;;;;:::i;:::-;;-1:-1:-1;;982:12097:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;7518:33;;982:12097;;;;;;;7518:33;;;;;;;982:12097;7518:33;;;982:12097;7555:10;982:12097;7555:10;982:12097;;7518:47;7514:105;;7759:25;982:12097;;;;7656:74;;982:12097;;;;;;;;;;;;;;7656:74;;982:12097;;;;;;;;;;7720:9;982:12097;;;;7656:74;982:12097;7656:74;;;;;;;:::i;:::-;982:12097;7646:85;;7759:25;:::i;:::-;982:12097;;;;;;;7798:22;7795:52;;982:12097;7720:9;;;;982:12097;;;;7876:41;;982:12097;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;7932:5;7928:60;;982:12097;;;;;8000:26;982:12097;;;;;;;;8071:27;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8294:19;982:12097;;;;;8294:19;;;;982:12097;8280:13;982:12097;;;;;;;;;;;;;;;;10537:24;982:12097;;;;;;;;;;;;;;;;;;10603:14;;982:12097;;;10537:82;982:12097;;;8280:13;;982:12097;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;7656:74;982:12097;;;;;;;;;;7656:74;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;;-1:-1:-1;982:12097:0;;;7928:60;982:12097;;;7961:15;;;;982:12097;;;7795:52;982:12097;;;7829:18;;;;7518:33;;;;982:12097;7518:33;982:12097;7518:33;;;;;;;:::i;:::-;;;;982:12097;;;;;-1:-1:-1;;982:12097:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;5437:33;;982:12097;5437:33;;;982:12097;5437:33;;;;;;;;;982:12097;5437:33;;;982:12097;5474:10;;982:12097;;5437:47;5433:105;;982:12097;;;5548:20;982:12097;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5548:20;982:12097;;;;;;;;;;;;5548:20;982:12097;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;5437:33;;;;;;;;;;;;;;;:::i;:::-;;;;;982:12097;;;;;-1:-1:-1;;982:12097:0;;;;;;;;;;;;;;;;;8564:33;982:12097;;8549:48;;982:12097;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;:::i;:::-;;;;;;;4497:19;982:12097;;;;;;;:::i;:::-;;;;4548:31;4544:346;;982:12097;;;;;;;;:::i;4544:346::-;4755:13;;4818:26;4745:24;4755:13;4745:24;:::i;4818:26::-;982:12097;;;;;4675:21;982:12097;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4636:227;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;4636:227;;;;;;;;;:::i;:::-;4544:346;;;982:12097;;;;4675:21;982:12097;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;4636:227;982:12097;;;;;;;;;;;;;;;;;;;;;;4636:227;;;982:12097;-1:-1:-1;982:12097:0;;;;;;;;;-1:-1:-1;4636:227:0;982:12097;;;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;982:12097:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;982:12097:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;-1:-1:-1;982:12097:0;;;;-1:-1:-1;982:12097:0;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;982:12097:0;;;;-1:-1:-1;982:12097:0;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;982:12097:0;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;:::o;10635:676::-;;10774:530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10635:676::o;982:12097::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;11319:486;982:12097;;;;;;;;;;;;;;;;;11429:2;982:12097;;;;;;;;-1:-1:-1;11460:6:0;11464:2;11460:6;;;;11781:16;;11319:486;:::o;11448:10::-;11540:2;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;11713:1;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;11683:9;982:12097;;;;11683:9;:::i;:::-;982:12097;;;;;;;;;;;;11718:9;11674:18;982:12097;11674:18;-1:-1:-1;11674:18:0;;;;;:::i;:::-;;982:12097;;;11718:9;:::i;:::-;982:12097;;;;;;;;11707:20;;-1:-1:-1;11707:20:0;;;;:::i;:::-;;982:12097;11448:10;;982:12097;;-1:-1:-1;982:12097:0;;;;;-1:-1:-1;982:12097:0;;;-1:-1:-1;982:12097:0;;;;;-1:-1:-1;982:12097:0;11813:172;982:12097;;11897:2;11886:13;;11897:2;;;982:12097;;;;;;;;;;;;11901:30::o;11882:95::-;982:12097;;;;;;;;;;;;11947:30::o;12282:794::-;;;12519:2;12505:16;12501:68;;-1:-1:-1;12682:177:0;;;;;;;;12939:7;12944:2;12939:7;;;:18;;;12282:794;12935:134;;;12974:19;;;;;:::o;12935:134::-;12682:177;982:12097;;;;12682:177;982:12097;;;;;;;;12682:177;;;982:12097;;;12682:177;;982:12097;;;;13033:24;;;;;;;;;;13026:31;:::o;13033:24::-;12682:177;982:12097;;;;;;;;;12939:18;12950:7;12955:2;12950:7;;;12939:18;;12501:68;12538:19;;-1:-1:-1;12538:19:0;:::o

Swarm Source

ipfs://6bc15351f18d369ad8114fef889337e19224acfe27fc86a5c6465257e33eef7f

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ 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.