ETH Price: $2,610.47 (-1.60%)

Contract

0x5Dc76fD132354be5567ad617fD1fE8fB79421D82
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Exec Transaction207217552024-09-10 17:39:2319 days ago1725989963IN
0x5Dc76fD1...B79421D82
0 ETH0.000375993.36784492
Exec Transaction207217432024-09-10 17:36:5919 days ago1725989819IN
0x5Dc76fD1...B79421D82
0 ETH0.000351993.21776144
Wrap ERC20207155152024-09-09 20:43:2320 days ago1725914603IN
0x5Dc76fD1...B79421D82
0 ETH0.000145893.78296013
Wrap ERC20206888072024-09-06 3:16:3524 days ago1725592595IN
0x5Dc76fD1...B79421D82
0 ETH0.00005371.23796492
Wrap ERC20206402732024-08-30 8:42:5931 days ago1725007379IN
0x5Dc76fD1...B79421D82
0 ETH0.000055651.20592795
Exec Transaction206257822024-08-28 8:06:1133 days ago1724832371IN
0x5Dc76fD1...B79421D82
0 ETH0.000187741.68168148
Exec Transaction206035992024-08-25 5:43:5936 days ago1724564639IN
0x5Dc76fD1...B79421D82
0 ETH0.000085460.90065878
Exec Transaction206035472024-08-25 5:33:2336 days ago1724564003IN
0x5Dc76fD1...B79421D82
0 ETH0.000084790.82522601
Exec Transaction206035162024-08-25 5:27:1136 days ago1724563631IN
0x5Dc76fD1...B79421D82
0 ETH0.000075470.79548939
Exec Transaction206034512024-08-25 5:13:5936 days ago1724562839IN
0x5Dc76fD1...B79421D82
0 ETH0.000091010.88590639
Exec Transaction206034332024-08-25 5:10:2336 days ago1724562623IN
0x5Dc76fD1...B79421D82
0 ETH0.000103180.86104086
Wrap ERC20205665492024-08-20 1:27:3541 days ago1724117255IN
0x5Dc76fD1...B79421D82
0 ETH0.000106412.57328984
Exec Transaction205650832024-08-19 20:33:2341 days ago1724099603IN
0x5Dc76fD1...B79421D82
0 ETH0.000213061.95080869
Exec Transaction205632252024-08-19 14:19:2341 days ago1724077163IN
0x5Dc76fD1...B79421D82
0 ETH0.000570554.76120487
Exec Transaction205363562024-08-15 20:16:4745 days ago1723753007IN
0x5Dc76fD1...B79421D82
0 ETH0.000860686.94354053
Exec Transaction205210222024-08-13 16:53:3547 days ago1723568015IN
0x5Dc76fD1...B79421D82
0 ETH0.000793616.56451187
Wrap ERC20204754002024-08-07 8:07:5954 days ago1723018079IN
0x5Dc76fD1...B79421D82
0 ETH0.000081162.10514981
Wrap ERC20203192752024-07-16 13:09:1175 days ago1721135351IN
0x5Dc76fD1...B79421D82
0 ETH0.000338858.19208885
Wrap ERC20202830572024-07-11 11:46:4780 days ago1720698407IN
0x5Dc76fD1...B79421D82
0 ETH0.000227824.60889983
Wrap ERC20202416922024-07-05 17:07:1186 days ago1720199231IN
0x5Dc76fD1...B79421D82
0 ETH0.000275687.14610926
Exec Transaction202346792024-07-04 17:36:2387 days ago1720114583IN
0x5Dc76fD1...B79421D82
0 ETH0.0014021113.50487989
Exec Transaction202230412024-07-03 2:36:3589 days ago1719974195IN
0x5Dc76fD1...B79421D82
0 ETH0.000381723.49613363
Exec Transaction201730792024-06-26 3:09:2396 days ago1719371363IN
0x5Dc76fD1...B79421D82
0 ETH0.000484724.04401771
Exec Transaction201730602024-06-26 3:05:3596 days ago1719371135IN
0x5Dc76fD1...B79421D82
0 ETH0.000477343.98294602
Exec Transaction201570842024-06-23 21:30:5998 days ago1719178259IN
0x5Dc76fD1...B79421D82
0 ETH0.000285442.77813666
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WrapMultisig

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
File 1 of 5 : WrapMultisig.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.8.0;
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/cryptography/ECDSA.sol";
import "./base/WrapManager.sol";
import "./interfaces/ERC721TokenReceiver.sol";

/// @title Wrap protocol locking contract, based on Gnosis Safe contract work
contract WrapMultisig is MultisigManager, ERC721TokenReceiver {
    using SafeMath for uint256;
    using ECDSA for bytes32;

    string public constant NAME = "Wrap multisig";
    string public constant VERSION = "1.0.0";

    bytes4 private constant ERC20_TRANSFER_SELECTOR =
        bytes4(keccak256(bytes("transferFrom(address,address,uint256)")));

    bytes4 private constant ERC721_SAFE_TRANSFER_SELECTOR =
        bytes4(keccak256(bytes("safeTransferFrom(address,address,uint256)")));

    //keccak256(
    //    "EIP712Domain(address verifyingContract)"
    //);
    bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH =
        0x035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d4749;

    //keccak256(
    //    "WrapTx(address to,uint256 value,bytes data,string tezosOperation)"
    //);
    bytes32 private constant UNWRAP_TX_TYPEHASH =
        0x987804e036e2c4c5e32f45ccae87d65fb92de3f7d16998a7fa3910a01da2ab53;

    mapping(string => bool) internal tezosOperations;

    event ExecutionFailure(bytes32 txHash);
    event ExecutionSuccess(bytes32 txHash);
    event ERC20WrapAsked(
        address user,
        address token,
        uint256 amount,
        string tezosDestinationAddress
    );
    event ERC721WrapAsked(
        address user,
        address token,
        uint256 tokenId,
        string tezosDestinationAddress
    );

    bytes32 public domainSeparator;

    /// @notice The administrator will be allowed to modify multisig members and quorum
    /// @param _administrator Administrator of the multisig
    constructor(address _administrator) {
        require(
            _administrator != address(0),
            "WRAP: INVALID_ADMINISTRATOR_PROVIDED"
        );
        administrator = _administrator;
    }

    /// @notice Initialize multisig members and threshold
    /// @dev This function can only be called once and set the domain separator
    /// @param owners Initial members of the multisig
    /// @param threshold Threshold of the multisig
    function setup(address[] calldata owners, uint256 threshold)
        external
        authorized
    {
        require(domainSeparator == 0, "WRAP: DOMAIN_SEPARATOR_ALREADY_SET");
        domainSeparator = keccak256(
            abi.encode(DOMAIN_SEPARATOR_TYPEHASH, this)
        );
        _setup(owners, threshold);
    }

    /// @notice Transfer ERC20 tokens to the custody on behalf of the user
    /// @param token Token contract address
    /// @param amount Amount to put in custody
    /// @param tezosAddress Destination address of the wrap on Tezos blockchain
    function wrapERC20(
        address token,
        uint256 amount,
        string calldata tezosAddress
    ) external returns (bool success) {
        require(amount > 0, "WRAP: INVALID_AMOUNT");
        _erc20SafeTransferFrom(token, msg.sender, address(this), amount);
        emit ERC20WrapAsked(msg.sender, token, amount, tezosAddress);
        return true;
    }

    function _erc20SafeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) private {
        (bool success, bytes memory data) =
            token.call(
                abi.encodeWithSelector(ERC20_TRANSFER_SELECTOR, from, to, value)
            );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "WRAP: ERC20_TRANSFER_FAILED"
        );
    }

    /// @notice Transfer ERC721 tokens to the custody on behalf of the user
    /// @param token Token contract address
    /// @param tokenId Id of the NFT to transfer
    /// @param tezosAddress Destination address of the wrap on Tezos blockchain
    function wrapERC721(
        address token,
        uint256 tokenId,
        string calldata tezosAddress
    ) external returns (bool success) {
        _erc721SafeTransferFrom(token, msg.sender, address(this), tokenId);
        emit ERC721WrapAsked(msg.sender, token, tokenId, tezosAddress);
        return true;
    }

    function _erc721SafeTransferFrom(
        address token,
        address from,
        address to,
        uint256 tokenId
    ) private {
        (bool success, bytes memory data) =
            token.call(
                abi.encodeWithSelector(
                    ERC721_SAFE_TRANSFER_SELECTOR,
                    from,
                    to,
                    tokenId
                )
            );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "WRAP: ERC721_TRANSFER_FAILED"
        );
    }

    /// @notice Allow to execute an unwrap transaction signed by multisig members
    /// @dev tezosOperation is used as a nonce to protect against replay attacks
    /// @param to Destination address of the transaction
    /// @param value Ether value
    /// @param data Data paylaod
    /// @param tezosOperation Identifier of the tezos operation used to burn corresponding wrapped assets
    /// @param signatures Packed signature data
    function execTransaction(
        address to,
        uint256 value,
        bytes calldata data,
        string calldata tezosOperation,
        bytes calldata signatures
    ) external returns (bool success) {
        require(
            tezosOperations[tezosOperation] == false,
            "WRAP: TRANSACTION_ALREADY_PROCESSED"
        );
        tezosOperations[tezosOperation] = true;
        bytes memory txHashData =
            encodeTransactionData(to, value, data, tezosOperation);
        bytes32 txHash = keccak256(txHashData);
        _checkSignatures(txHash, signatures);
        success = _execute(to, value, data, gasleft());
        if (success) emit ExecutionSuccess(txHash);
        else emit ExecutionFailure(txHash);
    }

    function _execute(
        address to,
        uint256 value,
        bytes memory data,
        uint256 txGas
    ) internal returns (bool success) {
        assembly {
            success := call(
                txGas,
                to,
                value,
                add(data, 0x20),
                mload(data),
                0,
                0
            )
        }
    }

    /// @dev divides bytes signature into `uint8 v, bytes32 r, bytes32 s`
    /// @notice Make sure to perform a bounds check for @param pos, to avoid out of bounds access on @param signatures
    /// @param pos which signature to read. A prior bounds check of this parameter should be performed, to avoid out of bounds access
    /// @param signatures concatenated rsv signatures
    /// @return v v
    /// @return r r
    /// @return s s
    function _signatureSplit(bytes memory signatures, uint256 pos)
        internal
        pure
        returns (
            uint8 v,
            bytes32 r,
            bytes32 s
        )
    {
        // The signature format is a compact form of:
        //   {bytes32 r}{bytes32 s}{uint8 v}
        // Compact means, uint8 is not padded to 32 bytes.
        assembly {
            let signaturePos := mul(0x41, pos)
            r := mload(add(signatures, add(signaturePos, 0x20)))
            s := mload(add(signatures, add(signaturePos, 0x40)))
            // Here we are loading the last 32 bytes, including 31 bytes
            // of 's'. There is no 'mload8' to do this.
            //
            // 'byte' is not working due to the Solidity parser, so lets
            // use the second best option, 'and'
            v := and(mload(add(signatures, add(signaturePos, 0x41))), 0xff)
        }
    }

    /// @dev Checks whether the signature provided is valid for the provided hash. Will revert otherwise.
    /// @param dataHash Hash of the data
    /// @param signatures Signature data that should be verified.
    function _checkSignatures(bytes32 dataHash, bytes memory signatures)
        internal
        view
    {
        uint256 _threshold = threshold;
        require(_threshold > 0, "WRAP: THRESHOLD_NOT_DEFINED");
        require(
            signatures.length >= _threshold.mul(65),
            "WRAP: SIGNATURES_DATA_TOO_SHORT"
        );
        address lastOwner = address(0);
        address currentOwner;
        uint8 v;
        bytes32 r;
        bytes32 s;
        uint256 i;
        for (i = 0; i < _threshold; i++) {
            (v, r, s) = _signatureSplit(signatures, i);
            currentOwner = dataHash.toEthSignedMessageHash().recover(v, r, s);
            require(
                currentOwner > lastOwner &&
                    owners[currentOwner] != address(0) &&
                    currentOwner != SENTINEL_OWNERS,
                "WRAP: INVALID_OWNER_PROVIDED"
            );
            lastOwner = currentOwner;
        }
    }

    /// @notice Returns the bytes that are hashed to be signed by owners
    /// @param to Destination address
    /// @param value Ether value
    /// @param data Data payload
    /// @param tezosOperation Identifier of the tezos operation used to burn corresponding wrapped assets
    /// @return Transaction hash bytes
    function encodeTransactionData(
        address to,
        uint256 value,
        bytes memory data,
        string memory tezosOperation
    ) public view returns (bytes memory) {
        bytes32 wrapTxHash =
            keccak256(
                abi.encode(
                    UNWRAP_TX_TYPEHASH,
                    to,
                    value,
                    keccak256(data),
                    tezosOperation
                )
            );
        return
            abi.encodePacked(
                bytes1(0x19),
                bytes1(0x01),
                domainSeparator,
                wrapTxHash
            );
    }

    /// @notice Returns hash to be signed by owners
    /// @param to Destination address
    /// @param value Ether value
    /// @param data Data payload
    /// @param tezosOperation Identifier of the tezos operation used to burn corresponding wrapped assets
    /// @return Transaction hash
    function getTransactionHash(
        address to,
        uint256 value,
        bytes memory data,
        string memory tezosOperation
    ) public view returns (bytes32) {
        return
            keccak256(encodeTransactionData(to, value, data, tezosOperation));
    }

    /// @notice Check if an unwrap were already processed
    /// @param tezosOperation Identifier to check
    /// @return true if already processed, false otherwise
    function isTezosOperationProcessed(string memory tezosOperation)
        public
        view
        returns (bool)
    {
        return tezosOperations[tezosOperation];
    }

    /// @notice Allow ERC721 safe transfers
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external pure override returns (bytes4) {
        return 0x150b7a02;
    }
}

File 2 of 5 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 3 of 5 : ECDSA.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        if (signature.length != 65) {
            revert("ECDSA: invalid signature length");
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        return recover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
     * JSON-RPC method.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }
}

File 4 of 5 : WrapManager.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.8.0;

/// @title MultisigManager - Manages a set of owners and a threshold to perform actions
/// @notice Owners and threshold is managed by the administrator
contract MultisigManager {
    event AddedOwner(address owner);
    event RemovedOwner(address owner);
    event ChangedThreshold(uint256 threshold);

    address internal constant SENTINEL_OWNERS = address(0x1);

    address administrator;
    mapping(address => address) internal owners;
    uint256 ownerCount;
    uint256 internal threshold;

    modifier authorized() {
        require(
            msg.sender == administrator,
            "WRAP: METHOD_CAN_ONLY_BE_CALLED_BY_ADMINISTRATOR"
        );
        _;
    }

    /// @dev Setup function sets initial storage of contract
    /// @param _owners List of owners
    /// @param _threshold Number of required confirmations for a Wrap transaction
    function _setup(address[] memory _owners, uint256 _threshold) internal {
        require(threshold == 0, "WRAP: CONTRACT_ALREADY_SETUP");
        require(
            _threshold <= _owners.length,
            "WRAP: THRESHOLD_CANNOT_EXCEED_OWNER_COUNT"
        );
        require(_threshold >= 1, "WRAP: THRESHOLD_NEEED_TO_BE_GREETER_THAN_0");
        address currentOwner = SENTINEL_OWNERS;
        for (uint256 i = 0; i < _owners.length; i++) {
            address owner = _owners[i];
            require(
                owner != address(0) && owner != SENTINEL_OWNERS,
                "WRAP: INVALID_OWNER_PROVIDED"
            );
            require(
                owners[owner] == address(0),
                "WRAP: DUPLICATE_OWNER_ADDRESS_PROVIDED"
            );
            owners[currentOwner] = owner;
            currentOwner = owner;
        }
        owners[currentOwner] = SENTINEL_OWNERS;
        ownerCount = _owners.length;
        threshold = _threshold;
    }

    /// @dev Allows to add a new owner and update the threshold at the same time
    /// @notice Adds the owner `owner` and updates the threshold to `_threshold`
    /// @param owner New owner address
    /// @param _threshold New threshold
    function addOwnerWithThreshold(address owner, uint256 _threshold)
        public
        authorized
    {
        require(
            owner != address(0) && owner != SENTINEL_OWNERS,
            "WRAP: INVALID_OWNER_ADDRESS_PROVIDED"
        );
        require(
            owners[owner] == address(0),
            "WRAP: ADDRESS_IS_ALREADY_AN_OWNER"
        );
        owners[owner] = owners[SENTINEL_OWNERS];
        owners[SENTINEL_OWNERS] = owner;
        ownerCount++;
        emit AddedOwner(owner);
        if (threshold != _threshold) changeThreshold(_threshold);
    }

    /// @dev Allows to remove an owner and update the threshold at the same time
    /// @notice Removes the owner `owner` and updates the threshold to `_threshold`
    /// @param prevOwner Owner that pointed to the owner to be removed in the linked list
    /// @param owner Owner address to be removed
    /// @param _threshold New threshold
    function removeOwner(
        address prevOwner,
        address owner,
        uint256 _threshold
    ) public authorized {
        require(
            ownerCount - 1 >= _threshold,
            "WRAP: NEW_OWNER_COUNT_NEEDS_TO_BE_LONGER_THAN_THRESHOLD"
        );
        require(
            owner != address(0) && owner != SENTINEL_OWNERS,
            "WRAP: INVALID_OWNER_ADDRESS_PROVIDED"
        );
        require(
            owners[prevOwner] == owner,
            "WRAP: INVALID_PREV_OWNER_OWNER_PAIR_PROVIDED"
        );
        owners[prevOwner] = owners[owner];
        owners[owner] = address(0);
        ownerCount--;
        emit RemovedOwner(owner);
        if (threshold != _threshold) changeThreshold(_threshold);
    }

    /// @dev Allows to swap/replace an owner with another address
    /// @notice Replaces the owner `oldOwner` with `newOwner`
    /// @param prevOwner Owner that pointed to the owner to be replaced in the linked list
    /// @param oldOwner Owner address to be replaced
    /// @param newOwner New owner address
    function swapOwner(
        address prevOwner,
        address oldOwner,
        address newOwner
    ) public authorized {
        require(
            newOwner != address(0) && newOwner != SENTINEL_OWNERS,
            "WRAP: INVALID_OWNER_ADDRESS_PROVIDED"
        );
        require(
            owners[newOwner] == address(0),
            "WRAP: ADDRESS_IS_ALREADY_AN_OWNER"
        );
        require(
            oldOwner != address(0) && oldOwner != SENTINEL_OWNERS,
            "WRAP: INVALID_OWNER_ADDRESS_PROVIDED"
        );
        require(
            owners[prevOwner] == oldOwner,
            "WRAP: INVALID_PREV_OWNER_OWNER_PAIR_PROVIDED"
        );
        owners[newOwner] = owners[oldOwner];
        owners[prevOwner] = newOwner;
        owners[oldOwner] = address(0);
        emit RemovedOwner(oldOwner);
        emit AddedOwner(newOwner);
    }

    /// @dev Allows to update the number of required confirmations
    /// @notice Changes the threshold to `_threshold`
    /// @param _threshold New threshold
    function changeThreshold(uint256 _threshold) public authorized {
        require(
            _threshold <= ownerCount,
            "WRAP: THRESHOLD_CANNOT_EXCEED_OWNER_COUNT"
        );
        require(_threshold >= 1, "WRAP: THRESHOLD_NEEED_TO_BE_GREETER_THAN_0");
        threshold = _threshold;
        emit ChangedThreshold(threshold);
    }

    /// @notice Get multisig threshold
    /// @return Threshold
    function getThreshold() public view returns (uint256) {
        return threshold;
    }

    /// @notice Allow to check if an address is owner of the multisig
    /// @return True if owner, false otherwise
    function isOwner(address owner) public view returns (bool) {
        return owner != SENTINEL_OWNERS && owners[owner] != address(0);
    }

    /// @notice Get multisig members
    /// @return Owners list
    function getOwners() public view returns (address[] memory) {
        address[] memory array = new address[](ownerCount);

        uint256 index = 0;
        address currentOwner = owners[SENTINEL_OWNERS];
        while (currentOwner != SENTINEL_OWNERS) {
            array[index] = currentOwner;
            currentOwner = owners[currentOwner];
            index++;
        }
        return array;
    }

    /// @notice Get current multisig administrator
    /// @return Administrator address
    function getAdministrator() public view returns (address) {
        return administrator;
    }
}

File 5 of 5 : ERC721TokenReceiver.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.8.0;

interface ERC721TokenReceiver {
    function onERC721Received(
        address _operator,
        address _from,
        uint256 _tokenId,
        bytes calldata _data
    ) external returns (bytes4);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_administrator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"AddedOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"ChangedThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"tezosDestinationAddress","type":"string"}],"name":"ERC20WrapAsked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"tezosDestinationAddress","type":"string"}],"name":"ERC721WrapAsked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"txHash","type":"bytes32"}],"name":"ExecutionFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"txHash","type":"bytes32"}],"name":"ExecutionSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"RemovedOwner","type":"event"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"addOwnerWithThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"changeThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"string","name":"tezosOperation","type":"string"}],"name":"encodeTransactionData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"string","name":"tezosOperation","type":"string"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"execTransaction","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdministrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"string","name":"tezosOperation","type":"string"}],"name":"getTransactionHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tezosOperation","type":"string"}],"name":"isTezosOperationProcessed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"prevOwner","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"removeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"prevOwner","type":"address"},{"internalType":"address","name":"oldOwner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"swapOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"tezosAddress","type":"string"}],"name":"wrapERC20","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tezosAddress","type":"string"}],"name":"wrapERC721","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5060405162002eb738038062002eb78339818101604052602081101561003557600080fd5b50516001600160a01b03811661007d5760405162461bcd60e51b815260040180806020018281038252602481526020018062002e936024913960400191505060405180910390fd5b600080546001600160a01b039092166001600160a01b0319909216919091179055612de580620000ae6000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c8063931a2256116100cd578063e75235b811610081578063f698da2511610066578063f698da2514610a3a578063f8dc5dd914610a42578063ffa1ad7414610a8557610151565b8063e75235b8146108d1578063eed53e9f146108eb57610151565b8063a3f4df7e116100b2578063a3f4df7e146106c0578063c8d3e9801461073d578063e318b52b1461088c57610151565b8063931a2256146105d6578063a0e67e2b1461066857610151565b80632f54bf6e1161012457806345426b9b1161010957806345426b9b146104135780634ab8842714610549578063694e80c3146105b957610151565b80632f54bf6e1461033a57806339c691d51461036d57610151565b8063090a3282146101565780630d582f13146101fc578063150b7a02146102375780631696740714610309575b600080fd5b6101e86004803603606081101561016c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516916020810135918101906060810160408201356401000000008111156101a957600080fd5b8201836020820111156101bb57600080fd5b803590602001918460018302840111640100000000831117156101dd57600080fd5b509092509050610a8d565b604080519115158252519081900360200190f35b6102356004803603604081101561021257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610b68565b005b6102d46004803603608081101561024d57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116916040820135919081019060808101606082013564010000000081111561029557600080fd5b8201836020820111156102a757600080fd5b803590602001918460018302840111640100000000831117156102c957600080fd5b509092509050610dbf565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b610311610de9565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101e86004803603602081101561035057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e05565b6101e86004803603602081101561038357600080fd5b81019060208101813564010000000081111561039e57600080fd5b8201836020820111156103b057600080fd5b803590602001918460018302840111640100000000831117156103d257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e5a945050505050565b6101e8600480360360a081101561042957600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359181019060608101604082013564010000000081111561046657600080fd5b82018360208201111561047857600080fd5b8035906020019184600183028401116401000000008311171561049a57600080fd5b9193909290916020810190356401000000008111156104b857600080fd5b8201836020820111156104ca57600080fd5b803590602001918460018302840111640100000000831117156104ec57600080fd5b91939092909160208101903564010000000081111561050a57600080fd5b82018360208201111561051c57600080fd5b8035906020019184600183028401116401000000008311171561053e57600080fd5b509092509050610f01565b6102356004803603604081101561055f57600080fd5b81019060208101813564010000000081111561057a57600080fd5b82018360208201111561058c57600080fd5b803590602001918460208302840111640100000000831117156105ae57600080fd5b91935091503561115e565b610235600480360360208110156105cf57600080fd5b50356112b6565b6101e8600480360360608110156105ec57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359181019060608101604082013564010000000081111561062957600080fd5b82018360208201111561063b57600080fd5b8035906020019184600183028401116401000000008311171561065d57600080fd5b509092509050611416565b61067061155f565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106ac578181015183820152602001610694565b505050509050019250505060405180910390f35b6106c8611669565b6040805160208082528351818301528351919283929083019185019080838360005b838110156107025781810151838201526020016106ea565b50505050905090810190601f16801561072f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6106c86004803603608081101561075357600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359181019060608101604082013564010000000081111561079057600080fd5b8201836020820111156107a257600080fd5b803590602001918460018302840111640100000000831117156107c457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561081757600080fd5b82018360208201111561082957600080fd5b8035906020019184600183028401116401000000008311171561084b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506116a2945050505050565b610235600480360360608110156108a257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101358216916040909101351661182b565b6108d9611bbb565b60408051918252519081900360200190f35b6108d96004803603608081101561090157600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359181019060608101604082013564010000000081111561093e57600080fd5b82018360208201111561095057600080fd5b8035906020019184600183028401116401000000008311171561097257600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156109c557600080fd5b8201836020820111156109d757600080fd5b803590602001918460018302840111640100000000831117156109f957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611bc1945050505050565b6108d9611be0565b61023560048036036060811015610a5857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135611be6565b6106c8611ea0565b6000610a9b85333087611ed9565b7f2e616d24cb14cc7a22d0efef037ff9c8dc13ee53c172ca5fef2185c5f5ad28e03386868686604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039850909650505050505050a1506001949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612d5a6030913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821615801590610c14575073ffffffffffffffffffffffffffffffffffffffff8216600114155b610c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612baf6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600160205260409020541615610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612c776021913960400191505060405180910390fd5b600160208181527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f805473ffffffffffffffffffffffffffffffffffffffff868116600081815260408082208054949095167fffffffffffffffffffffffff0000000000000000000000000000000000000000948516179094558690528354909116811790925560028054909401909355825190815291517f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269281900390910190a18060035414610dbb57610dbb816112b6565b5050565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600073ffffffffffffffffffffffffffffffffffffffff8216600114801590610e54575073ffffffffffffffffffffffffffffffffffffffff8281166000908152600160205260409020541615155b92915050565b60006004826040518082805190602001908083835b60208310610eac57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610e6f565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205460ff16949350505050565b60006004858560405180838380828437919091019485525050604051928390036020019092205460ff16159150610f859050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180612b676023913960400191505060405180910390fd5b60016004868660405180838380828437919091019485525050604080516020948190038501812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001696151596909617909555601f8b018490048402850184019052505087825260009161104d918c918c918c908c908190840183828082843760009201919091525050604080516020601f8e018190048102820181019092528c815292508c91508b90819084018382808284376000920191909152506116a292505050565b905060008180519060200120905061109b8186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120f292505050565b6110dc8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050505a61231e565b9250821561111c576040805182815290517fdc29884a71d2bb98d3c53dc09718be05c7bfd142b7773a5c5cf2517629290ac09181900360200190a1611150565b6040805182815290517fdbe42d02a4e07d7eeff2874efe172540c93b297d206f6d691c9782a257323e329181900360200190a15b505098975050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612d5a6030913960400191505060405180910390fd5b60055415611227576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612c556022913960400191505060405180910390fd5b604080517f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d4749602080830191909152308284015282518083038401815260608301808552815191830191909120600555608091860280840183019094528581526112b19390928792879283929190910190849080828437600092019190915250859250612336915050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611326576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612d5a6030913960400191505060405180910390fd5b600254811115611381576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180612d076029913960400191505060405180910390fd5b60018110156113db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612d30602a913960400191505060405180910390fd5b60038190556040805182815290517f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c939181900360200190a150565b600080841161148657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f575241503a20494e56414c49445f414d4f554e54000000000000000000000000604482015290519081900360640190fd5b61149285333087612675565b7f4f4dff159c274e50aaa8650afd371620db5c679e96bde2a4133cf626384ba0463386868686604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039850909650505050505050a1506001949350505050565b6060600060025467ffffffffffffffff8111801561157c57600080fd5b506040519080825280602002602001820160405280156115a6578160200160208202803683370190505b50600160008181526020919091527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f549192509073ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff8116600114611661578083838151811061161c57fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152918116600090815260019283905260409020549290910191166115f1565b509091505090565b6040518060400160405280600d81526020017f57726170206d756c74697369670000000000000000000000000000000000000081525081565b606060007f987804e036e2c4c5e32f45ccae87d65fb92de3f7d16998a7fa3910a01da2ab5360001b8686868051906020012086604051602001808681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561174357818101518382015260200161172b565b50505050905090810190601f1680156117705780820380516001836020036101000a031916815260200191505b50604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280516020918201206005547f1900000000000000000000000000000000000000000000000000000000000000928501929092527f01000000000000000000000000000000000000000000000000000000000000006021850152602284019190915260428084019190915281518084039091018152606290920190529d9c50505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461189b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612d5a6030913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116158015906118d7575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61192c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612baf6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81811660009081526001602052604090205416156119aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612c776021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216158015906119e6575073ffffffffffffffffffffffffffffffffffffffff8216600114155b611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612baf6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff838116600090815260016020526040902054811690831614611abd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612cdb602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600160209081526040808320805487871680865283862080549289167fffffffffffffffffffffffff0000000000000000000000000000000000000000938416179055968a16855282852080548216909717909655928490528254909416909155825191825291517ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf929181900390910190a16040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269181900360200190a1505050565b60035490565b6000611bcf858585856116a2565b805190602001209050949350505050565b60055481565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612d5a6030913960400191505060405180910390fd5b806001600254031015611cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180612bfc6037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821615801590611cf0575073ffffffffffffffffffffffffffffffffffffffff8216600114155b611d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612baf6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff838116600090815260016020526040902054811690831614611dc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612cdb602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600160209081526040808320805489871685528285208054919097167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909655928490528254909416909155600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055825191825291517ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf929181900390910190a180600354146112b1576112b1816112b6565b6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6000808573ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060298152602001612bd36029913980516020918201206040805173ffffffffffffffffffffffffffffffffffffffff808b166024830152891660448201526064808201899052825180830390910181526084909101825292830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092178252518251909182918083835b60208310611fea57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611fad565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461204c576040519150601f19603f3d011682016040523d82523d6000602084013e612051565b606091505b509150915081801561207f57508051158061207f575080806020019051602081101561207c57600080fd5b50515b6120ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f575241503a204552433732315f5452414e534645525f4641494c454400000000604482015290519081900360640190fd5b505050505050565b6003548061216157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f575241503a205448524553484f4c445f4e4f545f444546494e45440000000000604482015290519081900360640190fd5b61216c816041612886565b825110156121db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f575241503a205349474e4154555245535f444154415f544f4f5f53484f525400604482015290519081900360640190fd5b6000808060008060005b86811015612313576121f78882612900565b9195509350915061221584848461220d8d61291e565b92919061296f565b94508573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16118015612278575073ffffffffffffffffffffffffffffffffffffffff8581166000908152600160205260409020541615155b801561229b575073ffffffffffffffffffffffffffffffffffffffff8516600114155b61230657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f575241503a20494e56414c49445f4f574e45525f50524f564944454400000000604482015290519081900360640190fd5b93945084936001016121e5565b505050505050505050565b6000806000845160208601878987f195945050505050565b600354156123a557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f575241503a20434f4e54524143545f414c52454144595f534554555000000000604482015290519081900360640190fd5b81518111156123ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180612d076029913960400191505060405180910390fd5b6001811015612459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612d30602a913960400191505060405180910390fd5b600160005b835181101561261a57600084828151811061247557fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156124d3575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61253e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f575241503a20494e56414c49445f4f574e45525f50524f564944454400000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81811660009081526001602052604090205416156125bc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612d8a6026913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff928316600090815260016020819052604090912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001694831694909417909355910161245e565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260016020819052604090912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690911790559051600255600355565b6000808573ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060258152602001612b8a6025913980516020918201206040805173ffffffffffffffffffffffffffffffffffffffff808b166024830152891660448201526064808201899052825180830390910181526084909101825292830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092178252518251909182918083835b6020831061278657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612749565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146127e8576040519150601f19603f3d011682016040523d82523d6000602084013e6127ed565b606091505b509150915081801561281b57508051158061281b575080806020019051602081101561281857600080fd5b50515b6120ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f575241503a2045524332305f5452414e534645525f4641494c45440000000000604482015290519081900360640190fd5b60008261289557506000610e54565b828202828482816128a257fe5b04146128f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612cba6021913960400191505060405180910390fd5b9392505050565b60419081029190910160208101516040820151919092015160ff1692565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156129ea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612c336022913960400191505060405180910390fd5b8360ff16601b14806129ff57508360ff16601c145b612a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612c986022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612ab0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612b5d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9594505050505056fe575241503a205452414e53414354494f4e5f414c52454144595f50524f4345535345447472616e7366657246726f6d28616464726573732c616464726573732c75696e7432353629575241503a20494e56414c49445f4f574e45525f414444524553535f50524f5649444544736166655472616e7366657246726f6d28616464726573732c616464726573732c75696e7432353629575241503a204e45575f4f574e45525f434f554e545f4e454544535f544f5f42455f4c4f4e4745525f5448414e5f5448524553484f4c4445434453413a20696e76616c6964207369676e6174757265202773272076616c7565575241503a20444f4d41494e5f534550415241544f525f414c52454144595f534554575241503a20414444524553535f49535f414c52454144595f414e5f4f574e455245434453413a20696e76616c6964207369676e6174757265202776272076616c7565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77575241503a20494e56414c49445f505245565f4f574e45525f4f574e45525f504149525f50524f5649444544575241503a205448524553484f4c445f43414e4e4f545f4558434545445f4f574e45525f434f554e54575241503a205448524553484f4c445f4e454545445f544f5f42455f475245455445525f5448414e5f30575241503a204d4554484f445f43414e5f4f4e4c595f42455f43414c4c45445f42595f41444d494e4953545241544f52575241503a204455504c49434154455f4f574e45525f414444524553535f50524f5649444544a264697066735822122070f702fc78d19ccd35e78eca00de9cbc7d60f5ef86f32619d098ec80dc7b77e764736f6c63430007060033575241503a20494e56414c49445f41444d494e4953545241544f525f50524f56494445440000000000000000000000005b64d8b8459b37e3d1e8ae59d4a6d4fd6d207698

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101515760003560e01c8063931a2256116100cd578063e75235b811610081578063f698da2511610066578063f698da2514610a3a578063f8dc5dd914610a42578063ffa1ad7414610a8557610151565b8063e75235b8146108d1578063eed53e9f146108eb57610151565b8063a3f4df7e116100b2578063a3f4df7e146106c0578063c8d3e9801461073d578063e318b52b1461088c57610151565b8063931a2256146105d6578063a0e67e2b1461066857610151565b80632f54bf6e1161012457806345426b9b1161010957806345426b9b146104135780634ab8842714610549578063694e80c3146105b957610151565b80632f54bf6e1461033a57806339c691d51461036d57610151565b8063090a3282146101565780630d582f13146101fc578063150b7a02146102375780631696740714610309575b600080fd5b6101e86004803603606081101561016c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516916020810135918101906060810160408201356401000000008111156101a957600080fd5b8201836020820111156101bb57600080fd5b803590602001918460018302840111640100000000831117156101dd57600080fd5b509092509050610a8d565b604080519115158252519081900360200190f35b6102356004803603604081101561021257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610b68565b005b6102d46004803603608081101561024d57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116916040820135919081019060808101606082013564010000000081111561029557600080fd5b8201836020820111156102a757600080fd5b803590602001918460018302840111640100000000831117156102c957600080fd5b509092509050610dbf565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b610311610de9565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101e86004803603602081101561035057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e05565b6101e86004803603602081101561038357600080fd5b81019060208101813564010000000081111561039e57600080fd5b8201836020820111156103b057600080fd5b803590602001918460018302840111640100000000831117156103d257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e5a945050505050565b6101e8600480360360a081101561042957600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359181019060608101604082013564010000000081111561046657600080fd5b82018360208201111561047857600080fd5b8035906020019184600183028401116401000000008311171561049a57600080fd5b9193909290916020810190356401000000008111156104b857600080fd5b8201836020820111156104ca57600080fd5b803590602001918460018302840111640100000000831117156104ec57600080fd5b91939092909160208101903564010000000081111561050a57600080fd5b82018360208201111561051c57600080fd5b8035906020019184600183028401116401000000008311171561053e57600080fd5b509092509050610f01565b6102356004803603604081101561055f57600080fd5b81019060208101813564010000000081111561057a57600080fd5b82018360208201111561058c57600080fd5b803590602001918460208302840111640100000000831117156105ae57600080fd5b91935091503561115e565b610235600480360360208110156105cf57600080fd5b50356112b6565b6101e8600480360360608110156105ec57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359181019060608101604082013564010000000081111561062957600080fd5b82018360208201111561063b57600080fd5b8035906020019184600183028401116401000000008311171561065d57600080fd5b509092509050611416565b61067061155f565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106ac578181015183820152602001610694565b505050509050019250505060405180910390f35b6106c8611669565b6040805160208082528351818301528351919283929083019185019080838360005b838110156107025781810151838201526020016106ea565b50505050905090810190601f16801561072f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6106c86004803603608081101561075357600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359181019060608101604082013564010000000081111561079057600080fd5b8201836020820111156107a257600080fd5b803590602001918460018302840111640100000000831117156107c457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561081757600080fd5b82018360208201111561082957600080fd5b8035906020019184600183028401116401000000008311171561084b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506116a2945050505050565b610235600480360360608110156108a257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101358216916040909101351661182b565b6108d9611bbb565b60408051918252519081900360200190f35b6108d96004803603608081101561090157600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359181019060608101604082013564010000000081111561093e57600080fd5b82018360208201111561095057600080fd5b8035906020019184600183028401116401000000008311171561097257600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156109c557600080fd5b8201836020820111156109d757600080fd5b803590602001918460018302840111640100000000831117156109f957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611bc1945050505050565b6108d9611be0565b61023560048036036060811015610a5857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135611be6565b6106c8611ea0565b6000610a9b85333087611ed9565b7f2e616d24cb14cc7a22d0efef037ff9c8dc13ee53c172ca5fef2185c5f5ad28e03386868686604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039850909650505050505050a1506001949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612d5a6030913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821615801590610c14575073ffffffffffffffffffffffffffffffffffffffff8216600114155b610c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612baf6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600160205260409020541615610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612c776021913960400191505060405180910390fd5b600160208181527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f805473ffffffffffffffffffffffffffffffffffffffff868116600081815260408082208054949095167fffffffffffffffffffffffff0000000000000000000000000000000000000000948516179094558690528354909116811790925560028054909401909355825190815291517f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269281900390910190a18060035414610dbb57610dbb816112b6565b5050565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600073ffffffffffffffffffffffffffffffffffffffff8216600114801590610e54575073ffffffffffffffffffffffffffffffffffffffff8281166000908152600160205260409020541615155b92915050565b60006004826040518082805190602001908083835b60208310610eac57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610e6f565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205460ff16949350505050565b60006004858560405180838380828437919091019485525050604051928390036020019092205460ff16159150610f859050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180612b676023913960400191505060405180910390fd5b60016004868660405180838380828437919091019485525050604080516020948190038501812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001696151596909617909555601f8b018490048402850184019052505087825260009161104d918c918c918c908c908190840183828082843760009201919091525050604080516020601f8e018190048102820181019092528c815292508c91508b90819084018382808284376000920191909152506116a292505050565b905060008180519060200120905061109b8186868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120f292505050565b6110dc8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050505a61231e565b9250821561111c576040805182815290517fdc29884a71d2bb98d3c53dc09718be05c7bfd142b7773a5c5cf2517629290ac09181900360200190a1611150565b6040805182815290517fdbe42d02a4e07d7eeff2874efe172540c93b297d206f6d691c9782a257323e329181900360200190a15b505098975050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612d5a6030913960400191505060405180910390fd5b60055415611227576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612c556022913960400191505060405180910390fd5b604080517f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d4749602080830191909152308284015282518083038401815260608301808552815191830191909120600555608091860280840183019094528581526112b19390928792879283929190910190849080828437600092019190915250859250612336915050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611326576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612d5a6030913960400191505060405180910390fd5b600254811115611381576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180612d076029913960400191505060405180910390fd5b60018110156113db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612d30602a913960400191505060405180910390fd5b60038190556040805182815290517f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c939181900360200190a150565b600080841161148657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f575241503a20494e56414c49445f414d4f554e54000000000000000000000000604482015290519081900360640190fd5b61149285333087612675565b7f4f4dff159c274e50aaa8650afd371620db5c679e96bde2a4133cf626384ba0463386868686604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039850909650505050505050a1506001949350505050565b6060600060025467ffffffffffffffff8111801561157c57600080fd5b506040519080825280602002602001820160405280156115a6578160200160208202803683370190505b50600160008181526020919091527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f549192509073ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff8116600114611661578083838151811061161c57fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152918116600090815260019283905260409020549290910191166115f1565b509091505090565b6040518060400160405280600d81526020017f57726170206d756c74697369670000000000000000000000000000000000000081525081565b606060007f987804e036e2c4c5e32f45ccae87d65fb92de3f7d16998a7fa3910a01da2ab5360001b8686868051906020012086604051602001808681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561174357818101518382015260200161172b565b50505050905090810190601f1680156117705780820380516001836020036101000a031916815260200191505b50604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280516020918201206005547f1900000000000000000000000000000000000000000000000000000000000000928501929092527f01000000000000000000000000000000000000000000000000000000000000006021850152602284019190915260428084019190915281518084039091018152606290920190529d9c50505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461189b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612d5a6030913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116158015906118d7575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61192c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612baf6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81811660009081526001602052604090205416156119aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612c776021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216158015906119e6575073ffffffffffffffffffffffffffffffffffffffff8216600114155b611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612baf6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff838116600090815260016020526040902054811690831614611abd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612cdb602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600160209081526040808320805487871680865283862080549289167fffffffffffffffffffffffff0000000000000000000000000000000000000000938416179055968a16855282852080548216909717909655928490528254909416909155825191825291517ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf929181900390910190a16040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea269181900360200190a1505050565b60035490565b6000611bcf858585856116a2565b805190602001209050949350505050565b60055481565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612d5a6030913960400191505060405180910390fd5b806001600254031015611cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180612bfc6037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821615801590611cf0575073ffffffffffffffffffffffffffffffffffffffff8216600114155b611d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612baf6024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff838116600090815260016020526040902054811690831614611dc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612cdb602c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600160209081526040808320805489871685528285208054919097167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909655928490528254909416909155600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055825191825291517ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf929181900390910190a180600354146112b1576112b1816112b6565b6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6000808573ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060298152602001612bd36029913980516020918201206040805173ffffffffffffffffffffffffffffffffffffffff808b166024830152891660448201526064808201899052825180830390910181526084909101825292830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092178252518251909182918083835b60208310611fea57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611fad565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461204c576040519150601f19603f3d011682016040523d82523d6000602084013e612051565b606091505b509150915081801561207f57508051158061207f575080806020019051602081101561207c57600080fd5b50515b6120ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f575241503a204552433732315f5452414e534645525f4641494c454400000000604482015290519081900360640190fd5b505050505050565b6003548061216157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f575241503a205448524553484f4c445f4e4f545f444546494e45440000000000604482015290519081900360640190fd5b61216c816041612886565b825110156121db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f575241503a205349474e4154555245535f444154415f544f4f5f53484f525400604482015290519081900360640190fd5b6000808060008060005b86811015612313576121f78882612900565b9195509350915061221584848461220d8d61291e565b92919061296f565b94508573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16118015612278575073ffffffffffffffffffffffffffffffffffffffff8581166000908152600160205260409020541615155b801561229b575073ffffffffffffffffffffffffffffffffffffffff8516600114155b61230657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f575241503a20494e56414c49445f4f574e45525f50524f564944454400000000604482015290519081900360640190fd5b93945084936001016121e5565b505050505050505050565b6000806000845160208601878987f195945050505050565b600354156123a557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f575241503a20434f4e54524143545f414c52454144595f534554555000000000604482015290519081900360640190fd5b81518111156123ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180612d076029913960400191505060405180910390fd5b6001811015612459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612d30602a913960400191505060405180910390fd5b600160005b835181101561261a57600084828151811061247557fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156124d3575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61253e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f575241503a20494e56414c49445f4f574e45525f50524f564944454400000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81811660009081526001602052604090205416156125bc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612d8a6026913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff928316600090815260016020819052604090912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001694831694909417909355910161245e565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260016020819052604090912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690911790559051600255600355565b6000808573ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060258152602001612b8a6025913980516020918201206040805173ffffffffffffffffffffffffffffffffffffffff808b166024830152891660448201526064808201899052825180830390910181526084909101825292830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092178252518251909182918083835b6020831061278657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612749565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146127e8576040519150601f19603f3d011682016040523d82523d6000602084013e6127ed565b606091505b509150915081801561281b57508051158061281b575080806020019051602081101561281857600080fd5b50515b6120ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f575241503a2045524332305f5452414e534645525f4641494c45440000000000604482015290519081900360640190fd5b60008261289557506000610e54565b828202828482816128a257fe5b04146128f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612cba6021913960400191505060405180910390fd5b9392505050565b60419081029190910160208101516040820151919092015160ff1692565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156129ea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612c336022913960400191505060405180910390fd5b8360ff16601b14806129ff57508360ff16601c145b612a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612c986022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612ab0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612b5d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9594505050505056fe575241503a205452414e53414354494f4e5f414c52454144595f50524f4345535345447472616e7366657246726f6d28616464726573732c616464726573732c75696e7432353629575241503a20494e56414c49445f4f574e45525f414444524553535f50524f5649444544736166655472616e7366657246726f6d28616464726573732c616464726573732c75696e7432353629575241503a204e45575f4f574e45525f434f554e545f4e454544535f544f5f42455f4c4f4e4745525f5448414e5f5448524553484f4c4445434453413a20696e76616c6964207369676e6174757265202773272076616c7565575241503a20444f4d41494e5f534550415241544f525f414c52454144595f534554575241503a20414444524553535f49535f414c52454144595f414e5f4f574e455245434453413a20696e76616c6964207369676e6174757265202776272076616c7565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77575241503a20494e56414c49445f505245565f4f574e45525f4f574e45525f504149525f50524f5649444544575241503a205448524553484f4c445f43414e4e4f545f4558434545445f4f574e45525f434f554e54575241503a205448524553484f4c445f4e454545445f544f5f42455f475245455445525f5448414e5f30575241503a204d4554484f445f43414e5f4f4e4c595f42455f43414c4c45445f42595f41444d494e4953545241544f52575241503a204455504c49434154455f4f574e45525f414444524553535f50524f5649444544a264697066735822122070f702fc78d19ccd35e78eca00de9cbc7d60f5ef86f32619d098ec80dc7b77e764736f6c63430007060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005b64d8b8459b37e3d1e8ae59d4a6d4fd6d207698

-----Decoded View---------------
Arg [0] : _administrator (address): 0x5b64d8B8459b37e3d1E8AE59D4a6D4fd6d207698

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005b64d8b8459b37e3d1e8ae59d4a6d4fd6d207698


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
Chain Token Portfolio % Price Amount Value
ETH43.97%$63,4676.4581$409,876.38
ETH21.43%$2,610.4776.5273$199,772.25
ETH8.83%$182,334.568$82,334.57
ETH6.39%$12.024,955.5994$59,566.3
ETH5.45%$0.169348300,010$50,806.09
ETH4.29%$139,968.4529$39,968.45
ETH3.25%$0.97843131,000.1206$30,331.48
ETH2.13%$119,897.0409$19,897.04
ETH1.22%$0.40696127,887.1541$11,348.99
ETH0.77%$0.08457185,262.6617$7,210.75
ETH0.74%$7.44925.0565$6,882.42
ETH0.57%$155.734.2812$5,337.58
ETH0.26%$12,458.9007$2,458.9
ETH0.19%$41.2242.1663$1,738.1
ETH0.14%$5.92228.1918$1,350.9
ETH0.14%$1,603.860.8412$1,349.22
ETH0.07%$1.12562.7767$630.31
ETH0.04%$47.447.7983$369.95
ETH0.04%$2,633.480.1333$351.1
ETH0.03%$0.8394281.1823$236.02
ETH0.01%$0.330948402.0041$133.04
ETH0.01%$0.0271343,483.9737$94.53
ETH<0.01%$2.0930.0097$62.72
ETH<0.01%$0.55556459.6995$33.17
ETH<0.01%$0.2782751$0.2782
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.