ETH Price: $3,910.48 (+0.05%)

Contract

0x625B7FD68B35Ee8dC2C9405a712fA450cCd357bE
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00
Transaction Hash
Method
Block
From
To
Deposit191893802024-02-09 8:27:47308 days ago1707467267IN
0x625B7FD6...0cCd357bE
0.012107 ETH0.0013071644.25667267
Deposit186254562023-11-22 6:20:11387 days ago1700634011IN
0x625B7FD6...0cCd357bE
5.6 ETH0.0008121527.49695915
Deposit186254352023-11-22 6:15:59387 days ago1700633759IN
0x625B7FD6...0cCd357bE
5.5 ETH0.0009244831.3001614
Deposit183928932023-10-20 17:01:59420 days ago1697821319IN
0x625B7FD6...0cCd357bE
1.9 ETH0.0007039323.8331573
Deposit181960502023-09-23 4:10:59447 days ago1695442259IN
0x625B7FD6...0cCd357bE
1 ETH0.000200626.79271743
Deposit181930032023-09-22 17:56:11448 days ago1695405371IN
0x625B7FD6...0cCd357bE
1 ETH0.000246288.33832599
Deposit179033462023-08-13 3:47:11488 days ago1691898431IN
0x625B7FD6...0cCd357bE
0.5 ETH0.0005289717.90942001
Deposit179033392023-08-13 3:45:47488 days ago1691898347IN
0x625B7FD6...0cCd357bE
0.5 ETH0.0003321311.24498379
Deposit177446332023-07-21 22:55:23511 days ago1689980123IN
0x625B7FD6...0cCd357bE
32 ETH0.0006956423.55241588
Deposit176567052023-07-09 14:20:47523 days ago1688912447IN
0x625B7FD6...0cCd357bE
1.1 ETH0.0005437518.40983262
Deposit176566912023-07-09 14:17:59523 days ago1688912279IN
0x625B7FD6...0cCd357bE
1.1 ETH0.0007104724.05468573
Deposit175398932023-06-23 4:25:59539 days ago1687494359IN
0x625B7FD6...0cCd357bE
0.671209 ETH0.0004131713.98899788
Deposit174847612023-06-15 10:42:23547 days ago1686825743IN
0x625B7FD6...0cCd357bE
0.1 ETH0.0004936216.71256329
Deposit173620612023-05-29 3:45:23564 days ago1685331923IN
0x625B7FD6...0cCd357bE
1.5 ETH0.0009591232.47299805
Deposit170361912023-04-13 3:37:59610 days ago1681357079IN
0x625B7FD6...0cCd357bE
10 ETH0.0008227427.85551847
Deposit170290772023-04-12 2:49:59612 days ago1681267799IN
0x625B7FD6...0cCd357bE
22 ETH0.0031971724.74283763
Deposit169953422023-04-07 8:07:47616 days ago1680854867IN
0x625B7FD6...0cCd357bE
13 ETH0.0036407724.88296682
Deposit169894432023-04-06 12:02:35617 days ago1680782555IN
0x625B7FD6...0cCd357bE
0.8 ETH0.0036424228.18864796
Deposit169883342023-04-06 8:08:47617 days ago1680768527IN
0x625B7FD6...0cCd357bE
0.02 ETH0.0046606131.85308033
Deposit169730552023-04-04 4:00:23619 days ago1680580823IN
0x625B7FD6...0cCd357bE
35 ETH0.0028040521.70049203
Deposit169209362023-03-27 19:56:23627 days ago1679946983IN
0x625B7FD6...0cCd357bE
0.05 ETH0.004953433.85419171
Deposit168238812023-03-14 4:41:59640 days ago1678768919IN
0x625B7FD6...0cCd357bE
19.9788 ETH0.0028601822.13490266
Deposit167733772023-03-07 2:11:23648 days ago1678155083IN
0x625B7FD6...0cCd357bE
1.27 ETH0.0043894830
Deposit167617102023-03-05 10:49:35649 days ago1678013375IN
0x625B7FD6...0cCd357bE
8.495685 ETH0.0026908220.82427412
Deposit167616682023-03-05 10:40:59649 days ago1678012859IN
0x625B7FD6...0cCd357bE
1.182631 ETH0.0033302622.76074284
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
170307052023-04-12 8:21:11611 days ago1681287671
0x625B7FD6...0cCd357bE
93 ETH
170307052023-04-12 8:21:11611 days ago1681287671
0x625B7FD6...0cCd357bE
93 ETH
170306782023-04-12 8:15:47611 days ago1681287347
0x625B7FD6...0cCd357bE
3 ETH
170306782023-04-12 8:15:47611 days ago1681287347
0x625B7FD6...0cCd357bE
3 ETH
170290772023-04-12 2:49:59612 days ago1681267799
0x625B7FD6...0cCd357bE
22 ETH
170248522023-04-11 12:27:59612 days ago1681216079
0x625B7FD6...0cCd357bE
0.41828017 ETH
170248522023-04-11 12:27:59612 days ago1681216079
0x625B7FD6...0cCd357bE
0.41828017 ETH
170066712023-04-08 22:39:11615 days ago1680993551
0x625B7FD6...0cCd357bE
0.41183895 ETH
170066712023-04-08 22:39:11615 days ago1680993551
0x625B7FD6...0cCd357bE
0.41183895 ETH
170007842023-04-08 2:37:59616 days ago1680921479
0x625B7FD6...0cCd357bE
0.42156343 ETH
170007842023-04-08 2:37:59616 days ago1680921479
0x625B7FD6...0cCd357bE
0.42156343 ETH
169953422023-04-07 8:07:47616 days ago1680854867
0x625B7FD6...0cCd357bE
13 ETH
169894432023-04-06 12:02:35617 days ago1680782555
0x625B7FD6...0cCd357bE
0.8 ETH
169883342023-04-06 8:08:47617 days ago1680768527
0x625B7FD6...0cCd357bE
0.02 ETH
169846862023-04-05 19:40:47618 days ago1680723647
0x625B7FD6...0cCd357bE
0.41469219 ETH
169846862023-04-05 19:40:47618 days ago1680723647
0x625B7FD6...0cCd357bE
0.41469219 ETH
169730552023-04-04 4:00:23619 days ago1680580823
0x625B7FD6...0cCd357bE
35 ETH
169559952023-04-01 18:11:35622 days ago1680372695
0x625B7FD6...0cCd357bE
0.41408884 ETH
169559952023-04-01 18:11:35622 days ago1680372695
0x625B7FD6...0cCd357bE
0.41408884 ETH
169209362023-03-27 19:56:23627 days ago1679946983
0x625B7FD6...0cCd357bE
0.05 ETH
169200992023-03-27 17:06:35627 days ago1679936795
0x625B7FD6...0cCd357bE
0.45991326 ETH
169200992023-03-27 17:06:35627 days ago1679936795
0x625B7FD6...0cCd357bE
0.45991326 ETH
169053352023-03-25 15:21:35629 days ago1679757695
0x625B7FD6...0cCd357bE
0.40692261 ETH
169053352023-03-25 15:21:35629 days ago1679757695
0x625B7FD6...0cCd357bE
0.40692261 ETH
168809212023-03-22 5:00:59632 days ago1679461259
0x625B7FD6...0cCd357bE
0.53542774 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StafiUserDeposit

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 14 : StafiUserDeposit.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

import "@openzeppelin/contracts/math/SafeMath.sol";
import "../StafiBase.sol";
import "../interfaces/IStafiEther.sol";
import "../interfaces/IStafiEtherWithdrawer.sol";
import "../interfaces/deposit/IStafiUserDeposit.sol";
import "../interfaces/pool/IStafiStakingPool.sol";
import "../interfaces/pool/IStafiStakingPoolQueue.sol";
import "../interfaces/token/IRETHToken.sol";
import "../interfaces/node/IStafiSuperNode.sol";
import "../interfaces/node/IStafiLightNode.sol";

// Accepts user deposits and mints rETH; handles assignment of deposited ETH to pools
contract StafiUserDeposit is StafiBase, IStafiUserDeposit, IStafiEtherWithdrawer {

    // Libs
    using SafeMath for uint256;

    // Events
    event DepositReceived(address indexed from, uint256 amount, uint256 time);
    event DepositRecycled(address indexed from, uint256 amount, uint256 time);
    event DepositAssigned(address indexed stakingPool, uint256 amount, uint256 time);
    event ExcessWithdrawn(address indexed to, uint256 amount, uint256 time);

    // Construct
    constructor(address _stafiStorageAddress) StafiBase(_stafiStorageAddress) {
        version = 1;
        // Initialize settings on deployment
        if (!getBoolS("settings.user.deposit.init")) {
            // Apply settings
            setDepositEnabled(true);
            setAssignDepositsEnabled(true);
            setMinimumDeposit(0.01 ether);
            // setMaximumDepositPoolSize(100000 ether);
            setMaximumDepositAssignments(2);
            // Settings initialized
            setBoolS("settings.user.deposit.init", true);
        }
    }

    // Current deposit pool balance
    function getBalance() override public view returns (uint256) {
        IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther"));
        return stafiEther.balanceOf(address(this));
    }

    // Excess deposit pool balance (in excess of stakingPool queue capacity)
    function getExcessBalance() override public view returns (uint256) {
        // Get stakingPool queue capacity
        IStafiStakingPoolQueue stafiStakingPoolQueue = IStafiStakingPoolQueue(getContractAddress("stafiStakingPoolQueue"));
        uint256 stakingPoolCapacity = stafiStakingPoolQueue.getEffectiveCapacity();
        // Calculate and return
        uint256 balance = getBalance();
        if (stakingPoolCapacity >= balance) { return 0; }
        else { return balance.sub(stakingPoolCapacity); }
    }

    // Receive a ether withdrawal
    // Only accepts calls from the StafiEther contract
    function receiveEtherWithdrawal() override external payable onlyLatestContract("stafiUserDeposit", address(this)) onlyLatestContract("stafiEther", msg.sender) {}

    // Accept a deposit from a user
    function deposit() override external payable onlyLatestContract("stafiUserDeposit", address(this)) {
        // Check deposit settings
        require(getDepositEnabled(), "Deposits into Stafi are currently disabled");
        require(msg.value >= getMinimumDeposit(), "The deposited amount is less than the minimum deposit size");
        // require(getBalance().add(msg.value) <= getMaximumDepositPoolSize(), "The deposit pool size after depositing exceeds the maximum size");
        // Load contracts
        IRETHToken rETHToken = IRETHToken(getContractAddress("rETHToken"));
        // Mint rETH to user account
        rETHToken.userMint(msg.value, msg.sender);
        // Emit deposit received event
        emit DepositReceived(msg.sender, msg.value, block.timestamp);
        // Process deposit
        processDeposit();
    }

    // Recycle a deposit from a dissolved stakingPool
    // Only accepts calls from registered stakingPools
    function recycleDissolvedDeposit() override external payable onlyLatestContract("stafiUserDeposit", address(this)) onlyRegisteredStakingPool(msg.sender) {
        // Emit deposit recycled event
        emit DepositRecycled(msg.sender, msg.value, block.timestamp);
        // Process deposit
        processDeposit();
    }

    // Recycle a deposit from a withdrawn stakingPool
    function recycleWithdrawnDeposit() override external payable onlyLatestContract("stafiUserDeposit", address(this)) onlyLatestContract("stafiNetworkWithdrawal", msg.sender) {
        // Emit deposit recycled event
        emit DepositRecycled(msg.sender, msg.value, block.timestamp);
        // Process deposit
        processDeposit();
    }
    // Recycle a deposit from fee collector
    function recycleDistributorDeposit() override external payable onlyLatestContract("stafiUserDeposit", address(this)) onlyLatestContract("stafiDistributor", msg.sender) {
        // Emit deposit recycled event
        emit DepositRecycled(msg.sender, msg.value, block.timestamp);
        // Process deposit
        processDeposit();
    }

    // Process a deposit
    function processDeposit() private {
        // Load contracts
        IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther"));
        // Transfer ETH to stafiEther
        stafiEther.depositEther{value: msg.value}();
        // Assign deposits if enabled
        assignDeposits();
    }

    // Assign deposits to available stakingPools
    function assignDeposits() override public onlyLatestContract("stafiUserDeposit", address(this)) {
        // Check deposit settings
        require(getAssignDepositsEnabled(), "Deposit assignments are currently disabled");
        // Load contracts
        IStafiStakingPoolQueue stafiStakingPoolQueue = IStafiStakingPoolQueue(getContractAddress("stafiStakingPoolQueue"));
        IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther"));
        // Assign deposits
        uint256 maximumDepositAssignments = getMaximumDepositAssignments();
        for (uint256 i = 0; i < maximumDepositAssignments; ++i) {
            // Get & check next available staking pool capacity
            uint256 stakingPoolCapacity = stafiStakingPoolQueue.getNextCapacity();
            if (stakingPoolCapacity == 0 || getBalance() < stakingPoolCapacity) { break; }
            // Dequeue next available staking pool
            address stakingPoolAddress = stafiStakingPoolQueue.dequeueStakingPool();
            IStafiStakingPool stakingPool = IStafiStakingPool(stakingPoolAddress);
            // Withdraw ETH from stafiEther
            stafiEther.withdrawEther(stakingPoolCapacity);
            // Assign deposit to staking pool
            stakingPool.userDeposit{value: stakingPoolCapacity}();
            // Emit deposit assigned event
            emit DepositAssigned(stakingPoolAddress, stakingPoolCapacity, block.timestamp);
        }
    }

    // Withdraw excess deposit pool balance for rETH collateral
    function withdrawExcessBalance(uint256 _amount) override external onlyLatestContract("stafiUserDeposit", address(this)) onlyLatestContract("rETHToken", msg.sender) {
        // Load contracts
        IRETHToken rETHToken = IRETHToken(getContractAddress("rETHToken"));
        IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther"));
        // Check amount
        require(_amount <= getExcessBalance(), "Insufficient excess balance for withdrawal");
        // Withdraw ETH from vault
        stafiEther.withdrawEther(_amount);
        // Transfer to rETH contract
        rETHToken.depositExcess{value: _amount}();
        // Emit excess withdrawn event
        emit ExcessWithdrawn(msg.sender, _amount, block.timestamp);
    }

    // Withdraw excess deposit pool balance for super node
    function withdrawExcessBalanceForSuperNode(uint256 _amount) override external onlyLatestContract("stafiUserDeposit", address(this)) onlyLatestContract("stafiSuperNode", msg.sender) {
        // Load contracts
        IStafiSuperNode superNode = IStafiSuperNode(getContractAddress("stafiSuperNode"));
        IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther"));
        // Check amount
        require(_amount <= getExcessBalance(), "Insufficient balance for withdrawal");
        // Withdraw ETH from vault
        stafiEther.withdrawEther(_amount);
        // Transfer to superNode contract
        superNode.depositEth{value: _amount}();
        // Emit excess withdrawn event
        emit ExcessWithdrawn(msg.sender, _amount, block.timestamp);
    }
    
    // Withdraw excess deposit pool balance for light node
    function withdrawExcessBalanceForLightNode(uint256 _amount) override external onlyLatestContract("stafiUserDeposit", address(this)) onlyLatestContract("stafiLightNode", msg.sender) {
        // Load contracts
        IStafiLightNode lightNode = IStafiLightNode(getContractAddress("stafiLightNode"));
        IStafiEther stafiEther = IStafiEther(getContractAddress("stafiEther"));
        // Check amount
        require(_amount <= getExcessBalance(), "Insufficient balance for withdrawal");
        // Withdraw ETH from vault
        stafiEther.withdrawEther(_amount);
        // Transfer to superNode contract
        lightNode.depositEth{value: _amount}();
        // Emit excess withdrawn event
        emit ExcessWithdrawn(msg.sender, _amount, block.timestamp);
    }

    // Deposits currently enabled
    function getDepositEnabled() public view returns (bool) {
        return getBoolS("settings.deposit.enabled");
    }
    function setDepositEnabled(bool _value) public onlySuperUser {
        setBoolS("settings.deposit.enabled", _value);
    }

    // Deposit assignments currently enabled
    function getAssignDepositsEnabled() public view returns (bool) {
        return getBoolS("settings.deposit.assign.enabled");
    }
    function setAssignDepositsEnabled(bool _value) public onlySuperUser {
        setBoolS("settings.deposit.assign.enabled", _value);
    }

    // Minimum deposit size
    function getMinimumDeposit() public view returns (uint256) {
        return getUintS("settings.deposit.minimum");
    }
    function setMinimumDeposit(uint256 _value) public onlySuperUser {
        setUintS("settings.deposit.minimum", _value);
    }

    // The maximum size of the deposit pool
    // function getMaximumDepositPoolSize() public view returns (uint256) {
    //     return getUintS("settings.deposit.pool.maximum");
    // }
    // function setMaximumDepositPoolSize(uint256 _value) public onlySuperUser {
    //     setUintS("settings.deposit.pool.maximum", _value);
    // }

    // The maximum number of deposit assignments to perform at once
    function getMaximumDepositAssignments() public view returns (uint256) {
        return getUintS("settings.deposit.assign.maximum");
    }
    function setMaximumDepositAssignments(uint256 _value) public onlySuperUser {
        setUintS("settings.deposit.assign.maximum", _value);
    }

}

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

pragma solidity ^0.7.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

File 3 of 14 : StafiBase.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

import "./interfaces/storage/IStafiStorage.sol";

abstract contract StafiBase {

    // Version of the contract
    uint8 public version;

    // The main storage contract where primary persistant storage is maintained
    IStafiStorage stafiStorage = IStafiStorage(0);


    /**
    * @dev Throws if called by any sender that doesn't match a network contract
    */
    modifier onlyLatestNetworkContract() {
        require(getBool(keccak256(abi.encodePacked("contract.exists", msg.sender))), "Invalid or outdated network contract");
        _;
    }


    /**
    * @dev Throws if called by any sender that doesn't match one of the supplied contract or is the latest version of that contract
    */
    modifier onlyLatestContract(string memory _contractName, address _contractAddress) {
        require(_contractAddress == getAddress(keccak256(abi.encodePacked("contract.address", _contractName))), "Invalid or outdated contract");
        _;
    }


    /**
    * @dev Throws if called by any sender that isn't a trusted node
    */
    modifier onlyTrustedNode(address _nodeAddress) {
        require(getBool(keccak256(abi.encodePacked("node.trusted", _nodeAddress))), "Invalid trusted node");
        _;
    }
    
    /**
    * @dev Throws if called by any sender that isn't a super node
    */
    modifier onlySuperNode(address _nodeAddress) {
        require(getBool(keccak256(abi.encodePacked("node.super", _nodeAddress))), "Invalid super node");
        _;
    }


    /**
    * @dev Throws if called by any sender that isn't a registered staking pool
    */
    modifier onlyRegisteredStakingPool(address _stakingPoolAddress) {
        require(getBool(keccak256(abi.encodePacked("stakingpool.exists", _stakingPoolAddress))), "Invalid staking pool");
        _;
    }


    /**
    * @dev Throws if called by any account other than the owner.
    */
    modifier onlyOwner() {
        require(roleHas("owner", msg.sender), "Account is not the owner");
        _;
    }


    /**
    * @dev Modifier to scope access to admins
    */
    modifier onlyAdmin() {
        require(roleHas("admin", msg.sender), "Account is not an admin");
        _;
    }


    /**
    * @dev Modifier to scope access to admins
    */
    modifier onlySuperUser() {
        require(roleHas("owner", msg.sender) || roleHas("admin", msg.sender), "Account is not a super user");
        _;
    }


    /**
    * @dev Reverts if the address doesn't have this role
    */
    modifier onlyRole(string memory _role) {
        require(roleHas(_role, msg.sender), "Account does not match the specified role");
        _;
    }


    /// @dev Set the main Storage address
    constructor(address _stafiStorageAddress) {
        // Update the contract address
        stafiStorage = IStafiStorage(_stafiStorageAddress);
    }


    /// @dev Get the address of a network contract by name
    function getContractAddress(string memory _contractName) internal view returns (address) {
        // Get the current contract address
        address contractAddress = getAddress(keccak256(abi.encodePacked("contract.address", _contractName)));
        // Check it
        require(contractAddress != address(0x0), "Contract not found");
        // Return
        return contractAddress;
    }


    /// @dev Get the name of a network contract by address
    function getContractName(address _contractAddress) internal view returns (string memory) {
        // Get the contract name
        string memory contractName = getString(keccak256(abi.encodePacked("contract.name", _contractAddress)));
        // Check it
        require(keccak256(abi.encodePacked(contractName)) != keccak256(abi.encodePacked("")), "Contract not found");
        // Return
        return contractName;
    }


    /// @dev Storage get methods
    function getAddress(bytes32 _key) internal view returns (address) { return stafiStorage.getAddress(_key); }
    function getUint(bytes32 _key) internal view returns (uint256) { return stafiStorage.getUint(_key); }
    function getString(bytes32 _key) internal view returns (string memory) { return stafiStorage.getString(_key); }
    function getBytes(bytes32 _key) internal view returns (bytes memory) { return stafiStorage.getBytes(_key); }
    function getBool(bytes32 _key) internal view returns (bool) { return stafiStorage.getBool(_key); }
    function getInt(bytes32 _key) internal view returns (int256) { return stafiStorage.getInt(_key); }
    function getBytes32(bytes32 _key) internal view returns (bytes32) { return stafiStorage.getBytes32(_key); }
    function getAddressS(string memory _key) internal view returns (address) { return stafiStorage.getAddress(keccak256(abi.encodePacked(_key))); }
    function getUintS(string memory _key) internal view returns (uint256) { return stafiStorage.getUint(keccak256(abi.encodePacked(_key))); }
    function getStringS(string memory _key) internal view returns (string memory) { return stafiStorage.getString(keccak256(abi.encodePacked(_key))); }
    function getBytesS(string memory _key) internal view returns (bytes memory) { return stafiStorage.getBytes(keccak256(abi.encodePacked(_key))); }
    function getBoolS(string memory _key) internal view returns (bool) { return stafiStorage.getBool(keccak256(abi.encodePacked(_key))); }
    function getIntS(string memory _key) internal view returns (int256) { return stafiStorage.getInt(keccak256(abi.encodePacked(_key))); }
    function getBytes32S(string memory _key) internal view returns (bytes32) { return stafiStorage.getBytes32(keccak256(abi.encodePacked(_key))); }

    /// @dev Storage set methods
    function setAddress(bytes32 _key, address _value) internal { stafiStorage.setAddress(_key, _value); }
    function setUint(bytes32 _key, uint256 _value) internal { stafiStorage.setUint(_key, _value); }
    function setString(bytes32 _key, string memory _value) internal { stafiStorage.setString(_key, _value); }
    function setBytes(bytes32 _key, bytes memory _value) internal { stafiStorage.setBytes(_key, _value); }
    function setBool(bytes32 _key, bool _value) internal { stafiStorage.setBool(_key, _value); }
    function setInt(bytes32 _key, int256 _value) internal { stafiStorage.setInt(_key, _value); }
    function setBytes32(bytes32 _key, bytes32 _value) internal { stafiStorage.setBytes32(_key, _value); }
    function setAddressS(string memory _key, address _value) internal { stafiStorage.setAddress(keccak256(abi.encodePacked(_key)), _value); }
    function setUintS(string memory _key, uint256 _value) internal { stafiStorage.setUint(keccak256(abi.encodePacked(_key)), _value); }
    function setStringS(string memory _key, string memory _value) internal { stafiStorage.setString(keccak256(abi.encodePacked(_key)), _value); }
    function setBytesS(string memory _key, bytes memory _value) internal { stafiStorage.setBytes(keccak256(abi.encodePacked(_key)), _value); }
    function setBoolS(string memory _key, bool _value) internal { stafiStorage.setBool(keccak256(abi.encodePacked(_key)), _value); }
    function setIntS(string memory _key, int256 _value) internal { stafiStorage.setInt(keccak256(abi.encodePacked(_key)), _value); }
    function setBytes32S(string memory _key, bytes32 _value) internal { stafiStorage.setBytes32(keccak256(abi.encodePacked(_key)), _value); }

    /// @dev Storage delete methods
    function deleteAddress(bytes32 _key) internal { stafiStorage.deleteAddress(_key); }
    function deleteUint(bytes32 _key) internal { stafiStorage.deleteUint(_key); }
    function deleteString(bytes32 _key) internal { stafiStorage.deleteString(_key); }
    function deleteBytes(bytes32 _key) internal { stafiStorage.deleteBytes(_key); }
    function deleteBool(bytes32 _key) internal { stafiStorage.deleteBool(_key); }
    function deleteInt(bytes32 _key) internal { stafiStorage.deleteInt(_key); }
    function deleteBytes32(bytes32 _key) internal { stafiStorage.deleteBytes32(_key); }
    function deleteAddressS(string memory _key) internal { stafiStorage.deleteAddress(keccak256(abi.encodePacked(_key))); }
    function deleteUintS(string memory _key) internal { stafiStorage.deleteUint(keccak256(abi.encodePacked(_key))); }
    function deleteStringS(string memory _key) internal { stafiStorage.deleteString(keccak256(abi.encodePacked(_key))); }
    function deleteBytesS(string memory _key) internal { stafiStorage.deleteBytes(keccak256(abi.encodePacked(_key))); }
    function deleteBoolS(string memory _key) internal { stafiStorage.deleteBool(keccak256(abi.encodePacked(_key))); }
    function deleteIntS(string memory _key) internal { stafiStorage.deleteInt(keccak256(abi.encodePacked(_key))); }
    function deleteBytes32S(string memory _key) internal { stafiStorage.deleteBytes32(keccak256(abi.encodePacked(_key))); }


    /**
    * @dev Check if an address has this role
    */
    function roleHas(string memory _role, address _address) internal view returns (bool) {
        return getBool(keccak256(abi.encodePacked("access.role", _role, _address)));
    }

}

File 4 of 14 : IStafiEther.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

interface IStafiEther {
    function balanceOf(address _contractAddress) external view returns (uint256);
    function depositEther() external payable;
    function withdrawEther(uint256 _amount) external;
}

File 5 of 14 : IStafiEtherWithdrawer.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

interface IStafiEtherWithdrawer {
    function receiveEtherWithdrawal() external payable;
}

File 6 of 14 : IStafiUserDeposit.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

interface IStafiUserDeposit {
    function getBalance() external view returns (uint256);
    function getExcessBalance() external view returns (uint256);
    function deposit() external payable;
    function recycleDissolvedDeposit() external payable;
    function recycleWithdrawnDeposit() external payable;
    function recycleDistributorDeposit() external payable;
    function assignDeposits() external;
    function withdrawExcessBalance(uint256 _amount) external;
    function withdrawExcessBalanceForSuperNode(uint256 _amount) external;
    function withdrawExcessBalanceForLightNode(uint256 _amount) external;
}

File 7 of 14 : IStafiStakingPool.sol
pragma solidity 0.7.6;
// SPDX-License-Identifier: GPL-3.0-only

import "../../types/DepositType.sol";
import "../../types/StakingPoolStatus.sol";

interface IStafiStakingPool {
    function initialise(address _nodeAddress, DepositType _depositType) external;
    function getStatus() external view returns (StakingPoolStatus);
    function getStatusBlock() external view returns (uint256);
    function getStatusTime() external view returns (uint256);
    function getWithdrawalCredentialsMatch() external view returns (bool);
    function getDepositType() external view returns (DepositType);
    function getNodeAddress() external view returns (address);
    function getNodeFee() external view returns (uint256);
    function getNodeDepositBalance() external view returns (uint256);
    function getNodeRefundBalance() external view returns (uint256);
    function getNodeDepositAssigned() external view returns (bool);
    function getNodeCommonlyRefunded() external view returns (bool);
    function getNodeTrustedRefunded() external view returns (bool);
    function getUserDepositBalance() external view returns (uint256);
    function getUserDepositAssigned() external view returns (bool);
    function getUserDepositAssignedTime() external view returns (uint256);
    function getPlatformDepositBalance() external view returns (uint256);
    function nodeDeposit(bytes calldata _validatorPubkey, bytes calldata _validatorSignature, bytes32 _depositDataRoot) external payable;
    function userDeposit() external payable;
    function stake(bytes calldata _validatorSignature, bytes32 _depositDataRoot)  external;
    function refund() external;
    function dissolve() external;
    function close() external;
    function voteWithdrawCredentials() external;
}

File 8 of 14 : IStafiStakingPoolQueue.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

import "../../types/DepositType.sol";

interface IStafiStakingPoolQueue {
    function getTotalLength() external view returns (uint256);
    function getLength(DepositType _depositType) external view returns (uint256);
    function getTotalCapacity() external view returns (uint256);
    function getEffectiveCapacity() external view returns (uint256);
    function getNextCapacity() external view returns (uint256);
    function enqueueStakingPool(DepositType _depositType, address _stakingPool) external;
    function dequeueStakingPool() external returns (address);
    function removeStakingPool() external;
}

File 9 of 14 : IRETHToken.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

interface IRETHToken {
    function getEthValue(uint256 _rethAmount) external view returns (uint256);
    function getRethValue(uint256 _ethAmount) external view returns (uint256);
    function getExchangeRate() external view returns (uint256);
    function getTotalCollateral() external view returns (uint256);
    function getCollateralRate() external view returns (uint256);
    function depositRewards() external payable;
    function depositExcess() external payable;
    function userMint(uint256 _ethAmount, address _to) external;
    function userBurn(uint256 _rethAmount) external;
}

File 10 of 14 : IStafiSuperNode.sol
pragma solidity 0.7.6;
pragma abicoder v2;
// SPDX-License-Identifier: GPL-3.0-only

interface IStafiSuperNode {
    function depositEth() external payable;
    function deposit(bytes[] calldata _validatorPubkeys, bytes[] calldata _validatorSignatures, bytes32[] calldata _depositDataRoots) external;
    function stake(bytes[] calldata _validatorPubkeys, bytes[] calldata _validatorSignatures, bytes32[] calldata _depositDataRoots) external;
    function getSuperNodePubkeyCount(address _nodeAddress) external view returns (uint256);
    function getSuperNodePubkeyAt(address _nodeAddress, uint256 _index) external view returns (bytes memory);
    function getSuperNodePubkeyStatus(bytes calldata _validatorPubkey) external view returns (uint256);
    function voteWithdrawCredentials(bytes[] calldata _pubkey, bool[] calldata _match) external;
}

File 11 of 14 : IStafiLightNode.sol
pragma solidity 0.7.6;
pragma abicoder v2;
// SPDX-License-Identifier: GPL-3.0-only

interface IStafiLightNode {
    function depositEth() external payable;
    function deposit(bytes[] calldata _validatorPubkeys, bytes[] calldata _validatorSignatures, bytes32[] calldata _depositDataRoots) external payable;
    function stake(bytes[] calldata _validatorPubkeys, bytes[] calldata _validatorSignatures, bytes32[] calldata _depositDataRoots) external;
    function offBoard(bytes calldata _validatorPubkey) external;
    function provideNodeDepositToken(bytes calldata _validatorPubkey) external payable;
    function withdrawNodeDepositToken(bytes calldata _validatorPubkey) external;
    function getLightNodePubkeyCount(address _nodeAddress) external view returns (uint256);
    function getLightNodePubkeyAt(address _nodeAddress, uint256 _index) external view returns (bytes memory);
    function getLightNodePubkeyStatus(bytes calldata _validatorPubkey) external view returns (uint256);
    function voteWithdrawCredentials(bytes[] calldata _pubkey, bool[] calldata _match) external;
}

File 12 of 14 : IStafiStorage.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

interface IStafiStorage {

    // Getters
    function getAddress(bytes32 _key) external view returns (address);
    function getUint(bytes32 _key) external view returns (uint);
    function getString(bytes32 _key) external view returns (string memory);
    function getBytes(bytes32 _key) external view returns (bytes memory);
    function getBool(bytes32 _key) external view returns (bool);
    function getInt(bytes32 _key) external view returns (int);
    function getBytes32(bytes32 _key) external view returns (bytes32);

    // Setters
    function setAddress(bytes32 _key, address _value) external;
    function setUint(bytes32 _key, uint _value) external;
    function setString(bytes32 _key, string calldata _value) external;
    function setBytes(bytes32 _key, bytes calldata _value) external;
    function setBool(bytes32 _key, bool _value) external;
    function setInt(bytes32 _key, int _value) external;
    function setBytes32(bytes32 _key, bytes32 _value) external;

    // Deleters
    function deleteAddress(bytes32 _key) external;
    function deleteUint(bytes32 _key) external;
    function deleteString(bytes32 _key) external;
    function deleteBytes(bytes32 _key) external;
    function deleteBool(bytes32 _key) external;
    function deleteInt(bytes32 _key) external;
    function deleteBytes32(bytes32 _key) external;

}

File 13 of 14 : DepositType.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

// Represents the type of deposits
enum DepositType {
    None,    // Marks an invalid deposit type
    FOUR,    // Require 4 ETH from the node operator to be matched with 28 ETH from user deposits
    EIGHT,   // Require 8 ETH from the node operator to be matched with 24 ETH from user deposits
    TWELVE,  // Require 12 ETH from the node operator to be matched with 20 ETH from user deposits
    SIXTEEN,  // Require 16 ETH from the node operator to be matched with 16 ETH from user deposits
    Empty    // Require 0 ETH from the node operator to be matched with 32 ETH from user deposits (trusted nodes only)
}

File 14 of 14 : StakingPoolStatus.sol
pragma solidity 0.7.6;

// SPDX-License-Identifier: GPL-3.0-only

// Represents a stakingpool's status within the network
enum StakingPoolStatus {
    Initialized,    // The stakingpool has been initialized and is awaiting a deposit of user ETH
    Prelaunch,      // The stakingpool has enough ETH to begin staking and is awaiting launch by the node
    Staking,        // The stakingpool is currently staking
    Withdrawn,   // The stakingpool has been withdrawn from by the node
    Dissolved       // The stakingpool has been dissolved and its user deposited ETH has been returned to the deposit pool
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_stafiStorageAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakingPool","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"DepositAssigned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"DepositReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"DepositRecycled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"ExcessWithdrawn","type":"event"},{"inputs":[],"name":"assignDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAssignDepositsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDepositEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExcessBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaximumDepositAssignments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiveEtherWithdrawal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"recycleDissolvedDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"recycleDistributorDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"recycleWithdrawnDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setAssignDepositsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setDepositEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMaximumDepositAssignments","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMinimumDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawExcessBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawExcessBalanceForLightNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawExcessBalanceForSuperNode","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260008060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005257600080fd5b506040516200461538038062004615833981810160405260208110156200007857600080fd5b81019080805190602001909291905050508080600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060016000806101000a81548160ff021916908360ff1602179055506200012d6040518060400160405280601a81526020017f73657474696e67732e757365722e6465706f7369742e696e6974000000000000815250620001d060201b60201c565b620001c957620001446001620002fc60201b60201c565b6200015660016200044f60201b60201c565b6200016e662386f26fc10000620005a260201b60201c565b620001806002620006f560201b60201c565b620001c86040518060400160405280601a81526020017f73657474696e67732e757365722e6465706f7369742e696e697400000000000081525060016200084860201b60201c565b5b5062000bf6565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040516020018082805190602001908083835b6020831062000248578051825260208201915060208101905060208303925062000223565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015620002b857600080fd5b505afa158015620002cd573d6000803e3d6000fd5b505050506040513d6020811015620002e457600080fd5b81019080805190602001909291905050509050919050565b620003436040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b80620003925750620003916040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b5b62000405576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b6200044c6040518060400160405280601881526020017f73657474696e67732e6465706f7369742e656e61626c65640000000000000000815250826200084860201b60201c565b50565b620004966040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b80620004e55750620004e46040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b5b62000558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b6200059f6040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e656e61626c656400815250826200084860201b60201c565b50565b620005e96040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b80620006385750620006376040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b5b620006ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b620006f26040518060400160405280601881526020017f73657474696e67732e6465706f7369742e6d696e696d756d00000000000000008152508262000a2f60201b60201c565b50565b6200073c6040518060400160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b806200078b57506200078a6040518060400160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250336200095860201b60201c565b5b620007fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b620008456040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e6d6178696d756d008152508262000a2f60201b60201c565b50565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abfdcced836040516020018082805190602001908083835b60208310620008bf57805182526020820191506020810190506020830392506200089a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156200093b57600080fd5b505af115801562000950573d6000803e3d6000fd5b505050505050565b600062000a27838360405160200180807f6163636573732e726f6c65000000000000000000000000000000000000000000815250600b0183805190602001908083835b60208310620009c057805182526020820191506020810190506020830392506200099b565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1660601b8152601401925050506040516020818303038152906040528051906020012062000b3d60201b60201c565b905092915050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a836040516020018082805190602001908083835b6020831062000aa6578051825260208201915060208101905060208303925062000a81565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b15801562000b2057600080fd5b505af115801562000b35573d6000803e3d6000fd5b505050505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801562000bb257600080fd5b505afa15801562000bc7573d6000803e3d6000fd5b505050506040513d602081101562000bde57600080fd5b81019080805190602001909291905050509050919050565b613a0f8062000c066000396000f3fe60806040526004361061011f5760003560e01c806363a5db9e116100a0578063888b042f11610064578063888b042f1461038d578063cc88c3c8146103b8578063d0e30db0146103f3578063e44ad24c146103fd578063e78ec42e146104075761011f565b806363a5db9e146102d65780636ada78471461031157806372f5158d1461033e5780637c697e74146103485780638554913b146103525761011f565b80633fa9c18d116100e75780633fa9c18d146101c657806347fa434a1461020157806354fd4d501461022e5780635b17d04b1461025c5780635cb17a90146102995761011f565b8063035cf142146101245780630a019eaf1461014f57806312065fe01461015957806327c8f193146101845780633b474a651461019b575b600080fd5b34801561013057600080fd5b50610139610442565b6040518082815260200191505060405180910390f35b610157610487565b005b34801561016557600080fd5b5061016e61077f565b6040518082815260200191505060405180910390f35b34801561019057600080fd5b5061019961086a565b005b3480156101a757600080fd5b506101b0610d44565b6040518082815260200191505060405180910390f35b3480156101d257600080fd5b506101ff600480360360208110156101e957600080fd5b8101908080359060200190929190505050610d89565b005b34801561020d57600080fd5b50610216610ec2565b60405180821515815260200191505060405180910390f35b34801561023a57600080fd5b50610243610f07565b604051808260ff16815260200191505060405180910390f35b34801561026857600080fd5b506102976004803603602081101561027f57600080fd5b81019080803515159060200190929190505050610f18565b005b3480156102a557600080fd5b506102d4600480360360208110156102bc57600080fd5b81019080803515159060200190929190505050611051565b005b3480156102e257600080fd5b5061030f600480360360208110156102f957600080fd5b810190808035906020019092919050505061118a565b005b34801561031d57600080fd5b5061032661168b565b60405180821515815260200191505060405180910390f35b6103466116d0565b005b61035061198f565b005b34801561035e57600080fd5b5061038b6004803603602081101561037557600080fd5b8101908080359060200190929190505050611ce5565b005b34801561039957600080fd5b506103a26121e6565b6040518082815260200191505060405180910390f35b3480156103c457600080fd5b506103f1600480360360208110156103db57600080fd5b81019080803590602001909291905050506122e9565b005b6103fb6127ea565b005b610405612b4e565b005b34801561041357600080fd5b506104406004803603602081101561042a57600080fd5b8101908080359060200190929190505050612ea4565b005b60006104826040518060400160405280601881526020017f73657474696e67732e6465706f7369742e6d696e696d756d0000000000000000815250612fdd565b905090565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306105608260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061052057805182526020820191506020810190506020830392506104fd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610600576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600a81526020017f7374616669457468657200000000000000000000000000000000000000000000815250336106d98260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106106995780518252602082019150602081019050602083039250610676565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b50505050565b6000806107c06040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561082957600080fd5b505afa15801561083d573d6000803e3d6000fd5b505050506040513d602081101561085357600080fd5b810190808051906020019092919050505091505090565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306109438260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061090357805182526020820191506020810190506020830392506108e0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6109eb610ec2565b610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061395c602a913960400191505060405180910390fd5b6000610a806040518060400160405280601581526020017f73746166695374616b696e67506f6f6c517565756500000000000000000000008152506131ba565b90506000610ac26040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506000610ace610d44565b905060005b81811015610d3c5760008473ffffffffffffffffffffffffffffffffffffffff1663516123056040518163ffffffff1660e01b815260040160206040518083038186803b158015610b2357600080fd5b505afa158015610b37573d6000803e3d6000fd5b505050506040513d6020811015610b4d57600080fd5b810190808051906020019092919050505090506000811480610b75575080610b7361077f565b105b15610b805750610d3c565b60008573ffffffffffffffffffffffffffffffffffffffff16639a9580616040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610bca57600080fd5b505af1158015610bde573d6000803e3d6000fd5b505050506040513d6020811015610bf457600080fd5b8101908080519060200190929190505050905060008190508573ffffffffffffffffffffffffffffffffffffffff16633bed33ce846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610c5f57600080fd5b505af1158015610c73573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166348146113846040518263ffffffff1660e01b81526004016000604051808303818588803b158015610cbf57600080fd5b505af1158015610cd3573d6000803e3d6000fd5b50505050508173ffffffffffffffffffffffffffffffffffffffff167fa1811054b7d96716259cff0d366c2f6405951e0efe00c8db3e237cbf77fe7be98442604051808381526020018281526020019250505060405180910390a2505050806001019050610ad3565b505050505050565b6000610d846040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e6d6178696d756d00815250612fdd565b905090565b610dc86040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b80610e0e5750610e0d6040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b610e80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b610ebf6040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e6d6178696d756d00815250826133da565b50565b6000610f026040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e656e61626c6564008152506134e4565b905090565b60008054906101000a900460ff1681565b610f576040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b80610f9d5750610f9c6040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b61100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b61104e6040518060400160405280601881526020017f73657474696e67732e6465706f7369742e656e61626c656400000000000000008152508261360b565b50565b6110906040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b806110d657506110d56040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b6111876040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e656e61626c6564008152508261360b565b50565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306112638260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106112235780518252602082019150602081019050602083039250611200565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611303576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600981526020017f72455448546f6b656e0000000000000000000000000000000000000000000000815250336113dc8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061139c5780518252602082019150602081019050602083039250611379565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461147c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b60006114bc6040518060400160405280600981526020017f72455448546f6b656e00000000000000000000000000000000000000000000008152506131ba565b905060006114fe6040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506115086121e6565b871115611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806139b0602a913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16633bed33ce886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115b357600080fd5b505af11580156115c7573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff16636c985a88886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561161357600080fd5b505af1158015611627573d6000803e3d6000fd5b50505050503373ffffffffffffffffffffffffffffffffffffffff167f992f462cfb62e164bd03bf07baf2cffce83fbd9370cae10635842b20200121208842604051808381526020018281526020019250505060405180910390a250505050505050565b60006116cb6040518060400160405280601881526020017f73657474696e67732e6465706f7369742e656e61626c656400000000000000008152506134e4565b905090565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306117a98260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106117695780518252602082019150602081019050602083039250611746565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b336118ba8160405160200180807f7374616b696e67706f6f6c2e65786973747300000000000000000000000000008152506012018273ffffffffffffffffffffffffffffffffffffffff1660601b815260140191505060405160208183030381529060405280519060200120613717565b61192c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c6964207374616b696e6720706f6f6c00000000000000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3a6614e80d02b57255cbb1f8305fbeca53d7e05a4b779d4062791966085129253442604051808381526020018281526020019250505060405180910390a261198a6137cd565b505050565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525030611a688260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611a285780518252602082019150602081019050602083039250611a05565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280601081526020017f73746166694469737472696275746f720000000000000000000000000000000081525033611be18260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611ba15780518252602082019150602081019050602083039250611b7e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3a6614e80d02b57255cbb1f8305fbeca53d7e05a4b779d4062791966085129253442604051808381526020018281526020019250505060405180910390a2611cdf6137cd565b50505050565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525030611dbe8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611d7e5780518252602082019150602081019050602083039250611d5b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600e81526020017f737461666953757065724e6f646500000000000000000000000000000000000081525033611f378260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611ef75780518252602082019150602081019050602083039250611ed4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611fd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b60006120176040518060400160405280600e81526020017f737461666953757065724e6f64650000000000000000000000000000000000008152506131ba565b905060006120596040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506120636121e6565b8711156120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806139396023913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16633bed33ce886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561210e57600080fd5b505af1158015612122573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff1663439370b1886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561216e57600080fd5b505af1158015612182573d6000803e3d6000fd5b50505050503373ffffffffffffffffffffffffffffffffffffffff167f992f462cfb62e164bd03bf07baf2cffce83fbd9370cae10635842b20200121208842604051808381526020018281526020019250505060405180910390a250505050505050565b6000806122276040518060400160405280601581526020017f73746166695374616b696e67506f6f6c517565756500000000000000000000008152506131ba565b905060008173ffffffffffffffffffffffffffffffffffffffff1663e60b40bf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561227157600080fd5b505afa158015612285573d6000803e3d6000fd5b505050506040513d602081101561229b57600080fd5b8101908080519060200190929190505050905060006122b861077f565b90508082106122cd57600093505050506122e6565b6122e0828261387b90919063ffffffff16565b93505050505b90565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306123c28260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310612382578051825260208201915060208101905060208303925061235f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600e81526020017f73746166694c696768744e6f64650000000000000000000000000000000000008152503361253b8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106124fb57805182526020820191506020810190506020830392506124d8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146125db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b600061261b6040518060400160405280600e81526020017f73746166694c696768744e6f64650000000000000000000000000000000000008152506131ba565b9050600061265d6040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506126676121e6565b8711156126bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806139396023913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16633bed33ce886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561271257600080fd5b505af1158015612726573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff1663439370b1886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561277257600080fd5b505af1158015612786573d6000803e3d6000fd5b50505050503373ffffffffffffffffffffffffffffffffffffffff167f992f462cfb62e164bd03bf07baf2cffce83fbd9370cae10635842b20200121208842604051808381526020018281526020019250505060405180910390a250505050505050565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306128c38260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106128835780518252602082019150602081019050602083039250612860565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b61296b61168b565b6129c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613986602a913960400191505060405180910390fd5b6129c8610442565b341015612a20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806138ff603a913960400191505060405180910390fd5b6000612a606040518060400160405280600981526020017f72455448546f6b656e00000000000000000000000000000000000000000000008152506131ba565b90508073ffffffffffffffffffffffffffffffffffffffff1663bff3a9f834336040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015612ad357600080fd5b505af1158015612ae7573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f7aa1a8eb998c779420645fc14513bf058edb347d95c2fc2e6845bdc22f8886313442604051808381526020018281526020019250505060405180910390a2612b496137cd565b505050565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525030612c278260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310612be75780518252602082019150602081019050602083039250612bc4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612cc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280601681526020017f73746166694e6574776f726b5769746864726177616c0000000000000000000081525033612da08260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310612d605780518252602082019150602081019050602083039250612d3d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3a6614e80d02b57255cbb1f8305fbeca53d7e05a4b779d4062791966085129253442604051808381526020018281526020019250505060405180910390a2612e9e6137cd565b50505050565b612ee36040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b80612f295750612f286040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b612f9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b612fda6040518060400160405280601881526020017f73657474696e67732e6465706f7369742e6d696e696d756d0000000000000000815250826133da565b50565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040516020018082805190602001908083835b602083106130535780518252602082019150602081019050602083039250613030565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156130c257600080fd5b505afa1580156130d6573d6000803e3d6000fd5b505050506040513d60208110156130ec57600080fd5b81019080805190602001909291905050509050919050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561317857600080fd5b505afa15801561318c573d6000803e3d6000fd5b505050506040513d60208110156131a257600080fd5b81019080805190602001909291905050509050919050565b60008061325f8360405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061321f57805182526020820191506020810190506020830392506131fc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e7472616374206e6f7420666f756e64000000000000000000000000000081525060200191505060405180910390fd5b80915050919050565b60006133d2838360405160200180807f6163636573732e726f6c65000000000000000000000000000000000000000000815250600b0183805190602001908083835b60208310613372578051825260208201915060208101905060208303925061334f565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019250505060405160208183030381529060405280519060200120613717565b905092915050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a836040516020018082805190602001908083835b6020831061344f578051825260208201915060208101905060208303925061342c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b1580156134c857600080fd5b505af11580156134dc573d6000803e3d6000fd5b505050505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040516020018082805190602001908083835b6020831061355a5780518252602082019150602081019050602083039250613537565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156135c957600080fd5b505afa1580156135dd573d6000803e3d6000fd5b505050506040513d60208110156135f357600080fd5b81019080805190602001909291905050509050919050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abfdcced836040516020018082805190602001908083835b60208310613680578051825260208201915060208101905060208303925061365d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156136fb57600080fd5b505af115801561370f573d6000803e3d6000fd5b505050505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561378b57600080fd5b505afa15801561379f573d6000803e3d6000fd5b505050506040513d60208110156137b557600080fd5b81019080805190602001909291905050509050919050565b600061380d6040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90508073ffffffffffffffffffffffffffffffffffffffff166398ea5fca346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561385757600080fd5b505af115801561386b573d6000803e3d6000fd5b505050505061387861086a565b50565b6000828211156138f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b81830390509291505056fe546865206465706f736974656420616d6f756e74206973206c657373207468616e20746865206d696e696d756d206465706f7369742073697a65496e73756666696369656e742062616c616e636520666f72207769746864726177616c4465706f7369742061737369676e6d656e7473206172652063757272656e746c792064697361626c65644465706f7369747320696e746f205374616669206172652063757272656e746c792064697361626c6564496e73756666696369656e74206578636573732062616c616e636520666f72207769746864726177616ca26469706673582212200db792dc4d5bef86f5144863de07319addd6af254ec907e2c3acb4d072c0080b64736f6c634300070600330000000000000000000000006c2f7b6110a37b3b0fbdd811876be368df02e8b0

Deployed Bytecode

0x60806040526004361061011f5760003560e01c806363a5db9e116100a0578063888b042f11610064578063888b042f1461038d578063cc88c3c8146103b8578063d0e30db0146103f3578063e44ad24c146103fd578063e78ec42e146104075761011f565b806363a5db9e146102d65780636ada78471461031157806372f5158d1461033e5780637c697e74146103485780638554913b146103525761011f565b80633fa9c18d116100e75780633fa9c18d146101c657806347fa434a1461020157806354fd4d501461022e5780635b17d04b1461025c5780635cb17a90146102995761011f565b8063035cf142146101245780630a019eaf1461014f57806312065fe01461015957806327c8f193146101845780633b474a651461019b575b600080fd5b34801561013057600080fd5b50610139610442565b6040518082815260200191505060405180910390f35b610157610487565b005b34801561016557600080fd5b5061016e61077f565b6040518082815260200191505060405180910390f35b34801561019057600080fd5b5061019961086a565b005b3480156101a757600080fd5b506101b0610d44565b6040518082815260200191505060405180910390f35b3480156101d257600080fd5b506101ff600480360360208110156101e957600080fd5b8101908080359060200190929190505050610d89565b005b34801561020d57600080fd5b50610216610ec2565b60405180821515815260200191505060405180910390f35b34801561023a57600080fd5b50610243610f07565b604051808260ff16815260200191505060405180910390f35b34801561026857600080fd5b506102976004803603602081101561027f57600080fd5b81019080803515159060200190929190505050610f18565b005b3480156102a557600080fd5b506102d4600480360360208110156102bc57600080fd5b81019080803515159060200190929190505050611051565b005b3480156102e257600080fd5b5061030f600480360360208110156102f957600080fd5b810190808035906020019092919050505061118a565b005b34801561031d57600080fd5b5061032661168b565b60405180821515815260200191505060405180910390f35b6103466116d0565b005b61035061198f565b005b34801561035e57600080fd5b5061038b6004803603602081101561037557600080fd5b8101908080359060200190929190505050611ce5565b005b34801561039957600080fd5b506103a26121e6565b6040518082815260200191505060405180910390f35b3480156103c457600080fd5b506103f1600480360360208110156103db57600080fd5b81019080803590602001909291905050506122e9565b005b6103fb6127ea565b005b610405612b4e565b005b34801561041357600080fd5b506104406004803603602081101561042a57600080fd5b8101908080359060200190929190505050612ea4565b005b60006104826040518060400160405280601881526020017f73657474696e67732e6465706f7369742e6d696e696d756d0000000000000000815250612fdd565b905090565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306105608260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061052057805182526020820191506020810190506020830392506104fd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610600576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600a81526020017f7374616669457468657200000000000000000000000000000000000000000000815250336106d98260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106106995780518252602082019150602081019050602083039250610676565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b50505050565b6000806107c06040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561082957600080fd5b505afa15801561083d573d6000803e3d6000fd5b505050506040513d602081101561085357600080fd5b810190808051906020019092919050505091505090565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306109438260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061090357805182526020820191506020810190506020830392506108e0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6109eb610ec2565b610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061395c602a913960400191505060405180910390fd5b6000610a806040518060400160405280601581526020017f73746166695374616b696e67506f6f6c517565756500000000000000000000008152506131ba565b90506000610ac26040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506000610ace610d44565b905060005b81811015610d3c5760008473ffffffffffffffffffffffffffffffffffffffff1663516123056040518163ffffffff1660e01b815260040160206040518083038186803b158015610b2357600080fd5b505afa158015610b37573d6000803e3d6000fd5b505050506040513d6020811015610b4d57600080fd5b810190808051906020019092919050505090506000811480610b75575080610b7361077f565b105b15610b805750610d3c565b60008573ffffffffffffffffffffffffffffffffffffffff16639a9580616040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610bca57600080fd5b505af1158015610bde573d6000803e3d6000fd5b505050506040513d6020811015610bf457600080fd5b8101908080519060200190929190505050905060008190508573ffffffffffffffffffffffffffffffffffffffff16633bed33ce846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610c5f57600080fd5b505af1158015610c73573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166348146113846040518263ffffffff1660e01b81526004016000604051808303818588803b158015610cbf57600080fd5b505af1158015610cd3573d6000803e3d6000fd5b50505050508173ffffffffffffffffffffffffffffffffffffffff167fa1811054b7d96716259cff0d366c2f6405951e0efe00c8db3e237cbf77fe7be98442604051808381526020018281526020019250505060405180910390a2505050806001019050610ad3565b505050505050565b6000610d846040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e6d6178696d756d00815250612fdd565b905090565b610dc86040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b80610e0e5750610e0d6040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b610e80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b610ebf6040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e6d6178696d756d00815250826133da565b50565b6000610f026040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e656e61626c6564008152506134e4565b905090565b60008054906101000a900460ff1681565b610f576040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b80610f9d5750610f9c6040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b61100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b61104e6040518060400160405280601881526020017f73657474696e67732e6465706f7369742e656e61626c656400000000000000008152508261360b565b50565b6110906040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b806110d657506110d56040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b6111876040518060400160405280601f81526020017f73657474696e67732e6465706f7369742e61737369676e2e656e61626c6564008152508261360b565b50565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306112638260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106112235780518252602082019150602081019050602083039250611200565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611303576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600981526020017f72455448546f6b656e0000000000000000000000000000000000000000000000815250336113dc8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061139c5780518252602082019150602081019050602083039250611379565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461147c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b60006114bc6040518060400160405280600981526020017f72455448546f6b656e00000000000000000000000000000000000000000000008152506131ba565b905060006114fe6040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506115086121e6565b871115611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806139b0602a913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16633bed33ce886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115b357600080fd5b505af11580156115c7573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff16636c985a88886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561161357600080fd5b505af1158015611627573d6000803e3d6000fd5b50505050503373ffffffffffffffffffffffffffffffffffffffff167f992f462cfb62e164bd03bf07baf2cffce83fbd9370cae10635842b20200121208842604051808381526020018281526020019250505060405180910390a250505050505050565b60006116cb6040518060400160405280601881526020017f73657474696e67732e6465706f7369742e656e61626c656400000000000000008152506134e4565b905090565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306117a98260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106117695780518252602082019150602081019050602083039250611746565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b336118ba8160405160200180807f7374616b696e67706f6f6c2e65786973747300000000000000000000000000008152506012018273ffffffffffffffffffffffffffffffffffffffff1660601b815260140191505060405160208183030381529060405280519060200120613717565b61192c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e76616c6964207374616b696e6720706f6f6c00000000000000000000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3a6614e80d02b57255cbb1f8305fbeca53d7e05a4b779d4062791966085129253442604051808381526020018281526020019250505060405180910390a261198a6137cd565b505050565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525030611a688260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611a285780518252602082019150602081019050602083039250611a05565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280601081526020017f73746166694469737472696275746f720000000000000000000000000000000081525033611be18260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611ba15780518252602082019150602081019050602083039250611b7e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3a6614e80d02b57255cbb1f8305fbeca53d7e05a4b779d4062791966085129253442604051808381526020018281526020019250505060405180910390a2611cdf6137cd565b50505050565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525030611dbe8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611d7e5780518252602082019150602081019050602083039250611d5b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600e81526020017f737461666953757065724e6f646500000000000000000000000000000000000081525033611f378260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310611ef75780518252602082019150602081019050602083039250611ed4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611fd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b60006120176040518060400160405280600e81526020017f737461666953757065724e6f64650000000000000000000000000000000000008152506131ba565b905060006120596040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506120636121e6565b8711156120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806139396023913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16633bed33ce886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561210e57600080fd5b505af1158015612122573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff1663439370b1886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561216e57600080fd5b505af1158015612182573d6000803e3d6000fd5b50505050503373ffffffffffffffffffffffffffffffffffffffff167f992f462cfb62e164bd03bf07baf2cffce83fbd9370cae10635842b20200121208842604051808381526020018281526020019250505060405180910390a250505050505050565b6000806122276040518060400160405280601581526020017f73746166695374616b696e67506f6f6c517565756500000000000000000000008152506131ba565b905060008173ffffffffffffffffffffffffffffffffffffffff1663e60b40bf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561227157600080fd5b505afa158015612285573d6000803e3d6000fd5b505050506040513d602081101561229b57600080fd5b8101908080519060200190929190505050905060006122b861077f565b90508082106122cd57600093505050506122e6565b6122e0828261387b90919063ffffffff16565b93505050505b90565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306123c28260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310612382578051825260208201915060208101905060208303925061235f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280600e81526020017f73746166694c696768744e6f64650000000000000000000000000000000000008152503361253b8260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106124fb57805182526020820191506020810190506020830392506124d8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146125db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b600061261b6040518060400160405280600e81526020017f73746166694c696768744e6f64650000000000000000000000000000000000008152506131ba565b9050600061265d6040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90506126676121e6565b8711156126bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806139396023913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16633bed33ce886040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561271257600080fd5b505af1158015612726573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff1663439370b1886040518263ffffffff1660e01b81526004016000604051808303818588803b15801561277257600080fd5b505af1158015612786573d6000803e3d6000fd5b50505050503373ffffffffffffffffffffffffffffffffffffffff167f992f462cfb62e164bd03bf07baf2cffce83fbd9370cae10635842b20200121208842604051808381526020018281526020019250505060405180910390a250505050505050565b6040518060400160405280601081526020017f7374616669557365724465706f73697400000000000000000000000000000000815250306128c38260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b602083106128835780518252602082019150602081019050602083039250612860565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b61296b61168b565b6129c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613986602a913960400191505060405180910390fd5b6129c8610442565b341015612a20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806138ff603a913960400191505060405180910390fd5b6000612a606040518060400160405280600981526020017f72455448546f6b656e00000000000000000000000000000000000000000000008152506131ba565b90508073ffffffffffffffffffffffffffffffffffffffff1663bff3a9f834336040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015612ad357600080fd5b505af1158015612ae7573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f7aa1a8eb998c779420645fc14513bf058edb347d95c2fc2e6845bdc22f8886313442604051808381526020018281526020019250505060405180910390a2612b496137cd565b505050565b6040518060400160405280601081526020017f7374616669557365724465706f7369740000000000000000000000000000000081525030612c278260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310612be75780518252602082019150602081019050602083039250612bc4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612cc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b6040518060400160405280601681526020017f73746166694e6574776f726b5769746864726177616c0000000000000000000081525033612da08260405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b60208310612d605780518252602082019150602081019050602083039250612d3d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e76616c6964206f72206f7574646174656420636f6e74726163740000000081525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3a6614e80d02b57255cbb1f8305fbeca53d7e05a4b779d4062791966085129253442604051808381526020018281526020019250505060405180910390a2612e9e6137cd565b50505050565b612ee36040518060400160405280600581526020017f6f776e65720000000000000000000000000000000000000000000000000000008152503361330d565b80612f295750612f286040518060400160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152503361330d565b5b612f9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e74206973206e6f7420612073757065722075736572000000000081525060200191505060405180910390fd5b612fda6040518060400160405280601881526020017f73657474696e67732e6465706f7369742e6d696e696d756d0000000000000000815250826133da565b50565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd02d0f5836040516020018082805190602001908083835b602083106130535780518252602082019150602081019050602083039250613030565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156130c257600080fd5b505afa1580156130d6573d6000803e3d6000fd5b505050506040513d60208110156130ec57600080fd5b81019080805190602001909291905050509050919050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561317857600080fd5b505afa15801561318c573d6000803e3d6000fd5b505050506040513d60208110156131a257600080fd5b81019080805190602001909291905050509050919050565b60008061325f8360405160200180807f636f6e74726163742e616464726573730000000000000000000000000000000081525060100182805190602001908083835b6020831061321f57805182526020820191506020810190506020830392506131fc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120613104565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e7472616374206e6f7420666f756e64000000000000000000000000000081525060200191505060405180910390fd5b80915050919050565b60006133d2838360405160200180807f6163636573732e726f6c65000000000000000000000000000000000000000000815250600b0183805190602001908083835b60208310613372578051825260208201915060208101905060208303925061334f565b6001836020036101000a0380198251168184511680821785525050505050509050018273ffffffffffffffffffffffffffffffffffffffff1660601b81526014019250505060405160208183030381529060405280519060200120613717565b905092915050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2a4853a836040516020018082805190602001908083835b6020831061344f578051825260208201915060208101905060208303925061342c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b1580156134c857600080fd5b505af11580156134dc573d6000803e3d6000fd5b505050505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040516020018082805190602001908083835b6020831061355a5780518252602082019150602081019050602083039250613537565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156135c957600080fd5b505afa1580156135dd573d6000803e3d6000fd5b505050506040513d60208110156135f357600080fd5b81019080805190602001909291905050509050919050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663abfdcced836040516020018082805190602001908083835b60208310613680578051825260208201915060208101905060208303925061365d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156136fb57600080fd5b505af115801561370f573d6000803e3d6000fd5b505050505050565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ae1cfca836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561378b57600080fd5b505afa15801561379f573d6000803e3d6000fd5b505050506040513d60208110156137b557600080fd5b81019080805190602001909291905050509050919050565b600061380d6040518060400160405280600a81526020017f73746166694574686572000000000000000000000000000000000000000000008152506131ba565b90508073ffffffffffffffffffffffffffffffffffffffff166398ea5fca346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561385757600080fd5b505af115801561386b573d6000803e3d6000fd5b505050505061387861086a565b50565b6000828211156138f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b81830390509291505056fe546865206465706f736974656420616d6f756e74206973206c657373207468616e20746865206d696e696d756d206465706f7369742073697a65496e73756666696369656e742062616c616e636520666f72207769746864726177616c4465706f7369742061737369676e6d656e7473206172652063757272656e746c792064697361626c65644465706f7369747320696e746f205374616669206172652063757272656e746c792064697361626c6564496e73756666696369656e74206578636573732062616c616e636520666f72207769746864726177616ca26469706673582212200db792dc4d5bef86f5144863de07319addd6af254ec907e2c3acb4d072c0080b64736f6c63430007060033

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

0000000000000000000000006c2f7b6110a37b3b0fbdd811876be368df02e8b0

-----Decoded View---------------
Arg [0] : _stafiStorageAddress (address): 0x6c2f7b6110a37b3B0fbdd811876be368df02E8B0

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000006c2f7b6110a37b3b0fbdd811876be368df02e8b0


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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