Contract 0xae845755bC833c5aa89aa67E6413624F65E58764

Contract Overview

Balance:
0 MATIC

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x8cda6a39a7477d44d7b261a719de62b9282552fb4df888639e718b3b21686aebStart262920922022-05-12 4:21:16199 days 10 hrs ago0xc4341dc0561554f924830abd1f8723cc25143347 IN  0xae845755bc833c5aa89aa67e6413624f65e587640 MATIC0.000264925001 2.50000001
0x21403dc26806d6bd7648c7258905611da65cf45638efae0ef3589a8974f6df92Start262918702022-05-12 3:52:18199 days 10 hrs ago0xc4341dc0561554f924830abd1f8723cc25143347 IN  0xae845755bc833c5aa89aa67e6413624f65e587640 MATIC0.000310084751 2.425000011
0xcfd911bf6f2b6775084d15a81c15d7663088de97248fcf1f6981dd0b20acc2d6Start262917712022-05-12 3:33:01199 days 11 hrs ago0x4b6123e6811c27558b5cb96b847b2f22b247bf25 IN  0xae845755bc833c5aa89aa67e6413624f65e587640 MATIC0.019550905001 176.500000016
0xcc86ba3af5e8325f5584b73212c645b0db4c1b742125d75e0f734a31ef486218End262912192022-05-12 2:16:53199 days 12 hrs ago0x4b6123e6811c27558b5cb96b847b2f22b247bf25 IN  0xae845755bc833c5aa89aa67e6413624f65e587640 MATIC0.026284556501 176.500000012
0x782c90b84faf8ce2d5c2637b0b9421775a3f490f80f70d4939bc4f661da81fd5Start262912102022-05-12 2:15:23199 days 12 hrs ago0x4b6123e6811c27558b5cb96b847b2f22b247bf25 IN  0xae845755bc833c5aa89aa67e6413624f65e587640 MATIC0.022564819001 176.500000011
0x157660fe14ca63b5869e68d59794298f5f7b8fd9a4263c052c8b5fe4ae9a2eaaChange Owner262909262022-05-12 1:38:38199 days 12 hrs ago0x4b6123e6811c27558b5cb96b847b2f22b247bf25 IN  0xae845755bc833c5aa89aa67e6413624f65e587640 MATIC0.005094849 176.500000012
0x77f202a6d468b9a8d754a6dee0c365ed0a943a468fdb7d5e6609ffcf21ae70c3Start262908982022-05-12 1:33:58199 days 12 hrs ago0x8c357febf9fc47d82e97a05ff7c73344f235787a IN  0xae845755bc833c5aa89aa67e6413624f65e587640 MATIC0.019548787001 176.500000015
0x9bf0e86ac0389f987515ffd3d023d3760393e1ad2ddc199585f7ac3d154a09a9Start262908512022-05-12 1:26:07199 days 13 hrs ago0x8c357febf9fc47d82e97a05ff7c73344f235787a IN  0xae845755bc833c5aa89aa67e6413624f65e587640 MATIC0.025585087001 176.50000001
0x8ce2a7913e4c3109b1e12ede504244c205fee6e82c8f1b422f57f6a2f4b964e9Start262908322022-05-12 1:22:57199 days 13 hrs ago0x8c357febf9fc47d82e97a05ff7c73344f235787a IN  0xae845755bc833c5aa89aa67e6413624f65e587640 MATIC0.005694243 176.500000008
0x9db5f7125fbf167873cee5ceea3fcdbd43ac7727822e016a2877768d5ad593c20x60806040262907632022-05-12 1:15:46199 days 13 hrs ago0x4b6123e6811c27558b5cb96b847b2f22b247bf25 IN  Create: Stakes0 MATIC0.367097055018 176.500000009
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Stakes

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-05-12
*/

// SPDX-License-Identifier: MIT

/**

██╗    ██╗ █████╗ ████████╗████████╗    ███████╗████████╗ █████╗ ██╗  ██╗███████╗
██║    ██║██╔══██╗╚══██╔══╝╚══██╔══╝    ██╔════╝╚══██╔══╝██╔══██╗██║ ██╔╝██╔════╝
██║ █╗ ██║███████║   ██║      ██║       ███████╗   ██║   ███████║█████╔╝ █████╗  
██║███╗██║██╔══██║   ██║      ██║       ╚════██║   ██║   ██╔══██║██╔═██╗ ██╔══╝  
╚███╔███╔╝██║  ██║   ██║      ██║       ███████║   ██║   ██║  ██║██║  ██╗███████╗
 ╚══╝╚══╝ ╚═╝  ╚═╝   ╚═╝      ╚═╝       ╚══════╝   ╚═╝   ╚═╝  ╚═╝╚═╝  ╚═╝╚══════╝

  WATT Staking contract with maturity time and an annual interest 

*/

pragma solidity ^0.8.2;

/**
 * @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) {
        // Solidity only automatically asserts when dividing by 0
        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;
    }
}

/**
 * @title Owner
 * @dev Set & change owner
 */
contract Owner {

    address private owner;
    
    // event for EVM logging
    event OwnerSet(address indexed oldOwner, address indexed newOwner);
    
    // modifier to check if caller is owner
    modifier isOwner() {
        // If the first argument of 'require' evaluates to 'false', execution terminates and all
        // changes to the state and to Ether balances are reverted.
        // This used to consume all gas in old EVM versions, but not anymore.
        // It is often a good idea to use 'require' to check if functions are called correctly.
        // As a second argument, you can also provide an explanation about what went wrong.
        require(msg.sender == owner, "Caller is not owner");
        _;
    }
    
    /**
     * @dev Set contract deployer as owner
     */
    constructor(address _owner) {
        owner = _owner;
        emit OwnerSet(address(0), owner);
    }

    /**
     * @dev Change owner
     * @param newOwner address of new owner
     */
    function changeOwner(address newOwner) public isOwner {
        emit OwnerSet(owner, newOwner);
        owner = newOwner;
    }

    /**
     * @dev Return owner address 
     * @return address of owner
     */
    function getOwner() public view returns (address) {
        return owner;
    }
}

/**
 * @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].
 */
abstract 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() {
        _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 making 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;
    }
}

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

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

/**
 * @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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

/**
 * 
 * Stakes is an interest gain contract for ERC-20 tokens
 * 
 * assets is the ERC20 token
 * interest_rate: percentage rate
 * maturity is the time in seconds after which is safe to end the stake
 * penalization for ending a stake before maturity time
 * lower_amount is the minimum amount for creating a stake
 * 
 */
contract Stakes is Owner, ReentrancyGuard {

    using SafeMath for uint256;

    // token    
    ERC20 public asset;

    // stakes history
    struct Record {
        uint256 from;
        uint256 amount;
        uint256 gain;
        uint256 penalization;
        uint256 to;
        bool ended;
    }

    // contract parameters
    uint8 public interest_rate;
    uint256 public maturity;
    uint8 public penalization;
    uint256 public lower_amount;

    mapping(address => Record[]) public ledger;

    event StakeStart(address indexed user, uint256 value, uint256 index);
    event StakeEnd(address indexed user, uint256 value, uint256 penalty, uint256 interest, uint256 index);
    
    constructor(ERC20 _erc20, address _owner, uint8 _rate, uint256 _maturity, uint8 _penalization, uint256 _lower) Owner(_owner) {
        require(_penalization<=100, "Penalty has to be an integer between 0 and 100");
        asset = _erc20;
        interest_rate = _rate;
        maturity = _maturity;
        penalization = _penalization;
        lower_amount = _lower;
    }
    
    function start(uint256 _value) external {
        require(_value >= lower_amount, "Invalid value");
        asset.transferFrom(msg.sender, address(this), _value);
        ledger[msg.sender].push(Record(block.timestamp, _value, 0, 0, 0, false));
        emit StakeStart(msg.sender, _value, ledger[msg.sender].length-1);
    }

    function end(uint256 i) external nonReentrant {

        require(i < ledger[msg.sender].length, "Invalid index");
        require(ledger[msg.sender][i].ended==false, "Invalid stake");
        
        // penalization
        if(block.timestamp.sub(ledger[msg.sender][i].from) < maturity) {
            uint256 _penalization = ledger[msg.sender][i].amount.mul(penalization).div(100);
            asset.transfer(msg.sender, ledger[msg.sender][i].amount.sub(_penalization));
            asset.transfer(getOwner(), _penalization);
            ledger[msg.sender][i].penalization = _penalization;
            ledger[msg.sender][i].to = block.timestamp;
            ledger[msg.sender][i].ended = true;
            emit StakeEnd(msg.sender, ledger[msg.sender][i].amount, _penalization, 0, i);
        // interest gained
        } else {
            uint256 _interest = get_gains(msg.sender, i);
            // check that the owner can pay interest before trying to pay
            if (asset.allowance(getOwner(), address(this)) >= _interest && asset.balanceOf(getOwner()) >= _interest) {
                asset.transferFrom(getOwner(), msg.sender, _interest);
            } else {
                _interest = 0;
            }
            asset.transfer(msg.sender, ledger[msg.sender][i].amount);
            ledger[msg.sender][i].gain = _interest;
            ledger[msg.sender][i].to = block.timestamp;
            ledger[msg.sender][i].ended = true;
            emit StakeEnd(msg.sender, ledger[msg.sender][i].amount, 0, _interest, i);
        }
    }

    function set(uint256 _lower, uint256 _maturity, uint8 _rate, uint8 _penalization) public isOwner {
        require(_penalization<=100, "Invalid value");
        lower_amount = _lower;
        maturity = _maturity;
        interest_rate = _rate;
        penalization = _penalization;
    }
    
    // calculate interest to the current date time
    function get_gains(address _address, uint256 _rec_number) public view returns (uint256) {
        uint256 _record_seconds = block.timestamp.sub(ledger[_address][_rec_number].from);
        uint256 _year_seconds = 365*24*60*60;
        return _record_seconds.mul(
            ledger[_address][_rec_number].amount.mul(interest_rate).div(100)
        ).div(_year_seconds);
    }

    function ledger_length(address _address) public view returns (uint256) {
        return ledger[_address].length;
    }

}

Contract ABI

[{"inputs":[{"internalType":"contract ERC20","name":"_erc20","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint8","name":"_rate","type":"uint8"},{"internalType":"uint256","name":"_maturity","type":"uint256"},{"internalType":"uint8","name":"_penalization","type":"uint8"},{"internalType":"uint256","name":"_lower","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"interest","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"StakeEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"StakeStart","type":"event"},{"inputs":[],"name":"asset","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"end","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_rec_number","type":"uint256"}],"name":"get_gains","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"interest_rate","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ledger","outputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"gain","type":"uint256"},{"internalType":"uint256","name":"penalization","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"bool","name":"ended","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"ledger_length","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lower_amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maturity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"penalization","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lower","type":"uint256"},{"internalType":"uint256","name":"_maturity","type":"uint256"},{"internalType":"uint8","name":"_rate","type":"uint8"},{"internalType":"uint8","name":"_penalization","type":"uint8"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162002656380380620026568339818101604052810190620000379190620002fe565b84806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a3506001808190555060648260ff16111562000145576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200013c9062000421565b60405180910390fd5b85600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600260146101000a81548160ff021916908360ff1602179055508260038190555081600460006101000a81548160ff021916908360ff1602179055508060058190555050505050505062000443565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200020882620001db565b9050919050565b60006200021c82620001fb565b9050919050565b6200022e816200020f565b81146200023a57600080fd5b50565b6000815190506200024e8162000223565b92915050565b6200025f81620001fb565b81146200026b57600080fd5b50565b6000815190506200027f8162000254565b92915050565b600060ff82169050919050565b6200029d8162000285565b8114620002a957600080fd5b50565b600081519050620002bd8162000292565b92915050565b6000819050919050565b620002d881620002c3565b8114620002e457600080fd5b50565b600081519050620002f881620002cd565b92915050565b60008060008060008060c087890312156200031e576200031d620001d6565b5b60006200032e89828a016200023d565b96505060206200034189828a016200026e565b95505060406200035489828a01620002ac565b94505060606200036789828a01620002e7565b93505060806200037a89828a01620002ac565b92505060a06200038d89828a01620002e7565b9150509295509295509295565b600082825260208201905092915050565b7f50656e616c74792068617320746f20626520616e20696e74656765722062657460008201527f7765656e203020616e6420313030000000000000000000000000000000000000602082015250565b600062000409602e836200039a565b91506200041682620003ab565b604082019050919050565b600060208201905081810360008301526200043c81620003fa565b9050919050565b61220380620004536000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063893d20e81161008c578063aa4c0dd911610066578063aa4c0dd9146101f3578063b7f8f9ea14610223578063cb63dce814610253578063cbb3d8081461026f576100cf565b8063893d20e81461019d57806395805dad146101bb578063a6f9dae1146101d7576100cf565b80630ad24528146100d45780630c98c9c1146100f0578063204f83f91461010e57806338d52e0f1461012c57806357ca87401461014a57806374f1ca3a14610168575b600080fd5b6100ee60048036038101906100e991906117fa565b61028d565b005b6100f8610e7a565b6040516101059190611836565b60405180910390f35b610116610e80565b6040516101239190611836565b60405180910390f35b610134610e86565b60405161014191906118d0565b60405180910390f35b610152610eac565b60405161015f9190611907565b60405180910390f35b610182600480360381019061017d9190611960565b610ebf565b604051610194969594939291906119bb565b60405180910390f35b6101a5610f25565b6040516101b29190611a2b565b60405180910390f35b6101d560048036038101906101d091906117fa565b610f4e565b005b6101f160048036038101906101ec9190611a46565b6111d5565b005b61020d60048036038101906102089190611a46565b611320565b60405161021a9190611836565b60405180910390f35b61023d60048036038101906102389190611960565b61136c565b60405161024a9190611836565b60405180910390f35b61026d60048036038101906102689190611a9f565b6114b7565b005b6102776115d6565b6040516102849190611907565b60405180910390f35b600260015414156102d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102ca90611b63565b60405180910390fd5b6002600181905550600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811061035f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035690611bcf565b60405180910390fd5b60001515600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106103b4576103b3611bef565b5b906000526020600020906006020160050160009054906101000a900460ff16151514610415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040c90611c6a565b60405180910390fd5b60035461048d600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061046c5761046b611bef565b5b906000526020600020906006020160000154426115e990919063ffffffff16565b101561091257600061052f6064610521600460009054906101000a900460ff1660ff16600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020868154811061050157610500611bef565b5b90600052602060002090600602016001015461163390919063ffffffff16565b6116ae90919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336105e584600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002087815481106105c5576105c4611bef565b5b9060005260206000209060060201600101546115e990919063ffffffff16565b6040518363ffffffff1660e01b8152600401610602929190611c8a565b602060405180830381600087803b15801561061c57600080fd5b505af1158015610630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106549190611cdf565b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61069b610f25565b836040518363ffffffff1660e01b81526004016106b9929190611c8a565b602060405180830381600087803b1580156106d357600080fd5b505af11580156106e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070b9190611cdf565b5080600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061075e5761075d611bef565b5b90600052602060002090600602016003018190555042600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106107c5576107c4611bef565b5b9060005260206000209060060201600401819055506001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061082d5761082c611bef565b5b906000526020600020906006020160050160006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f1deb31f039e2645a4e97af07659090228d39e7f992bfaf37af3838ad9665e23a600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106108de576108dd611bef565b5b906000526020600020906006020160010154836000866040516109049493929190611d47565b60405180910390a250610e70565b600061091e338361136c565b905080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e610967610f25565b306040518363ffffffff1660e01b8152600401610985929190611d8c565b60206040518083038186803b15801561099d57600080fd5b505afa1580156109b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d59190611dca565b10158015610a94575080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610a25610f25565b6040518263ffffffff1660e01b8152600401610a419190611a2b565b60206040518083038186803b158015610a5957600080fd5b505afa158015610a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a919190611dca565b10155b15610b5757600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd610adf610f25565b33846040518463ffffffff1660e01b8152600401610aff93929190611df7565b602060405180830381600087803b158015610b1957600080fd5b505af1158015610b2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b519190611cdf565b50610b5c565b600090505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110610bec57610beb611bef565b5b9060005260206000209060060201600101546040518363ffffffff1660e01b8152600401610c1b929190611c8a565b602060405180830381600087803b158015610c3557600080fd5b505af1158015610c49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6d9190611cdf565b5080600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110610cc057610cbf611bef565b5b90600052602060002090600602016002018190555042600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110610d2757610d26611bef565b5b9060005260206000209060060201600401819055506001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110610d8f57610d8e611bef565b5b906000526020600020906006020160050160006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f1deb31f039e2645a4e97af07659090228d39e7f992bfaf37af3838ad9665e23a600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110610e4057610e3f611bef565b5b90600052602060002090600602016001015460008486604051610e669493929190611e2e565b60405180910390a2505b6001808190555050565b60055481565b60035481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900460ff1681565b60066020528160005260406000208181548110610edb57600080fd5b9060005260206000209060060201600091509150508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16905086565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600554811015610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a90611ebf565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401610ff293929190611df7565b602060405180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110449190611cdf565b50600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060c00160405280428152602001838152602001600081526020016000815260200160008152602001600015158152509080600181540180825580915050600190039060005260206000209060060201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555050503373ffffffffffffffffffffffffffffffffffffffff167f01030a23696d25d6138e45b2944d465c807d48422a2700ae29527f92b6cb439c826001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506111bc9190611f0e565b6040516111ca929190611f42565b60405180910390a250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125a90611fb7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b6000806113e4600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106113c3576113c2611bef565b5b906000526020600020906006020160000154426115e990919063ffffffff16565b905060006301e1338090506114ad8161149f6114906064611482600260149054906101000a900460ff1660ff16600660008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208b8154811061146257611461611bef565b5b90600052602060002090600602016001015461163390919063ffffffff16565b6116ae90919063ffffffff16565b8561163390919063ffffffff16565b6116ae90919063ffffffff16565b9250505092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90611fb7565b60405180910390fd5b60648160ff16111561158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390611ebf565b60405180910390fd5b836005819055508260038190555081600260146101000a81548160ff021916908360ff16021790555080600460006101000a81548160ff021916908360ff16021790555050505050565b600260149054906101000a900460ff1681565b600061162b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506116f8565b905092915050565b60008083141561164657600090506116a8565b600082846116549190611fd7565b90508284826116639190612060565b146116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90612103565b60405180910390fd5b809150505b92915050565b60006116f083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061175c565b905092915050565b6000838311158290611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173791906121ab565b60405180910390fd5b506000838561174f9190611f0e565b9050809150509392505050565b600080831182906117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a91906121ab565b60405180910390fd5b50600083856117b29190612060565b9050809150509392505050565b600080fd5b6000819050919050565b6117d7816117c4565b81146117e257600080fd5b50565b6000813590506117f4816117ce565b92915050565b6000602082840312156118105761180f6117bf565b5b600061181e848285016117e5565b91505092915050565b611830816117c4565b82525050565b600060208201905061184b6000830184611827565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061189661189161188c84611851565b611871565b611851565b9050919050565b60006118a88261187b565b9050919050565b60006118ba8261189d565b9050919050565b6118ca816118af565b82525050565b60006020820190506118e560008301846118c1565b92915050565b600060ff82169050919050565b611901816118eb565b82525050565b600060208201905061191c60008301846118f8565b92915050565b600061192d82611851565b9050919050565b61193d81611922565b811461194857600080fd5b50565b60008135905061195a81611934565b92915050565b60008060408385031215611977576119766117bf565b5b60006119858582860161194b565b9250506020611996858286016117e5565b9150509250929050565b60008115159050919050565b6119b5816119a0565b82525050565b600060c0820190506119d06000830189611827565b6119dd6020830188611827565b6119ea6040830187611827565b6119f76060830186611827565b611a046080830185611827565b611a1160a08301846119ac565b979650505050505050565b611a2581611922565b82525050565b6000602082019050611a406000830184611a1c565b92915050565b600060208284031215611a5c57611a5b6117bf565b5b6000611a6a8482850161194b565b91505092915050565b611a7c816118eb565b8114611a8757600080fd5b50565b600081359050611a9981611a73565b92915050565b60008060008060808587031215611ab957611ab86117bf565b5b6000611ac7878288016117e5565b9450506020611ad8878288016117e5565b9350506040611ae987828801611a8a565b9250506060611afa87828801611a8a565b91505092959194509250565b600082825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000611b4d601f83611b06565b9150611b5882611b17565b602082019050919050565b60006020820190508181036000830152611b7c81611b40565b9050919050565b7f496e76616c696420696e64657800000000000000000000000000000000000000600082015250565b6000611bb9600d83611b06565b9150611bc482611b83565b602082019050919050565b60006020820190508181036000830152611be881611bac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e76616c6964207374616b6500000000000000000000000000000000000000600082015250565b6000611c54600d83611b06565b9150611c5f82611c1e565b602082019050919050565b60006020820190508181036000830152611c8381611c47565b9050919050565b6000604082019050611c9f6000830185611a1c565b611cac6020830184611827565b9392505050565b611cbc816119a0565b8114611cc757600080fd5b50565b600081519050611cd981611cb3565b92915050565b600060208284031215611cf557611cf46117bf565b5b6000611d0384828501611cca565b91505092915050565b6000819050919050565b6000611d31611d2c611d2784611d0c565b611871565b6117c4565b9050919050565b611d4181611d16565b82525050565b6000608082019050611d5c6000830187611827565b611d696020830186611827565b611d766040830185611d38565b611d836060830184611827565b95945050505050565b6000604082019050611da16000830185611a1c565b611dae6020830184611a1c565b9392505050565b600081519050611dc4816117ce565b92915050565b600060208284031215611de057611ddf6117bf565b5b6000611dee84828501611db5565b91505092915050565b6000606082019050611e0c6000830186611a1c565b611e196020830185611a1c565b611e266040830184611827565b949350505050565b6000608082019050611e436000830187611827565b611e506020830186611d38565b611e5d6040830185611827565b611e6a6060830184611827565b95945050505050565b7f496e76616c69642076616c756500000000000000000000000000000000000000600082015250565b6000611ea9600d83611b06565b9150611eb482611e73565b602082019050919050565b60006020820190508181036000830152611ed881611e9c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611f19826117c4565b9150611f24836117c4565b925082821015611f3757611f36611edf565b5b828203905092915050565b6000604082019050611f576000830185611827565b611f646020830184611827565b9392505050565b7f43616c6c6572206973206e6f74206f776e657200000000000000000000000000600082015250565b6000611fa1601383611b06565b9150611fac82611f6b565b602082019050919050565b60006020820190508181036000830152611fd081611f94565b9050919050565b6000611fe2826117c4565b9150611fed836117c4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561202657612025611edf565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061206b826117c4565b9150612076836117c4565b92508261208657612085612031565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006120ed602183611b06565b91506120f882612091565b604082019050919050565b6000602082019050818103600083015261211c816120e0565b9050919050565b600081519050919050565b60005b8381101561214c578082015181840152602081019050612131565b8381111561215b576000848401525b50505050565b6000601f19601f8301169050919050565b600061217d82612123565b6121878185611b06565b935061219781856020860161212e565b6121a081612161565b840191505092915050565b600060208201905081810360008301526121c58184612172565b90509291505056fea2646970667358221220cd1cedfa5b04de58f7993e55d6d184467bb41b2d9b9a2616eed5b8c6e2fda56a64736f6c63430008090033000000000000000000000000eba5ebe8cb3af119cd21101591c8c1ce9804fa0a0000000000000000000000004b6123e6811c27558b5cb96b847b2f22b247bf25000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000032

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

000000000000000000000000eba5ebe8cb3af119cd21101591c8c1ce9804fa0a0000000000000000000000004b6123e6811c27558b5cb96b847b2f22b247bf25000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000032

-----Decoded View---------------
Arg [0] : _erc20 (address): 0xeba5ebe8cb3af119cd21101591c8c1ce9804fa0a
Arg [1] : _owner (address): 0x4b6123e6811c27558b5cb96b847b2f22b247bf25
Arg [2] : _rate (uint8): 30
Arg [3] : _maturity (uint256): 30
Arg [4] : _penalization (uint8): 30
Arg [5] : _lower (uint256): 50

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000eba5ebe8cb3af119cd21101591c8c1ce9804fa0a
Arg [1] : 0000000000000000000000004b6123e6811c27558b5cb96b847b2f22b247bf25
Arg [2] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [3] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [4] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000032


Deployed ByteCode Sourcemap

26967:3909:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28423:1573;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27418:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27356:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27071:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27386:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27454:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;7957:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28086:329;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7733:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30751:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30362:381;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30004:294;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27323:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28423:1573;9696:1;10294:7;;:19;;10286:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;9696:1;10427:7;:18;;;;28494:6:::1;:18;28501:10;28494:18;;;;;;;;;;;;;;;:25;;;;28490:1;:29;28482:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;28585:5;28556:34;;:6;:18;28563:10;28556:18;;;;;;;;;;;;;;;28575:1;28556:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:27;;;;;;;;;;;;:34;;;28548:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;28707:8;;28657:47;28677:6;:18;28684:10;28677:18;;;;;;;;;;;;;;;28696:1;28677:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:26;;;28657:15;:19;;:47;;;;:::i;:::-;:58;28654:1335;;;28732:21;28756:55;28807:3;28756:46;28789:12;;;;;;;;;;;28756:46;;:6;:18;28763:10;28756:18;;;;;;;;;;;;;;;28775:1;28756:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:28;;;:32;;:46;;;;:::i;:::-;:50;;:55;;;;:::i;:::-;28732:79;;28826:5;;;;;;;;;;;:14;;;28841:10;28853:47;28886:13;28853:6;:18;28860:10;28853:18;;;;;;;;;;;;;;;28872:1;28853:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:28;;;:32;;:47;;;;:::i;:::-;28826:75;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28916:5;;;;;;;;;;;:14;;;28931:10;:8;:10::i;:::-;28943:13;28916:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29009:13;28972:6;:18;28979:10;28972:18;;;;;;;;;;;;;;;28991:1;28972:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;:50;;;;29064:15;29037:6;:18;29044:10;29037:18;;;;;;;;;;;;;;;29056:1;29037:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:24;;:42;;;;29124:4;29094:6;:18;29101:10;29094:18;;;;;;;;;;;;;;;29113:1;29094:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:27;;;:34;;;;;;;;;;;;;;;;;;29157:10;29148:71;;;29169:6;:18;29176:10;29169:18;;;;;;;;;;;;;;;29188:1;29169:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:28;;;29199:13;29214:1;29217;29148:71;;;;;;;;;:::i;:::-;;;;;;;;28717:542;28654:1335;;;29280:17;29300:24;29310:10;29322:1;29300:9;:24::i;:::-;29280:44;;29464:9;29418:5;;;;;;;;;;;:15;;;29434:10;:8;:10::i;:::-;29454:4;29418:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;:99;;;;;29508:9;29477:5;;;;;;;;;;;:15;;;29493:10;:8;:10::i;:::-;29477:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;29418:99;29414:247;;;29538:5;;;;;;;;;;;:18;;;29557:10;:8;:10::i;:::-;29569;29581:9;29538:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29414:247;;;29644:1;29632:13;;29414:247;29675:5;;;;;;;;;;;:14;;;29690:10;29702:6;:18;29709:10;29702:18;;;;;;;;;;;;;;;29721:1;29702:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:28;;;29675:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29775:9;29746:6;:18;29753:10;29746:18;;;;;;;;;;;;;;;29765:1;29746:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:26;;:38;;;;29826:15;29799:6;:18;29806:10;29799:18;;;;;;;;;;;;;;;29818:1;29799:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:24;;:42;;;;29886:4;29856:6;:18;29863:10;29856:18;;;;;;;;;;;;;;;29875:1;29856:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:27;;;:34;;;;;;;;;;;;;;;;;;29919:10;29910:67;;;29931:6;:18;29938:10;29931:18;;;;;;;;;;;;;;;29950:1;29931:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:28;;;29961:1;29964:9;29975:1;29910:67;;;;;;;;;:::i;:::-;;;;;;;;29265:724;28654:1335;9652:1:::0;10606:7;:22;;;;28423:1573;:::o;27418:27::-;;;;:::o;27356:23::-;;;;:::o;27071:18::-;;;;;;;;;;;;;:::o;27386:25::-;;;;;;;;;;;;;:::o;27454:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7957:81::-;7998:7;8025:5;;;;;;;;;;;8018:12;;7957:81;:::o;28086:329::-;28155:12;;28145:6;:22;;28137:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;28196:5;;;;;;;;;;;:18;;;28215:10;28235:4;28242:6;28196:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28260:6;:18;28267:10;28260:18;;;;;;;;;;;;;;;28284:47;;;;;;;;28291:15;28284:47;;;;28308:6;28284:47;;;;28316:1;28284:47;;;;28319:1;28284:47;;;;28322:1;28284:47;;;;28325:5;28284:47;;;;;28260:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28359:10;28348:59;;;28371:6;28405:1;28379:6;:18;28386:10;28379:18;;;;;;;;;;;;;;;:25;;;;:27;;;;:::i;:::-;28348:59;;;;;;;:::i;:::-;;;;;;;;28086:329;:::o;7733:130::-;7409:5;;;;;;;;;;7395:19;;:10;:19;;;7387:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;7819:8:::1;7803:25;;7812:5;::::0;::::1;;;;;;;;7803:25;;;;;;;;;;;;7847:8;7839:5;::::0;:16:::1;;;;;;;;;;;;;;;;;;7733:130:::0;:::o;30751:120::-;30813:7;30840:6;:16;30847:8;30840:16;;;;;;;;;;;;;;;:23;;;;30833:30;;30751:120;;;:::o;30362:381::-;30441:7;30461:23;30487:55;30507:6;:16;30514:8;30507:16;;;;;;;;;;;;;;;30524:11;30507:29;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;30487:15;:19;;:55;;;;:::i;:::-;30461:81;;30553:21;30577:12;30553:36;;30607:128;30721:13;30607:109;30641:64;30701:3;30641:55;30682:13;;;;;;;;;;;30641:55;;:6;:16;30648:8;30641:16;;;;;;;;;;;;;;;30658:11;30641:29;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:40;;:55;;;;:::i;:::-;:59;;:64;;;;:::i;:::-;30607:15;:19;;:109;;;;:::i;:::-;:113;;:128;;;;:::i;:::-;30600:135;;;;30362:381;;;;:::o;30004:294::-;7409:5;;;;;;;;;;7395:19;;:10;:19;;;7387:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;30135:3:::1;30120:13;:18;;;;30112:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;30182:6;30167:12;:21;;;;30210:9;30199:8;:20;;;;30246:5;30230:13;;:21;;;;;;;;;;;;;;;;;;30277:13;30262:12;;:28;;;;;;;;;;;;;;;;;;30004:294:::0;;;;:::o;27323:26::-;;;;;;;;;;;;;:::o;2639:136::-;2697:7;2724:43;2728:1;2731;2724:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;2717:50;;2639:136;;;;:::o;3513:471::-;3571:7;3821:1;3816;:6;3812:47;;;3846:1;3839:8;;;;3812:47;3871:9;3887:1;3883;:5;;;;:::i;:::-;3871:17;;3916:1;3911;3907;:5;;;;:::i;:::-;:10;3899:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3975:1;3968:8;;;3513:471;;;;;:::o;4452:132::-;4510:7;4537:39;4541:1;4544;4537:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;4530:46;;4452:132;;;;:::o;3070:192::-;3156:7;3189:1;3184;:6;;3192:12;3176:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;3216:9;3232:1;3228;:5;;;;:::i;:::-;3216:17;;3253:1;3246:8;;;3070:192;;;;;:::o;5072:345::-;5158:7;5257:1;5253;:5;5260:12;5245:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5284:9;5300:1;5296;:5;;;;:::i;:::-;5284:17;;5408:1;5401:8;;;5072:345;;;;;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:118::-;1112:24;1130:5;1112:24;:::i;:::-;1107:3;1100:37;1025:118;;:::o;1149:222::-;1242:4;1280:2;1269:9;1265:18;1257:26;;1293:71;1361:1;1350:9;1346:17;1337:6;1293:71;:::i;:::-;1149:222;;;;:::o;1377:126::-;1414:7;1454:42;1447:5;1443:54;1432:65;;1377:126;;;:::o;1509:60::-;1537:3;1558:5;1551:12;;1509:60;;;:::o;1575:142::-;1625:9;1658:53;1676:34;1685:24;1703:5;1685:24;:::i;:::-;1676:34;:::i;:::-;1658:53;:::i;:::-;1645:66;;1575:142;;;:::o;1723:126::-;1773:9;1806:37;1837:5;1806:37;:::i;:::-;1793:50;;1723:126;;;:::o;1855:139::-;1918:9;1951:37;1982:5;1951:37;:::i;:::-;1938:50;;1855:139;;;:::o;2000:157::-;2100:50;2144:5;2100:50;:::i;:::-;2095:3;2088:63;2000:157;;:::o;2163:248::-;2269:4;2307:2;2296:9;2292:18;2284:26;;2320:84;2401:1;2390:9;2386:17;2377:6;2320:84;:::i;:::-;2163:248;;;;:::o;2417:86::-;2452:7;2492:4;2485:5;2481:16;2470:27;;2417:86;;;:::o;2509:112::-;2592:22;2608:5;2592:22;:::i;:::-;2587:3;2580:35;2509:112;;:::o;2627:214::-;2716:4;2754:2;2743:9;2739:18;2731:26;;2767:67;2831:1;2820:9;2816:17;2807:6;2767:67;:::i;:::-;2627:214;;;;:::o;2847:96::-;2884:7;2913:24;2931:5;2913:24;:::i;:::-;2902:35;;2847:96;;;:::o;2949:122::-;3022:24;3040:5;3022:24;:::i;:::-;3015:5;3012:35;3002:63;;3061:1;3058;3051:12;3002:63;2949:122;:::o;3077:139::-;3123:5;3161:6;3148:20;3139:29;;3177:33;3204:5;3177:33;:::i;:::-;3077:139;;;;:::o;3222:474::-;3290:6;3298;3347:2;3335:9;3326:7;3322:23;3318:32;3315:119;;;3353:79;;:::i;:::-;3315:119;3473:1;3498:53;3543:7;3534:6;3523:9;3519:22;3498:53;:::i;:::-;3488:63;;3444:117;3600:2;3626:53;3671:7;3662:6;3651:9;3647:22;3626:53;:::i;:::-;3616:63;;3571:118;3222:474;;;;;:::o;3702:90::-;3736:7;3779:5;3772:13;3765:21;3754:32;;3702:90;;;:::o;3798:109::-;3879:21;3894:5;3879:21;:::i;:::-;3874:3;3867:34;3798:109;;:::o;3913:763::-;4140:4;4178:3;4167:9;4163:19;4155:27;;4192:71;4260:1;4249:9;4245:17;4236:6;4192:71;:::i;:::-;4273:72;4341:2;4330:9;4326:18;4317:6;4273:72;:::i;:::-;4355;4423:2;4412:9;4408:18;4399:6;4355:72;:::i;:::-;4437;4505:2;4494:9;4490:18;4481:6;4437:72;:::i;:::-;4519:73;4587:3;4576:9;4572:19;4563:6;4519:73;:::i;:::-;4602:67;4664:3;4653:9;4649:19;4640:6;4602:67;:::i;:::-;3913:763;;;;;;;;;:::o;4682:118::-;4769:24;4787:5;4769:24;:::i;:::-;4764:3;4757:37;4682:118;;:::o;4806:222::-;4899:4;4937:2;4926:9;4922:18;4914:26;;4950:71;5018:1;5007:9;5003:17;4994:6;4950:71;:::i;:::-;4806:222;;;;:::o;5034:329::-;5093:6;5142:2;5130:9;5121:7;5117:23;5113:32;5110:119;;;5148:79;;:::i;:::-;5110:119;5268:1;5293:53;5338:7;5329:6;5318:9;5314:22;5293:53;:::i;:::-;5283:63;;5239:117;5034:329;;;;:::o;5369:118::-;5440:22;5456:5;5440:22;:::i;:::-;5433:5;5430:33;5420:61;;5477:1;5474;5467:12;5420:61;5369:118;:::o;5493:135::-;5537:5;5575:6;5562:20;5553:29;;5591:31;5616:5;5591:31;:::i;:::-;5493:135;;;;:::o;5634:757::-;5716:6;5724;5732;5740;5789:3;5777:9;5768:7;5764:23;5760:33;5757:120;;;5796:79;;:::i;:::-;5757:120;5916:1;5941:53;5986:7;5977:6;5966:9;5962:22;5941:53;:::i;:::-;5931:63;;5887:117;6043:2;6069:53;6114:7;6105:6;6094:9;6090:22;6069:53;:::i;:::-;6059:63;;6014:118;6171:2;6197:51;6240:7;6231:6;6220:9;6216:22;6197:51;:::i;:::-;6187:61;;6142:116;6297:2;6323:51;6366:7;6357:6;6346:9;6342:22;6323:51;:::i;:::-;6313:61;;6268:116;5634:757;;;;;;;:::o;6397:169::-;6481:11;6515:6;6510:3;6503:19;6555:4;6550:3;6546:14;6531:29;;6397:169;;;;:::o;6572:181::-;6712:33;6708:1;6700:6;6696:14;6689:57;6572:181;:::o;6759:366::-;6901:3;6922:67;6986:2;6981:3;6922:67;:::i;:::-;6915:74;;6998:93;7087:3;6998:93;:::i;:::-;7116:2;7111:3;7107:12;7100:19;;6759:366;;;:::o;7131:419::-;7297:4;7335:2;7324:9;7320:18;7312:26;;7384:9;7378:4;7374:20;7370:1;7359:9;7355:17;7348:47;7412:131;7538:4;7412:131;:::i;:::-;7404:139;;7131:419;;;:::o;7556:163::-;7696:15;7692:1;7684:6;7680:14;7673:39;7556:163;:::o;7725:366::-;7867:3;7888:67;7952:2;7947:3;7888:67;:::i;:::-;7881:74;;7964:93;8053:3;7964:93;:::i;:::-;8082:2;8077:3;8073:12;8066:19;;7725:366;;;:::o;8097:419::-;8263:4;8301:2;8290:9;8286:18;8278:26;;8350:9;8344:4;8340:20;8336:1;8325:9;8321:17;8314:47;8378:131;8504:4;8378:131;:::i;:::-;8370:139;;8097:419;;;:::o;8522:180::-;8570:77;8567:1;8560:88;8667:4;8664:1;8657:15;8691:4;8688:1;8681:15;8708:163;8848:15;8844:1;8836:6;8832:14;8825:39;8708:163;:::o;8877:366::-;9019:3;9040:67;9104:2;9099:3;9040:67;:::i;:::-;9033:74;;9116:93;9205:3;9116:93;:::i;:::-;9234:2;9229:3;9225:12;9218:19;;8877:366;;;:::o;9249:419::-;9415:4;9453:2;9442:9;9438:18;9430:26;;9502:9;9496:4;9492:20;9488:1;9477:9;9473:17;9466:47;9530:131;9656:4;9530:131;:::i;:::-;9522:139;;9249:419;;;:::o;9674:332::-;9795:4;9833:2;9822:9;9818:18;9810:26;;9846:71;9914:1;9903:9;9899:17;9890:6;9846:71;:::i;:::-;9927:72;9995:2;9984:9;9980:18;9971:6;9927:72;:::i;:::-;9674:332;;;;;:::o;10012:116::-;10082:21;10097:5;10082:21;:::i;:::-;10075:5;10072:32;10062:60;;10118:1;10115;10108:12;10062:60;10012:116;:::o;10134:137::-;10188:5;10219:6;10213:13;10204:22;;10235:30;10259:5;10235:30;:::i;:::-;10134:137;;;;:::o;10277:345::-;10344:6;10393:2;10381:9;10372:7;10368:23;10364:32;10361:119;;;10399:79;;:::i;:::-;10361:119;10519:1;10544:61;10597:7;10588:6;10577:9;10573:22;10544:61;:::i;:::-;10534:71;;10490:125;10277:345;;;;:::o;10628:85::-;10673:7;10702:5;10691:16;;10628:85;;;:::o;10719:158::-;10777:9;10810:61;10828:42;10837:32;10863:5;10837:32;:::i;:::-;10828:42;:::i;:::-;10810:61;:::i;:::-;10797:74;;10719:158;;;:::o;10883:147::-;10978:45;11017:5;10978:45;:::i;:::-;10973:3;10966:58;10883:147;;:::o;11036:569::-;11221:4;11259:3;11248:9;11244:19;11236:27;;11273:71;11341:1;11330:9;11326:17;11317:6;11273:71;:::i;:::-;11354:72;11422:2;11411:9;11407:18;11398:6;11354:72;:::i;:::-;11436:80;11512:2;11501:9;11497:18;11488:6;11436:80;:::i;:::-;11526:72;11594:2;11583:9;11579:18;11570:6;11526:72;:::i;:::-;11036:569;;;;;;;:::o;11611:332::-;11732:4;11770:2;11759:9;11755:18;11747:26;;11783:71;11851:1;11840:9;11836:17;11827:6;11783:71;:::i;:::-;11864:72;11932:2;11921:9;11917:18;11908:6;11864:72;:::i;:::-;11611:332;;;;;:::o;11949:143::-;12006:5;12037:6;12031:13;12022:22;;12053:33;12080:5;12053:33;:::i;:::-;11949:143;;;;:::o;12098:351::-;12168:6;12217:2;12205:9;12196:7;12192:23;12188:32;12185:119;;;12223:79;;:::i;:::-;12185:119;12343:1;12368:64;12424:7;12415:6;12404:9;12400:22;12368:64;:::i;:::-;12358:74;;12314:128;12098:351;;;;:::o;12455:442::-;12604:4;12642:2;12631:9;12627:18;12619:26;;12655:71;12723:1;12712:9;12708:17;12699:6;12655:71;:::i;:::-;12736:72;12804:2;12793:9;12789:18;12780:6;12736:72;:::i;:::-;12818;12886:2;12875:9;12871:18;12862:6;12818:72;:::i;:::-;12455:442;;;;;;:::o;12903:569::-;13088:4;13126:3;13115:9;13111:19;13103:27;;13140:71;13208:1;13197:9;13193:17;13184:6;13140:71;:::i;:::-;13221:80;13297:2;13286:9;13282:18;13273:6;13221:80;:::i;:::-;13311:72;13379:2;13368:9;13364:18;13355:6;13311:72;:::i;:::-;13393;13461:2;13450:9;13446:18;13437:6;13393:72;:::i;:::-;12903:569;;;;;;;:::o;13478:163::-;13618:15;13614:1;13606:6;13602:14;13595:39;13478:163;:::o;13647:366::-;13789:3;13810:67;13874:2;13869:3;13810:67;:::i;:::-;13803:74;;13886:93;13975:3;13886:93;:::i;:::-;14004:2;13999:3;13995:12;13988:19;;13647:366;;;:::o;14019:419::-;14185:4;14223:2;14212:9;14208:18;14200:26;;14272:9;14266:4;14262:20;14258:1;14247:9;14243:17;14236:47;14300:131;14426:4;14300:131;:::i;:::-;14292:139;;14019:419;;;:::o;14444:180::-;14492:77;14489:1;14482:88;14589:4;14586:1;14579:15;14613:4;14610:1;14603:15;14630:191;14670:4;14690:20;14708:1;14690:20;:::i;:::-;14685:25;;14724:20;14742:1;14724:20;:::i;:::-;14719:25;;14763:1;14760;14757:8;14754:34;;;14768:18;;:::i;:::-;14754:34;14813:1;14810;14806:9;14798:17;;14630:191;;;;:::o;14827:332::-;14948:4;14986:2;14975:9;14971:18;14963:26;;14999:71;15067:1;15056:9;15052:17;15043:6;14999:71;:::i;:::-;15080:72;15148:2;15137:9;15133:18;15124:6;15080:72;:::i;:::-;14827:332;;;;;:::o;15165:169::-;15305:21;15301:1;15293:6;15289:14;15282:45;15165:169;:::o;15340:366::-;15482:3;15503:67;15567:2;15562:3;15503:67;:::i;:::-;15496:74;;15579:93;15668:3;15579:93;:::i;:::-;15697:2;15692:3;15688:12;15681:19;;15340:366;;;:::o;15712:419::-;15878:4;15916:2;15905:9;15901:18;15893:26;;15965:9;15959:4;15955:20;15951:1;15940:9;15936:17;15929:47;15993:131;16119:4;15993:131;:::i;:::-;15985:139;;15712:419;;;:::o;16137:348::-;16177:7;16200:20;16218:1;16200:20;:::i;:::-;16195:25;;16234:20;16252:1;16234:20;:::i;:::-;16229:25;;16422:1;16354:66;16350:74;16347:1;16344:81;16339:1;16332:9;16325:17;16321:105;16318:131;;;16429:18;;:::i;:::-;16318:131;16477:1;16474;16470:9;16459:20;;16137:348;;;;:::o;16491:180::-;16539:77;16536:1;16529:88;16636:4;16633:1;16626:15;16660:4;16657:1;16650:15;16677:185;16717:1;16734:20;16752:1;16734:20;:::i;:::-;16729:25;;16768:20;16786:1;16768:20;:::i;:::-;16763:25;;16807:1;16797:35;;16812:18;;:::i;:::-;16797:35;16854:1;16851;16847:9;16842:14;;16677:185;;;;:::o;16868:220::-;17008:34;17004:1;16996:6;16992:14;16985:58;17077:3;17072:2;17064:6;17060:15;17053:28;16868:220;:::o;17094:366::-;17236:3;17257:67;17321:2;17316:3;17257:67;:::i;:::-;17250:74;;17333:93;17422:3;17333:93;:::i;:::-;17451:2;17446:3;17442:12;17435:19;;17094:366;;;:::o;17466:419::-;17632:4;17670:2;17659:9;17655:18;17647:26;;17719:9;17713:4;17709:20;17705:1;17694:9;17690:17;17683:47;17747:131;17873:4;17747:131;:::i;:::-;17739:139;;17466:419;;;:::o;17891:99::-;17943:6;17977:5;17971:12;17961:22;;17891:99;;;:::o;17996:307::-;18064:1;18074:113;18088:6;18085:1;18082:13;18074:113;;;18173:1;18168:3;18164:11;18158:18;18154:1;18149:3;18145:11;18138:39;18110:2;18107:1;18103:10;18098:15;;18074:113;;;18205:6;18202:1;18199:13;18196:101;;;18285:1;18276:6;18271:3;18267:16;18260:27;18196:101;18045:258;17996:307;;;:::o;18309:102::-;18350:6;18401:2;18397:7;18392:2;18385:5;18381:14;18377:28;18367:38;;18309:102;;;:::o;18417:364::-;18505:3;18533:39;18566:5;18533:39;:::i;:::-;18588:71;18652:6;18647:3;18588:71;:::i;:::-;18581:78;;18668:52;18713:6;18708:3;18701:4;18694:5;18690:16;18668:52;:::i;:::-;18745:29;18767:6;18745:29;:::i;:::-;18740:3;18736:39;18729:46;;18509:272;18417:364;;;;:::o;18787:313::-;18900:4;18938:2;18927:9;18923:18;18915:26;;18987:9;18981:4;18977:20;18973:1;18962:9;18958:17;18951:47;19015:78;19088:4;19079:6;19015:78;:::i;:::-;19007:86;;18787:313;;;;:::o

Swarm Source

ipfs://cd1cedfa5b04de58f7993e55d6d184467bb41b2d9b9a2616eed5b8c6e2fda56a
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading