ETH Price: $3,390.75 (+1.83%)

Contract

0x1bdA1227875f0F8BB27625DD720f386b40003e14
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CoinBridge

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion
File 1 of 7 : CoinBridge.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

import "./AbstractBridge.sol";
import "./mint/IMint.sol";
import "../Mutex.sol";

contract CoinBridge is AbstractBridge, Mutex {
    uint256 constant DIVIDER = 10 ** 12;

    mapping(uint128 => BindingInfo) public bindings;
    uint256 public fees;
    uint256 public balance;

    event LockTokens(
        uint16 feeChainId,
        uint256 amount,
        string recipient,
        uint256 gaslessReward,
        string referrer,
        uint256 referrerFee,
        uint256 fee
    );
    event ReleaseTokens(
        uint256 amount,
        address recipient,
        uint256 gaslessReward,
        address caller
    );
    event Fee(uint16 feeChainId, uint256 amount, string recipient);

    function lockTokens(
        uint16 executionChainId_,
        string calldata recipient_,
        string calldata referrer_,
        uint256 gaslessReward_
    ) external payable mutex whenNotPaused whenInitialized {
        require(chains[executionChainId_], "execution chain is disable");
        BindingInfo memory binding = bindings[executionChainId_];
        require(binding.enabled, "token is disabled");
        require(msg.value >= binding.minAmount, "less than min amount");
        uint128 percent = msg.value > binding.thresholdFee
            ? binding.afterPercentFee
            : binding.beforePercentFee;
        uint256 fee = binding.minFee + (msg.value * percent) / PERCENT_FACTOR;
        require(msg.value > fee, "fee more than amount");
        uint256 amount;
        unchecked {
            amount = msg.value - fee;
        }
        require(amount > gaslessReward_, "gassless reward more than amount");
        uint256 referrerFee = (fee *
            referrersFeeInPercent[executionChainId_][referrer_]) /
            PERCENT_FACTOR;
        fees += fee - referrerFee;
        balance += amount + referrerFee;
        emit LockTokens(
            executionChainId_,
            amount,
            recipient_,
            gaslessReward_,
            referrer_,
            referrerFee,
            fee - referrerFee
        );
        IMint(adapter).mintTokens(
            executionChainId_,
            binding.executionAsset,
            amount / DIVIDER,
            recipient_,
            gaslessReward_ / DIVIDER,
            referrer_,
            referrerFee / DIVIDER
        );
    }

    function releaseTokens(
        bytes32 callerContract_,
        address payable recipient_,
        uint256 amount_,
        uint256 gaslessReward_
    ) external mutex whenNotPaused whenInitialized onlyExecutor {
        require(callerContract == callerContract_, "only caller contract");

        uint256 balance_ = balance;
        amount_ *= DIVIDER;
        gaslessReward_ *= DIVIDER;
        require(balance_ >= amount_, "insufficient funds");
        unchecked {
            balance = balance_ - amount_;
        }

        // slither-disable-start tx-origin
        emit ReleaseTokens(amount_, recipient_, gaslessReward_, tx.origin);
        if (gaslessReward_ > 0 && recipient_ != tx.origin) {
            recipient_.transfer(amount_ - gaslessReward_);
            payable(tx.origin).transfer(gaslessReward_);
        } else {
            recipient_.transfer(amount_);
        }
        // slither-disable-end tx-origin
    }

    function transferFee() external mutex whenNotPaused whenInitialized {
        uint16 feeChainId_ = feeChainId;
        require(chains[feeChainId_], "chain is disable");
        BindingInfo memory binding = bindings[feeChainId_];
        require(binding.enabled, "token is disabled");
        uint256 fee_ = fees;
        require(fee_ >= binding.minAmount, "less than min amount");
        balance += fee_;
        fees = 0;
        fee_ /= DIVIDER;
        string memory feeRecipient_ = feeRecipient;

        emit Fee(feeChainId_, fee_, feeRecipient_);
        IMint(adapter).mintTokens(
            feeChainId_,
            binding.executionAsset,
            fee_,
            feeRecipient_,
            0,
            "",
            0
        );
    }

    function updateBindingInfo(
        uint16 executionChainId_,
        string calldata executionAsset_,
        uint256 minAmount_,
        uint256 minFee_,
        uint256 thresholdFee_,
        uint128 beforePercentFee_,
        uint128 afterPercentFee_,
        bool enabled_
    ) external onlyAdmin {
        bindings[executionChainId_] = BindingInfo(
            executionAsset_,
            minAmount_,
            minFee_,
            thresholdFee_,
            beforePercentFee_,
            afterPercentFee_,
            enabled_
        );
    }

    receive() external payable {}
}

File 2 of 7 : AbstractBridge.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

import "../Pausable.sol";
import "../Initializable.sol";

abstract contract AbstractBridge is Initializable, Pausable {
    struct BindingInfo {
        string executionAsset;
        uint256 minAmount;
        uint256 minFee;
        uint256 thresholdFee;
        uint128 beforePercentFee;
        uint128 afterPercentFee;
        bool enabled;
    }

    event ExecutionChainUpdated(uint128 feeChainId, address caller);
    event FeeChainUpdated(uint128 feeChainId, address caller);
    event CallerContractUpdated(bytes32 executorContract, address caller);
    event FeeRecipientUpdated(string feeRecipient, address caller);
    event SignerUpdated(address caller, address oldSigner, address signer);
    event ReferrerFeeUpdated(
        uint128 chainId,
        string referrer,
        uint128 feeInPercent
    );

    uint128 constant PERCENT_FACTOR = 10 ** 6;

    uint16 public feeChainId;
    string public feeRecipient;
    address public adapter;
    address public executor;
    bytes32 callerContract;
    mapping(uint128 => bool) public chains;
    mapping(uint128 => mapping(string => uint128)) public referrersFeeInPercent;

    modifier onlyExecutor() {
        require(msg.sender == executor, "only executor");
        _;
    }

    function init(
        address admin_,
        address adapter_,
        uint16 feeChainId_,
        string calldata feeRecipient_,
        address executor_,
        bytes32 callerContract_
    ) external whenNotInitialized {
        require(admin_ != address(0), "zero address");
        require(adapter_ != address(0), "zero address");
        require(executor_ != address(0), "zero address");
        feeChainId = feeChainId_;
        pauser = admin_;
        admin = admin_;
        feeRecipient = feeRecipient_;
        adapter = adapter_;
        executor = executor_;
        callerContract = callerContract_;
        isInited = true;
    }

    function updateExecutionChain(
        uint128 executionChainId_,
        bool enabled
    ) external onlyAdmin {
        emit ExecutionChainUpdated(executionChainId_, msg.sender);
        chains[executionChainId_] = enabled;
    }

    function updateFeeChain(uint16 feeChainId_) external onlyAdmin {
        emit FeeChainUpdated(feeChainId_, msg.sender);
        feeChainId = feeChainId_;
    }

    function updateCallerContract(bytes32 callerContract_) external onlyAdmin {
        emit CallerContractUpdated(callerContract_, msg.sender);
        callerContract_ = callerContract_;
    }

    function updateFeeRecipient(
        string calldata feeRecipient_
    ) external onlyAdmin {
        emit FeeRecipientUpdated(feeRecipient_, msg.sender);
        feeRecipient = feeRecipient_;
    }

    function updateReferrer(
        uint128 executionChainId_,
        string calldata referrer_,
        uint128 percentFee_
    ) external onlyAdmin {
        require(percentFee_ <= 2e5); // up 20% max
        require(chains[executionChainId_], "execution chain is disable");
        emit ReferrerFeeUpdated(executionChainId_, referrer_, percentFee_);
        referrersFeeInPercent[executionChainId_][referrer_] = percentFee_;
    }
}

File 3 of 7 : IMint.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

interface IMint {
    function mintTokens(
        uint16 executionChainId_,
        string calldata token_,
        uint256 amount_,
        string calldata recipient_,
        uint256 gaslessClaimReward_,
        string calldata referrer_,
        uint256 referrerFee_
    ) external;
}

File 4 of 7 : Mutex.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

abstract contract Mutex {
    bool private _lock;

    modifier mutex() {
        require(!_lock, "mutex lock");
        _lock = true;
        _;
        _lock = false;
    }
}

File 5 of 7 : Pausable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

import "./Adminable.sol";

abstract contract Pausable is Adminable {
    event Paused(address account);
    event Unpaused(address account);
    event PauserUpdated(address sender, address oldPauser, address pauser);

    bool public isPaused;
    address public pauser;

    constructor() {
        isPaused = false;
    }

    modifier whenNotPaused() {
        require(!isPaused, "paused");
        _;
    }

    modifier whenPaused() {
        require(isPaused, "not paused");
        _;
    }

    modifier onlyPauser() {
        require(pauser == msg.sender, "only pauser");
        _;
    }

    function pause() external whenNotPaused onlyPauser {
        isPaused = true;
        emit Paused(msg.sender);
    }

    function unpause() external whenPaused onlyPauser {
        isPaused = false;
        emit Unpaused(msg.sender);
    }

    function updatePauser(address pauser_) external onlyAdmin {
        require(pauser_ != address(0), "zero address");
        emit PauserUpdated(msg.sender, pauser, pauser_);
        pauser = pauser_;
    }
}

File 6 of 7 : Initializable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

abstract contract Initializable {
    bool internal isInited;

    modifier whenInitialized() {
        require(isInited, "not initialized");
        _;
    }

    modifier whenNotInitialized() {
        require(!isInited, "already initialized");
        _;
    }
}

File 7 of 7 : Adminable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

abstract contract Adminable {
    event AdminUpdated(address sender, address oldAdmin, address admin);

    address public admin;

    modifier onlyAdmin() {
        require(admin == msg.sender, "only admin");
        _;
    }

    function updateAdmin(address admin_) external onlyAdmin {
        require(admin_ != address(0), "zero address");
        emit AdminUpdated(msg.sender, admin, admin_);
        admin = admin_;
    }
}

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

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"AdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"executorContract","type":"bytes32"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"CallerContractUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"feeChainId","type":"uint128"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ExecutionChainUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"feeChainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"recipient","type":"string"}],"name":"Fee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"feeChainId","type":"uint128"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"FeeChainUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"feeRecipient","type":"string"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"FeeRecipientUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"feeChainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"recipient","type":"string"},{"indexed":false,"internalType":"uint256","name":"gaslessReward","type":"uint256"},{"indexed":false,"internalType":"string","name":"referrer","type":"string"},{"indexed":false,"internalType":"uint256","name":"referrerFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"LockTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"oldPauser","type":"address"},{"indexed":false,"internalType":"address","name":"pauser","type":"address"}],"name":"PauserUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"chainId","type":"uint128"},{"indexed":false,"internalType":"string","name":"referrer","type":"string"},{"indexed":false,"internalType":"uint128","name":"feeInPercent","type":"uint128"}],"name":"ReferrerFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"gaslessReward","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ReleaseTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"address","name":"oldSigner","type":"address"},{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"SignerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"adapter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"","type":"uint128"}],"name":"bindings","outputs":[{"internalType":"string","name":"executionAsset","type":"string"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"minFee","type":"uint256"},{"internalType":"uint256","name":"thresholdFee","type":"uint256"},{"internalType":"uint128","name":"beforePercentFee","type":"uint128"},{"internalType":"uint128","name":"afterPercentFee","type":"uint128"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"","type":"uint128"}],"name":"chains","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"executor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeChainId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin_","type":"address"},{"internalType":"address","name":"adapter_","type":"address"},{"internalType":"uint16","name":"feeChainId_","type":"uint16"},{"internalType":"string","name":"feeRecipient_","type":"string"},{"internalType":"address","name":"executor_","type":"address"},{"internalType":"bytes32","name":"callerContract_","type":"bytes32"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"executionChainId_","type":"uint16"},{"internalType":"string","name":"recipient_","type":"string"},{"internalType":"string","name":"referrer_","type":"string"},{"internalType":"uint256","name":"gaslessReward_","type":"uint256"}],"name":"lockTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"","type":"uint128"},{"internalType":"string","name":"","type":"string"}],"name":"referrersFeeInPercent","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"callerContract_","type":"bytes32"},{"internalType":"address payable","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"gaslessReward_","type":"uint256"}],"name":"releaseTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin_","type":"address"}],"name":"updateAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"executionChainId_","type":"uint16"},{"internalType":"string","name":"executionAsset_","type":"string"},{"internalType":"uint256","name":"minAmount_","type":"uint256"},{"internalType":"uint256","name":"minFee_","type":"uint256"},{"internalType":"uint256","name":"thresholdFee_","type":"uint256"},{"internalType":"uint128","name":"beforePercentFee_","type":"uint128"},{"internalType":"uint128","name":"afterPercentFee_","type":"uint128"},{"internalType":"bool","name":"enabled_","type":"bool"}],"name":"updateBindingInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"callerContract_","type":"bytes32"}],"name":"updateCallerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"executionChainId_","type":"uint128"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateExecutionChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"feeChainId_","type":"uint16"}],"name":"updateFeeChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"feeRecipient_","type":"string"}],"name":"updateFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pauser_","type":"address"}],"name":"updatePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"executionChainId_","type":"uint128"},{"internalType":"string","name":"referrer_","type":"string"},{"internalType":"uint128","name":"percentFee_","type":"uint128"}],"name":"updateReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b506000805460ff60a81b191690556135468061002d6000396000f3fe6080604052600436106101a55760003560e01c80639fd0506d116100e1578063bac9e1b71161008a578063e2f273bd11610064578063e2f273bd14610534578063e45da52614610554578063f67db96b14610574578063f851a440146105ba57600080fd5b8063bac9e1b7146104b7578063c34c08e5146104d7578063e22fe72f1461050457600080fd5b8063b187bd26116100bb578063b187bd261461043e578063b3c276e214610481578063b69ef8a8146104a157600080fd5b80639fd0506d146103dc578063a7392f8e14610409578063acb2ad6f1461042957600080fd5b8063469048401161014e57806367e9bd431161012857806367e9bd43146103145780638456cb59146103275780638497e6661461033c5780639af1d35a146103b857600080fd5b806346904840146102b2578063554bab3c146102d45780635f7ebb05146102f457600080fd5b80631c47ae5e1161017f5780631c47ae5e1461025d5780632c16ae001461027d5780633f4ba83a1461029d57600080fd5b806303eadcfc146101b157806305b53c31146102085780630bab60531461023b57600080fd5b366101ac57005b600080fd5b3480156101bd57600080fd5b506003546101de9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561021457600080fd5b506102286102233660046129bb565b6105ec565b6040516101ff9796959493929190612a41565b34801561024757600080fd5b5061025b610256366004612a99565b6106d7565b005b34801561026957600080fd5b5061025b610278366004612ac2565b61079d565b34801561028957600080fd5b5061025b610298366004612b50565b6108bf565b3480156102a957600080fd5b5061025b610a82565b3480156102be57600080fd5b506102c7610be6565b6040516101ff9190612bf2565b3480156102e057600080fd5b5061025b6102ef366004612c2a565b610c74565b34801561030057600080fd5b5061025b61030f366004612c47565b610e17565b61025b610322366004612c62565b610f26565b34801561033357600080fd5b5061025b611623565b34801561034857600080fd5b50610397610357366004612d1a565b600760209081526000928352604090922081518083018401805192815290840192909301919091209152546fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020016101ff565b3480156103c457600080fd5b506103ce600a5481565b6040519081526020016101ff565b3480156103e857600080fd5b506001546101de9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561041557600080fd5b5061025b610424366004612dfa565b61179a565b34801561043557600080fd5b5061025b611c20565b34801561044a57600080fd5b50600054610471907501000000000000000000000000000000000000000000900460ff1681565b60405190151581526020016101ff565b34801561048d57600080fd5b5061025b61049c366004612e37565b6121ec565b3480156104ad57600080fd5b506103ce600b5481565b3480156104c357600080fd5b5061025b6104d2366004612ece565b61251b565b3480156104e357600080fd5b506004546101de9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561051057600080fd5b5061047161051f3660046129bb565b60066020526000908152604090205460ff1681565b34801561054057600080fd5b5061025b61054f366004612c2a565b612716565b34801561056057600080fd5b5061025b61056f366004612f33565b6128c3565b34801561058057600080fd5b506001546105a79074010000000000000000000000000000000000000000900461ffff1681565b60405161ffff90911681526020016101ff565b3480156105c657600080fd5b506000546101de90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020526000908152604090208054819061060790612f75565b80601f016020809104026020016040519081016040528092919081815260200182805461063390612f75565b80156106805780601f1061065557610100808354040283529160200191610680565b820191906000526020600020905b81548152906001019060200180831161066357829003601f168201915b50505060018401546002850154600386015460048701546005909701549596929591945092506fffffffffffffffffffffffffffffffff808316927001000000000000000000000000000000009004169060ff1687565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e0000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b604080518281523360208201527fcff96c14f90d679c9b2edb1cd5b9990824d3083f97ade84c79539884ca33fc02910160405180910390a150565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610759565b604080516fffffffffffffffffffffffffffffffff841681523360208201527fcd8ca9842747d8162878825088ab13c89199cba4f7f23889db839b92328ef815910160405180910390a16fffffffffffffffffffffffffffffffff91909116600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610759565b6040518060e0016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060208083018a905260408084018a9052606084018990526fffffffffffffffffffffffffffffffff8089166080860152871660a085015285151560c09094019390935261ffff8d1682526009905220815181906109e59082613016565b50602082015160018201556040820151600282015560608201516003820155608082015160a08301516fffffffffffffffffffffffffffffffff90811670010000000000000000000000000000000002911617600482015560c090910151600590910180549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16610b07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f7420706175736564000000000000000000000000000000000000000000006044820152606401610759565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6f6e6c79207061757365720000000000000000000000000000000000000000006044820152606401610759565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b60028054610bf390612f75565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1f90612f75565b8015610c6c5780601f10610c4157610100808354040283529160200191610c6c565b820191906000526020600020905b815481529060010190602001808311610c4f57829003601f168201915b505050505081565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610cfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610759565b73ffffffffffffffffffffffffffffffffffffffff8116610d77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610759565b6001546040805133815273ffffffffffffffffffffffffffffffffffffffff928316602082015291831682820152517f9b3d82621a55ae56941a49b01b3111acf42e49f89b2af1a6dea8fb9886d3520c9181900360600190a1600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610e9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610759565b6040805161ffff831681523360208201527fa3f2d453e9999c008b07f10a428e6a33ce8dd4b9423bef99ff9cd579cedfb8b5910160405180910390a16001805461ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60085460ff1615610f93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6d75746578206c6f636b000000000000000000000000000000000000000000006044820152606401610759565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000547501000000000000000000000000000000000000000000900460ff1615611044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610759565b60005460ff166110b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6e6f7420696e697469616c697a656400000000000000000000000000000000006044820152606401610759565b61ffff861660009081526006602052604090205460ff1661112d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f657865637574696f6e20636861696e2069732064697361626c650000000000006044820152606401610759565b61ffff8616600090815260096020526040808220815160e0810190925280548290829061115990612f75565b80601f016020809104026020016040519081016040528092919081815260200182805461118590612f75565b80156111d25780601f106111a7576101008083540402835291602001916111d2565b820191906000526020600020905b8154815290600101906020018083116111b557829003601f168201915b505050918352505060018201546020820152600282015460408201526003820154606082015260048201546fffffffffffffffffffffffffffffffff80821660808401527001000000000000000000000000000000009091041660a082015260059091015460ff16151560c0918201528101519091506112ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f6b656e2069732064697361626c65640000000000000000000000000000006044820152606401610759565b806020015134101561131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6c657373207468616e206d696e20616d6f756e740000000000000000000000006044820152606401610759565b600081606001513411611333578160800151611339565b8160a001515b90506000620f424061135d6fffffffffffffffffffffffffffffffff84163461315f565b611367919061317c565b836040015161137691906131b7565b90508034116113e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f666565206d6f7265207468616e20616d6f756e740000000000000000000000006044820152606401610759565b3481900384811161144e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f676173736c65737320726577617264206d6f7265207468616e20616d6f756e746044820152606401610759565b61ffff8a166000908152600760205260408082209051620f42409190611477908b908b906131ca565b908152604051908190036020019020546114a3906fffffffffffffffffffffffffffffffff168561315f565b6114ad919061317c565b90506114b981846131da565b600a60008282546114ca91906131b7565b909155506114da905081836131b7565b600b60008282546114eb91906131b7565b909155507fbd5f70a23e54b5a3880fb16392520f3c3cb0fb9e78a2f6a218e7a7f37a61c7fd90508b838c8c8a8d8d88611524818d6131da565b60405161153999989796959493929190613236565b60405180910390a1600354855173ffffffffffffffffffffffffffffffffffffffff9091169063f3f8db33908d9061157664e8d4a510008761317c565b8e8e61158764e8d4a510008e61317c565b8f8f61159864e8d4a510008c61317c565b6040518a63ffffffff1660e01b81526004016115bc9998979695949392919061328c565b600060405180830381600087803b1580156115d657600080fd5b505af11580156115ea573d6000803e3d6000fd5b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905550505050505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16156116a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610759565b60015473ffffffffffffffffffffffffffffffffffffffff16331461172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6f6e6c79207061757365720000000000000000000000000000000000000000006044820152606401610759565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610bdc565b60085460ff1615611807576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6d75746578206c6f636b000000000000000000000000000000000000000000006044820152606401610759565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000547501000000000000000000000000000000000000000000900460ff16156118b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610759565b60005460ff16611924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6e6f7420696e697469616c697a656400000000000000000000000000000000006044820152606401610759565b60045473ffffffffffffffffffffffffffffffffffffffff1633146119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c79206578656375746f72000000000000000000000000000000000000006044820152606401610759565b8360055414611a10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6f6e6c792063616c6c657220636f6e74726163740000000000000000000000006044820152606401610759565b600b54611a2264e8d4a510008461315f565b9250611a3364e8d4a510008361315f565b915082811015611a9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e742066756e647300000000000000000000000000006044820152606401610759565b828103600b556040805184815273ffffffffffffffffffffffffffffffffffffffff861660208201529081018390523260608201527f962ba7162f4c833675515d18cddc45390cfe1ea38dd381d4b5b3119cc05d14d19060800160405180910390a1600082118015611b27575073ffffffffffffffffffffffffffffffffffffffff84163214155b15611bac5773ffffffffffffffffffffffffffffffffffffffff84166108fc611b5084866131da565b6040518115909202916000818181858888f19350505050158015611b78573d6000803e3d6000fd5b50604051329083156108fc029084906000818181858888f19350505050158015611ba6573d6000803e3d6000fd5b50611bf1565b60405173ffffffffffffffffffffffffffffffffffffffff85169084156108fc029085906000818181858888f19350505050158015611bef573d6000803e3d6000fd5b505b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055505050565b60085460ff1615611c8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6d75746578206c6f636b000000000000000000000000000000000000000000006044820152606401610759565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000547501000000000000000000000000000000000000000000900460ff1615611d3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610759565b60005460ff16611daa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6e6f7420696e697469616c697a656400000000000000000000000000000000006044820152606401610759565b60015474010000000000000000000000000000000000000000900461ffff1660008181526006602052604090205460ff16611e41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f636861696e2069732064697361626c65000000000000000000000000000000006044820152606401610759565b61ffff8116600090815260096020526040808220815160e08101909252805482908290611e6d90612f75565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9990612f75565b8015611ee65780601f10611ebb57610100808354040283529160200191611ee6565b820191906000526020600020905b815481529060010190602001808311611ec957829003601f168201915b505050918352505060018201546020820152600282015460408201526003820154606082015260048201546fffffffffffffffffffffffffffffffff80821660808401527001000000000000000000000000000000009091041660a082015260059091015460ff16151560c091820152810151909150611fc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f6b656e2069732064697361626c65640000000000000000000000000000006044820152606401610759565b600a546020820151811015612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6c657373207468616e206d696e20616d6f756e740000000000000000000000006044820152606401610759565b80600b600082825461204591906131b7565b90915550506000600a5561205e64e8d4a510008261317c565b905060006002805461206f90612f75565b80601f016020809104026020016040519081016040528092919081815260200182805461209b90612f75565b80156120e85780601f106120bd576101008083540402835291602001916120e8565b820191906000526020600020905b8154815290600101906020018083116120cb57829003601f168201915b505050505090507f96437ac80e46ae10e2d87d1e818cd46867714023a3eb1e12484429d8cfa43922848383604051612122939291906132f4565b60405180910390a160035483516040517ff3f8db3300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9092169163f3f8db339161218c91889190879087906000908190600401613320565b600060405180830381600087803b1580156121a657600080fd5b505af11580156121ba573d6000803e3d6000fd5b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055505050505050565b60005460ff1615612259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f616c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610759565b73ffffffffffffffffffffffffffffffffffffffff87166122d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610759565b73ffffffffffffffffffffffffffffffffffffffff8616612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610759565b73ffffffffffffffffffffffffffffffffffffffff82166123d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610759565b600180547fffffffffffffffffffff00000000000000000000000000000000000000000000167401000000000000000000000000000000000000000061ffff8816027fffffffffffffffffffffffff0000000000000000000000000000000000000000161773ffffffffffffffffffffffffffffffffffffffff8916908117909155600080547fffffffffffffffffffffff0000000000000000000000000000000000000000ff16610100909202919091179055600261249184868361337a565b506003805473ffffffffffffffffffffffffffffffffffffffff9788167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600480549390971692169190911790945550505060055550600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600054610100900473ffffffffffffffffffffffffffffffffffffffff1633146125a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610759565b62030d40816fffffffffffffffffffffffffffffffff1611156125c357600080fd5b6fffffffffffffffffffffffffffffffff841660009081526006602052604090205460ff1661264e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f657865637574696f6e20636861696e2069732064697361626c650000000000006044820152606401610759565b7f933e13f2c0174ad6202905ed6eb73212911941c4fb8daf560b05445099b52e27848484846040516126839493929190613495565b60405180910390a16fffffffffffffffffffffffffffffffff84166000908152600760205260409081902090518291906126c090869086906131ca565b90815260405190819003602001902080546fffffffffffffffffffffffffffffffff929092167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905550505050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff16331461279c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610759565b73ffffffffffffffffffffffffffffffffffffffff8116612819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610759565b6000546040805133815273ffffffffffffffffffffffffffffffffffffffff6101009093048316602082015291831682820152517f9f6130d220a6021d90d78c7ed17b7cfb79f530974405b174fef75f671205513c9181900360600190a16000805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314612949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610759565b7f212215b14b6f95abef8735f1a53e5383ebe2be1b7767190b1429c167e9b55a3182823360405161297c939291906134d6565b60405180910390a1600261299182848361337a565b505050565b80356fffffffffffffffffffffffffffffffff811681146129b657600080fd5b919050565b6000602082840312156129cd57600080fd5b6129d682612996565b9392505050565b6000815180845260005b81811015612a03576020818501810151868301820152016129e7565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60e081526000612a5460e083018a6129dd565b602083019890985250604081019590955260608501939093526fffffffffffffffffffffffffffffffff91821660808501521660a0830152151560c090910152919050565b600060208284031215612aab57600080fd5b5035919050565b803580151581146129b657600080fd5b60008060408385031215612ad557600080fd5b612ade83612996565b9150612aec60208401612ab2565b90509250929050565b803561ffff811681146129b657600080fd5b60008083601f840112612b1957600080fd5b50813567ffffffffffffffff811115612b3157600080fd5b602083019150836020828501011115612b4957600080fd5b9250929050565b60008060008060008060008060006101008a8c031215612b6f57600080fd5b612b788a612af5565b985060208a013567ffffffffffffffff811115612b9457600080fd5b612ba08c828d01612b07565b90995097505060408a0135955060608a0135945060808a01359350612bc760a08b01612996565b9250612bd560c08b01612996565b9150612be360e08b01612ab2565b90509295985092959850929598565b6020815260006129d660208301846129dd565b73ffffffffffffffffffffffffffffffffffffffff81168114612c2757600080fd5b50565b600060208284031215612c3c57600080fd5b81356129d681612c05565b600060208284031215612c5957600080fd5b6129d682612af5565b60008060008060008060808789031215612c7b57600080fd5b612c8487612af5565b9550602087013567ffffffffffffffff80821115612ca157600080fd5b612cad8a838b01612b07565b90975095506040890135915080821115612cc657600080fd5b50612cd389828a01612b07565b979a9699509497949695606090950135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215612d2d57600080fd5b612d3683612996565b9150602083013567ffffffffffffffff80821115612d5357600080fd5b818501915085601f830112612d6757600080fd5b813581811115612d7957612d79612ceb565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715612dbf57612dbf612ceb565b81604052828152886020848701011115612dd857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060008060808587031215612e1057600080fd5b843593506020850135612e2281612c05565b93969395505050506040820135916060013590565b600080600080600080600060c0888a031215612e5257600080fd5b8735612e5d81612c05565b96506020880135612e6d81612c05565b9550612e7b60408901612af5565b9450606088013567ffffffffffffffff811115612e9757600080fd5b612ea38a828b01612b07565b9095509350506080880135612eb781612c05565b8092505060a0880135905092959891949750929550565b60008060008060608587031215612ee457600080fd5b612eed85612996565b9350602085013567ffffffffffffffff811115612f0957600080fd5b612f1587828801612b07565b9094509250612f28905060408601612996565b905092959194509250565b60008060208385031215612f4657600080fd5b823567ffffffffffffffff811115612f5d57600080fd5b612f6985828601612b07565b90969095509350505050565b600181811c90821680612f8957607f821691505b602082108103612fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561299157600081815260208120601f850160051c81016020861015612fef5750805b601f850160051c820191505b8181101561300e57828155600101612ffb565b505050505050565b815167ffffffffffffffff81111561303057613030612ceb565b6130448161303e8454612f75565b84612fc8565b602080601f83116001811461309757600084156130615750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561300e565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156130e4578886015182559484019460019091019084016130c5565b508582101561312057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761317657613176613130565b92915050565b6000826131b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082018082111561317657613176613130565b8183823760009101908152919050565b8181038181111561317657613176613130565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b61ffff8a16815288602082015260e06040820152600061325a60e08301898b6131ed565b87606084015282810360808401526132738187896131ed565b60a0840195909552505060c00152979650505050505050565b61ffff8a16815260e0602082015260006132a960e083018b6129dd565b89604084015282810360608401526132c281898b6131ed565b905086608084015282810360a08401526132dd8186886131ed565b9150508260c08301529a9950505050505050505050565b61ffff8416815282602082015260606040820152600061331760608301846129dd565b95945050505050565b61ffff8716815260e06020820152600061333d60e08301886129dd565b866040840152828103606084015261335581876129dd565b6080840195909552505080830360a08201526000835260c00152602001949350505050565b67ffffffffffffffff83111561339257613392612ceb565b6133a6836133a08354612f75565b83612fc8565b6000601f8411600181146133f857600085156133c25750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561348e565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156134475786850135825560209485019460019092019101613427565b5086821015613482577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60006fffffffffffffffffffffffffffffffff8087168352606060208401526134c26060840186886131ed565b915080841660408401525095945050505050565b6040815260006134ea6040830185876131ed565b905073ffffffffffffffffffffffffffffffffffffffff8316602083015294935050505056fea264697066735822122035850e6a458868fac9dda5e7464e45e0356b0bf3086d27b6845ee6b2730eceb564736f6c63430008120033

Deployed Bytecode

0x6080604052600436106101a55760003560e01c80639fd0506d116100e1578063bac9e1b71161008a578063e2f273bd11610064578063e2f273bd14610534578063e45da52614610554578063f67db96b14610574578063f851a440146105ba57600080fd5b8063bac9e1b7146104b7578063c34c08e5146104d7578063e22fe72f1461050457600080fd5b8063b187bd26116100bb578063b187bd261461043e578063b3c276e214610481578063b69ef8a8146104a157600080fd5b80639fd0506d146103dc578063a7392f8e14610409578063acb2ad6f1461042957600080fd5b8063469048401161014e57806367e9bd431161012857806367e9bd43146103145780638456cb59146103275780638497e6661461033c5780639af1d35a146103b857600080fd5b806346904840146102b2578063554bab3c146102d45780635f7ebb05146102f457600080fd5b80631c47ae5e1161017f5780631c47ae5e1461025d5780632c16ae001461027d5780633f4ba83a1461029d57600080fd5b806303eadcfc146101b157806305b53c31146102085780630bab60531461023b57600080fd5b366101ac57005b600080fd5b3480156101bd57600080fd5b506003546101de9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561021457600080fd5b506102286102233660046129bb565b6105ec565b6040516101ff9796959493929190612a41565b34801561024757600080fd5b5061025b610256366004612a99565b6106d7565b005b34801561026957600080fd5b5061025b610278366004612ac2565b61079d565b34801561028957600080fd5b5061025b610298366004612b50565b6108bf565b3480156102a957600080fd5b5061025b610a82565b3480156102be57600080fd5b506102c7610be6565b6040516101ff9190612bf2565b3480156102e057600080fd5b5061025b6102ef366004612c2a565b610c74565b34801561030057600080fd5b5061025b61030f366004612c47565b610e17565b61025b610322366004612c62565b610f26565b34801561033357600080fd5b5061025b611623565b34801561034857600080fd5b50610397610357366004612d1a565b600760209081526000928352604090922081518083018401805192815290840192909301919091209152546fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020016101ff565b3480156103c457600080fd5b506103ce600a5481565b6040519081526020016101ff565b3480156103e857600080fd5b506001546101de9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561041557600080fd5b5061025b610424366004612dfa565b61179a565b34801561043557600080fd5b5061025b611c20565b34801561044a57600080fd5b50600054610471907501000000000000000000000000000000000000000000900460ff1681565b60405190151581526020016101ff565b34801561048d57600080fd5b5061025b61049c366004612e37565b6121ec565b3480156104ad57600080fd5b506103ce600b5481565b3480156104c357600080fd5b5061025b6104d2366004612ece565b61251b565b3480156104e357600080fd5b506004546101de9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561051057600080fd5b5061047161051f3660046129bb565b60066020526000908152604090205460ff1681565b34801561054057600080fd5b5061025b61054f366004612c2a565b612716565b34801561056057600080fd5b5061025b61056f366004612f33565b6128c3565b34801561058057600080fd5b506001546105a79074010000000000000000000000000000000000000000900461ffff1681565b60405161ffff90911681526020016101ff565b3480156105c657600080fd5b506000546101de90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020526000908152604090208054819061060790612f75565b80601f016020809104026020016040519081016040528092919081815260200182805461063390612f75565b80156106805780601f1061065557610100808354040283529160200191610680565b820191906000526020600020905b81548152906001019060200180831161066357829003601f168201915b50505060018401546002850154600386015460048701546005909701549596929591945092506fffffffffffffffffffffffffffffffff808316927001000000000000000000000000000000009004169060ff1687565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e0000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b604080518281523360208201527fcff96c14f90d679c9b2edb1cd5b9990824d3083f97ade84c79539884ca33fc02910160405180910390a150565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610759565b604080516fffffffffffffffffffffffffffffffff841681523360208201527fcd8ca9842747d8162878825088ab13c89199cba4f7f23889db839b92328ef815910160405180910390a16fffffffffffffffffffffffffffffffff91909116600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610759565b6040518060e0016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060208083018a905260408084018a9052606084018990526fffffffffffffffffffffffffffffffff8089166080860152871660a085015285151560c09094019390935261ffff8d1682526009905220815181906109e59082613016565b50602082015160018201556040820151600282015560608201516003820155608082015160a08301516fffffffffffffffffffffffffffffffff90811670010000000000000000000000000000000002911617600482015560c090910151600590910180549115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909216919091179055505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16610b07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f7420706175736564000000000000000000000000000000000000000000006044820152606401610759565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6f6e6c79207061757365720000000000000000000000000000000000000000006044820152606401610759565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b60028054610bf390612f75565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1f90612f75565b8015610c6c5780601f10610c4157610100808354040283529160200191610c6c565b820191906000526020600020905b815481529060010190602001808311610c4f57829003601f168201915b505050505081565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610cfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610759565b73ffffffffffffffffffffffffffffffffffffffff8116610d77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610759565b6001546040805133815273ffffffffffffffffffffffffffffffffffffffff928316602082015291831682820152517f9b3d82621a55ae56941a49b01b3111acf42e49f89b2af1a6dea8fb9886d3520c9181900360600190a1600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610e9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610759565b6040805161ffff831681523360208201527fa3f2d453e9999c008b07f10a428e6a33ce8dd4b9423bef99ff9cd579cedfb8b5910160405180910390a16001805461ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60085460ff1615610f93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6d75746578206c6f636b000000000000000000000000000000000000000000006044820152606401610759565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000547501000000000000000000000000000000000000000000900460ff1615611044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610759565b60005460ff166110b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6e6f7420696e697469616c697a656400000000000000000000000000000000006044820152606401610759565b61ffff861660009081526006602052604090205460ff1661112d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f657865637574696f6e20636861696e2069732064697361626c650000000000006044820152606401610759565b61ffff8616600090815260096020526040808220815160e0810190925280548290829061115990612f75565b80601f016020809104026020016040519081016040528092919081815260200182805461118590612f75565b80156111d25780601f106111a7576101008083540402835291602001916111d2565b820191906000526020600020905b8154815290600101906020018083116111b557829003601f168201915b505050918352505060018201546020820152600282015460408201526003820154606082015260048201546fffffffffffffffffffffffffffffffff80821660808401527001000000000000000000000000000000009091041660a082015260059091015460ff16151560c0918201528101519091506112ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f6b656e2069732064697361626c65640000000000000000000000000000006044820152606401610759565b806020015134101561131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6c657373207468616e206d696e20616d6f756e740000000000000000000000006044820152606401610759565b600081606001513411611333578160800151611339565b8160a001515b90506000620f424061135d6fffffffffffffffffffffffffffffffff84163461315f565b611367919061317c565b836040015161137691906131b7565b90508034116113e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f666565206d6f7265207468616e20616d6f756e740000000000000000000000006044820152606401610759565b3481900384811161144e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f676173736c65737320726577617264206d6f7265207468616e20616d6f756e746044820152606401610759565b61ffff8a166000908152600760205260408082209051620f42409190611477908b908b906131ca565b908152604051908190036020019020546114a3906fffffffffffffffffffffffffffffffff168561315f565b6114ad919061317c565b90506114b981846131da565b600a60008282546114ca91906131b7565b909155506114da905081836131b7565b600b60008282546114eb91906131b7565b909155507fbd5f70a23e54b5a3880fb16392520f3c3cb0fb9e78a2f6a218e7a7f37a61c7fd90508b838c8c8a8d8d88611524818d6131da565b60405161153999989796959493929190613236565b60405180910390a1600354855173ffffffffffffffffffffffffffffffffffffffff9091169063f3f8db33908d9061157664e8d4a510008761317c565b8e8e61158764e8d4a510008e61317c565b8f8f61159864e8d4a510008c61317c565b6040518a63ffffffff1660e01b81526004016115bc9998979695949392919061328c565b600060405180830381600087803b1580156115d657600080fd5b505af11580156115ea573d6000803e3d6000fd5b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905550505050505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16156116a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610759565b60015473ffffffffffffffffffffffffffffffffffffffff16331461172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6f6e6c79207061757365720000000000000000000000000000000000000000006044820152606401610759565b600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610bdc565b60085460ff1615611807576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6d75746578206c6f636b000000000000000000000000000000000000000000006044820152606401610759565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000547501000000000000000000000000000000000000000000900460ff16156118b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610759565b60005460ff16611924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6e6f7420696e697469616c697a656400000000000000000000000000000000006044820152606401610759565b60045473ffffffffffffffffffffffffffffffffffffffff1633146119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c79206578656375746f72000000000000000000000000000000000000006044820152606401610759565b8360055414611a10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6f6e6c792063616c6c657220636f6e74726163740000000000000000000000006044820152606401610759565b600b54611a2264e8d4a510008461315f565b9250611a3364e8d4a510008361315f565b915082811015611a9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e742066756e647300000000000000000000000000006044820152606401610759565b828103600b556040805184815273ffffffffffffffffffffffffffffffffffffffff861660208201529081018390523260608201527f962ba7162f4c833675515d18cddc45390cfe1ea38dd381d4b5b3119cc05d14d19060800160405180910390a1600082118015611b27575073ffffffffffffffffffffffffffffffffffffffff84163214155b15611bac5773ffffffffffffffffffffffffffffffffffffffff84166108fc611b5084866131da565b6040518115909202916000818181858888f19350505050158015611b78573d6000803e3d6000fd5b50604051329083156108fc029084906000818181858888f19350505050158015611ba6573d6000803e3d6000fd5b50611bf1565b60405173ffffffffffffffffffffffffffffffffffffffff85169084156108fc029085906000818181858888f19350505050158015611bef573d6000803e3d6000fd5b505b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055505050565b60085460ff1615611c8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6d75746578206c6f636b000000000000000000000000000000000000000000006044820152606401610759565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556000547501000000000000000000000000000000000000000000900460ff1615611d3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f70617573656400000000000000000000000000000000000000000000000000006044820152606401610759565b60005460ff16611daa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6e6f7420696e697469616c697a656400000000000000000000000000000000006044820152606401610759565b60015474010000000000000000000000000000000000000000900461ffff1660008181526006602052604090205460ff16611e41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f636861696e2069732064697361626c65000000000000000000000000000000006044820152606401610759565b61ffff8116600090815260096020526040808220815160e08101909252805482908290611e6d90612f75565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9990612f75565b8015611ee65780601f10611ebb57610100808354040283529160200191611ee6565b820191906000526020600020905b815481529060010190602001808311611ec957829003601f168201915b505050918352505060018201546020820152600282015460408201526003820154606082015260048201546fffffffffffffffffffffffffffffffff80821660808401527001000000000000000000000000000000009091041660a082015260059091015460ff16151560c091820152810151909150611fc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f6b656e2069732064697361626c65640000000000000000000000000000006044820152606401610759565b600a546020820151811015612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6c657373207468616e206d696e20616d6f756e740000000000000000000000006044820152606401610759565b80600b600082825461204591906131b7565b90915550506000600a5561205e64e8d4a510008261317c565b905060006002805461206f90612f75565b80601f016020809104026020016040519081016040528092919081815260200182805461209b90612f75565b80156120e85780601f106120bd576101008083540402835291602001916120e8565b820191906000526020600020905b8154815290600101906020018083116120cb57829003601f168201915b505050505090507f96437ac80e46ae10e2d87d1e818cd46867714023a3eb1e12484429d8cfa43922848383604051612122939291906132f4565b60405180910390a160035483516040517ff3f8db3300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9092169163f3f8db339161218c91889190879087906000908190600401613320565b600060405180830381600087803b1580156121a657600080fd5b505af11580156121ba573d6000803e3d6000fd5b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055505050505050565b60005460ff1615612259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f616c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610759565b73ffffffffffffffffffffffffffffffffffffffff87166122d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610759565b73ffffffffffffffffffffffffffffffffffffffff8616612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610759565b73ffffffffffffffffffffffffffffffffffffffff82166123d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610759565b600180547fffffffffffffffffffff00000000000000000000000000000000000000000000167401000000000000000000000000000000000000000061ffff8816027fffffffffffffffffffffffff0000000000000000000000000000000000000000161773ffffffffffffffffffffffffffffffffffffffff8916908117909155600080547fffffffffffffffffffffff0000000000000000000000000000000000000000ff16610100909202919091179055600261249184868361337a565b506003805473ffffffffffffffffffffffffffffffffffffffff9788167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600480549390971692169190911790945550505060055550600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600054610100900473ffffffffffffffffffffffffffffffffffffffff1633146125a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610759565b62030d40816fffffffffffffffffffffffffffffffff1611156125c357600080fd5b6fffffffffffffffffffffffffffffffff841660009081526006602052604090205460ff1661264e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f657865637574696f6e20636861696e2069732064697361626c650000000000006044820152606401610759565b7f933e13f2c0174ad6202905ed6eb73212911941c4fb8daf560b05445099b52e27848484846040516126839493929190613495565b60405180910390a16fffffffffffffffffffffffffffffffff84166000908152600760205260409081902090518291906126c090869086906131ca565b90815260405190819003602001902080546fffffffffffffffffffffffffffffffff929092167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905550505050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff16331461279c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610759565b73ffffffffffffffffffffffffffffffffffffffff8116612819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610759565b6000546040805133815273ffffffffffffffffffffffffffffffffffffffff6101009093048316602082015291831682820152517f9f6130d220a6021d90d78c7ed17b7cfb79f530974405b174fef75f671205513c9181900360600190a16000805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314612949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e000000000000000000000000000000000000000000006044820152606401610759565b7f212215b14b6f95abef8735f1a53e5383ebe2be1b7767190b1429c167e9b55a3182823360405161297c939291906134d6565b60405180910390a1600261299182848361337a565b505050565b80356fffffffffffffffffffffffffffffffff811681146129b657600080fd5b919050565b6000602082840312156129cd57600080fd5b6129d682612996565b9392505050565b6000815180845260005b81811015612a03576020818501810151868301820152016129e7565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60e081526000612a5460e083018a6129dd565b602083019890985250604081019590955260608501939093526fffffffffffffffffffffffffffffffff91821660808501521660a0830152151560c090910152919050565b600060208284031215612aab57600080fd5b5035919050565b803580151581146129b657600080fd5b60008060408385031215612ad557600080fd5b612ade83612996565b9150612aec60208401612ab2565b90509250929050565b803561ffff811681146129b657600080fd5b60008083601f840112612b1957600080fd5b50813567ffffffffffffffff811115612b3157600080fd5b602083019150836020828501011115612b4957600080fd5b9250929050565b60008060008060008060008060006101008a8c031215612b6f57600080fd5b612b788a612af5565b985060208a013567ffffffffffffffff811115612b9457600080fd5b612ba08c828d01612b07565b90995097505060408a0135955060608a0135945060808a01359350612bc760a08b01612996565b9250612bd560c08b01612996565b9150612be360e08b01612ab2565b90509295985092959850929598565b6020815260006129d660208301846129dd565b73ffffffffffffffffffffffffffffffffffffffff81168114612c2757600080fd5b50565b600060208284031215612c3c57600080fd5b81356129d681612c05565b600060208284031215612c5957600080fd5b6129d682612af5565b60008060008060008060808789031215612c7b57600080fd5b612c8487612af5565b9550602087013567ffffffffffffffff80821115612ca157600080fd5b612cad8a838b01612b07565b90975095506040890135915080821115612cc657600080fd5b50612cd389828a01612b07565b979a9699509497949695606090950135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215612d2d57600080fd5b612d3683612996565b9150602083013567ffffffffffffffff80821115612d5357600080fd5b818501915085601f830112612d6757600080fd5b813581811115612d7957612d79612ceb565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715612dbf57612dbf612ceb565b81604052828152886020848701011115612dd857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060008060808587031215612e1057600080fd5b843593506020850135612e2281612c05565b93969395505050506040820135916060013590565b600080600080600080600060c0888a031215612e5257600080fd5b8735612e5d81612c05565b96506020880135612e6d81612c05565b9550612e7b60408901612af5565b9450606088013567ffffffffffffffff811115612e9757600080fd5b612ea38a828b01612b07565b9095509350506080880135612eb781612c05565b8092505060a0880135905092959891949750929550565b60008060008060608587031215612ee457600080fd5b612eed85612996565b9350602085013567ffffffffffffffff811115612f0957600080fd5b612f1587828801612b07565b9094509250612f28905060408601612996565b905092959194509250565b60008060208385031215612f4657600080fd5b823567ffffffffffffffff811115612f5d57600080fd5b612f6985828601612b07565b90969095509350505050565b600181811c90821680612f8957607f821691505b602082108103612fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561299157600081815260208120601f850160051c81016020861015612fef5750805b601f850160051c820191505b8181101561300e57828155600101612ffb565b505050505050565b815167ffffffffffffffff81111561303057613030612ceb565b6130448161303e8454612f75565b84612fc8565b602080601f83116001811461309757600084156130615750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561300e565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156130e4578886015182559484019460019091019084016130c5565b508582101561312057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761317657613176613130565b92915050565b6000826131b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082018082111561317657613176613130565b8183823760009101908152919050565b8181038181111561317657613176613130565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b61ffff8a16815288602082015260e06040820152600061325a60e08301898b6131ed565b87606084015282810360808401526132738187896131ed565b60a0840195909552505060c00152979650505050505050565b61ffff8a16815260e0602082015260006132a960e083018b6129dd565b89604084015282810360608401526132c281898b6131ed565b905086608084015282810360a08401526132dd8186886131ed565b9150508260c08301529a9950505050505050505050565b61ffff8416815282602082015260606040820152600061331760608301846129dd565b95945050505050565b61ffff8716815260e06020820152600061333d60e08301886129dd565b866040840152828103606084015261335581876129dd565b6080840195909552505080830360a08201526000835260c00152602001949350505050565b67ffffffffffffffff83111561339257613392612ceb565b6133a6836133a08354612f75565b83612fc8565b6000601f8411600181146133f857600085156133c25750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561348e565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156134475786850135825560209485019460019092019101613427565b5086821015613482577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60006fffffffffffffffffffffffffffffffff8087168352606060208401526134c26060840186886131ed565b915080841660408401525095945050505050565b6040815260006134ea6040830185876131ed565b905073ffffffffffffffffffffffffffffffffffffffff8316602083015294935050505056fea264697066735822122035850e6a458868fac9dda5e7464e45e0356b0bf3086d27b6845ee6b2730eceb564736f6c63430008120033

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

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.