ETH Price: $2,305.09 (-0.53%)

Contract

0xC6182b7f3d23140Ca0e4005E97b2AbfaBA3Ed041
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040116907182021-01-20 6:44:181337 days ago1611125058IN
 Create: LnErc20Bridge
0 ETH0.0967874842

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LnErc20Bridge

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 999999 runs

Other Settings:
istanbul EvmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2021-01-20
*/

// 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 ECDSAUpgradeable {
    /**
     * @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)))
        }

        // 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));
    }
}

interface IMintBurnToken {
    function mint(address account, uint256 amount) external;

    function burn(address account, uint256 amount) external;
}

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }

    /// @dev Returns true if and only if the function is running in the constructor
    function _isConstructor() private view returns (bool) {
        // extcodesize checks the size of the code stored in an address, and
        // address returns the current address. Since the code is still not
        // deployed when running a constructor, any checks on its code size will
        // yield zero, making it an effective way to detect if a contract is
        // under construction or not.
        address self = address(this);
        uint256 cs;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            cs := extcodesize(self)
        }
        return cs == 0;
    }
}

/**
 * @title LnAdminUpgradeable
 *
 * @dev This is an upgradeable version of `LnAdmin` by replacing the constructor with
 * an initializer and reserving storage slots.
 */
contract LnAdminUpgradeable is Initializable {
    event CandidateChanged(address oldCandidate, address newCandidate);
    event AdminChanged(address oldAdmin, address newAdmin);

    address public admin;
    address public candidate;

    function __LnAdminUpgradeable_init(address _admin) public initializer {
        require(_admin != address(0), "LnAdminUpgradeable: zero address");
        admin = _admin;
        emit AdminChanged(address(0), _admin);
    }

    function setCandidate(address _candidate) external onlyAdmin {
        address old = candidate;
        candidate = _candidate;
        emit CandidateChanged(old, candidate);
    }

    function becomeAdmin() external {
        require(msg.sender == candidate, "LnAdminUpgradeable: only candidate can become admin");
        address old = admin;
        admin = candidate;
        emit AdminChanged(old, admin);
    }

    modifier onlyAdmin {
        require((msg.sender == admin), "LnAdminUpgradeable: only the contract admin can perform this action");
        _;
    }

    // Reserved storage space to allow for layout changes in the future.
    uint256[48] private __gap;
}

/**
 * @title LnErc20Bridge
 *
 * @dev An upgradeable contract for moving ERC20 tokens across blockchains. An
 * off-chain relayer is responsible for signing proofs of deposits to be used on destination
 * chains of the transactions. A multi-relayer set up can be used for enhanced security and
 * decentralization.
 *
 * @dev The relayer should wait for finality on the source chain before generating a deposit
 * proof. Otherwise a double-spending attack is possible.
 *
 * @dev The bridge can operate in two different modes for each token: transfer mode and mint/burn
 * mode, depending on the nature of the token.
 *
 * @dev Note that transaction hashes shall NOT be used for re-entrance prevention as doing
 * so will result in false negatives when multiple transfers are made in a single
 * transaction (with the use of contracts).
 *
 * @dev Chain IDs in this contract currently refer to the ones introduced in EIP-155. However,
 * a list of custom IDs might be used instead when non-EVM compatible chains are added.
 */
contract LnErc20Bridge is LnAdminUpgradeable {
    using ECDSAUpgradeable for bytes32;

    /**
     * @dev Emits when a deposit is made.
     *
     * @dev Addresses are represented with bytes32 to maximize compatibility with
     * non-Ethereum-compatible blockchains.
     *
     * @param srcChainId Chain ID of the source blockchain (current chain)
     * @param destChainId Chain ID of the destination blockchain
     * @param depositId Unique ID of the deposit on the current chain
     * @param depositor Address of the account on the current chain that made the deposit
     * @param recipient Address of the account on the destination chain that will receive the amount
     * @param currency A bytes32-encoded universal currency key
     * @param amount Amount of tokens being deposited to recipient's address.
     */
    event TokenDeposited(
        uint256 srcChainId,
        uint256 destChainId,
        uint256 depositId,
        bytes32 depositor,
        bytes32 recipient,
        bytes32 currency,
        uint256 amount
    );
    event TokenWithdrawn(
        uint256 srcChainId,
        uint256 destChainId,
        uint256 depositId,
        bytes32 depositor,
        bytes32 recipient,
        bytes32 currency,
        uint256 amount
    );
    event RelayerChanged(address oldRelayer, address newRelayer);
    event TokenAdded(bytes32 tokenKey, address tokenAddress, uint8 lockType);
    event TokenRemoved(bytes32 tokenKey);
    event ChainSupportForTokenAdded(bytes32 tokenKey, uint256 chainId);
    event ChainSupportForTokenDropped(bytes32 tokenKey, uint256 chainId);

    struct TokenInfo {
        address tokenAddress;
        uint8 lockType;
    }

    uint256 public currentChainId;
    address public relayer;
    uint256 public depositCount;
    mapping(bytes32 => TokenInfo) public tokenInfos;
    mapping(bytes32 => mapping(uint256 => bool)) public tokenSupportedOnChain;
    mapping(uint256 => mapping(uint256 => bool)) public withdrawnDeposits;

    bytes32 public DOMAIN_SEPARATOR; // For EIP-712

    bytes32 public constant DEPOSIT_TYPEHASH =
        keccak256(
            "Deposit(uint256 srcChainId,uint256 destChainId,uint256 depositId,bytes32 depositor,bytes32 recipient,bytes32 currency,uint256 amount)"
        );

    uint8 public constant TOKEN_LOCK_TYPE_TRANSFER = 1;
    uint8 public constant TOKEN_LOCK_TYPE_MINT_BURN = 2;

    bytes4 private constant TRANSFER_SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)")));
    bytes4 private constant TRANSFERFROM_SELECTOR = bytes4(keccak256(bytes("transferFrom(address,address,uint256)")));

    function getTokenAddress(bytes32 tokenKey) public view returns (address) {
        return tokenInfos[tokenKey].tokenAddress;
    }

    function getTokenLockType(bytes32 tokenKey) public view returns (uint8) {
        return tokenInfos[tokenKey].lockType;
    }

    function isTokenSupportedOnChain(bytes32 tokenKey, uint256 chainId) public view returns (bool) {
        return tokenSupportedOnChain[tokenKey][chainId];
    }

    function __LnErc20Bridge_init(address _relayer, address _admin) public initializer {
        __LnAdminUpgradeable_init(_admin);

        _setRelayer(_relayer);

        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        currentChainId = chainId;
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes("Linear")),
                keccak256(bytes("1")),
                chainId,
                address(this)
            )
        );
    }

    function setRelayer(address _relayer) external onlyAdmin {
        _setRelayer(_relayer);
    }

    function addToken(
        bytes32 tokenKey,
        address tokenAddress,
        uint8 lockType
    ) external onlyAdmin {
        require(tokenInfos[tokenKey].tokenAddress == address(0), "LnErc20Bridge: token already exists");
        require(tokenAddress != address(0), "LnErc20Bridge: zero address");
        require(
            lockType == TOKEN_LOCK_TYPE_TRANSFER || lockType == TOKEN_LOCK_TYPE_MINT_BURN,
            "LnErc20Bridge: unknown token lock type"
        );

        tokenInfos[tokenKey] = TokenInfo({tokenAddress: tokenAddress, lockType: lockType});
        emit TokenAdded(tokenKey, tokenAddress, lockType);
    }

    function removeToken(bytes32 tokenKey) external onlyAdmin {
        require(tokenInfos[tokenKey].tokenAddress != address(0), "LnErc20Bridge: token does not exists");
        delete tokenInfos[tokenKey];
        emit TokenRemoved(tokenKey);
    }

    function addChainSupportForToken(bytes32 tokenKey, uint256 chainId) external onlyAdmin {
        require(!tokenSupportedOnChain[tokenKey][chainId], "LnErc20Bridge: already supported");
        tokenSupportedOnChain[tokenKey][chainId] = true;
        emit ChainSupportForTokenAdded(tokenKey, chainId);
    }

    function dropChainSupportForToken(bytes32 tokenKey, uint256 chainId) external onlyAdmin {
        require(tokenSupportedOnChain[tokenKey][chainId], "LnErc20Bridge: not supported");
        tokenSupportedOnChain[tokenKey][chainId] = false;
        emit ChainSupportForTokenDropped(tokenKey, chainId);
    }

    function deposit(
        bytes32 token,
        uint256 amount,
        uint256 destChainId,
        bytes32 recipient
    ) external {
        TokenInfo memory tokenInfo = tokenInfos[token];
        require(tokenInfo.tokenAddress != address(0), "LnErc20Bridge: token not found");

        require(amount > 0, "LnErc20Bridge: amount must be positive");
        require(destChainId != currentChainId, "LnErc20Bridge: dest must be different from src");
        require(isTokenSupportedOnChain(token, destChainId), "LnErc20Bridge: token not supported on chain");
        require(recipient != 0, "LnErc20Bridge: zero address");

        depositCount = depositCount + 1;

        if (tokenInfo.lockType == TOKEN_LOCK_TYPE_TRANSFER) {
            safeTransferFrom(tokenInfo.tokenAddress, msg.sender, address(this), amount);
        } else if (tokenInfo.lockType == TOKEN_LOCK_TYPE_MINT_BURN) {
            IMintBurnToken(tokenInfo.tokenAddress).burn(msg.sender, amount);
        } else {
            require(false, "LnErc20Bridge: unknown token lock type");
        }

        emit TokenDeposited(
            currentChainId,
            destChainId,
            depositCount,
            bytes32(uint256(msg.sender)),
            recipient,
            token,
            amount
        );
    }

    function withdraw(
        uint256 srcChainId,
        uint256 destChainId,
        uint256 depositId,
        bytes32 depositor,
        bytes32 recipient,
        bytes32 currency,
        uint256 amount,
        bytes calldata signature
    ) external {
        require(destChainId == currentChainId, "LnErc20Bridge: wrong chain");
        require(!withdrawnDeposits[srcChainId][depositId], "LnErc20Bridge: already withdrawn");
        require(recipient != 0, "LnErc20Bridge: zero address");
        require(amount > 0, "LnErc20Bridge: amount must be positive");

        TokenInfo memory tokenInfo = tokenInfos[currency];
        require(tokenInfo.tokenAddress != address(0), "LnErc20Bridge: token not found");

        // Verify EIP-712 signature
        bytes32 digest =
            keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR,
                    keccak256(
                        abi.encode(
                            DEPOSIT_TYPEHASH,
                            srcChainId,
                            destChainId,
                            depositId,
                            depositor,
                            recipient,
                            currency,
                            amount
                        )
                    )
                )
            );
        address recoveredAddress = digest.recover(signature);
        require(recoveredAddress == relayer, "LnErc20Bridge: invalid signature");

        withdrawnDeposits[srcChainId][depositId] = true;

        address decodedRecipient = address(uint160(uint256(recipient)));

        if (tokenInfo.lockType == TOKEN_LOCK_TYPE_TRANSFER) {
            safeTransfer(tokenInfo.tokenAddress, decodedRecipient, amount);
        } else if (tokenInfo.lockType == TOKEN_LOCK_TYPE_MINT_BURN) {
            IMintBurnToken(tokenInfo.tokenAddress).mint(decodedRecipient, amount);
        } else {
            require(false, "LnErc20Bridge: unknown token lock type");
        }

        emit TokenWithdrawn(srcChainId, destChainId, depositId, depositor, recipient, currency, amount);
    }

    function _setRelayer(address _relayer) private {
        require(_relayer != address(0), "LnErc20Bridge: zero address");
        require(_relayer != relayer, "LnErc20Bridge: relayer not changed");

        address oldRelayer = relayer;
        relayer = _relayer;

        emit RelayerChanged(oldRelayer, relayer);
    }

    function safeTransfer(
        address token,
        address recipient,
        uint256 amount
    ) private {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(TRANSFER_SELECTOR, recipient, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "LnErc20Bridge: transfer failed");
    }

    function safeTransferFrom(
        address token,
        address sender,
        address recipient,
        uint256 amount
    ) private {
        (bool success, bytes memory data) =
            token.call(abi.encodeWithSelector(TRANSFERFROM_SELECTOR, sender, recipient, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "LnErc20Bridge: transfer from failed");
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldCandidate","type":"address"},{"indexed":false,"internalType":"address","name":"newCandidate","type":"address"}],"name":"CandidateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"tokenKey","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"ChainSupportForTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"tokenKey","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"ChainSupportForTokenDropped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldRelayer","type":"address"},{"indexed":false,"internalType":"address","name":"newRelayer","type":"address"}],"name":"RelayerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"tokenKey","type":"bytes32"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint8","name":"lockType","type":"uint8"}],"name":"TokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"srcChainId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"destChainId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"depositor","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"recipient","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"currency","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"tokenKey","type":"bytes32"}],"name":"TokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"srcChainId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"destChainId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"depositor","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"recipient","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"currency","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenWithdrawn","type":"event"},{"inputs":[],"name":"DEPOSIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_LOCK_TYPE_MINT_BURN","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_LOCK_TYPE_TRANSFER","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"__LnAdminUpgradeable_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_relayer","type":"address"},{"internalType":"address","name":"_admin","type":"address"}],"name":"__LnErc20Bridge_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenKey","type":"bytes32"},{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"addChainSupportForToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenKey","type":"bytes32"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"lockType","type":"uint8"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"becomeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"candidate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"token","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"destChainId","type":"uint256"},{"internalType":"bytes32","name":"recipient","type":"bytes32"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenKey","type":"bytes32"},{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"dropChainSupportForToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenKey","type":"bytes32"}],"name":"getTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenKey","type":"bytes32"}],"name":"getTokenLockType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenKey","type":"bytes32"},{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"isTokenSupportedOnChain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"relayer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenKey","type":"bytes32"}],"name":"removeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"setCandidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_relayer","type":"address"}],"name":"setRelayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"tokenInfos","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"lockType","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenSupportedOnChain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"srcChainId","type":"uint256"},{"internalType":"uint256","name":"destChainId","type":"uint256"},{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"bytes32","name":"depositor","type":"bytes32"},{"internalType":"bytes32","name":"recipient","type":"bytes32"},{"internalType":"bytes32","name":"currency","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdrawnDeposits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50612904806100206000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80636c8381f8116100ee57806390f1f17b11610097578063b594909111610071578063b5949091146104f9578063d22ed8b61461053b578063df225e8c1461055e578063f851a44014610599576101ae565b806390f1f17b14610485578063a8d6e15d146104d4578063b12e4410146104dc576101ae565b80637ba898f7116100c85780637ba898f71461042d5780638406c0791461044a5780638e118b8314610452576101ae565b80636c8381f8146103575780636cbadbfa146103885780636dea061914610390576101ae565b80633644e5151161015b5780634c5dd3f3116101355780634c5dd3f3146102c05780634ff5174c146102e35780636025e492146103065780636548e9bc14610324576101ae565b80633644e5151461028157806339eeee441461028957806348825e94146102b8576101ae565b806325971dff1161018c57806325971dff1461023c5780632bca8a75146102445780632dfdf0b514610267576101ae565b80630589b8b2146101b357806307880b7f146101ea578063224e74621461021f575b600080fd5b6101d6600480360360408110156101c957600080fd5b50803590602001356105a1565b604080519115158252519081900360200190f35b61021d6004803603602081101561020057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166105c1565b005b61021d6004803603602081101561023557600080fd5b50356106be565b61021d61081a565b6101d66004803603604081101561025a57600080fd5b5080359060200135610920565b61026f610940565b60408051918252519081900360200190f35b61026f610946565b61021d6004803603608081101561029f57600080fd5b508035906020810135906040810135906060013561094c565b61026f610d19565b61021d600480360360408110156102d657600080fd5b5080359060200135610d3d565b61021d600480360360408110156102f957600080fd5b5080359060200135610ebb565b61030e611035565b6040805160ff9092168252519081900360200190f35b61021d6004803603602081101561033a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661103a565b61035f6110bc565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61026f6110d8565b61021d60048036036101008110156103a757600080fd5b81359160208101359160408201359160608101359160808201359160a08101359160c08201359190810190610100810160e08201356401000000008111156103ee57600080fd5b82018360208201111561040057600080fd5b8035906020019184600183028401116401000000008311171561042257600080fd5b5090925090506110de565b61030e6004803603602081101561044357600080fd5b503561166e565b61035f61169b565b61021d6004803603602081101561046857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166116b7565b6104a26004803603602081101561049b57600080fd5b50356118d3565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff90911660208301528051918290030190f35b61030e611918565b61035f600480360360208110156104f257600080fd5b503561191d565b61021d6004803603606081101561050f57600080fd5b50803590602081013573ffffffffffffffffffffffffffffffffffffffff16906040013560ff16611945565b6101d66004803603604081101561055157600080fd5b5080359060200135611c12565b61021d6004803603604081101561057457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611c32565b61035f611e62565b603660209081526000928352604080842090915290825290205460ff1681565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610637576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806128666043913960600191505060405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831617928390556040805192821680845293909116602083015280517f7f730391c4f0fa1bea34bcb9bff8c30a079b21a0359759160cb990648ab84c729281900390910190a15050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610734576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806128666043913960600191505060405180910390fd5b60008181526035602052604090205473ffffffffffffffffffffffffffffffffffffffff166107ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806127cf6024913960400191505060405180910390fd5b60008181526035602090815260409182902080547fffffffffffffffffffffff000000000000000000000000000000000000000000169055815183815291517f27b51627532fe8cd0df946e5a9590efb06cc367d3d611c1e4084c7e1dccb3ab49281900390910190a150565b60015473ffffffffffffffffffffffffffffffffffffffff16331461088a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061274b6033913960400191505060405180910390fd5b6000805460015473ffffffffffffffffffffffffffffffffffffffff908116620100009081027fffffffffffffffffffff0000000000000000000000000000000000000000ffff8416179384905560408051938290048316808552919094049091166020830152825190927f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f928290030190a150565b603760209081526000928352604080842090915290825290205460ff1681565b60345481565b60385481565b60008481526035602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff81168084527401000000000000000000000000000000000000000090910460ff1691830191909152610a0f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4c6e45726332304272696467653a20746f6b656e206e6f7420666f756e640000604482015290519081900360640190fd5b60008411610a68576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806128156026913960400191505060405180910390fd5b603254831415610ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806126d8602e913960400191505060405180910390fd5b610acd8584611c12565b610b22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061283b602b913960400191505060405180910390fd5b81610b8e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4c6e45726332304272696467653a207a65726f20616464726573730000000000604482015290519081900360640190fd5b603480546001908101909155602082015160ff161415610bbb578051610bb690333087611e84565b610cb1565b602081015160ff1660021415610c60578051604080517f9dc29fac00000000000000000000000000000000000000000000000000000000815233600482015260248101879052905173ffffffffffffffffffffffffffffffffffffffff90921691639dc29fac9160448082019260009290919082900301818387803b158015610c4357600080fd5b505af1158015610c57573d6000803e3d6000fd5b50505050610cb1565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806128a96026913960400191505060405180910390fd5b6032546034546040805192835260208301869052828101919091523360608301526080820184905260a0820187905260c08201869052517fe048043259af829807fad585485c031d37a62916d79cf4ed94a2c6e7e61f4fb09181900360e00190a15050505050565b7f7dea0ff38c20ec194d3cb84e9720e47fce7770d8b28af58ea15562bc9cf5286081565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610db3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806128666043913960600191505060405180910390fd5b600082815260366020908152604080832084845290915290205460ff1615610e3c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4c6e45726332304272696467653a20616c726561647920737570706f72746564604482015290519081900360640190fd5b600082815260366020908152604080832084845282529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815184815290810183905281517f71d564e28114f33667381ae9c6bfadc1254fab8fb4e6a9606bfa512cb5e7df49929181900390910190a15050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806128666043913960600191505060405180910390fd5b600082815260366020908152604080832084845290915290205460ff16610fb957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4c6e45726332304272696467653a206e6f7420737570706f7274656400000000604482015290519081900360640190fd5b600082815260366020908152604080832084845282529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055815184815290810183905281517fb8a301810556c08eff893eded78cbada9895cdb3c3976c53f3c48073e23d2422929181900390910190a15050565b600181565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806128666043913960600191505060405180910390fd5b6110b981612087565b50565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60325481565b603254881461114e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4c6e45726332304272696467653a2077726f6e6720636861696e000000000000604482015290519081900360640190fd5b60008981526037602090815260408083208a845290915290205460ff16156111d757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4c6e45726332304272696467653a20616c72656164792077697468647261776e604482015290519081900360640190fd5b8461124357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4c6e45726332304272696467653a207a65726f20616464726573730000000000604482015290519081900360640190fd5b6000831161129c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806128156026913960400191505060405180910390fd5b60008481526035602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff81168084527401000000000000000000000000000000000000000090910460ff169183019190915261135f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4c6e45726332304272696467653a20746f6b656e206e6f7420666f756e640000604482015290519081900360640190fd5b603854604080517f7dea0ff38c20ec194d3cb84e9720e47fce7770d8b28af58ea15562bc9cf528606020808301919091528183018e9052606082018d9052608082018c905260a082018b905260c082018a905260e0820189905261010080830189905283518084039091018152610120830184528051908201207f1901000000000000000000000000000000000000000000000000000000000000610140840152610142830194909452610162808301949094528251808303909401845261018282018084528451948201949094206101a2601f8801839004909202830182019093528584529192600092611470928891889182910183828082843760009201919091525086939250506122049050565b60335490915073ffffffffffffffffffffffffffffffffffffffff8083169116146114fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4c6e45726332304272696467653a20696e76616c6964207369676e6174757265604482015290519081900360640190fd5b60008c81526037602090815260408083208d8452825290912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915590840151899160ff91909116141561156557835161156090828961247e565b611603565b602084015160ff1660021415610c6057836000015173ffffffffffffffffffffffffffffffffffffffff166340c10f1982896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156115ea57600080fd5b505af11580156115fe573d6000803e3d6000fd5b505050505b604080518e8152602081018e90528082018d9052606081018c9052608081018b905260a081018a905260c0810189905290517f7b585240ba8820bb7f974aecfbf00d525f6a451106a775438a3f64c48875d5709181900360e00190a150505050505050505050505050565b60009081526035602052604090205474010000000000000000000000000000000000000000900460ff1690565b60335473ffffffffffffffffffffffffffffffffffffffff1681565b600054610100900460ff16806116d057506116d061268a565b806116de575060005460ff16155b611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806127a1602e913960400191505060405180910390fd5b600054610100900460ff1615801561179957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b73ffffffffffffffffffffffffffffffffffffffff821661181b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4c6e41646d696e5570677261646561626c653a207a65726f2061646472657373604482015290519081900360640190fd5b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851690810291909117825560408051928352602083019190915280517f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f9281900390910190a180156118cf57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b5050565b60356020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900460ff1682565b600281565b60009081526035602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806128666043913960600191505060405180910390fd5b60008381526035602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611a36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061277e6023913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611ab857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4c6e45726332304272696467653a207a65726f20616464726573730000000000604482015290519081900360640190fd5b60ff811660011480611acd575060ff81166002145b611b22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806128a96026913960400191505060405180910390fd5b60408051808201825273ffffffffffffffffffffffffffffffffffffffff80851680835260ff808616602080860182815260008b81526035835288902096518754915190941674010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff949096167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161792909216939093179093558351878152928301528183015290517fd9c6008de31d775aae4523eb2e6e6565ea965cabb3eac06153885621c3ddb0359181900360600190a1505050565b600091825260366020908152604080842092845291905290205460ff1690565b600054610100900460ff1680611c4b5750611c4b61268a565b80611c59575060005460ff16155b611cae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806127a1602e913960400191505060405180910390fd5b600054610100900460ff16158015611d1457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b611d1d826116b7565b611d2683612087565b466032819055604080518082018252600681527f4c696e656172000000000000000000000000000000000000000000000000000060209182015281518083018352600181527f31000000000000000000000000000000000000000000000000000000000000009082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f16061f58256c86e6eb7d166e78be192f96e51b4ccf2d8de3d9fbf3c6cbdb9bb5818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c090930190915281519101206038558015611e5d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808573ffffffffffffffffffffffffffffffffffffffff166040518060600160405280602581526020016126b36025913980516020918201206040805173ffffffffffffffffffffffffffffffffffffffff808b166024830152891660448201526064808201899052825180830390910181526084909101825292830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092178252518251909182918083835b60208310611f9557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611f58565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611ff7576040519150601f19603f3d011682016040523d82523d6000602084013e611ffc565b606091505b509150915081801561202a57508051158061202a575080806020019051602081101561202757600080fd5b50515b61207f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806127066023913960400191505060405180910390fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff811661210957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4c6e45726332304272696467653a207a65726f20616464726573730000000000604482015290519081900360640190fd5b60335473ffffffffffffffffffffffffffffffffffffffff8281169116141561217d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806126916022913960400191505060405180910390fd5b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831617928390556040805192821680845293909116602083015280517f18f08848c5694a025f9966c34ff2367f32a1a8275663b282ee01f4338b0454909281900390910190a15050565b6000815160411461227657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806127296022913960400191505060405180910390fd5b8060ff16601b148061231657508060ff16601c145b61236b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806127f36022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156123c7573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661247457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017815292518151600094859489169392918291908083835b6020831061258357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612546565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146125e5576040519150601f19603f3d011682016040523d82523d6000602084013e6125ea565b606091505b5091509150818015612618575080511580612618575080806020019051602081101561261557600080fd5b50515b61268357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4c6e45726332304272696467653a207472616e73666572206661696c65640000604482015290519081900360640190fd5b5050505050565b303b159056fe4c6e45726332304272696467653a2072656c61796572206e6f74206368616e6765647472616e7366657246726f6d28616464726573732c616464726573732c75696e74323536294c6e45726332304272696467653a2064657374206d75737420626520646966666572656e742066726f6d207372634c6e45726332304272696467653a207472616e736665722066726f6d206661696c656445434453413a20696e76616c6964207369676e6174757265202773272076616c75654c6e41646d696e5570677261646561626c653a206f6e6c792063616e6469646174652063616e206265636f6d652061646d696e4c6e45726332304272696467653a20746f6b656e20616c726561647920657869737473496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65644c6e45726332304272696467653a20746f6b656e20646f6573206e6f742065786973747345434453413a20696e76616c6964207369676e6174757265202776272076616c75654c6e45726332304272696467653a20616d6f756e74206d75737420626520706f7369746976654c6e45726332304272696467653a20746f6b656e206e6f7420737570706f72746564206f6e20636861696e4c6e41646d696e5570677261646561626c653a206f6e6c792074686520636f6e74726163742061646d696e2063616e20706572666f726d207468697320616374696f6e4c6e45726332304272696467653a20756e6b6e6f776e20746f6b656e206c6f636b2074797065a2646970667358221220a43d26d98a139a91bc422ec635ccb4cb15ec5b9139a4830d2d5146009bfcacc064736f6c63430007060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101ae5760003560e01c80636c8381f8116100ee57806390f1f17b11610097578063b594909111610071578063b5949091146104f9578063d22ed8b61461053b578063df225e8c1461055e578063f851a44014610599576101ae565b806390f1f17b14610485578063a8d6e15d146104d4578063b12e4410146104dc576101ae565b80637ba898f7116100c85780637ba898f71461042d5780638406c0791461044a5780638e118b8314610452576101ae565b80636c8381f8146103575780636cbadbfa146103885780636dea061914610390576101ae565b80633644e5151161015b5780634c5dd3f3116101355780634c5dd3f3146102c05780634ff5174c146102e35780636025e492146103065780636548e9bc14610324576101ae565b80633644e5151461028157806339eeee441461028957806348825e94146102b8576101ae565b806325971dff1161018c57806325971dff1461023c5780632bca8a75146102445780632dfdf0b514610267576101ae565b80630589b8b2146101b357806307880b7f146101ea578063224e74621461021f575b600080fd5b6101d6600480360360408110156101c957600080fd5b50803590602001356105a1565b604080519115158252519081900360200190f35b61021d6004803603602081101561020057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166105c1565b005b61021d6004803603602081101561023557600080fd5b50356106be565b61021d61081a565b6101d66004803603604081101561025a57600080fd5b5080359060200135610920565b61026f610940565b60408051918252519081900360200190f35b61026f610946565b61021d6004803603608081101561029f57600080fd5b508035906020810135906040810135906060013561094c565b61026f610d19565b61021d600480360360408110156102d657600080fd5b5080359060200135610d3d565b61021d600480360360408110156102f957600080fd5b5080359060200135610ebb565b61030e611035565b6040805160ff9092168252519081900360200190f35b61021d6004803603602081101561033a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661103a565b61035f6110bc565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61026f6110d8565b61021d60048036036101008110156103a757600080fd5b81359160208101359160408201359160608101359160808201359160a08101359160c08201359190810190610100810160e08201356401000000008111156103ee57600080fd5b82018360208201111561040057600080fd5b8035906020019184600183028401116401000000008311171561042257600080fd5b5090925090506110de565b61030e6004803603602081101561044357600080fd5b503561166e565b61035f61169b565b61021d6004803603602081101561046857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166116b7565b6104a26004803603602081101561049b57600080fd5b50356118d3565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff90911660208301528051918290030190f35b61030e611918565b61035f600480360360208110156104f257600080fd5b503561191d565b61021d6004803603606081101561050f57600080fd5b50803590602081013573ffffffffffffffffffffffffffffffffffffffff16906040013560ff16611945565b6101d66004803603604081101561055157600080fd5b5080359060200135611c12565b61021d6004803603604081101561057457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611c32565b61035f611e62565b603660209081526000928352604080842090915290825290205460ff1681565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610637576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806128666043913960600191505060405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831617928390556040805192821680845293909116602083015280517f7f730391c4f0fa1bea34bcb9bff8c30a079b21a0359759160cb990648ab84c729281900390910190a15050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610734576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806128666043913960600191505060405180910390fd5b60008181526035602052604090205473ffffffffffffffffffffffffffffffffffffffff166107ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806127cf6024913960400191505060405180910390fd5b60008181526035602090815260409182902080547fffffffffffffffffffffff000000000000000000000000000000000000000000169055815183815291517f27b51627532fe8cd0df946e5a9590efb06cc367d3d611c1e4084c7e1dccb3ab49281900390910190a150565b60015473ffffffffffffffffffffffffffffffffffffffff16331461088a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061274b6033913960400191505060405180910390fd5b6000805460015473ffffffffffffffffffffffffffffffffffffffff908116620100009081027fffffffffffffffffffff0000000000000000000000000000000000000000ffff8416179384905560408051938290048316808552919094049091166020830152825190927f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f928290030190a150565b603760209081526000928352604080842090915290825290205460ff1681565b60345481565b60385481565b60008481526035602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff81168084527401000000000000000000000000000000000000000090910460ff1691830191909152610a0f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4c6e45726332304272696467653a20746f6b656e206e6f7420666f756e640000604482015290519081900360640190fd5b60008411610a68576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806128156026913960400191505060405180910390fd5b603254831415610ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806126d8602e913960400191505060405180910390fd5b610acd8584611c12565b610b22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061283b602b913960400191505060405180910390fd5b81610b8e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4c6e45726332304272696467653a207a65726f20616464726573730000000000604482015290519081900360640190fd5b603480546001908101909155602082015160ff161415610bbb578051610bb690333087611e84565b610cb1565b602081015160ff1660021415610c60578051604080517f9dc29fac00000000000000000000000000000000000000000000000000000000815233600482015260248101879052905173ffffffffffffffffffffffffffffffffffffffff90921691639dc29fac9160448082019260009290919082900301818387803b158015610c4357600080fd5b505af1158015610c57573d6000803e3d6000fd5b50505050610cb1565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806128a96026913960400191505060405180910390fd5b6032546034546040805192835260208301869052828101919091523360608301526080820184905260a0820187905260c08201869052517fe048043259af829807fad585485c031d37a62916d79cf4ed94a2c6e7e61f4fb09181900360e00190a15050505050565b7f7dea0ff38c20ec194d3cb84e9720e47fce7770d8b28af58ea15562bc9cf5286081565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610db3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806128666043913960600191505060405180910390fd5b600082815260366020908152604080832084845290915290205460ff1615610e3c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4c6e45726332304272696467653a20616c726561647920737570706f72746564604482015290519081900360640190fd5b600082815260366020908152604080832084845282529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815184815290810183905281517f71d564e28114f33667381ae9c6bfadc1254fab8fb4e6a9606bfa512cb5e7df49929181900390910190a15050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610f31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806128666043913960600191505060405180910390fd5b600082815260366020908152604080832084845290915290205460ff16610fb957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4c6e45726332304272696467653a206e6f7420737570706f7274656400000000604482015290519081900360640190fd5b600082815260366020908152604080832084845282529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055815184815290810183905281517fb8a301810556c08eff893eded78cbada9895cdb3c3976c53f3c48073e23d2422929181900390910190a15050565b600181565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806128666043913960600191505060405180910390fd5b6110b981612087565b50565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60325481565b603254881461114e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4c6e45726332304272696467653a2077726f6e6720636861696e000000000000604482015290519081900360640190fd5b60008981526037602090815260408083208a845290915290205460ff16156111d757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4c6e45726332304272696467653a20616c72656164792077697468647261776e604482015290519081900360640190fd5b8461124357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4c6e45726332304272696467653a207a65726f20616464726573730000000000604482015290519081900360640190fd5b6000831161129c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806128156026913960400191505060405180910390fd5b60008481526035602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff81168084527401000000000000000000000000000000000000000090910460ff169183019190915261135f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4c6e45726332304272696467653a20746f6b656e206e6f7420666f756e640000604482015290519081900360640190fd5b603854604080517f7dea0ff38c20ec194d3cb84e9720e47fce7770d8b28af58ea15562bc9cf528606020808301919091528183018e9052606082018d9052608082018c905260a082018b905260c082018a905260e0820189905261010080830189905283518084039091018152610120830184528051908201207f1901000000000000000000000000000000000000000000000000000000000000610140840152610142830194909452610162808301949094528251808303909401845261018282018084528451948201949094206101a2601f8801839004909202830182019093528584529192600092611470928891889182910183828082843760009201919091525086939250506122049050565b60335490915073ffffffffffffffffffffffffffffffffffffffff8083169116146114fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4c6e45726332304272696467653a20696e76616c6964207369676e6174757265604482015290519081900360640190fd5b60008c81526037602090815260408083208d8452825290912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915590840151899160ff91909116141561156557835161156090828961247e565b611603565b602084015160ff1660021415610c6057836000015173ffffffffffffffffffffffffffffffffffffffff166340c10f1982896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156115ea57600080fd5b505af11580156115fe573d6000803e3d6000fd5b505050505b604080518e8152602081018e90528082018d9052606081018c9052608081018b905260a081018a905260c0810189905290517f7b585240ba8820bb7f974aecfbf00d525f6a451106a775438a3f64c48875d5709181900360e00190a150505050505050505050505050565b60009081526035602052604090205474010000000000000000000000000000000000000000900460ff1690565b60335473ffffffffffffffffffffffffffffffffffffffff1681565b600054610100900460ff16806116d057506116d061268a565b806116de575060005460ff16155b611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806127a1602e913960400191505060405180910390fd5b600054610100900460ff1615801561179957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b73ffffffffffffffffffffffffffffffffffffffff821661181b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4c6e41646d696e5570677261646561626c653a207a65726f2061646472657373604482015290519081900360640190fd5b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851690810291909117825560408051928352602083019190915280517f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f9281900390910190a180156118cf57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b5050565b60356020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900460ff1682565b600281565b60009081526035602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806128666043913960600191505060405180910390fd5b60008381526035602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611a36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061277e6023913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611ab857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4c6e45726332304272696467653a207a65726f20616464726573730000000000604482015290519081900360640190fd5b60ff811660011480611acd575060ff81166002145b611b22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806128a96026913960400191505060405180910390fd5b60408051808201825273ffffffffffffffffffffffffffffffffffffffff80851680835260ff808616602080860182815260008b81526035835288902096518754915190941674010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff949096167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161792909216939093179093558351878152928301528183015290517fd9c6008de31d775aae4523eb2e6e6565ea965cabb3eac06153885621c3ddb0359181900360600190a1505050565b600091825260366020908152604080842092845291905290205460ff1690565b600054610100900460ff1680611c4b5750611c4b61268a565b80611c59575060005460ff16155b611cae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806127a1602e913960400191505060405180910390fd5b600054610100900460ff16158015611d1457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b611d1d826116b7565b611d2683612087565b466032819055604080518082018252600681527f4c696e656172000000000000000000000000000000000000000000000000000060209182015281518083018352600181527f31000000000000000000000000000000000000000000000000000000000000009082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f16061f58256c86e6eb7d166e78be192f96e51b4ccf2d8de3d9fbf3c6cbdb9bb5818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c090930190915281519101206038558015611e5d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6000808573ffffffffffffffffffffffffffffffffffffffff166040518060600160405280602581526020016126b36025913980516020918201206040805173ffffffffffffffffffffffffffffffffffffffff808b166024830152891660448201526064808201899052825180830390910181526084909101825292830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092178252518251909182918083835b60208310611f9557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611f58565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611ff7576040519150601f19603f3d011682016040523d82523d6000602084013e611ffc565b606091505b509150915081801561202a57508051158061202a575080806020019051602081101561202757600080fd5b50515b61207f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806127066023913960400191505060405180910390fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff811661210957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4c6e45726332304272696467653a207a65726f20616464726573730000000000604482015290519081900360640190fd5b60335473ffffffffffffffffffffffffffffffffffffffff8281169116141561217d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806126916022913960400191505060405180910390fd5b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831617928390556040805192821680845293909116602083015280517f18f08848c5694a025f9966c34ff2367f32a1a8275663b282ee01f4338b0454909281900390910190a15050565b6000815160411461227657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806127296022913960400191505060405180910390fd5b8060ff16601b148061231657508060ff16601c145b61236b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806127f36022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156123c7573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661247457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017815292518151600094859489169392918291908083835b6020831061258357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612546565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146125e5576040519150601f19603f3d011682016040523d82523d6000602084013e6125ea565b606091505b5091509150818015612618575080511580612618575080806020019051602081101561261557600080fd5b50515b61268357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4c6e45726332304272696467653a207472616e73666572206661696c65640000604482015290519081900360640190fd5b5050505050565b303b159056fe4c6e45726332304272696467653a2072656c61796572206e6f74206368616e6765647472616e7366657246726f6d28616464726573732c616464726573732c75696e74323536294c6e45726332304272696467653a2064657374206d75737420626520646966666572656e742066726f6d207372634c6e45726332304272696467653a207472616e736665722066726f6d206661696c656445434453413a20696e76616c6964207369676e6174757265202773272076616c75654c6e41646d696e5570677261646561626c653a206f6e6c792063616e6469646174652063616e206265636f6d652061646d696e4c6e45726332304272696467653a20746f6b656e20616c726561647920657869737473496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65644c6e45726332304272696467653a20746f6b656e20646f6573206e6f742065786973747345434453413a20696e76616c6964207369676e6174757265202776272076616c75654c6e45726332304272696467653a20616d6f756e74206d75737420626520706f7369746976654c6e45726332304272696467653a20746f6b656e206e6f7420737570706f72746564206f6e20636861696e4c6e41646d696e5570677261646561626c653a206f6e6c792074686520636f6e74726163742061646d696e2063616e20706572666f726d207468697320616374696f6e4c6e45726332304272696467653a20756e6b6e6f776e20746f6b656e206c6f636b2074797065a2646970667358221220a43d26d98a139a91bc422ec635ccb4cb15ec5b9139a4830d2d5146009bfcacc064736f6c63430007060033

Deployed Bytecode Sourcemap

8789:10075:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10678:73;;;;;;;;;;;;;;;;-1:-1:-1;10678:73:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;7038:184;;;;;;;;;;;;;;;;-1:-1:-1;7038:184:0;;;;:::i;:::-;;13323:249;;;;;;;;;;;;;;;;-1:-1:-1;13323:249:0;;:::i;7230:236::-;;;:::i;10758:69::-;;;;;;;;;;;;;;;;-1:-1:-1;10758:69:0;;;;;;;:::i;10590:27::-;;;:::i;:::-;;;;;;;;;;;;;;;;10836:31;;;:::i;14215:1324::-;;;;;;;;;;;;;;;;-1:-1:-1;14215:1324:0;;;;;;;;;;;;;;;;;:::i;10891:222::-;;;:::i;13580:310::-;;;;;;;;;;;;;;;;-1:-1:-1;13580:310:0;;;;;;;:::i;13898:309::-;;;;;;;;;;;;;;;;-1:-1:-1;13898:309:0;;;;;;;:::i;11122:50::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12561:97;;;;;;;;;;;;;;;;-1:-1:-1;12561:97:0;;;;:::i;6770:24::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10525:29;;;:::i;15547:2199::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15547:2199:0;;-1:-1:-1;15547:2199:0;-1:-1:-1;15547:2199:0;:::i;11605:127::-;;;;;;;;;;;;;;;;-1:-1:-1;11605:127:0;;:::i;10561:22::-;;;:::i;6803:227::-;;;;;;;;;;;;;;;;-1:-1:-1;6803:227:0;;;;:::i;10624:47::-;;;;;;;;;;;;;;;;-1:-1:-1;10624:47:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;11179:51;;;:::i;11465:132::-;;;;;;;;;;;;;;;;-1:-1:-1;11465:132:0;;:::i;12666:649::-;;;;;;;;;;;;;;;;-1:-1:-1;12666:649:0;;;;;;;;;;;;;;;;:::i;11740:161::-;;;;;;;;;;;;;;;;-1:-1:-1;11740:161:0;;;;;;;:::i;11909:644::-;;;;;;;;;;;;;;;;-1:-1:-1;11909:644:0;;;;;;;;;;;:::i;6743:20::-;;;:::i;10678:73::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7038:184::-;7527:5;;;;;;;7513:10;:19;7504:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7124:9:::1;::::0;;::::1;7144:22:::0;;::::1;::::0;;::::1;;::::0;;;;7182:32:::1;::::0;;7124:9;;::::1;7182:32:::0;;;7204:9;;;::::1;7182:32;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;7616:1;7038:184:::0;:::o;13323:249::-;7527:5;;;;;;;7513:10;:19;7504:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13445:1:::1;13400:20:::0;;;:10:::1;:20;::::0;;;;:33;:47:::1;:33;13392:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13506:20;::::0;;;:10:::1;:20;::::0;;;;;;;;13499:27;;;;;;13542:22;;;;;;;::::1;::::0;;;;;;;;::::1;13323:249:::0;:::o;7230:236::-;7295:9;;;;7281:10;:23;7273:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7371:11;7385:5;;7409:9;;7385:5;7409:9;;;7385:5;7401:17;;;;;;;;;;;7434:24;;;7385:5;;;;;;7434:24;;;7452:5;;;;;;;7434:24;;;;;;7385:5;;7434:24;;;;;;;;7230:236;:::o;10758:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10590:27::-;;;;:::o;10836:31::-;;;;:::o;14215:1324::-;14366:26;14395:17;;;:10;:17;;;;;;;;;14366:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;14423:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14532:1;14523:6;:10;14515:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14610:14;;14595:11;:29;;14587:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14694:43;14718:5;14725:11;14694:23;:43::i;:::-;14686:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14804:14;14796:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14878:12;;;14893:1;14878:16;;;14863:31;;;14911:18;;;;:46;;;14907:392;;;14991:22;;14974:75;;15015:10;15035:4;15042:6;14974:16;:75::i;:::-;14907:392;;;15071:18;;;;:47;;11229:1;15071:47;15067:232;;;15150:22;;15135:63;;;;;;15179:10;15135:63;;;;;;;;;;;;:43;;;;;;;:63;;;;;15150:22;;15135:63;;;;;;;;15150:22;15135:43;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15067:232;;;15231:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15345:14;;15400:12;;15316:215;;;;;;;;;;;;;;;;;;;15443:10;15316:215;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14215:1324;;;;;:::o;10891:222::-;10943:170;10891:222;:::o;13580:310::-;7527:5;;;;;;;7513:10;:19;7504:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13687:31:::1;::::0;;;:21:::1;:31;::::0;;;;;;;:40;;;;;;;;;::::1;;13686:41;13678:86;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;13775:31;::::0;;;:21:::1;:31;::::0;;;;;;;:40;;;;;;;;;:47;;;::::1;13818:4;13775:47;::::0;;13838:44;;;;;;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;13580:310:::0;;:::o;13898:309::-;7527:5;;;;;;;7513:10;:19;7504:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14005:31:::1;::::0;;;:21:::1;:31;::::0;;;;;;;:40;;;;;;;;;::::1;;13997:81;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;14132:5;14089:31:::0;;;:21:::1;:31;::::0;;;;;;;:40;;;;;;;;;:48;;;::::1;::::0;;14153:46;;;;;;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;13898:309:::0;;:::o;11122:50::-;11171:1;11122:50;:::o;12561:97::-;7527:5;;;;;;;7513:10;:19;7504:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12629:21:::1;12641:8;12629:11;:21::i;:::-;12561:97:::0;:::o;6770:24::-;;;;;;:::o;10525:29::-;;;;:::o;15547:2199::-;15845:14;;15830:11;:29;15822:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15910:29;;;;:17;:29;;;;;;;;:40;;;;;;;;;;;15909:41;15901:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16006:14;15998:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16080:1;16071:6;:10;16063:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16137:26;16166:20;;;:10;:20;;;;;;;;;16137:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;16197:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16456:16;;16531:363;;;10943:170;16531:363;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16495:422;;;;;;16384:552;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16356:595;;;;;;;;;16989:25;;;;;;;;;;;;;;;;;;;;16356:595;;16326:14;;16989:25;;17004:9;;;;;;16989:25;17004:9;;;;16989:25;;;;;;;;;-1:-1:-1;16989:6:0;;:25;-1:-1:-1;;16989:14:0;:25;-1:-1:-1;16989:25:0:i;:::-;17053:7;;16962:52;;-1:-1:-1;17053:7:0;17033:27;;;17053:7;;17033:27;17025:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17110:29;;;;:17;:29;;;;;;;;:40;;;;;;;;:47;;;;17153:4;17110:47;;;;;;17250:18;;;;17221:9;;17110:47;17250:46;;;;;17246:385;;;17326:22;;17313:62;;17350:16;17368:6;17313:12;:62::i;:::-;17246:385;;;17397:18;;;;:47;;11229:1;17397:47;17393:238;;;17476:9;:22;;;17461:43;;;17505:16;17523:6;17461:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17563:56;17648:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15547:2199;;;;;;;;;;;;;:::o;11605:127::-;11670:5;11695:20;;;:10;:20;;;;;:29;;;;;;;11605:127::o;10561:22::-;;;;;;:::o;6803:227::-;5287:13;;;;;;;;:33;;;5304:16;:14;:16::i;:::-;5287:50;;;-1:-1:-1;5325:12:0;;;;5324:13;5287:50;5279:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5401:19;5424:13;;;;;;5423:14;5448:101;;;;5483:13;:20;;5518:19;5483:20;;;;;;5518:19;5499:4;5518:19;;;5448:101;6892:20:::1;::::0;::::1;6884:65;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;6960:5;:14:::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;6990:32:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;5579:14:::0;5575:68;;;5626:5;5610:21;;;;;;5575:68;6803:227;;:::o;10624:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;11179:51::-;11229:1;11179:51;:::o;11465:132::-;11529:7;11556:20;;;:10;:20;;;;;:33;;;;11465:132::o;12666:649::-;7527:5;;;;;;;7513:10;:19;7504:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12857:1:::1;12812:20:::0;;;:10:::1;:20;::::0;;;;:33;:47:::1;:33;:47:::0;12804:95:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12918:26;::::0;::::1;12910:66;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;13009:36;::::0;::::1;11171:1;13009:36;::::0;:77:::1;;-1:-1:-1::0;13049:37:0::1;::::0;::::1;11229:1;13049:37;13009:77;12987:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13188:59;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;13165:20:0;;;:10:::1;:20:::0;;;;;:82;;;;;;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;13263:44;;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;::::1;12666:649:::0;;;:::o;11740:161::-;11829:4;11853:31;;;:21;:31;;;;;;;;:40;;;;;;;;;;;;11740:161::o;11909:644::-;5287:13;;;;;;;;:33;;;5304:16;:14;:16::i;:::-;5287:50;;;-1:-1:-1;5325:12:0;;;;5324:13;5287:50;5279:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5401:19;5424:13;;;;;;5423:14;5448:101;;;;5483:13;:20;;5518:19;5483:20;;;;;;5518:19;5499:4;5518:19;;;5448:101;12003:33:::1;12029:6;12003:25;:33::i;:::-;12049:21;12061:8;12049:11;:21::i;:::-;12144:9;12174:14;:24:::0;;;12405:15:::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;12450:10;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;12252:282;;12281:95:::1;12252:282:::0;;::::1;::::0;12395:26;12252:282;;;;12440:21;12252:282;;;;;;;;;;;12514:4:::1;12252:282:::0;;;;;;;;;;;;;;;;;;;;;;;;;12228:317;;;::::1;::::0;12209:16:::1;:336:::0;5575:68;;;;5626:5;5610:21;;;;;;5575:68;11909:644;;;:::o;6743:20::-;;;;;;;;;:::o;18450:411::-;18605:12;18619:17;18653:5;:10;;11408:46;;;;;;;;;;;;;;;;;11398:57;;;;;;;18664:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18653:84;;;;;;;;;18664:72;18653:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18604:133;;;;18756:7;:57;;;;-1:-1:-1;18768:11:0;;:16;;:44;;;18799:4;18788:24;;;;;;;;;;;;;;;-1:-1:-1;18788:24:0;18768:44;18748:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18450:411;;;;;;:::o;17754:328::-;17820:22;;;17812:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17905:7;;;17893:19;;;17905:7;;17893:19;;17885:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17985:7;;;;18003:18;;;;;;;;;;;18039:35;;;17985:7;;;18039:35;;;18066:7;;;;18039:35;;;;;;;;;;;;;;;;17754:328;;:::o;1108:2088::-;1186:7;1249:9;:16;1269:2;1249:22;1245:96;;1288:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1245:96;1702:4;1687:20;;1681:27;1748:4;1733:20;;1727:27;1802:4;1787:20;;1781:27;1410:9;1773:36;2751:66;2737:80;;;2715:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2898:1;:7;;2903:2;2898:7;:18;;;;2909:1;:7;;2914:2;2909:7;2898:18;2890:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3053:14;3070:24;3080:4;3086:1;3089;3092;3070:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3070:24:0;;;;;;-1:-1:-1;;3113:20:0;;;3105:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3182:6;1108:2088;-1:-1:-1;;;;;;1108:2088:0:o;18090:352::-;11300:34;;;;;;;;;;;;;;;;;18262:60;;18251:10;18262:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18251:72;;;;18216:12;;;;18251:10;;;18262:60;18251:72;;;18262:60;18251:72;;18262:60;18251:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18215:108;;;;18342:7;:57;;;;-1:-1:-1;18354:11:0;;:16;;:44;;;18385:4;18374:24;;;;;;;;;;;;;;;-1:-1:-1;18374:24:0;18354:44;18334:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18090:352;;;;;:::o;5743:626::-;6185:4;6309:17;6354:7;5743:626;:::o

Swarm Source

ipfs://a43d26d98a139a91bc422ec635ccb4cb15ec5b9139a4830d2d5146009bfcacc0

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  ]

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.