ETH Price: $2,526.81 (+0.36%)

Contract

0xA1784F009d990D9b33fac0F5461cAc9bCB21D827
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Simple Withdraw136318132021-11-17 8:14:321018 days ago1637136872IN
0xA1784F00...bCB21D827
0 ETH0.0292498396.17418386
Withdraw Acumula...129599002021-08-04 17:07:541122 days ago1628096874IN
0xA1784F00...bCB21D827
0 ETH0.0035009254
Set Fees Destina...129598972021-08-04 17:06:481122 days ago1628096808IN
0xA1784F00...bCB21D827
0 ETH0.0049702654
Simple Withdraw128407822021-07-16 23:12:471141 days ago1626477167IN
0xA1784F00...bCB21D827
0 ETH0.0057933422
Simple Withdraw127781812021-07-07 4:30:021151 days ago1625632202IN
0xA1784F00...bCB21D827
0 ETH0.0098527643
Simple Withdraw127189222021-06-27 23:04:481160 days ago1624835088IN
0xA1784F00...bCB21D827
0 ETH0.0050033419
Simple Withdraw126527012021-06-17 15:21:061170 days ago1623943266IN
0xA1784F00...bCB21D827
0 ETH0.0037807116.5
Simple Withdraw126393452021-06-15 13:37:031172 days ago1623764223IN
0xA1784F00...bCB21D827
0 ETH0.0032078714
Simple Withdraw125770722021-06-05 22:15:241182 days ago1622931324IN
0xA1784F00...bCB21D827
0 ETH0.0043337117.6
Simple Withdraw125527842021-06-02 4:07:351186 days ago1622606855IN
0xA1784F00...bCB21D827
0 ETH0.0044322118
Simple Withdraw125366822021-05-30 16:01:491188 days ago1622390509IN
0xA1784F00...bCB21D827
0 ETH0.0043535419
Simple Withdraw125292832021-05-29 12:32:191189 days ago1622291539IN
0xA1784F00...bCB21D827
0 ETH0.0041859717
Simple Withdraw125093382021-05-26 10:05:361193 days ago1622023536IN
0xA1784F00...bCB21D827
0 ETH0.0078794832
Simple Withdraw125026742021-05-25 9:24:041194 days ago1621934644IN
0xA1784F00...bCB21D827
0 ETH0.0086900233
Simple Withdraw124886992021-05-23 5:30:131196 days ago1621747813IN
0xA1784F00...bCB21D827
0 ETH0.0077317431.4
Simple Withdraw124573702021-05-18 8:44:291201 days ago1621327469IN
0xA1784F00...bCB21D827
0 ETH0.0140353357
Simple Withdraw124428282021-05-16 2:30:541203 days ago1621132254IN
0xA1784F00...bCB21D827
0 ETH0.0136105559.4
Simple Withdraw124406302021-05-15 18:27:391203 days ago1621103259IN
0xA1784F00...bCB21D827
0 ETH0.0171392274.8
Simple Withdraw124390772021-05-15 12:52:141203 days ago1621083134IN
0xA1784F00...bCB21D827
0 ETH0.0158102469
Simple Withdraw124390472021-05-15 12:46:051203 days ago1621082765IN
0xA1784F00...bCB21D827
0 ETH0.0172363870
Simple Withdraw124389342021-05-15 12:21:121203 days ago1621081272IN
0xA1784F00...bCB21D827
0 ETH0.0169901469
Simple Withdraw124352602021-05-14 22:30:001204 days ago1621031400IN
0xA1784F00...bCB21D827
0 ETH0.02635041115
Simple Withdraw124316842021-05-14 9:27:251205 days ago1620984445IN
0xA1784F00...bCB21D827
0 ETH0.0217677395
Simple Withdraw124039642021-05-10 2:42:251209 days ago1620614545IN
0xA1784F00...bCB21D827
0 ETH0.02681488108.9
Simple Withdraw124014112021-05-09 17:10:211209 days ago1620580221IN
0xA1784F00...bCB21D827
0 ETH0.0226842699
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AlohaStaking

Compiler Version
v0.6.5+commit.f956cc89

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-03-01
*/

// File: @openzeppelin/contracts/GSN/Context.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: @openzeppelin/contracts/math/SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.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, 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) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * 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);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: contracts/IAlohaNFT.sol

pragma solidity ^0.6.0;

interface IAlohaNFT {
    function awardItem(
        address wallet,
        uint256 tokenImage,
        uint256 tokenRarity,
        uint256 tokenBackground
    ) external returns (uint256);
}

// File: contracts/AlohaStaking.sol

pragma solidity 0.6.5;
pragma experimental ABIEncoderV2;






contract AlohaStaking is Ownable, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeMath for uint8;

    /* Events */
    event SettedPool(
        uint256 indexed alohaAmount,
        uint256 indexed erc20Amount,
        uint256 duration,
        uint256 rarity,
        uint256 date
    );
    event Staked(
        address indexed wallet,
        address indexed erc20Address,
        uint256 rarity,
        uint256 endDate,
        uint256 tokenImage,
        uint256 tokenBackground,
        uint256 alohaAmount,
        uint256 erc20Amount,
        uint256 date
    );
    event Withdrawal(
        address indexed wallet,
        address indexed erc20Address,
        uint256 rarity,
        uint256 originalAlohaAmount,
        uint256 originalErc20Amount,
        uint256 receivedAlohaAmount,
        uint256 receivedErc20Amount,
        uint256 erc721Id,
        uint256 date
    );
    event Transfered(
        address indexed wallet,
        address indexed erc20Address,
        uint256 amount,
        uint256 date
    );

    /* Vars */
    uint256 public fee;
    address public alohaERC20;
    address public alohaERC721;
    uint256 public backgrounds;
    address[] public feesDestinators;
    uint256[] public feesPercentages;

    struct Pool {
        uint256 alohaAmount;
        uint256 erc20Amount; // 0 when is not a PairPool
        uint256 duration;
        uint256 rarity;
    }
    struct Stake {
        uint256 endDate;
        uint256 tokenImage;
        uint256 tokenBackground;
        uint256 alohaAmount;
        uint256 erc20Amount;  // 0 when is not a PairPool
    }

    // image => rarity
    mapping (uint256 => uint256) public rewardsMap;
    // rarity => [image]
    mapping (uint256 => uint256[]) public rarityByImages;
    // rarity => totalImages
    mapping (uint256 => uint256) public rarityByImagesTotal;
    // erc20Address => rarity => Pool
    mapping (address => mapping(uint256 => Pool)) public poolsMap;
    // userAddress => erc20Address => rarity => Stake 
    mapping (address => mapping(address => mapping(uint256 => Stake))) public stakingsMap;
    // erc20Address => totalStaked 
    mapping (address => uint256) public totalStaked;

    /* Modifiers */
    modifier imageNotExists(uint256 _image) {
        require(
            !_existsReward(_image),
            "AlohaStaking: Image for reward already exists"
        );
        _;
    }
    modifier validRarity(uint256 _rarity) {
        require(
            _rarity >= 1 && _rarity <= 3,
            "AlohaStaking: Rarity must be 1, 2 or 3"
        );
        _;
    }
    modifier poolExists(address _erc20, uint256 _rarity) {
        require(
            _existsPool(_erc20, _rarity),
            "AlohaStaking: Pool for ERC20 Token and rarity not exists"
        );
        _;
    }
    modifier rarityAvailable(uint256 _rarity) {
        require(
            !(rarityByImagesTotal[_rarity] == 0),
            "AlohaStaking: Rarity not available"
        );
        _;
    }
    modifier addressNotInStake(address _userAddress, address _erc20, uint256 _rarity) {
        require(
            (stakingsMap[msg.sender][_erc20][_rarity].endDate == 0),
            "AlohaStaking: Address already stakes in this pool"
        );
        _;
    }
    modifier addressInStake(address _userAddress, address _erc20, uint256 _rarity) {
        require(
            !(stakingsMap[msg.sender][_erc20][_rarity].endDate == 0),
            "AlohaStaking: Address not stakes in this pool"
        );
        _;
    }
    modifier stakeEnded(address _userAddress, address _erc20, uint256 _rarity) {
        require(
            (_getTime() > stakingsMap[msg.sender][_erc20][_rarity].endDate),
            "AlohaStaking: Stake duration has not ended yet"
        );
        _;
    }

    /* Public Functions */
    constructor(
        address _alohaERC20,
        address _alohaERC721,
        uint256 _backgrounds,
        uint256 _fee
    ) public {
        require(address(_alohaERC20) != address(0)); 
        require(address(_alohaERC721) != address(0));

        alohaERC20 = _alohaERC20;
        alohaERC721 = _alohaERC721;
        backgrounds = _backgrounds;
        fee = _fee;
    }

    /**
    * @dev Stake ALOHA to get a random token of the selected rarity
    */
    function simpleStake(
        uint256 _tokenRarity
    )
        public
    {
        pairStake(alohaERC20, _tokenRarity);
    }

    /**
    * @dev Stake ALOHA/TOKEN to get a random token of the selected rarity
    */
    function pairStake(
        address _erc20Token,
        uint256 _tokenRarity
    )
        public
        rarityAvailable(_tokenRarity)
        poolExists(_erc20Token, _tokenRarity)
        addressNotInStake(msg.sender, _erc20Token, _tokenRarity)
    {
        uint256 randomImage = rarityByImages[_tokenRarity][_randomA(rarityByImagesTotal[_tokenRarity]) - 1];
        uint256 _endDate = _getTime() + poolsMap[_erc20Token][_tokenRarity].duration;
        uint256 randomBackground = _randomB(backgrounds);

        uint256 alohaAmount = poolsMap[_erc20Token][_tokenRarity].alohaAmount;
        uint256 erc20Amount = poolsMap[_erc20Token][_tokenRarity].erc20Amount;

        _transferStake(msg.sender, alohaERC20, alohaAmount);
        totalStaked[alohaERC20] += alohaAmount;
        
        if (_erc20Token != alohaERC20) {
            _transferStake(msg.sender, _erc20Token, erc20Amount);
            totalStaked[_erc20Token] += erc20Amount;
        }

        stakingsMap[msg.sender][_erc20Token][_tokenRarity] = Stake({
            endDate: _endDate,
            tokenImage: randomImage,
            tokenBackground: randomBackground,
            alohaAmount: alohaAmount,
            erc20Amount: erc20Amount
        });

        emit Staked(
            msg.sender,
            _erc20Token,
            _tokenRarity,
            _endDate,
            randomImage,
            randomBackground,
            alohaAmount,
            erc20Amount,
            _getTime()
        );
    }

    /**
    * @dev Withdraw ALOHA and claim your random NFT for the selected rarity
    */
    function simpleWithdraw(
        uint256 _tokenRarity
    )
        public
    {
        pairWithdraw(alohaERC20, _tokenRarity);
    }

    /**
    * @dev Withdraw ALOHA/TOKEN and claim your random NFT for the selected rarity
    */
    function pairWithdraw(
        address _erc20Token,
        uint256 _tokenRarity
    )
        public
        nonReentrant()
        addressInStake(msg.sender, _erc20Token, _tokenRarity)
        stakeEnded(msg.sender, _erc20Token, _tokenRarity)
    {
        _withdraw(_erc20Token, _tokenRarity, true);
    }

    /**
    * @dev Withdra ALOHA without generating your NFT. This can be done before release time is reached.
    */
    function forceSimpleWithdraw(
        uint256 _tokenRarity
    )
        public
    {
        forcePairWithdraw(alohaERC20, _tokenRarity);
    }

    /**
    * @dev Withdraw ALOHA/TOKEN without generating your NFT. This can be done before release time is reached.
    */
    function forcePairWithdraw(
        address _erc20Token,
        uint256 _tokenRarity
    )
        public
        nonReentrant()
        addressInStake(msg.sender, _erc20Token, _tokenRarity)
    {
        _withdraw(_erc20Token, _tokenRarity, false);
    }

    /**
    * @dev Returns how many fees we collected from withdraws of one token.
    */
    function getAcumulatedFees(address _erc20Token) public returns (uint256) {
        uint256 balance = IERC20(_erc20Token).balanceOf(address(this));

        if (balance > 0) {
            return balance.sub(totalStaked[_erc20Token]);
        }

        return 0; 
    } 

    /**
    * @dev Send all the acumulated fees for one token to the fee destinators.
    */
    function withdrawAcumulatedFees(address _erc20Token) public {
        uint256 total = getAcumulatedFees(_erc20Token);
        
        for (uint8 i = 0; i < feesDestinators.length; i++) {
            IERC20(_erc20Token).transfer(
                feesDestinators[i],
                total.mul(feesPercentages[i]).div(100)
            );
        }
    }

    /* Governance Functions */

    /**
    * @dev Sets the fee for every withdraw.
    */
    function setFee(uint256 _fee) public onlyOwner() {
        fee = _fee;
    }

    /**
    * @dev Adds a new NFT to the pools, so users can stake for it.
    */
    function createReward(
        uint256 _tokenImage,
        uint256 _tokenRarity
    )
        public
        onlyOwner()
        imageNotExists(_tokenImage)
        validRarity(_tokenRarity)
    {
        rewardsMap[_tokenImage] = _tokenRarity;
        rarityByImages[_tokenRarity].push(_tokenImage);
        rarityByImagesTotal[_tokenRarity] += 1;
    }

    /**
    * @dev Configure staking time and amount in ALOHA pool for one rarity.
    */
    function setSimplePool(
        uint256 _alohaAmount,
        uint256 _duration,
        uint256 _tokenRarity
    )
        public
        onlyOwner()
        rarityAvailable(_tokenRarity)
    {
        poolsMap[alohaERC20][_tokenRarity] = Pool({
            alohaAmount: _alohaAmount,
            erc20Amount: 0,
            duration: _duration,
            rarity: _tokenRarity
        });

        emit SettedPool(
            _alohaAmount,
            0,
            _duration,
            _tokenRarity,
            _getTime()
        );
    }

    /**
    * @dev Configure staking time and amount in ALOHA/TOKEN pool for one rarity.
    */
    function setPairPool(
        uint256 _alohaAmount,
        address _erc20Address,
        uint256 _erc20Amount,
        uint256 _duration,
        uint256 _tokenRarity
    )
        public
        onlyOwner()
        rarityAvailable(_tokenRarity)
    {
        require(address(_erc20Address) != address(0));

        poolsMap[_erc20Address][_tokenRarity] = Pool({
            alohaAmount: _alohaAmount,
            erc20Amount: _erc20Amount,
            duration: _duration,
            rarity: _tokenRarity
        });

        emit SettedPool(
            _alohaAmount,
            _erc20Amount,
            _duration,
            _tokenRarity,
            _getTime()
        );
    }

    /**
    * @dev Creates a new background for NFTs. New stakers could get this background.
    */
    function addBackground(uint8 increase)
        public
        onlyOwner()
    {
        backgrounds += increase;
    }

    /**
    * @dev Configure how to distribute the fees for user's withdraws.
    */
    function setFeesDestinatorsWithPercentages(
        address[] memory _destinators,
        uint256[] memory _percentages
    )
        public
        onlyOwner()
    {
        require(_destinators.length <= 3, "AlohaStaking: Destinators lenght more then 3");
        require(_percentages.length <= 3, "AlohaStaking: Percentages lenght more then 3");
        require(_destinators.length == _percentages.length, "AlohaStaking: Destinators and percentageslenght are not equals");

        uint256 total = 0;
        for (uint8 i = 0; i < _percentages.length; i++) {
            total += _percentages[i];
        }
        require(total == 100, "AlohaStaking: Percentages sum must be 100");

        feesDestinators = _destinators;
        feesPercentages = _percentages;
    }

    /* Internal functions */
    function _existsReward(uint256 _tokenImage) internal view returns (bool) {
        return rewardsMap[_tokenImage] != 0;
    }

    function _existsPool(address _erc20Token, uint256 _rarity) internal view returns (bool) {
        return poolsMap[_erc20Token][_rarity].duration != 0;
    }

    function _getTime() internal view returns (uint256) {
        return block.timestamp;
    }

    /**
    * @dev Apply withdraw fees to the amounts.
    */
    function _applyStakeFees(
        address _erc20Token,
        uint256 _tokenRarity
    ) internal view returns (
        uint256 _alohaAmountAfterFees,
        uint256 _erc20AmountAfterFees
    ) {
        uint256 alohaAmount = poolsMap[_erc20Token][_tokenRarity].alohaAmount;
        uint256 alohaAmountAfterFees = alohaAmount.sub(alohaAmount.mul(fee).div(10000));
        uint256 erc20AmountAfterFees = 0;

        if (_erc20Token != alohaERC20) {
            uint256 erc20Amount = poolsMap[_erc20Token][_tokenRarity].erc20Amount;
            erc20AmountAfterFees = erc20Amount.sub(erc20Amount.mul(fee).div(10000));
        }

        return (alohaAmountAfterFees, erc20AmountAfterFees);
    }

    /**
    * @dev Transfers erc20 tokens to this contract.
    */
    function _transferStake(
        address _wallet,
        address _erc20,
        uint256 _amount
    ) internal {
        require(IERC20(_erc20).transferFrom(_wallet, address(this), _amount), "Must approve the ERC20 first");

        emit Transfered(_wallet, _erc20, _amount, _getTime());
    }

    /**
    * @dev Transfers erc20 tokens from this contract to the wallet.
    */
    function _transferWithdrawRewards(
        address _wallet,
        address _erc20,
        uint256 _amount
    ) internal {
        require(IERC20(_erc20).transfer(_wallet, _amount), "Must approve the ERC20 first");

        emit Transfered(_wallet, _erc20, _amount, _getTime());
    }

    /**
    * @dev Clear the stake state for a wallet and a rarity.
    */
    function _clearStake(address wallet, address _erc20Token, uint256 _tokenRarity) internal {
        stakingsMap[wallet][_erc20Token][_tokenRarity].endDate = 0;
        stakingsMap[wallet][_erc20Token][_tokenRarity].tokenImage = 0;
        stakingsMap[wallet][_erc20Token][_tokenRarity].tokenBackground = 0;
        stakingsMap[wallet][_erc20Token][_tokenRarity].alohaAmount = 0;
        stakingsMap[wallet][_erc20Token][_tokenRarity].erc20Amount = 0;
    }

    /**
    * @dev Withdraw tokens and mints the NFT if claimed.
    */
    function _withdraw(address _erc20Token, uint256 _tokenRarity, bool claimReward) internal {
        uint256 alohaAmount = poolsMap[_erc20Token][_tokenRarity].alohaAmount;
        uint256 erc20Amount = poolsMap[_erc20Token][_tokenRarity].erc20Amount;
        uint256 alohaAmountAfterFees;
        uint256 erc20AmountAfterFees;
    
        if (!claimReward) {
            alohaAmountAfterFees = alohaAmount;
            erc20AmountAfterFees = erc20Amount;
        } else {
            (alohaAmountAfterFees, erc20AmountAfterFees) = _applyStakeFees(_erc20Token, _tokenRarity);
        }

        _transferWithdrawRewards(msg.sender, alohaERC20, alohaAmountAfterFees);
        totalStaked[alohaERC20] -= alohaAmount;

        if (_erc20Token != alohaERC20) {
            _transferWithdrawRewards(msg.sender, _erc20Token, erc20AmountAfterFees);
            totalStaked[_erc20Token] -= erc20Amount;
        }

        uint256 tokenId = 0;
        if (claimReward) {
            uint256 image = stakingsMap[msg.sender][_erc20Token][_tokenRarity].tokenImage;
            uint256 brackground = stakingsMap[msg.sender][_erc20Token][_tokenRarity].tokenBackground;

            tokenId = IAlohaNFT(alohaERC721).awardItem(msg.sender, image, _tokenRarity, brackground);
        }

        emit Withdrawal(
            msg.sender,
            _erc20Token,
            _tokenRarity,
            alohaAmount,
            erc20Amount,
            alohaAmountAfterFees,
            erc20AmountAfterFees,
            tokenId,
            _getTime()
        );

        _clearStake(msg.sender, _erc20Token, _tokenRarity);
    }

    /**
    * @dev Generates a "random" number using the numbers of backgrounds that we have.
    */
    function _randomA(uint256 _limit) internal view returns (uint8) {
        uint256 _gasleft = gasleft();
        bytes32 _blockhash = blockhash(block.number-1);
        bytes32 _structHash = keccak256(
            abi.encode(
                _blockhash,
                backgrounds,
                _gasleft,
                _limit
            )
        );
        uint256 _randomNumber  = uint256(_structHash);
        assembly {_randomNumber := add(mod(_randomNumber, _limit),1)}
        return uint8(_randomNumber);
    }

    /**
    * @dev Generates a "random" number using the current block timestamp.
    */
    function _randomB(uint256 _limit) internal view returns (uint256) {
        uint256 _gasleft = gasleft();
        bytes32 _blockhash = blockhash(block.number-1);
        bytes32 _structHash = keccak256(
            abi.encode(
                _blockhash,
                _getTime(),
                _gasleft,
                _limit
            )
        );
        uint256 _randomNumber  = uint256(_structHash);
        assembly {_randomNumber := add(mod(_randomNumber, _limit),1)}
        return uint8(_randomNumber);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_alohaERC20","type":"address"},{"internalType":"address","name":"_alohaERC721","type":"address"},{"internalType":"uint256","name":"_backgrounds","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"alohaAmount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rarity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"SettedPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":true,"internalType":"address","name":"erc20Address","type":"address"},{"indexed":false,"internalType":"uint256","name":"rarity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenImage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenBackground","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"alohaAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":true,"internalType":"address","name":"erc20Address","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"Transfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":true,"internalType":"address","name":"erc20Address","type":"address"},{"indexed":false,"internalType":"uint256","name":"rarity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"originalAlohaAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"originalErc20Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receivedAlohaAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receivedErc20Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"erc721Id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[{"internalType":"uint8","name":"increase","type":"uint8"}],"name":"addBackground","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"alohaERC20","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alohaERC721","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"backgrounds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenImage","type":"uint256"},{"internalType":"uint256","name":"_tokenRarity","type":"uint256"}],"name":"createReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feesDestinators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feesPercentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20Token","type":"address"},{"internalType":"uint256","name":"_tokenRarity","type":"uint256"}],"name":"forcePairWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenRarity","type":"uint256"}],"name":"forceSimpleWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20Token","type":"address"}],"name":"getAcumulatedFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20Token","type":"address"},{"internalType":"uint256","name":"_tokenRarity","type":"uint256"}],"name":"pairStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20Token","type":"address"},{"internalType":"uint256","name":"_tokenRarity","type":"uint256"}],"name":"pairWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolsMap","outputs":[{"internalType":"uint256","name":"alohaAmount","type":"uint256"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"rarity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarityByImages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarityByImagesTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardsMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_destinators","type":"address[]"},{"internalType":"uint256[]","name":"_percentages","type":"uint256[]"}],"name":"setFeesDestinatorsWithPercentages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_alohaAmount","type":"uint256"},{"internalType":"address","name":"_erc20Address","type":"address"},{"internalType":"uint256","name":"_erc20Amount","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_tokenRarity","type":"uint256"}],"name":"setPairPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_alohaAmount","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_tokenRarity","type":"uint256"}],"name":"setSimplePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenRarity","type":"uint256"}],"name":"simpleStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenRarity","type":"uint256"}],"name":"simpleWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingsMap","outputs":[{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"uint256","name":"tokenImage","type":"uint256"},{"internalType":"uint256","name":"tokenBackground","type":"uint256"},{"internalType":"uint256","name":"alohaAmount","type":"uint256"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20Token","type":"address"}],"name":"withdrawAcumulatedFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620023ef380380620023ef833981016040819052620000349162000120565b6000620000496001600160e01b03620000fe16565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180556001600160a01b038416620000ab57600080fd5b6001600160a01b038316620000bf57600080fd5b600380546001600160a01b039586166001600160a01b031991821617909155600480549490951693169290921790925560059190915560025562000169565b3390565b80516001600160a01b03811681146200011a57600080fd5b92915050565b6000806000806080858703121562000136578384fd5b62000142868662000102565b935062000153866020870162000102565b6040860151606090960151949790965092505050565b61227680620001796000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806374c83ab811610104578063af57b4e4116100a2578063e0ab764911610071578063e0ab7649146103b3578063e4a0edb0146103c6578063ed4c1e3e146103d9578063f2fde38b146103ec576101cf565b8063af57b4e41461037d578063cc66473314610390578063dcc85630146103a3578063ddca3f43146103ab576101cf565b80638ead17df116100de5780638ead17df146103315780639586befc146103445780639bfd8d61146103575780639f00f3551461036a576101cf565b806374c83ab8146103035780637dbedad5146103165780638da5cb5b14610329576101cf565b80634a0805b01161017157806356793bc71161014b57806356793bc7146102a157806369fe0e2d146102c4578063715018a6146102d7578063729ae5f7146102df576101cf565b80634a0805b0146102685780634bbec1ce1461027b5780634c5879df1461028e576101cf565b806323505c4a116101ad57806323505c4a146102255780632af7c5c51461023a5780632bfc4eaa1461024d5780633f54acef14610260576101cf565b8063013e00c5146101d45780631230e161146101e95780631a8812bd146101fc575b600080fd5b6101e76101e2366004611bad565b6103ff565b005b6101e76101f7366004611bd8565b61050e565b61020f61020a366004611b16565b610554565b60405161021c9190612164565b60405180910390f35b61022d610566565b60405161021c9190611bf9565b61020f610248366004611b16565b610575565b61022d61025b366004611b16565b610587565b61022d6105ae565b6101e7610276366004611b16565b6105bd565b61020f610289366004611b16565b6105d6565b6101e761029c366004611a0a565b6105f4565b6102b46102af366004611a0a565b61092d565b60405161021c9493929190611c70565b6101e76102d2366004611b16565b61095f565b6101e7610999565b6102f26102ed3660046119ca565b610a18565b60405161021c959493929190612191565b61020f6103113660046119af565b610a58565b6101e7610324366004611b8c565b610b1c565b61022d610bec565b6101e761033f366004611a0a565b610bfc565b6101e7610352366004611b16565b610c87565b61020f6103653660046119af565b610c9d565b6101e76103783660046119af565b610caf565b6101e761038b366004611b46565b610dc4565b61020f61039e366004611b8c565b610edf565b61020f610f0d565b61020f610f13565b6101e76103c1366004611a0a565b610f19565b6101e76103d4366004611b16565b610ffc565b6101e76103e7366004611a34565b611012565b6101e76103fa3660046119af565b611132565b6104076111e8565b6000546001600160a01b0390811691161461043d5760405162461bcd60e51b815260040161043490611f78565b60405180910390fd5b6000818152600a6020526040902054819061046a5760405162461bcd60e51b81526004016104349061208e565b604080516080810182528581526000602080830182815283850188815260608501888152600380546001600160a01b03168652600b85528786208a8752909452958420945185559051600185015551600284015592519190920155847fed11b82c749170a371e37a9faea7ec5c4ef5b37083d20a458a8557262dce8e5085856104f16111ec565b6040516105009392919061217b565b60405180910390a350505050565b6105166111e8565b6000546001600160a01b039081169116146105435760405162461bcd60e51b815260040161043490611f78565b6005805460ff909216919091019055565b60086020526000908152604090205481565b6003546001600160a01b031681565b600a6020526000908152604090205481565b6006818154811061059457fe5b6000918252602090912001546001600160a01b0316905081565b6004546001600160a01b031681565b6003546105d3906001600160a01b031682610f19565b50565b600781815481106105e357fe5b600091825260209091200154905081565b6000818152600a602052604090205481906106215760405162461bcd60e51b81526004016104349061208e565b828261062d82826111f0565b6106495760405162461bcd60e51b815260040161043490611e89565b336000818152600c602090815260408083206001600160a01b038a168452825280832088845290915290205486908690156106965760405162461bcd60e51b815260040161043490611ee6565b6000878152600960209081526040808320600a9092528220546001906106bb90611220565b0360ff16815481106106c957fe5b60009182526020808320909101546001600160a01b038c168352600b825260408084208c8552909252908220600201549092506107046111ec565b0190506000610714600554611272565b90506000600b60008d6001600160a01b03166001600160a01b0316815260200190815260200160002060008c81526020019081526020016000206000015490506000600b60008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008d81526020019081526020016000206001015490506107b233600360009054906101000a90046001600160a01b0316846112ca565b600380546001600160a01b039081166000908152600d6020526040902080548501905590548e821691161461080b576107ec338e836112ca565b6001600160a01b038d166000908152600d602052604090208054820190555b6040518060a0016040528085815260200186815260200184815260200183815260200182815250600c6000336001600160a01b03166001600160a01b0316815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002060008e815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508c6001600160a01b0316336001600160a01b03167ff2760ce282eaf68c77ca7d18f9560ed8c991e4c3cec3a7b8a912ad4ffe6456998e87898888886109036111ec565b60405161091697969594939291906121b4565b60405180910390a350505050505050505050505050565b600b60209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b6109676111e8565b6000546001600160a01b039081169116146109945760405162461bcd60e51b815260040161043490611f78565b600255565b6109a16111e8565b6000546001600160a01b039081169116146109ce5760405162461bcd60e51b815260040161043490611f78565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600c602090815260009384526040808520825292845282842090528252902080546001820154600283015460038401546004909401549293919290919085565b600080826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610a879190611bf9565b60206040518083038186803b158015610a9f57600080fd5b505afa158015610ab3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad79190611b2e565b90508015610b11576001600160a01b0383166000908152600d6020526040902054610b0990829063ffffffff6113c116565b915050610b17565b60009150505b919050565b610b246111e8565b6000546001600160a01b03908116911614610b515760405162461bcd60e51b815260040161043490611f78565b81610b5b8161140a565b15610b785760405162461bcd60e51b815260040161043490611fad565b8160018110158015610b8b575060038111155b610ba75760405162461bcd60e51b815260040161043490612048565b50506000828152600860209081526040808320849055838352600982528083208054600181810183559185528385200195909555928252600a90522080549091019055565b6000546001600160a01b03165b90565b60026001541415610c1f5760405162461bcd60e51b81526004016104349061212d565b6002600155336000818152600c602090815260408083206001600160a01b0387168452825280832085845290915290205483908390610c705760405162461bcd60e51b815260040161043490611cde565b610c7c8585600061141e565b505060018055505050565b6003546105d3906001600160a01b031682610bfc565b600d6020526000908152604090205481565b6000610cba82610a58565b905060005b60065460ff82161015610dbf57826001600160a01b031663a9059cbb60068360ff1681548110610ceb57fe5b9060005260206000200160009054906101000a90046001600160a01b0316610d476064610d3b60078760ff1681548110610d2157fe5b90600052602060002001548861161090919063ffffffff16565b9063ffffffff61164a16565b6040518363ffffffff1660e01b8152600401610d64929190611c57565b602060405180830381600087803b158015610d7e57600080fd5b505af1158015610d92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db69190611af6565b50600101610cbf565b505050565b610dcc6111e8565b6000546001600160a01b03908116911614610df95760405162461bcd60e51b815260040161043490611f78565b6000818152600a60205260409020548190610e265760405162461bcd60e51b81526004016104349061208e565b6001600160a01b038516610e3957600080fd5b604080516080810182528781526020808201878152828401878152606084018781526001600160a01b038b166000908152600b85528681208982529094529490922092518355516001830155516002820155905160039091015583867fed11b82c749170a371e37a9faea7ec5c4ef5b37083d20a458a8557262dce8e508585610ec06111ec565b604051610ecf9392919061217b565b60405180910390a3505050505050565b60096020528160005260406000208181548110610ef857fe5b90600052602060002001600091509150505481565b60055481565b60025481565b60026001541415610f3c5760405162461bcd60e51b81526004016104349061212d565b6002600155336000818152600c602090815260408083206001600160a01b0387168452825280832085845290915290205483908390610f8d5760405162461bcd60e51b815260040161043490611cde565b336000818152600c602090815260408083206001600160a01b038a168452825280832088845290915290205486908690610fc56111ec565b11610fe25760405162461bcd60e51b815260040161043490611ffa565b610fee8888600161141e565b505060018055505050505050565b6003546105d3906001600160a01b0316826105f4565b61101a6111e8565b6000546001600160a01b039081169116146110475760405162461bcd60e51b815260040161043490611f78565b6003825111156110695760405162461bcd60e51b815260040161043490611df4565b60038151111561108b5760405162461bcd60e51b815260040161043490611da8565b80518251146110ac5760405162461bcd60e51b8152600401610434906120d0565b6000805b82518160ff1610156110e457828160ff16815181106110cb57fe5b60200260200101518201915080806001019150506110b0565b50806064146111055760405162461bcd60e51b815260040161043490611e40565b8251611118906006906020860190611840565b50815161112c9060079060208501906118a5565b50505050565b61113a6111e8565b6000546001600160a01b039081169116146111675760405162461bcd60e51b815260040161043490611f78565b6001600160a01b03811661118d5760405162461bcd60e51b815260040161043490611d62565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b4290565b6001600160a01b0382166000908152600b6020908152604080832084845290915290206002015415155b92915050565b6000805a9050600060014303409050600081600554848760405160200161124a9493929190611c70565b60408051601f1981840301815291905280516020909101208590066001019350505050919050565b6000805a90506000194301406000816112896111ec565b848760405160200161129e9493929190611c70565b60408051601f19818403018152919052805160209091012060ff90869006600101169350505050919050565b6040516323b872dd60e01b81526001600160a01b038316906323b872dd906112fa90869030908690600401611c33565b602060405180830381600087803b15801561131457600080fd5b505af1158015611328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134c9190611af6565b6113685760405162461bcd60e51b815260040161043490611d2b565b816001600160a01b0316836001600160a01b03167f39dda5b8a8c7e010975f59f0be906b1f9ea4d755c65431f73d3e593342f3dc87836113a66111ec565b6040516113b492919061216d565b60405180910390a3505050565b600061140383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061168c565b9392505050565b600090815260086020526040902054151590565b6001600160a01b0383166000908152600b60209081526040808320858452909152812080546001909101549091808461145b57508290508161146b565b61146587876116b8565b90925090505b6003546114839033906001600160a01b03168461178d565b600380546001600160a01b039081166000908152600d602052604090208054879003905590548882169116146114de576114be33888361178d565b6001600160a01b0387166000908152600d60205260409020805484900390555b600085156115a657336000818152600c602090815260408083206001600160a01b038d811685529083528184208c855290925291829020600181015460029091015460048054945163e3d8394d60e01b8152929591949093169263e3d8394d9261154f929187918f91889101611c0d565b602060405180830381600087803b15801561156957600080fd5b505af115801561157d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a19190611b2e565b925050505b6001600160a01b038816337f9e2f80d97288876e5089a642e6b44b8e8d38f42267878aa611ecbfea68ea8fed8988888888886115e06111ec565b6040516115f397969594939291906121b4565b60405180910390a36116063389896117bb565b5050505050505050565b60008261161f5750600061121a565b8282028284828161162c57fe5b04146114035760405162461bcd60e51b815260040161043490611f37565b600061140383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611809565b600081848411156116b05760405162461bcd60e51b81526004016104349190611c8b565b505050900390565b6001600160a01b0382166000908152600b60209081526040808320848452909152812054600254829190829061170e906117019061271090610d3b90869063ffffffff61161016565b839063ffffffff6113c116565b6003549091506000906001600160a01b03888116911614611781576001600160a01b0387166000908152600b6020908152604080832089845290915290206001015460025461177d906117709061271090610d3b90859063ffffffff61161016565b829063ffffffff6113c116565b9150505b90969095509350505050565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906112fa9086908590600401611c57565b6001600160a01b039283166000908152600c60209081526040808320949095168252928352838120918152915290812081815560018101829055600281018290556003810182905560040155565b6000818361182a5760405162461bcd60e51b81526004016104349190611c8b565b50600083858161183657fe5b0495945050505050565b828054828255906000526020600020908101928215611895579160200282015b8281111561189557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611860565b506118a19291506118ec565b5090565b8280548282559060005260206000209081019282156118e0579160200282015b828111156118e05782518255916020019190600101906118c5565b506118a1929150611910565b610bf991905b808211156118a15780546001600160a01b03191681556001016118f2565b610bf991905b808211156118a15760008155600101611916565b80356001600160a01b038116811461121a57600080fd5b600082601f830112611951578081fd5b813561196461195f8261220b565b6121e4565b81815291506020808301908481018184028601820187101561198557600080fd5b60005b848110156119a457813584529282019290820190600101611988565b505050505092915050565b6000602082840312156119c0578081fd5b611403838361192a565b6000806000606084860312156119de578182fd5b83356119e98161222b565b925060208401356119f98161222b565b929592945050506040919091013590565b60008060408385031215611a1c578182fd5b611a26848461192a565b946020939093013593505050565b60008060408385031215611a46578182fd5b823567ffffffffffffffff80821115611a5d578384fd5b81850186601f820112611a6e578485fd5b80359250611a7e61195f8461220b565b80848252602080830192508084018a828389028701011115611a9e578889fd5b8894505b86851015611ac857611ab48b8261192a565b845260019490940193928101928101611aa2565b509096508701359350505080821115611adf578283fd5b50611aec85828601611941565b9150509250929050565b600060208284031215611b07578081fd5b81518015158114611403578182fd5b600060208284031215611b27578081fd5b5035919050565b600060208284031215611b3f578081fd5b5051919050565b600080600080600060a08688031215611b5d578081fd5b85359450611b6e876020880161192a565b94979496505050506040830135926060810135926080909101359150565b60008060408385031215611b9e578182fd5b50508035926020909101359150565b600080600060608486031215611bc1578283fd5b505081359360208301359350604090920135919050565b600060208284031215611be9578081fd5b813560ff81168114611403578182fd5b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b93845260208401929092526040830152606082015260800190565b6000602080835283518082850152825b81811015611cb757858101830151858201604001528201611c9b565b81811115611cc85783604083870101525b50601f01601f1916929092016040019392505050565b6020808252602d908201527f416c6f68615374616b696e673a2041646472657373206e6f74207374616b657360408201526c081a5b881d1a1a5cc81c1bdbdb609a1b606082015260800190565b6020808252601c908201527f4d75737420617070726f76652074686520455243323020666972737400000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602c908201527f416c6f68615374616b696e673a2050657263656e7461676573206c656e67687460408201526b206d6f7265207468656e203360a01b606082015260800190565b6020808252602c908201527f416c6f68615374616b696e673a2044657374696e61746f7273206c656e67687460408201526b206d6f7265207468656e203360a01b606082015260800190565b60208082526029908201527f416c6f68615374616b696e673a2050657263656e74616765732073756d206d7560408201526807374206265203130360bc1b606082015260800190565b60208082526038908201527f416c6f68615374616b696e673a20506f6f6c20666f7220455243323020546f6b60408201527f656e20616e6420726172697479206e6f74206578697374730000000000000000606082015260800190565b60208082526031908201527f416c6f68615374616b696e673a204164647265737320616c7265616479207374604082015270185ad95cc81a5b881d1a1a5cc81c1bdbdb607a1b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602d908201527f416c6f68615374616b696e673a20496d61676520666f7220726577617264206160408201526c6c72656164792065786973747360981b606082015260800190565b6020808252602e908201527f416c6f68615374616b696e673a205374616b65206475726174696f6e2068617360408201526d081b9bdd08195b991959081e595d60921b606082015260800190565b60208082526026908201527f416c6f68615374616b696e673a20526172697479206d75737420626520312c2060408201526532206f72203360d01b606082015260800190565b60208082526022908201527f416c6f68615374616b696e673a20526172697479206e6f7420617661696c61626040820152616c6560f01b606082015260800190565b6020808252603e908201527f416c6f68615374616b696e673a2044657374696e61746f727320616e6420706560408201527f7263656e74616765736c656e67687420617265206e6f7420657175616c730000606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b948552602085019390935260408401919091526060830152608082015260a00190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b60405181810167ffffffffffffffff8111828210171561220357600080fd5b604052919050565b600067ffffffffffffffff821115612221578081fd5b5060209081020190565b6001600160a01b03811681146105d357600080fdfea26469706673582212203ea24b339020b92d324fd83aae624855fcf48b340f379f98753381b6067500e264736f6c63430006050033000000000000000000000000455f7ef6d8bcfc35f9337e85aee1b0600a59fabe0000000000000000000000009ad18b012bf83e3b0ccabcfa3d74a9bfb6889c770000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000012c

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806374c83ab811610104578063af57b4e4116100a2578063e0ab764911610071578063e0ab7649146103b3578063e4a0edb0146103c6578063ed4c1e3e146103d9578063f2fde38b146103ec576101cf565b8063af57b4e41461037d578063cc66473314610390578063dcc85630146103a3578063ddca3f43146103ab576101cf565b80638ead17df116100de5780638ead17df146103315780639586befc146103445780639bfd8d61146103575780639f00f3551461036a576101cf565b806374c83ab8146103035780637dbedad5146103165780638da5cb5b14610329576101cf565b80634a0805b01161017157806356793bc71161014b57806356793bc7146102a157806369fe0e2d146102c4578063715018a6146102d7578063729ae5f7146102df576101cf565b80634a0805b0146102685780634bbec1ce1461027b5780634c5879df1461028e576101cf565b806323505c4a116101ad57806323505c4a146102255780632af7c5c51461023a5780632bfc4eaa1461024d5780633f54acef14610260576101cf565b8063013e00c5146101d45780631230e161146101e95780631a8812bd146101fc575b600080fd5b6101e76101e2366004611bad565b6103ff565b005b6101e76101f7366004611bd8565b61050e565b61020f61020a366004611b16565b610554565b60405161021c9190612164565b60405180910390f35b61022d610566565b60405161021c9190611bf9565b61020f610248366004611b16565b610575565b61022d61025b366004611b16565b610587565b61022d6105ae565b6101e7610276366004611b16565b6105bd565b61020f610289366004611b16565b6105d6565b6101e761029c366004611a0a565b6105f4565b6102b46102af366004611a0a565b61092d565b60405161021c9493929190611c70565b6101e76102d2366004611b16565b61095f565b6101e7610999565b6102f26102ed3660046119ca565b610a18565b60405161021c959493929190612191565b61020f6103113660046119af565b610a58565b6101e7610324366004611b8c565b610b1c565b61022d610bec565b6101e761033f366004611a0a565b610bfc565b6101e7610352366004611b16565b610c87565b61020f6103653660046119af565b610c9d565b6101e76103783660046119af565b610caf565b6101e761038b366004611b46565b610dc4565b61020f61039e366004611b8c565b610edf565b61020f610f0d565b61020f610f13565b6101e76103c1366004611a0a565b610f19565b6101e76103d4366004611b16565b610ffc565b6101e76103e7366004611a34565b611012565b6101e76103fa3660046119af565b611132565b6104076111e8565b6000546001600160a01b0390811691161461043d5760405162461bcd60e51b815260040161043490611f78565b60405180910390fd5b6000818152600a6020526040902054819061046a5760405162461bcd60e51b81526004016104349061208e565b604080516080810182528581526000602080830182815283850188815260608501888152600380546001600160a01b03168652600b85528786208a8752909452958420945185559051600185015551600284015592519190920155847fed11b82c749170a371e37a9faea7ec5c4ef5b37083d20a458a8557262dce8e5085856104f16111ec565b6040516105009392919061217b565b60405180910390a350505050565b6105166111e8565b6000546001600160a01b039081169116146105435760405162461bcd60e51b815260040161043490611f78565b6005805460ff909216919091019055565b60086020526000908152604090205481565b6003546001600160a01b031681565b600a6020526000908152604090205481565b6006818154811061059457fe5b6000918252602090912001546001600160a01b0316905081565b6004546001600160a01b031681565b6003546105d3906001600160a01b031682610f19565b50565b600781815481106105e357fe5b600091825260209091200154905081565b6000818152600a602052604090205481906106215760405162461bcd60e51b81526004016104349061208e565b828261062d82826111f0565b6106495760405162461bcd60e51b815260040161043490611e89565b336000818152600c602090815260408083206001600160a01b038a168452825280832088845290915290205486908690156106965760405162461bcd60e51b815260040161043490611ee6565b6000878152600960209081526040808320600a9092528220546001906106bb90611220565b0360ff16815481106106c957fe5b60009182526020808320909101546001600160a01b038c168352600b825260408084208c8552909252908220600201549092506107046111ec565b0190506000610714600554611272565b90506000600b60008d6001600160a01b03166001600160a01b0316815260200190815260200160002060008c81526020019081526020016000206000015490506000600b60008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008d81526020019081526020016000206001015490506107b233600360009054906101000a90046001600160a01b0316846112ca565b600380546001600160a01b039081166000908152600d6020526040902080548501905590548e821691161461080b576107ec338e836112ca565b6001600160a01b038d166000908152600d602052604090208054820190555b6040518060a0016040528085815260200186815260200184815260200183815260200182815250600c6000336001600160a01b03166001600160a01b0316815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002060008e815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508c6001600160a01b0316336001600160a01b03167ff2760ce282eaf68c77ca7d18f9560ed8c991e4c3cec3a7b8a912ad4ffe6456998e87898888886109036111ec565b60405161091697969594939291906121b4565b60405180910390a350505050505050505050505050565b600b60209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b6109676111e8565b6000546001600160a01b039081169116146109945760405162461bcd60e51b815260040161043490611f78565b600255565b6109a16111e8565b6000546001600160a01b039081169116146109ce5760405162461bcd60e51b815260040161043490611f78565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600c602090815260009384526040808520825292845282842090528252902080546001820154600283015460038401546004909401549293919290919085565b600080826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610a879190611bf9565b60206040518083038186803b158015610a9f57600080fd5b505afa158015610ab3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad79190611b2e565b90508015610b11576001600160a01b0383166000908152600d6020526040902054610b0990829063ffffffff6113c116565b915050610b17565b60009150505b919050565b610b246111e8565b6000546001600160a01b03908116911614610b515760405162461bcd60e51b815260040161043490611f78565b81610b5b8161140a565b15610b785760405162461bcd60e51b815260040161043490611fad565b8160018110158015610b8b575060038111155b610ba75760405162461bcd60e51b815260040161043490612048565b50506000828152600860209081526040808320849055838352600982528083208054600181810183559185528385200195909555928252600a90522080549091019055565b6000546001600160a01b03165b90565b60026001541415610c1f5760405162461bcd60e51b81526004016104349061212d565b6002600155336000818152600c602090815260408083206001600160a01b0387168452825280832085845290915290205483908390610c705760405162461bcd60e51b815260040161043490611cde565b610c7c8585600061141e565b505060018055505050565b6003546105d3906001600160a01b031682610bfc565b600d6020526000908152604090205481565b6000610cba82610a58565b905060005b60065460ff82161015610dbf57826001600160a01b031663a9059cbb60068360ff1681548110610ceb57fe5b9060005260206000200160009054906101000a90046001600160a01b0316610d476064610d3b60078760ff1681548110610d2157fe5b90600052602060002001548861161090919063ffffffff16565b9063ffffffff61164a16565b6040518363ffffffff1660e01b8152600401610d64929190611c57565b602060405180830381600087803b158015610d7e57600080fd5b505af1158015610d92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db69190611af6565b50600101610cbf565b505050565b610dcc6111e8565b6000546001600160a01b03908116911614610df95760405162461bcd60e51b815260040161043490611f78565b6000818152600a60205260409020548190610e265760405162461bcd60e51b81526004016104349061208e565b6001600160a01b038516610e3957600080fd5b604080516080810182528781526020808201878152828401878152606084018781526001600160a01b038b166000908152600b85528681208982529094529490922092518355516001830155516002820155905160039091015583867fed11b82c749170a371e37a9faea7ec5c4ef5b37083d20a458a8557262dce8e508585610ec06111ec565b604051610ecf9392919061217b565b60405180910390a3505050505050565b60096020528160005260406000208181548110610ef857fe5b90600052602060002001600091509150505481565b60055481565b60025481565b60026001541415610f3c5760405162461bcd60e51b81526004016104349061212d565b6002600155336000818152600c602090815260408083206001600160a01b0387168452825280832085845290915290205483908390610f8d5760405162461bcd60e51b815260040161043490611cde565b336000818152600c602090815260408083206001600160a01b038a168452825280832088845290915290205486908690610fc56111ec565b11610fe25760405162461bcd60e51b815260040161043490611ffa565b610fee8888600161141e565b505060018055505050505050565b6003546105d3906001600160a01b0316826105f4565b61101a6111e8565b6000546001600160a01b039081169116146110475760405162461bcd60e51b815260040161043490611f78565b6003825111156110695760405162461bcd60e51b815260040161043490611df4565b60038151111561108b5760405162461bcd60e51b815260040161043490611da8565b80518251146110ac5760405162461bcd60e51b8152600401610434906120d0565b6000805b82518160ff1610156110e457828160ff16815181106110cb57fe5b60200260200101518201915080806001019150506110b0565b50806064146111055760405162461bcd60e51b815260040161043490611e40565b8251611118906006906020860190611840565b50815161112c9060079060208501906118a5565b50505050565b61113a6111e8565b6000546001600160a01b039081169116146111675760405162461bcd60e51b815260040161043490611f78565b6001600160a01b03811661118d5760405162461bcd60e51b815260040161043490611d62565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b4290565b6001600160a01b0382166000908152600b6020908152604080832084845290915290206002015415155b92915050565b6000805a9050600060014303409050600081600554848760405160200161124a9493929190611c70565b60408051601f1981840301815291905280516020909101208590066001019350505050919050565b6000805a90506000194301406000816112896111ec565b848760405160200161129e9493929190611c70565b60408051601f19818403018152919052805160209091012060ff90869006600101169350505050919050565b6040516323b872dd60e01b81526001600160a01b038316906323b872dd906112fa90869030908690600401611c33565b602060405180830381600087803b15801561131457600080fd5b505af1158015611328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134c9190611af6565b6113685760405162461bcd60e51b815260040161043490611d2b565b816001600160a01b0316836001600160a01b03167f39dda5b8a8c7e010975f59f0be906b1f9ea4d755c65431f73d3e593342f3dc87836113a66111ec565b6040516113b492919061216d565b60405180910390a3505050565b600061140383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061168c565b9392505050565b600090815260086020526040902054151590565b6001600160a01b0383166000908152600b60209081526040808320858452909152812080546001909101549091808461145b57508290508161146b565b61146587876116b8565b90925090505b6003546114839033906001600160a01b03168461178d565b600380546001600160a01b039081166000908152600d602052604090208054879003905590548882169116146114de576114be33888361178d565b6001600160a01b0387166000908152600d60205260409020805484900390555b600085156115a657336000818152600c602090815260408083206001600160a01b038d811685529083528184208c855290925291829020600181015460029091015460048054945163e3d8394d60e01b8152929591949093169263e3d8394d9261154f929187918f91889101611c0d565b602060405180830381600087803b15801561156957600080fd5b505af115801561157d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a19190611b2e565b925050505b6001600160a01b038816337f9e2f80d97288876e5089a642e6b44b8e8d38f42267878aa611ecbfea68ea8fed8988888888886115e06111ec565b6040516115f397969594939291906121b4565b60405180910390a36116063389896117bb565b5050505050505050565b60008261161f5750600061121a565b8282028284828161162c57fe5b04146114035760405162461bcd60e51b815260040161043490611f37565b600061140383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611809565b600081848411156116b05760405162461bcd60e51b81526004016104349190611c8b565b505050900390565b6001600160a01b0382166000908152600b60209081526040808320848452909152812054600254829190829061170e906117019061271090610d3b90869063ffffffff61161016565b839063ffffffff6113c116565b6003549091506000906001600160a01b03888116911614611781576001600160a01b0387166000908152600b6020908152604080832089845290915290206001015460025461177d906117709061271090610d3b90859063ffffffff61161016565b829063ffffffff6113c116565b9150505b90969095509350505050565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906112fa9086908590600401611c57565b6001600160a01b039283166000908152600c60209081526040808320949095168252928352838120918152915290812081815560018101829055600281018290556003810182905560040155565b6000818361182a5760405162461bcd60e51b81526004016104349190611c8b565b50600083858161183657fe5b0495945050505050565b828054828255906000526020600020908101928215611895579160200282015b8281111561189557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611860565b506118a19291506118ec565b5090565b8280548282559060005260206000209081019282156118e0579160200282015b828111156118e05782518255916020019190600101906118c5565b506118a1929150611910565b610bf991905b808211156118a15780546001600160a01b03191681556001016118f2565b610bf991905b808211156118a15760008155600101611916565b80356001600160a01b038116811461121a57600080fd5b600082601f830112611951578081fd5b813561196461195f8261220b565b6121e4565b81815291506020808301908481018184028601820187101561198557600080fd5b60005b848110156119a457813584529282019290820190600101611988565b505050505092915050565b6000602082840312156119c0578081fd5b611403838361192a565b6000806000606084860312156119de578182fd5b83356119e98161222b565b925060208401356119f98161222b565b929592945050506040919091013590565b60008060408385031215611a1c578182fd5b611a26848461192a565b946020939093013593505050565b60008060408385031215611a46578182fd5b823567ffffffffffffffff80821115611a5d578384fd5b81850186601f820112611a6e578485fd5b80359250611a7e61195f8461220b565b80848252602080830192508084018a828389028701011115611a9e578889fd5b8894505b86851015611ac857611ab48b8261192a565b845260019490940193928101928101611aa2565b509096508701359350505080821115611adf578283fd5b50611aec85828601611941565b9150509250929050565b600060208284031215611b07578081fd5b81518015158114611403578182fd5b600060208284031215611b27578081fd5b5035919050565b600060208284031215611b3f578081fd5b5051919050565b600080600080600060a08688031215611b5d578081fd5b85359450611b6e876020880161192a565b94979496505050506040830135926060810135926080909101359150565b60008060408385031215611b9e578182fd5b50508035926020909101359150565b600080600060608486031215611bc1578283fd5b505081359360208301359350604090920135919050565b600060208284031215611be9578081fd5b813560ff81168114611403578182fd5b6001600160a01b0391909116815260200190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b93845260208401929092526040830152606082015260800190565b6000602080835283518082850152825b81811015611cb757858101830151858201604001528201611c9b565b81811115611cc85783604083870101525b50601f01601f1916929092016040019392505050565b6020808252602d908201527f416c6f68615374616b696e673a2041646472657373206e6f74207374616b657360408201526c081a5b881d1a1a5cc81c1bdbdb609a1b606082015260800190565b6020808252601c908201527f4d75737420617070726f76652074686520455243323020666972737400000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602c908201527f416c6f68615374616b696e673a2050657263656e7461676573206c656e67687460408201526b206d6f7265207468656e203360a01b606082015260800190565b6020808252602c908201527f416c6f68615374616b696e673a2044657374696e61746f7273206c656e67687460408201526b206d6f7265207468656e203360a01b606082015260800190565b60208082526029908201527f416c6f68615374616b696e673a2050657263656e74616765732073756d206d7560408201526807374206265203130360bc1b606082015260800190565b60208082526038908201527f416c6f68615374616b696e673a20506f6f6c20666f7220455243323020546f6b60408201527f656e20616e6420726172697479206e6f74206578697374730000000000000000606082015260800190565b60208082526031908201527f416c6f68615374616b696e673a204164647265737320616c7265616479207374604082015270185ad95cc81a5b881d1a1a5cc81c1bdbdb607a1b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602d908201527f416c6f68615374616b696e673a20496d61676520666f7220726577617264206160408201526c6c72656164792065786973747360981b606082015260800190565b6020808252602e908201527f416c6f68615374616b696e673a205374616b65206475726174696f6e2068617360408201526d081b9bdd08195b991959081e595d60921b606082015260800190565b60208082526026908201527f416c6f68615374616b696e673a20526172697479206d75737420626520312c2060408201526532206f72203360d01b606082015260800190565b60208082526022908201527f416c6f68615374616b696e673a20526172697479206e6f7420617661696c61626040820152616c6560f01b606082015260800190565b6020808252603e908201527f416c6f68615374616b696e673a2044657374696e61746f727320616e6420706560408201527f7263656e74616765736c656e67687420617265206e6f7420657175616c730000606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b948552602085019390935260408401919091526060830152608082015260a00190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b60405181810167ffffffffffffffff8111828210171561220357600080fd5b604052919050565b600067ffffffffffffffff821115612221578081fd5b5060209081020190565b6001600160a01b03811681146105d357600080fdfea26469706673582212203ea24b339020b92d324fd83aae624855fcf48b340f379f98753381b6067500e264736f6c63430006050033

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

000000000000000000000000455f7ef6d8bcfc35f9337e85aee1b0600a59fabe0000000000000000000000009ad18b012bf83e3b0ccabcfa3d74a9bfb6889c770000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000012c

-----Decoded View---------------
Arg [0] : _alohaERC20 (address): 0x455F7Ef6D8BCfc35f9337e85aEe1B0600a59FabE
Arg [1] : _alohaERC721 (address): 0x9aD18b012bf83E3b0ccAbcFa3d74A9BfB6889c77
Arg [2] : _backgrounds (uint256): 3
Arg [3] : _fee (uint256): 300

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000455f7ef6d8bcfc35f9337e85aee1b0600a59fabe
Arg [1] : 0000000000000000000000009ad18b012bf83e3b0ccabcfa3d74a9bfb6889c77
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [3] : 000000000000000000000000000000000000000000000000000000000000012c


Deployed Bytecode Sourcemap

14681:17217:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14681:17217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;23828:570:0;;;;;;;;;:::i;:::-;;25330:123;;;;;;;;;:::i;16395:46::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;15820:25;;;:::i;:::-;;;;;;;;16563:55;;;;;;;;;:::i;15918:32::-;;;;;;;;;:::i;15852:26::-;;;:::i;20997:140::-;;;;;;;;;:::i;15957:32::-;;;;;;;;;:::i;19362:1533::-;;;;;;;;;:::i;16664:61::-;;;;;;;;;:::i;:::-;;;;;;;;;;;23189:78;;;;;;;;;:::i;2778:148::-;;;:::i;16788:85::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;22344:276;;;;;;;;;:::i;23360:367::-;;;;;;;;;:::i;2136:79::-;;;:::i;21978:265::-;;;;;;;;;:::i;21692:150::-;;;;;;;;;:::i;16917:47::-;;;;;;;;;:::i;22725:360::-;;;;;;;;;:::i;24505:714::-;;;;;;;;;:::i;16474:52::-;;;;;;;;;:::i;15885:26::-;;;:::i;15795:18::-;;;:::i;21245:318::-;;;;;;;;;:::i;19128:134::-;;;;;;;;;:::i;25549:792::-;;;;;;;;;:::i;3081:244::-;;;;;;;;;:::i;23828:570::-;2358:12;:10;:12::i;:::-;2348:6;;-1:-1:-1;;;;;2348:6:0;;;:22;;;2340:67;;;;-1:-1:-1;;;2340:67:0;;;;;;;;;;;;;;;;;17680:28:::1;::::0;;;:19:::1;:28;::::0;;;;;24010:12;;17656:120:::1;;;;-1:-1:-1::0;;;17656:120:0::1;;;;;;;;;24077:155:::2;::::0;;::::2;::::0;::::2;::::0;;;;;-1:-1:-1;24077:155:0::2;::::0;;::::2;::::0;;;;;;;;;;;;;;;24049:10:::2;::::0;;-1:-1:-1;;;;;24049:10:0::2;24040:20:::0;;:8:::2;:20:::0;;;;;:34;;;;;;;;;:192;;;;;;24049:10;24040:192;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;24110:12;24250:140:::2;24176:9:::0;24208:12;24369:10:::2;:8;:10::i;:::-;24250:140;;;;;;;;;;;;;;;;;2418:1:::1;23828:570:::0;;;:::o;25330:123::-;2358:12;:10;:12::i;:::-;2348:6;;-1:-1:-1;;;;;2348:6:0;;;:22;;;2340:67;;;;-1:-1:-1;;;2340:67:0;;;;;;;;;25422:11:::1;:23:::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;25330:123::o;16395:46::-;;;;;;;;;;;;;:::o;15820:25::-;;;-1:-1:-1;;;;;15820:25:0;;:::o;16563:55::-;;;;;;;;;;;;;:::o;15918:32::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15918:32:0;;-1:-1:-1;15918:32:0;:::o;15852:26::-;;;-1:-1:-1;;;;;15852:26:0;;:::o;20997:140::-;21104:10;;21091:38;;-1:-1:-1;;;;;21104:10:0;21116:12;21091;:38::i;:::-;20997:140;:::o;15957:32::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15957:32:0;:::o;19362:1533::-;17680:28;;;;:19;:28;;;;;;19490:12;;17656:120;;;;-1:-1:-1;;;17656:120:0;;;;;;;;;19524:11:::1;19537:12;17465:28;17477:6;17485:7;17465:11;:28::i;:::-;17443:134;;;;-1:-1:-1::0;;;17443:134:0::1;;;;;;;;;19578:10:::2;17918:23;::::0;;;:11:::2;:23;::::0;;;;;;;-1:-1:-1;;;;;17918:31:0;::::2;::::0;;;;;;;:40;;;;;;;;:48;19590:11;;19603:12;;17918:53;17895:154:::2;;;;-1:-1:-1::0;;;17895:154:0::2;;;;;;;;;19633:19:::3;19655:28:::0;;;:14:::3;:28;::::0;;;;;;;19693:19:::3;:33:::0;;;;;;19730:1:::3;::::0;19684:43:::3;::::0;:8:::3;:43::i;:::-;:47;19655:77;;;;;;;;;;;::::0;;;::::3;::::0;;;;;::::3;::::0;-1:-1:-1;;;;;19775:21:0;::::3;::::0;;:8:::3;:21:::0;;;;;;:35;;;;;;;;;:44:::3;;::::0;19655:77;;-1:-1:-1;19762:10:0::3;:8;:10::i;:::-;:57;19743:76;;19830:24;19857:21;19866:11;;19857:8;:21::i;:::-;19830:48;;19891:19;19913:8;:21;19922:11;-1:-1:-1::0;;;;;19913:21:0::3;-1:-1:-1::0;;;;;19913:21:0::3;;;;;;;;;;;;:35;19935:12;19913:35;;;;;;;;;;;:47;;;19891:69;;19971:19;19993:8;:21;20002:11;-1:-1:-1::0;;;;;19993:21:0::3;-1:-1:-1::0;;;;;19993:21:0::3;;;;;;;;;;;;:35;20015:12;19993:35;;;;;;;;;;;:47;;;19971:69;;20053:51;20068:10;20080;;;;;;;;;-1:-1:-1::0;;;;;20080:10:0::3;20092:11;20053:14;:51::i;:::-;20127:10;::::0;;-1:-1:-1;;;;;20127:10:0;;::::3;20115:23;::::0;;;:11:::3;:23;::::0;;;;:38;;;::::3;::::0;;20193:10;;20178:25;;::::3;20193:10:::0;::::3;20178:25;20174:164;;20220:52;20235:10;20247:11;20260;20220:14;:52::i;:::-;-1:-1:-1::0;;;;;20287:24:0;::::3;;::::0;;;:11:::3;:24;::::0;;;;:39;;;::::3;::::0;;20174:164:::3;20403:214;;;;;;;;20433:8;20403:214;;;;20468:11;20403:214;;;;20511:16;20403:214;;;;20555:11;20403:214;;;;20594:11;20403:214;;::::0;20350:11:::3;:23;20362:10;-1:-1:-1::0;;;;;20350:23:0::3;-1:-1:-1::0;;;;;20350:23:0::3;;;;;;;;;;;;:36;20374:11;-1:-1:-1::0;;;;;20350:36:0::3;-1:-1:-1::0;;;;;20350:36:0::3;;;;;;;;;;;;:50;20387:12;20350:50;;;;;;;;;;;:267;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20681:11;-1:-1:-1::0;;;;;20635:252:0::3;20656:10;-1:-1:-1::0;;;;;20635:252:0::3;;20707:12;20734:8;20757:11;20783:16;20814:11;20840;20866:10;:8;:10::i;:::-;20635:252;;;;;;;;;;;;;;;;;;;;;18060:1;;;;;17588::::2;;;17787::::1;;19362:1533:::0;;;:::o;16664:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23189:78::-;2358:12;:10;:12::i;:::-;2348:6;;-1:-1:-1;;;;;2348:6:0;;;:22;;;2340:67;;;;-1:-1:-1;;;2340:67:0;;;;;;;;;23249:3:::1;:10:::0;23189:78::o;2778:148::-;2358:12;:10;:12::i;:::-;2348:6;;-1:-1:-1;;;;;2348:6:0;;;:22;;;2340:67;;;;-1:-1:-1;;;2340:67:0;;;;;;;;;2885:1:::1;2869:6:::0;;2848:40:::1;::::0;-1:-1:-1;;;;;2869:6:0;;::::1;::::0;2848:40:::1;::::0;2885:1;;2848:40:::1;2916:1;2899:19:::0;;-1:-1:-1;;;;;;2899:19:0::1;::::0;;2778:148::o;16788:85::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22344:276::-;22408:7;22428:15;22453:11;-1:-1:-1;;;;;22446:29:0;;22484:4;22446:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22446:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22446:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;22446:44:0;;;;;;;;;22428:62;-1:-1:-1;22507:11:0;;22503:88;;-1:-1:-1;;;;;22554:24:0;;;;;;:11;:24;;;;;;22542:37;;:7;;:37;:11;:37;:::i;:::-;22535:44;;;;;22503:88;22610:1;22603:8;;;22344:276;;;;:::o;23360:367::-;2358:12;:10;:12::i;:::-;2348:6;;-1:-1:-1;;;;;2348:6:0;;;:22;;;2340:67;;;;-1:-1:-1;;;2340:67:0;;;;;;;;;23511:11:::1;17068:21;17082:6;17068:13;:21::i;:::-;17067:22;17045:117;;;;-1:-1:-1::0;;;17045:117:0::1;;;;;;;;;23545:12:::2;17270:1;17259:7;:12;;:28;;;;;17286:1;17275:7;:12;;17259:28;17237:116;;;;-1:-1:-1::0;;;17237:116:0::2;;;;;;;;;-1:-1:-1::0;;23575:23:0::3;::::0;;;:10:::3;:23;::::0;;;;;;;:38;;;23624:28;;;:14:::3;:28:::0;;;;;27:10:-1;;39:1:::3;23:18:::0;;::::3;45:23:::0;;23624:46:0;;;;;;::::3;::::0;;;;23681:33;;;:19:::3;:33:::0;;;:38;;;;::::3;::::0;;23360:367::o;2136:79::-;2174:7;2201:6;-1:-1:-1;;;;;2201:6:0;2136:79;;:::o;21978:265::-;13348:1;13954:7;;:19;;13946:63;;;;-1:-1:-1;;;13946:63:0;;;;;;;;;13348:1;14087:7;:18;22137:10:::1;18189:23;::::0;;;:11:::1;:23;::::0;;;;;;;-1:-1:-1;;;;;18189:31:0;::::1;::::0;;;;;;;:40;;;;;;;;:48;22149:11;;22162:12;;18165:151:::1;;;;-1:-1:-1::0;;;18165:151:0::1;;;;;;;;;22192:43:::2;22202:11;22215:12;22229:5;22192:9;:43::i;:::-;-1:-1:-1::0;;13304:1:0;14266:22;;-1:-1:-1;;;21978:265:0:o;21692:150::-;21809:10;;21791:43;;-1:-1:-1;;;;;21809:10:0;21821:12;21791:17;:43::i;16917:47::-;;;;;;;;;;;;;:::o;22725:360::-;22796:13;22812:30;22830:11;22812:17;:30::i;:::-;22796:46;-1:-1:-1;22868:7:0;22863:215;22885:15;:22;22881:26;;;;22863:215;;;22936:11;-1:-1:-1;;;;;22929:28:0;;22976:15;22992:1;22976:18;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22976:18:0;23013:38;23047:3;23013:29;23023:15;23039:1;23023:18;;;;;;;;;;;;;;;;;;23013:5;:9;;:29;;;;:::i;:::-;:33;:38;:33;:38;:::i;:::-;22929:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22929:137:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22929:137:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;22929:137:0;;;;;;;;;-1:-1:-1;22909:3:0;;22863:215;;;;22725:360;;:::o;24505:714::-;2358:12;:10;:12::i;:::-;2348:6;;-1:-1:-1;;;;;2348:6:0;;;:22;;;2340:67;;;;-1:-1:-1;;;2340:67:0;;;;;;;;;17680:28:::1;::::0;;;:19:::1;:28;::::0;;;;;24748:12;;17656:120:::1;;;;-1:-1:-1::0;;;17656:120:0::1;;;;;;;;;-1:-1:-1::0;;;;;24786:36:0;::::2;24778:45;;12:1:-1;9::::0;2:12:::2;24778:45:0;24876:166;::::0;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;::::2;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24836:23:0;::::2;-1:-1:-1::0;24836:23:0;;;:8:::2;:23:::0;;;;;:37;;;;;;;;;;:206;;;;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;;::::2;::::0;;::::2;::::0;24949:12;24909;25060:151:::2;24986:9:::0;25018:12;25190:10:::2;:8;:10::i;:::-;25060:151;;;;;;;;;;;;;;;;;2418:1:::1;24505:714:::0;;;;;:::o;16474:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15885:26::-;;;;:::o;15795:18::-;;;;:::o;21245:318::-;13348:1;13954:7;;:19;;13946:63;;;;-1:-1:-1;;;13946:63:0;;;;;;;;;13348:1;14087:7;:18;21399:10:::1;18189:23;::::0;;;:11:::1;:23;::::0;;;;;;;-1:-1:-1;;;;;18189:31:0;::::1;::::0;;;;;;;:40;;;;;;;;:48;21411:11;;21424:12;;18165:151:::1;;;;-1:-1:-1::0;;;18165:151:0::1;;;;;;;;;21458:10:::2;18464:23;::::0;;;:11:::2;:23;::::0;;;;;;;-1:-1:-1;;;;;18464:31:0;::::2;::::0;;;;;;;:40;;;;;;;;:48;21470:11;;21483:12;;18451:10:::2;:8;:10::i;:::-;:61;18428:159;;;;-1:-1:-1::0;;;18428:159:0::2;;;;;;;;;21513:42:::3;21523:11;21536:12;21550:4;21513:9;:42::i;:::-;-1:-1:-1::0;;13304:1:0;14266:22;;-1:-1:-1;;;;;;21245:318:0:o;19128:134::-;19229:10;;19219:35;;-1:-1:-1;;;;;19229:10:0;19241:12;19219:9;:35::i;25549:792::-;2358:12;:10;:12::i;:::-;2348:6;;-1:-1:-1;;;;;2348:6:0;;;:22;;;2340:67;;;;-1:-1:-1;;;2340:67:0;;;;;;;;;25763:1:::1;25740:12;:19;:24;;25732:81;;;;-1:-1:-1::0;;;25732:81:0::1;;;;;;;;;25855:1;25832:12;:19;:24;;25824:81;;;;-1:-1:-1::0;;;25824:81:0::1;;;;;;;;;25947:12;:19;25924:12;:19;:42;25916:117;;;;-1:-1:-1::0;;;25916:117:0::1;;;;;;;;;26046:13;::::0;26074:99:::1;26096:12;:19;26092:1;:23;;;26074:99;;;26146:12;26159:1;26146:15;;;;;;;;;;;;;;;;26137:24;;;;26117:3;;;;;;;26074:99;;;;26191:5;26200:3;26191:12;26183:66;;;;-1:-1:-1::0;;;26183:66:0::1;;;;;;;;;26262:30:::0;;::::1;::::0;:15:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;26303:30:0;;::::1;::::0;:15:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;:::-;;2418:1;25549:792:::0;;:::o;3081:244::-;2358:12;:10;:12::i;:::-;2348:6;;-1:-1:-1;;;;;2348:6:0;;;:22;;;2340:67;;;;-1:-1:-1;;;2340:67:0;;;;;;;;;-1:-1:-1;;;;;3170:22:0;::::1;3162:73;;;;-1:-1:-1::0;;;3162:73:0::1;;;;;;;;;3272:6;::::0;;3251:38:::1;::::0;-1:-1:-1;;;;;3251:38:0;;::::1;::::0;3272:6;::::1;::::0;3251:38:::1;::::0;::::1;3300:6;:17:::0;;-1:-1:-1;;;;;;3300:17:0::1;-1:-1:-1::0;;;;;3300:17:0;;;::::1;::::0;;;::::1;::::0;;3081:244::o;657:106::-;745:10;657:106;:::o;26680:93::-;26750:15;26680:93;:::o;26514:158::-;-1:-1:-1;;;;;26620:21:0;;26596:4;26620:21;;;:8;:21;;;;;;;;:30;;;;;;;;:39;;;:44;;26514:158;;;;;:::o;30718:537::-;30775:5;30793:16;30812:9;30793:28;;30832:18;30876:1;30863:12;:14;30853:25;30832:46;;30889:19;30964:10;30993:11;;31023:8;31050:6;30935:136;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;30935:136:0;;;30911:171;;49:4:-1;30911:171:0;;;;31180:26;;;31207:1;31176:33;;-1:-1:-1;;;;30718:537:0;;;:::o;31355:538::-;31412:7;31432:16;31451:9;31432:28;-1:-1:-1;;;31502:12:0;:14;31492:25;31471:18;31492:25;31632:10;:8;:10::i;:::-;31661:8;31688:6;31574:135;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;31574:135:0;;;31550:170;;49:4:-1;31550:170:0;;;;31858:27;31818:26;;;;31845:1;31814:33;31858:27;;-1:-1:-1;;;;31355:538:0;;;:::o;27637:303::-;27773:60;;-1:-1:-1;;;27773:60:0;;-1:-1:-1;;;;;27773:27:0;;;;;:60;;27801:7;;27818:4;;27825:7;;27773:60;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27773:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27773:60:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;27773:60:0;;;;;;;;;27765:101;;;;-1:-1:-1;;;27765:101:0;;;;;;;;;27904:6;-1:-1:-1;;;;;27884:48:0;27895:7;-1:-1:-1;;;;;27884:48:0;;27912:7;27921:10;:8;:10::i;:::-;27884:48;;;;;;;;;;;;;;;;27637:303;;;:::o;4752:136::-;4810:7;4837:43;4841:1;4844;4837:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4830:50;4752:136;-1:-1:-1;;;4752:136:0:o;26379:127::-;26446:4;26470:23;;;:10;:23;;;;;;:28;;;26379:127::o;28958:1648::-;-1:-1:-1;;;;;29080:21:0;;29058:19;29080:21;;;:8;:21;;;;;;;;:35;;;;;;;;:47;;29160;;;;;29080;;29058:19;29307:11;29302:250;;-1:-1:-1;29358:11:0;;-1:-1:-1;29407:11:0;29302:250;;;29498:42;29514:11;29527:12;29498:15;:42::i;:::-;29451:89;;-1:-1:-1;29451:89:0;-1:-1:-1;29302:250:0;29601:10;;29564:70;;29589:10;;-1:-1:-1;;;;;29601:10:0;29613:20;29564:24;:70::i;:::-;29657:10;;;-1:-1:-1;;;;;29657:10:0;;;29645:23;;;;:11;:23;;;;;:38;;;;;;;29715:10;;29700:25;;;29715:10;;29700:25;29696:183;;29742:71;29767:10;29779:11;29792:20;29742:24;:71::i;:::-;-1:-1:-1;;;;;29828:24:0;;;;;;:11;:24;;;;;:39;;;;;;;29696:183;29891:15;29921:329;;;;29981:10;29953:13;29969:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;29969:36:0;;;;;;;;;;;:50;;;;;;;;;;:61;;;;30067:66;;;;;30170:11;;;30160:78;;-1:-1:-1;;;30160:78:0;;29969:61;;30067:66;;30170:11;;;;30160:32;;:78;;29981:10;29969:61;;:50;;30067:66;;30160:78;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30160:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30160:78:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30160:78:0;;;;;;;;;30150:88;;29921:329;;;-1:-1:-1;;;;;30267:268:0;;30292:10;30267:268;30343:12;30370:11;30396;30422:20;30457;30492:7;30514:10;:8;:10::i;:::-;30267:268;;;;;;;;;;;;;;;;;;;;;30548:50;30560:10;30572:11;30585:12;30548:11;:50::i;:::-;28958:1648;;;;;;;;:::o;5642:471::-;5700:7;5945:6;5941:47;;-1:-1:-1;5975:1:0;5968:8;;5941:47;6012:5;;;6016:1;6012;:5;:1;6036:5;;;;;:10;6028:56;;;;-1:-1:-1;;;6028:56:0;;;;;;;;6589:132;6647:7;6674:39;6678:1;6681;6674:39;;;;;;;;;;;;;;;;;:3;:39::i;5191:192::-;5277:7;5313:12;5305:6;;;;5297:29;;;;-1:-1:-1;;;5297:29:0;;;;;;;;;;-1:-1:-1;;;5349:5:0;;;5191:192::o;26846:713::-;-1:-1:-1;;;;;27082:21:0;;26972:29;27082:21;;;:8;:21;;;;;;;;:35;;;;;;;;:47;27203:3;;26972:29;;27082:47;26972:29;;27171:48;;27187:31;;27212:5;;27187:20;;27082:47;;27187:20;:15;:20;:::i;:31::-;27171:11;;:48;:15;:48;:::i;:::-;27294:10;;27140:79;;-1:-1:-1;27230:28:0;;-1:-1:-1;;;;;27279:25:0;;;27294:10;;27279:25;27275:213;;-1:-1:-1;;;;;27343:21:0;;27321:19;27343:21;;;:8;:21;;;;;;;;:35;;;;;;;;:47;;;27460:3;;27428:48;;27444:31;;27469:5;;27444:20;;27343:47;;27444:20;:15;:20;:::i;:31::-;27428:11;;:48;:15;:48;:::i;:::-;27405:71;;27275:213;;27508:20;;;;-1:-1:-1;26846:713:0;-1:-1:-1;;;;26846:713:0:o;28034:294::-;28180:41;;-1:-1:-1;;;28180:41:0;;-1:-1:-1;;;;;28180:23:0;;;;;:41;;28204:7;;28213;;28180:41;;;;28414:461;-1:-1:-1;;;;;28514:19:0;;;28571:1;28514:19;;;:11;:19;;;;;;;;:32;;;;;;;;;;;;:46;;;;;;;;:58;;;28583:57;;;:61;;;28655:62;;;:66;;;28732:58;;;:62;;;28805:58;;:62;28414:461::o;7217:278::-;7303:7;7338:12;7331:5;7323:28;;;;-1:-1:-1;;;7323:28:0;;;;;;;;;;;7362:9;7378:1;7374;:5;;;;;;;7217:278;-1:-1:-1;;;;;7217:278:0:o;14681:17217::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14681:17217:0;-1:-1:-1;;;;;14681:17217:0;;;;;;;;;;;-1:-1:-1;14681:17217:0;;;;;;;-1:-1:-1;14681:17217:0;;;-1:-1:-1;14681:17217:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14681:17217:0;;;-1:-1:-1;14681:17217:0;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;14681:17217:0;;;;;;;;;;;;;;;;;;;;;;;;;5:130:-1;72:20;;-1:-1;;;;;27188:54;;28241:35;;28231:2;;28290:1;;28280:12;893:707;;1010:3;1003:4;995:6;991:17;987:27;977:2;;-1:-1;;1018:12;977:2;1065:6;1052:20;1087:80;1102:64;1159:6;1102:64;;;1087:80;;;1195:21;;;1078:89;-1:-1;1239:4;1252:14;;;;1227:17;;;1341;;;1332:27;;;;1329:36;-1:-1;1326:2;;;1378:1;;1368:12;1326:2;1403:1;1388:206;1413:6;1410:1;1407:13;1388:206;;;1810:20;;1481:50;;1545:14;;;;1573;;;;1435:1;1428:9;1388:206;;;1392:14;;;;;970:630;;;;;2154:241;;2258:2;2246:9;2237:7;2233:23;2229:32;2226:2;;;-1:-1;;2264:12;2226:2;2326:53;2371:7;2347:22;2326:53;;2402:491;;;;2540:2;2528:9;2519:7;2515:23;2511:32;2508:2;;;-1:-1;;2546:12;2508:2;85:6;72:20;97:33;124:5;97:33;;;2598:63;-1:-1;2698:2;2737:22;;72:20;97:33;72:20;97:33;;;2502:391;;2706:63;;-1:-1;;;2806:2;2845:22;;;;1810:20;;2502:391;2900:366;;;3021:2;3009:9;3000:7;2996:23;2992:32;2989:2;;;-1:-1;;3027:12;2989:2;3089:53;3134:7;3110:22;3089:53;;;3079:63;3179:2;3218:22;;;;1810:20;;-1:-1;;;2983:283;3273:638;;;3444:2;3432:9;3423:7;3419:23;3415:32;3412:2;;;-1:-1;;3450:12;3412:2;3508:17;3495:31;3546:18;;3538:6;3535:30;3532:2;;;-1:-1;;3568:12;3532:2;3659:6;3648:9;3644:22;277:3;270:4;262:6;258:17;254:27;244:2;;-1:-1;;285:12;244:2;332:6;319:20;305:34;;354:80;369:64;426:6;369:64;;354:80;440:16;476:6;469:5;462:21;506:4;;523:3;519:14;512:21;;506:4;498:6;494:17;628:3;506:4;;612:6;608:17;498:6;599:27;;596:36;593:2;;;-1:-1;;635:12;593:2;-1:-1;661:10;;655:206;680:6;677:1;674:13;655:206;;;760:37;793:3;781:10;760:37;;;748:50;;702:1;695:9;;;;;812:14;;;;840;;655:206;;;-1:-1;3588:88;;-1:-1;3726:18;;3713:32;;-1:-1;;;3754:30;;;3751:2;;;-1:-1;;3787:12;3751:2;;3817:78;3887:7;3878:6;3867:9;3863:22;3817:78;;;3807:88;;;3406:505;;;;;;3918:257;;4030:2;4018:9;4009:7;4005:23;4001:32;3998:2;;;-1:-1;;4036:12;3998:2;1689:6;1683:13;28387:5;27021:13;27014:21;28365:5;28362:32;28352:2;;-1:-1;;28398:12;4182:241;;4286:2;4274:9;4265:7;4261:23;4257:32;4254:2;;;-1:-1;;4292:12;4254:2;-1:-1;1810:20;;4248:175;-1:-1;4248:175;4430:263;;4545:2;4533:9;4524:7;4520:23;4516:32;4513:2;;;-1:-1;;4551:12;4513:2;-1:-1;1958:13;;4507:186;-1:-1;4507:186;4700:743;;;;;;4872:3;4860:9;4851:7;4847:23;4843:33;4840:2;;;-1:-1;;4879:12;4840:2;1823:6;1810:20;4931:63;;5049:53;5094:7;5031:2;5074:9;5070:22;5049:53;;;4834:609;;5039:63;;-1:-1;;;;5139:2;5178:22;;1810:20;;5247:2;5286:22;;1810:20;;5355:3;5395:22;;;1810:20;;-1:-1;4834:609;5450:366;;;5571:2;5559:9;5550:7;5546:23;5542:32;5539:2;;;-1:-1;;5577:12;5539:2;-1:-1;;1810:20;;;5729:2;5768:22;;;1810:20;;-1:-1;5533:283;5823:491;;;;5961:2;5949:9;5940:7;5936:23;5932:32;5929:2;;;-1:-1;;5967:12;5929:2;-1:-1;;1810:20;;;6119:2;6158:22;;1810:20;;-1:-1;6227:2;6266:22;;;1810:20;;5923:391;-1:-1;5923:391;6321:237;;6423:2;6411:9;6402:7;6398:23;6394:32;6391:2;;;-1:-1;;6429:12;6391:2;2099:6;2086:20;27404:4;28631:5;27393:16;28608:5;28605:33;28595:2;;-1:-1;;28642:12;13519:213;-1:-1;;;;;27188:54;;;;6785:37;;13637:2;13622:18;;13608:124;13739:563;-1:-1;;;;;27188:54;;;;6644:58;;14122:2;14107:18;;6905:37;;;;14205:2;14190:18;;6905:37;14288:2;14273:18;;6905:37;13949:3;13934:19;;13920:382;14309:435;-1:-1;;;;;27188:54;;;6785:37;;27188:54;;;;14647:2;14632:18;;6785:37;14730:2;14715:18;;6905:37;;;;14483:2;14468:18;;14454:290;14751:324;-1:-1;;;;;27188:54;;;;6785:37;;15061:2;15046:18;;6905:37;14897:2;14882:18;;14868:207;15082:547;6905:37;;;15449:2;15434:18;;6905:37;;;;15532:2;15517:18;;6905:37;15615:2;15600:18;;6905:37;15284:3;15269:19;;15255:374;15636:301;;15774:2;;15795:17;15788:47;7099:5;26644:12;26801:6;15774:2;15763:9;15759:18;26789:19;-1:-1;27873:101;27887:6;27884:1;27881:13;27873:101;;;27954:11;;;;;27948:18;27935:11;;;26829:14;27935:11;27928:39;27902:10;;27873:101;;;27989:6;27986:1;27983:13;27980:2;;;-1:-1;26829:14;28045:6;15763:9;28036:16;;28029:27;27980:2;-1:-1;28161:7;28145:14;-1:-1;;28141:28;7257:39;;;;26829:14;7257:39;;15745:192;-1:-1;;;15745:192;15944:407;16135:2;16149:47;;;7533:2;16120:18;;;26789:19;7569:34;26829:14;;;7549:55;-1:-1;;;7624:12;;;7617:37;7673:12;;;16106:245;16358:407;16549:2;16563:47;;;7924:2;16534:18;;;26789:19;7960:30;26829:14;;;7940:51;8010:12;;;16520:245;16772:407;16963:2;16977:47;;;8261:2;16948:18;;;26789:19;8297:34;26829:14;;;8277:55;-1:-1;;;8352:12;;;8345:30;8394:12;;;16934:245;17186:407;17377:2;17391:47;;;8645:2;17362:18;;;26789:19;8681:34;26829:14;;;8661:55;-1:-1;;;8736:12;;;8729:36;8784:12;;;17348:245;17600:407;17791:2;17805:47;;;9035:2;17776:18;;;26789:19;9071:34;26829:14;;;9051:55;-1:-1;;;9126:12;;;9119:36;9174:12;;;17762:245;18014:407;18205:2;18219:47;;;9425:2;18190:18;;;26789:19;9461:34;26829:14;;;9441:55;-1:-1;;;9516:12;;;9509:33;9561:12;;;18176:245;18428:407;18619:2;18633:47;;;9812:2;18604:18;;;26789:19;9848:34;26829:14;;;9828:55;9917:26;9903:12;;;9896:48;9963:12;;;18590:245;18842:407;19033:2;19047:47;;;10214:2;19018:18;;;26789:19;10250:34;26829:14;;;10230:55;-1:-1;;;10305:12;;;10298:41;10358:12;;;19004:245;19256:407;19447:2;19461:47;;;10609:2;19432:18;;;26789:19;10645:34;26829:14;;;10625:55;-1:-1;;;10700:12;;;10693:25;10737:12;;;19418:245;19670:407;19861:2;19875:47;;;19846:18;;;26789:19;11024:34;26829:14;;;11004:55;11078:12;;;19832:245;20084:407;20275:2;20289:47;;;11329:2;20260:18;;;26789:19;11365:34;26829:14;;;11345:55;-1:-1;;;11420:12;;;11413:37;11469:12;;;20246:245;20498:407;20689:2;20703:47;;;11720:2;20674:18;;;26789:19;11756:34;26829:14;;;11736:55;-1:-1;;;11811:12;;;11804:38;11861:12;;;20660:245;20912:407;21103:2;21117:47;;;12112:2;21088:18;;;26789:19;12148:34;26829:14;;;12128:55;-1:-1;;;12203:12;;;12196:30;12245:12;;;21074:245;21326:407;21517:2;21531:47;;;12496:2;21502:18;;;26789:19;12532:34;26829:14;;;12512:55;-1:-1;;;12587:12;;;12580:26;12625:12;;;21488:245;21740:407;21931:2;21945:47;;;12876:2;21916:18;;;26789:19;12912:34;26829:14;;;12892:55;12981:32;12967:12;;;12960:54;13033:12;;;21902:245;22154:407;22345:2;22359:47;;;13284:2;22330:18;;;26789:19;13320:33;26829:14;;;13300:54;13373:12;;;22316:245;22568:213;6905:37;;;22686:2;22671:18;;22657:124;22788:324;6905:37;;;23098:2;23083:18;;6905:37;22934:2;22919:18;;22905:207;23119:435;6905:37;;;23457:2;23442:18;;6905:37;;;;23540:2;23525:18;;6905:37;23293:2;23278:18;;23264:290;24115:659;6905:37;;;24510:2;24495:18;;6905:37;;;;24593:2;24578:18;;6905:37;;;;24676:2;24661:18;;6905:37;24759:3;24744:19;;6905:37;24345:3;24330:19;;24316:458;24781:883;6905:37;;;25232:2;25217:18;;6905:37;;;;25315:2;25300:18;;6905:37;;;;25398:2;25383:18;;6905:37;;;;25481:3;25466:19;;6905:37;25565:3;25550:19;;6905:37;25649:3;25634:19;;6905:37;25067:3;25052:19;;25038:626;25671:256;25733:2;25727:9;25759:17;;;25834:18;25819:34;;25855:22;;;25816:62;25813:2;;;25891:1;;25881:12;25813:2;25733;25900:22;25711:216;;-1:-1;25711:216;25934:304;;26093:18;26085:6;26082:30;26079:2;;;-1:-1;;26115:12;26079:2;-1:-1;26160:4;26148:17;;;26213:15;;26016:222;28182:117;-1:-1;;;;;27188:54;;28241:35;;28231:2;;28290:1;;28280:12

Swarm Source

ipfs://3ea24b339020b92d324fd83aae624855fcf48b340f379f98753381b6067500e2

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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