Contract 0x6d9173e597669609acfc6518c9c47feaaacfd6a7

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x979dcd152172632bcbd49a1f75b3fe0f7c0767a4589301cc1a8f00c5fce556baDeposit Token19028202022-10-02 14:53:1220 hrs 40 mins ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00714991
0x4410cc1fc5ae18ae90c6d2d2783537d3e1bb2156c90ab06b3d66999c166e7e83Deposit Token18957532022-10-01 14:48:181 day 20 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00734167
0x37908d0a812575f17106f800a5804fdf7c8597db8c6b695b55817157d58e69dcDeposit Token18936822022-10-01 7:44:182 days 3 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00714979
0x585404a397715e17a2f12dc8363d240c72886744e7b13a997f1d02fa4b8bd1d6Deposit Token18936712022-10-01 7:42:062 days 3 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a72,313 CLV0.0059391
0x2133e5574903597cffffea55bc7fc823c3e861735c60b0dec629c48bab41f2dbDeposit Token18892532022-09-30 16:49:062 days 18 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00714979
0xd67d548cb2bab6faf111e248eb72d7b97bb13814f3a30c145c4f81712d47c05eDeposit Token18817152022-09-29 15:16:303 days 20 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00714979
0xdbd52195de515b0ddf12179edfa0f9c8f87e6188d6634acbeb106638643cd76dDeposit Token18750112022-09-28 16:38:064 days 18 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00768979
0x4307f1d42c44e1310dfbe249ee3f4f511bed02685ea41dbd4037ad5e210454a1Deposit Token18674102022-09-27 14:56:485 days 20 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00768979
0x04fbc6b97d01325a5b2246efc5cc69804b6bbf7f4c113d7397889647d19fbb12Deposit Token18603542022-09-26 14:55:306 days 20 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00714979
0x33268a1738d2158278f76a81f1f06141adcf7c235deef568d02f1c26ae0002b9Deposit Token18535942022-09-25 15:58:307 days 19 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00788167
0xf8e0c5a691f398e80f63d368dea56498f4eeaf052d4ba813e762c969b2faebc8Deposit Token18463782022-09-24 15:22:488 days 20 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00768979
0xb552386bce49e10e0e201352d15591242025ba3a4318128867f5b1b5c074bc40Deposit Token18396062022-09-23 16:28:009 days 19 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00768979
0xe8a22d35a6d5f7fb1c1e91a4dfa59e0233aefb63ce9d38b1131c151610b49ab7Deposit Token18323442022-09-22 15:50:1810 days 19 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00768979
0x0770e5572a29a4cef95a1aa14bcde2f262aa855b28e213e08c3a17a5eebbeccdDeposit Token18318042022-09-22 13:59:1810 days 21 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a75 CLV0.00543662
0x9d121ae0facb3676d10f90e6a9e9785350dcf281c263a99cc9031d006b7597bbDeposit Token18249962022-09-21 15:04:2411 days 20 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00714979
0x5704c025a9613ee99b606f2cbabc7b109c018f832236701ef4af53649aa15914Deposit Token18180902022-09-20 15:44:0612 days 19 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00768979
0xfd023e128e1075c16661af5d61947ae448fe7b60b525fe98b9d3820652f80607Deposit Token18111312022-09-19 15:58:0613 days 19 hrs ago0x56aa4fb42f77faa81b5ca0d2b3cab33f80899648 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.00786297
0x48d3c01abf211dc02a03d2d46e055b24655198abe0d137d9c4076e1807a567d3Deposit Token17875852022-09-16 7:55:2417 days 3 hrs ago0xf4fc11286995ae23316f4b1ffc33904cc4118124 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a715,000 CLV0.00587711
0x43b6aa7115451e35d698634717c9637953af72841e23cb0ca4477c78ee15adf6Deposit Token17346412022-09-08 14:40:4224 days 20 hrs ago0x12dad3425d0ec383ebd9e86139a103ce119aa0b2 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a7550 CLV0.01148836
0xf86e0b293a8780d1ff29ca755c68f4250ea825784cbfc097141177e65ff96c56Withdraw Ether17207552022-09-06 13:23:4226 days 22 hrs ago0x12dad3425d0ec383ebd9e86139a103ce119aa0b2 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.01022608
0x149a57ae4036d8b6b14e9375dda043d1be13ff0e9e221be53c25f0d946c02a9eWithdraw Ether17207432022-09-06 13:21:0626 days 22 hrs ago0x12dad3425d0ec383ebd9e86139a103ce119aa0b2 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a70 CLV0.01204316
0x883e13b7d9df3164e68d0e516a5b90043c11e962d46f209046c760af295d1273Deposit Token16748542022-08-30 20:10:0633 days 15 hrs ago0x8de3c3891268502f77db7e876d727257dec0f852 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a710 CLV0.01083608
0xa967f9bd2d918960f2c4292e93e4a3e2d00530a440a1abb77498fc613763c0dfDeposit Token16218242022-08-23 2:36:4241 days 8 hrs ago0xb3d626766e3ed1419b5e945b6dad3714bed2e825 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a7248 CLV0.01048948
0x706f170a3c903b12f624a52ea759a79928278ea7ebb4675a36dc1a1b9eecdd17Deposit Token15906622022-08-18 13:43:4245 days 21 hrs ago0x12dad3425d0ec383ebd9e86139a103ce119aa0b2 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a7280 CLV0.0115316
0x09d6e861f30de5e52c449da5bedbd6b201457043a8f39c435b8b5b2065270de4Deposit Token15906482022-08-18 13:40:5445 days 21 hrs ago0x12dad3425d0ec383ebd9e86139a103ce119aa0b2 IN  0x6d9173e597669609acfc6518c9c47feaaacfd6a7940 CLV0.01048948
[ Download CSV Export 
Latest 3 internal transactions
Parent Txn Hash Block From To Value
0x585404a397715e17a2f12dc8363d240c72886744e7b13a997f1d02fa4b8bd1d618936712022-10-01 7:42:062 days 3 hrs ago 0x6d9173e597669609acfc6518c9c47feaaacfd6a7 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b32,313 CLV
0x0770e5572a29a4cef95a1aa14bcde2f262aa855b28e213e08c3a17a5eebbeccd18318042022-09-22 13:59:1810 days 21 hrs ago 0x6d9173e597669609acfc6518c9c47feaaacfd6a7 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b35 CLV
0x48d3c01abf211dc02a03d2d46e055b24655198abe0d137d9c4076e1807a567d317875852022-09-16 7:55:2417 days 3 hrs ago 0x6d9173e597669609acfc6518c9c47feaaacfd6a7 0x6d6ad95425fcf315c39fa6f3226471d4f16f27b315,000 CLV
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PronteraV2Kafra

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 9 : PronteraV2Kafra.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";

import "./interfaces/IProntera.sol";
import "./interfaces/IWETH.sol";

contract PronteraV2Kafra is Ownable, Pausable {
    using SafeERC20 for IERC20;
    using SafeERC20 for IWETH;
    using Address for address;
    using Address for address payable;

    IWETH public constant WETH = IWETH(0x6d6AD95425FcF315c39Fa6F3226471d4f16F27B3);

    IProntera public immutable prontera;
    address public juno;

    event SetJuno(address juno);

    event DepositToken(
        address indexed user,
        address indexed izlude,
        uint256 value,
        IERC20[] tokens,
        uint256[] tokenAmounts,
        uint256 wantAmount
    );
    event WithdrawToken(address indexed user, address indexed izlude, uint256 jellopyAmount, uint256 amountOut);
    event WithdrawEther(address indexed user, address indexed izlude, uint256 jellopyAmount, uint256 amountOut);
    event RemoveLiquidity(
        address indexed user,
        address indexed izlude,
        uint256 jellopyAmount,
        IERC20[] outTokens,
        uint256[] outAmounts
    );

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, "PronteraV2Kafra: EXPIRED");
        _;
    }

    constructor(IProntera _prontera, address _juno) {
        prontera = _prontera;
        juno = _juno;
    }

    function depositToken(
        address izlude,
        IERC20[] calldata tokens,
        uint256[] calldata tokenAmounts,
        uint256 amountOutMin,
        uint256 deadline,
        bytes calldata data
    ) external payable whenNotPaused ensure(deadline) {
        require(tokens.length == tokenAmounts.length);
        IERC20 want = IERC20(prontera.poolInfo(izlude).want);

        uint256 wantAmount;
        {
            // avoid stack too deep
            // convert tokens to want
            uint256 wantBeforeBal = want.balanceOf(address(this));

            if (msg.value > 0) {
                WETH.deposit{value: msg.value}();
            }
            if (WETH != want) {
                WETH.safeTransfer(juno, msg.value);
            }
            for (uint256 i = 0; i < tokens.length; i++) {
                require(_safeERC20TransferIn(tokens[i], tokenAmounts[i]) == tokenAmounts[i], "!amount");
                if (tokens[i] != want) {
                    tokens[i].safeTransfer(juno, tokenAmounts[i]);
                }
            }
            juno.functionCall(data, "juno: failed");
            uint256 wantAfterBal = want.balanceOf(address(this));
            wantAmount = wantAfterBal - wantBeforeBal;
            require(wantAmount >= amountOutMin, "insufficient output amount");
        }

        want.safeIncreaseAllowance(address(prontera), wantAmount);
        prontera.depositFor(msg.sender, izlude, wantAmount);

        emit DepositToken(msg.sender, izlude, msg.value, tokens, tokenAmounts, wantAmount);
    }

    function withdrawToken(
        address izlude,
        uint256 jellopyAmount,
        IERC20 token,
        uint256 amountOutMin,
        uint256 deadline,
        bytes calldata data
    ) external whenNotPaused ensure(deadline) {
        IERC20 want = IERC20(prontera.poolInfo(izlude).want);

        // withdraw want
        uint256 wantBeforeBal = want.balanceOf(address(this));
        {
            prontera.storeKeepJellopy(msg.sender, izlude, jellopyAmount);
            prontera.storeWithdraw(msg.sender, izlude, jellopyAmount);
        }
        uint256 wantAfterBal = want.balanceOf(address(this));
        uint256 amountOut = wantAfterBal - wantBeforeBal;
        require(amountOut > 0, "zero balance");

        // convert want to token
        if (want != token) {
            uint256 tokenBeforeBal = token.balanceOf(address(this));
            want.safeTransfer(juno, amountOut);
            juno.functionCall(data, "juno: failed");
            uint256 tokenAfterBal = token.balanceOf(address(this));
            amountOut = tokenAfterBal - tokenBeforeBal;
            require(amountOut >= amountOutMin, "insufficient output amount");
        }
        token.safeTransfer(msg.sender, amountOut);

        emit WithdrawToken(msg.sender, izlude, jellopyAmount, amountOut);
    }

    function withdrawEther(
        address izlude,
        uint256 jellopyAmount,
        uint256 amountOutMin,
        uint256 deadline,
        bytes calldata data
    ) external whenNotPaused ensure(deadline) {
        IERC20 want = IERC20(prontera.poolInfo(izlude).want);

        // withdraw want
        uint256 wantBeforeBal = want.balanceOf(address(this));
        {
            prontera.storeKeepJellopy(msg.sender, izlude, jellopyAmount);
            prontera.storeWithdraw(msg.sender, izlude, jellopyAmount);
        }
        uint256 wantAfterBal = want.balanceOf(address(this));
        uint256 amountOut = wantAfterBal - wantBeforeBal;
        require(amountOut > 0, "zero balance");

        // convert want to eth
        if (want != WETH) {
            uint256 tokenBeforeBal = WETH.balanceOf(address(this));
            want.safeTransfer(juno, amountOut);
            juno.functionCall(data, "juno: failed");
            uint256 tokenAfterBal = WETH.balanceOf(address(this));
            amountOut = tokenAfterBal - tokenBeforeBal;
            require(amountOut >= amountOutMin, "insufficient output amount");
        }
        WETH.withdraw(amountOut);
        payable(msg.sender).sendValue(amountOut);

        emit WithdrawEther(msg.sender, izlude, jellopyAmount, amountOut);
    }

    function removeLiquidity(
        address izlude,
        uint256 jellopyAmount,
        IERC20[] calldata tokens,
        uint256[] calldata amountOutMins,
        uint256 deadline,
        bytes calldata data
    ) external whenNotPaused ensure(deadline) {
        require(tokens.length == amountOutMins.length);
        IERC20 want = IERC20(prontera.poolInfo(izlude).want);

        // withdraw want
        uint256 wantAmountOut;
        {
            uint256 wantBeforeBal = want.balanceOf(address(this));
            {
                prontera.storeKeepJellopy(msg.sender, izlude, jellopyAmount);
                prontera.storeWithdraw(msg.sender, izlude, jellopyAmount);
            }
            uint256 wantAfterBal = want.balanceOf(address(this));
            wantAmountOut = wantAfterBal - wantBeforeBal;
            require(wantAmountOut > 0, "zero balance");
        }

        uint256[] memory amountOuts = new uint256[](tokens.length);
        {
            uint256[] memory tokenBeforeBals = new uint256[](tokens.length);
            for (uint256 i = 0; i < tokens.length; i++) {
                tokenBeforeBals[i] = tokens[i].balanceOf(address(this));
            }

            want.safeTransfer(juno, wantAmountOut);
            juno.functionCall(data, "juno: failed");

            for (uint256 i = 0; i < tokens.length; i++) {
                uint256 tokenAfterBal = tokens[i].balanceOf(address(this));
                amountOuts[i] = tokenAfterBal - tokenBeforeBals[i];
                require(amountOuts[i] >= amountOutMins[i], "insufficient output amount");
            }
        }

        for (uint256 i = 0; i < tokens.length; i++) {
            if (tokens[i] == WETH) {
                WETH.withdraw(amountOuts[i]);
                payable(msg.sender).sendValue(amountOuts[i]);
            } else {
                tokens[i].safeTransfer(msg.sender, amountOuts[i]);
            }
        }

        emit RemoveLiquidity(msg.sender, izlude, jellopyAmount, tokens, amountOuts);
    }

    function setJuno(address _juno) external onlyOwner {
        juno = _juno;
        emit SetJuno(_juno);
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }

    function inCaseTokensGetStuck(address token) external onlyOwner {
        uint256 amount = IERC20(token).balanceOf(address(this));
        IERC20(token).safeTransfer(msg.sender, amount);
    }

    function _safeERC20TransferIn(IERC20 token, uint256 amount) private returns (uint256) {
        require(amount > 0, "zero amount");

        uint256 balanceBefore = token.balanceOf(address(this));
        token.safeTransferFrom(msg.sender, address(this), amount);
        uint256 balanceAfter = token.balanceOf(address(this));
        return balanceAfter - balanceBefore;
    }

    receive() external payable {
        require(msg.sender == address(WETH), "reject");
    }
}

File 2 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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.
 */
abstract 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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual 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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 9 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 4 of 9 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 5 of 9 : IProntera.sol
//SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IProntera {
    struct UserInfo {
        uint256 jellopy;
        uint256 rewardDebt;
        uint256 storedJellopy;
    }

    function userInfo(address npc, address user) external view returns (UserInfo memory);

    struct PoolInfo {
        address want;
        address izlude;
        uint256 accKSWPerJellopy;
        uint64 allocPoint;
        uint64 lastRewardTime;
    }

    function poolInfo(address izlude) external view returns (PoolInfo memory);

    function pendingKSW(address izlude, address _user) external view returns (uint256);

    function deposit(address izlude, uint256 amount) external;

    function depositFor(
        address user,
        address izlude,
        uint256 amount
    ) external;

    function withdraw(address izlude, uint256 jellopyAmount) external;

    function emergencyWithdraw(address izlude) external;

    function storeWithdraw(
        address _user,
        address izlude,
        uint256 jellopyAmount
    ) external;

    function storeKeepJellopy(
        address _user,
        address izlude,
        uint256 amount
    ) external;

    function storeReturnJellopy(
        address _user,
        address izlude,
        uint256 amount
    ) external;

    function juno() external returns (address);
}

File 6 of 9 : IWETH.sol
//SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IWETH is IERC20 {
    function deposit() external payable;

    function withdraw(uint256 wad) external;
}

File 7 of 9 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.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 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;
    }
}

File 8 of 9 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.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 9 of 9 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

Contract ABI

[{"inputs":[{"internalType":"contract IProntera","name":"_prontera","type":"address"},{"internalType":"address","name":"_juno","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"izlude","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenAmounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"wantAmount","type":"uint256"}],"name":"DepositToken","type":"event"},{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"izlude","type":"address"},{"indexed":false,"internalType":"uint256","name":"jellopyAmount","type":"uint256"},{"indexed":false,"internalType":"contract IERC20[]","name":"outTokens","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"outAmounts","type":"uint256[]"}],"name":"RemoveLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"juno","type":"address"}],"name":"SetJuno","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"izlude","type":"address"},{"indexed":false,"internalType":"uint256","name":"jellopyAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"WithdrawEther","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"izlude","type":"address"},{"indexed":false,"internalType":"uint256","name":"jellopyAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"WithdrawToken","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"izlude","type":"address"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"tokenAmounts","type":"uint256[]"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"depositToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"juno","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prontera","outputs":[{"internalType":"contract IProntera","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"izlude","type":"address"},{"internalType":"uint256","name":"jellopyAmount","type":"uint256"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amountOutMins","type":"uint256[]"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"removeLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_juno","type":"address"}],"name":"setJuno","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"izlude","type":"address"},{"internalType":"uint256","name":"jellopyAmount","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"izlude","type":"address"},{"internalType":"uint256","name":"jellopyAmount","type":"uint256"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b5060405162003f9b38038062003f9b8339810160408190526200003491620000de565b6200003f3362000075565b6000805460ff60a01b191690556001600160a01b03918216608052600180546001600160a01b031916919092161790556200011d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000db57600080fd5b50565b60008060408385031215620000f257600080fd5b8251620000ff81620000c5565b60208401519092506200011281620000c5565b809150509250929050565b608051613e0e6200018d600039600081816102aa015281816104d90152818161064e015281816106fc01528181610e67015281816113f00152818161146701528181611782015281816118f901528181611959015281816123bb0152818161253001526125de0152613e0e6000f3fe6080604052600436106100ec5760003560e01c80638da5cb5b1161008a578063def68a9c11610059578063def68a9c14610314578063dfd53a3114610334578063f2fde38b14610354578063f69576901461037457600080fd5b80638da5cb5b1461024c5780638fbe554d14610298578063ad5c4648146102cc578063bd7c1b1d146102f457600080fd5b8063588cfb2b116100c6578063588cfb2b146101cf5780635c975abb146101e2578063715018a6146102225780638456cb591461023757600080fd5b80630c5dda401461017a5780633f4ba83a1461019a57806349abfa38146101af57600080fd5b366101755733736d6ad95425fcf315c39fa6f3226471d4f16f27b314610173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f72656a656374000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561018657600080fd5b50610173610195366004613757565b6103a1565b3480156101a657600080fd5b50610173610b9e565b3480156101bb57600080fd5b506101736101ca3660046137dd565b610c29565b6101736101dd36600461383f565b610d23565b3480156101ee57600080fd5b5060005474010000000000000000000000000000000000000000900460ff1660405190151581526020015b60405180910390f35b34801561022e57600080fd5b5061017361152a565b34801561024357600080fd5b506101736115b5565b34801561025857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610219565b3480156102a457600080fd5b506102737f000000000000000000000000000000000000000000000000000000000000000081565b3480156102d857600080fd5b50610273736d6ad95425fcf315c39fa6f3226471d4f16f27b381565b34801561030057600080fd5b5061017361030f366004613901565b61163e565b34801561032057600080fd5b5061017361032f3660046137dd565b61213b565b34801561034057600080fd5b5061017361034f36600461399f565b612283565b34801561036057600080fd5b5061017361036f3660046137dd565b612ae2565b34801561038057600080fd5b506001546102739073ffffffffffffffffffffffffffffffffffffffff1681565b60005474010000000000000000000000000000000000000000900460ff1615610426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161016a565b8242811015610491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f50726f6e7465726156324b616672613a20455850495245440000000000000000604482015260640161016a565b6040517f9a7b5f1100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690639a7b5f119060240160a06040518083038186803b15801561051d57600080fd5b505afa158015610531573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105559190613a5e565b516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b1580156105c157600080fd5b505afa1580156105d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f99190613b10565b6040517f2590dc0400000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c81166024830152604482018c90529192507f000000000000000000000000000000000000000000000000000000000000000090911690632590dc0490606401600060405180830381600087803b15801561069457600080fd5b505af11580156106a8573d6000803e3d6000fd5b50506040517fa437ecd500000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8d81166024830152604482018d90527f000000000000000000000000000000000000000000000000000000000000000016925063a437ecd59150606401600060405180830381600087803b15801561074257600080fd5b505af1158015610756573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff851691506370a082319060240160206040518083038186803b1580156107c257600080fd5b505afa1580156107d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fa9190613b10565b905060006108088383613b58565b905060008111610874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f2062616c616e63650000000000000000000000000000000000000000604482015260640161016a565b8973ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610b1b576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8c16906370a082319060240160206040518083038186803b15801561090f57600080fd5b505afa158015610923573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109479190613b10565b6001549091506109719073ffffffffffffffffffffffffffffffffffffffff878116911684612c12565b6109ff88888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600c81527f6a756e6f3a206661696c65640000000000000000000000000000000000000000602082015260015473ffffffffffffffffffffffffffffffffffffffff169392509050612ceb565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8d16906370a082319060240160206040518083038186803b158015610a6857600080fd5b505afa158015610a7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa09190613b10565b9050610aac8282613b58565b92508a831015610b18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f696e73756666696369656e74206f757470757420616d6f756e74000000000000604482015260640161016a565b50505b610b3c73ffffffffffffffffffffffffffffffffffffffff8b163383612c12565b604080518c81526020810183905273ffffffffffffffffffffffffffffffffffffffff8e169133917fa69fc39b702a6e8195370ae2252cc11b4445837cc4abe15ac39123f2f2d8770d91015b60405180910390a3505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016a565b610c27612d04565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610caa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016a565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f8766bbabe22a1a83bfca697c0f640ac0ff9e21bc13586a08b9fc16038919516d9060200160405180910390a150565b60005474010000000000000000000000000000000000000000900460ff1615610da8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161016a565b8242811015610e13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f50726f6e7465726156324b616672613a20455850495245440000000000000000604482015260640161016a565b878614610e1f57600080fd5b6040517f9a7b5f1100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690639a7b5f119060240160a06040518083038186803b158015610eab57600080fd5b505afa158015610ebf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee39190613a5e565b516040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909150600090819073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b158015610f5157600080fd5b505afa158015610f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f899190613b10565b9050341561100757736d6ad95425fcf315c39fa6f3226471d4f16f27b373ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610fed57600080fd5b505af1158015611001573d6000803e3d6000fd5b50505050505b736d6ad95425fcf315c39fa6f3226471d4f16f27b373ffffffffffffffffffffffffffffffffffffffff8416146110715760015461107190736d6ad95425fcf315c39fa6f3226471d4f16f27b39073ffffffffffffffffffffffffffffffffffffffff1634612c12565b60005b8b811015611229578a8a8281811061108e5761108e613b6f565b905060200201356110dd8e8e848181106110aa576110aa613b6f565b90506020020160208101906110bf91906137dd565b8d8d858181106110d1576110d1613b6f565b90506020020135612dfd565b14611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f21616d6f756e7400000000000000000000000000000000000000000000000000604482015260640161016a565b8373ffffffffffffffffffffffffffffffffffffffff168d8d8381811061116d5761116d613b6f565b905060200201602081019061118291906137dd565b73ffffffffffffffffffffffffffffffffffffffff1614611217576001546112179073ffffffffffffffffffffffffffffffffffffffff168c8c848181106111cc576111cc613b6f565b905060200201358f8f858181106111e5576111e5613b6f565b90506020020160208101906111fa91906137dd565b73ffffffffffffffffffffffffffffffffffffffff169190612c12565b8061122181613b9e565b915050611074565b506112b886868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600c81527f6a756e6f3a206661696c65640000000000000000000000000000000000000000602082015260015473ffffffffffffffffffffffffffffffffffffffff169392509050612ceb565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8516906370a082319060240160206040518083038186803b15801561132157600080fd5b505afa158015611335573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113599190613b10565b90506113658282613b58565b9250888310156113d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f696e73756666696369656e74206f757470757420616d6f756e74000000000000604482015260640161016a565b50611415905073ffffffffffffffffffffffffffffffffffffffff83167f000000000000000000000000000000000000000000000000000000000000000083612fe1565b6040517fb3db428b00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8d81166024830152604482018390527f0000000000000000000000000000000000000000000000000000000000000000169063b3db428b90606401600060405180830381600087803b1580156114ab57600080fd5b505af11580156114bf573d6000803e3d6000fd5b505050508b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd5aae81523050abe356f97b927527141fa2faf11e5961c143f5f84518886a8c3348e8e8e8e88604051610b8896959493929190613c2d565b60005473ffffffffffffffffffffffffffffffffffffffff1633146115ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016a565b610c2760006130f4565b60005473ffffffffffffffffffffffffffffffffffffffff163314611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016a565b610c27613169565b60005474010000000000000000000000000000000000000000900460ff16156116c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161016a565b824281101561172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f50726f6e7465726156324b616672613a20455850495245440000000000000000604482015260640161016a565b86851461173a57600080fd5b6040517f9a7b5f1100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690639a7b5f119060240160a06040518083038186803b1580156117c657600080fd5b505afa1580156117da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fe9190613a5e565b516040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909150600090819073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b15801561186c57600080fd5b505afa158015611880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a49190613b10565b6040517f2590dc0400000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8f81166024830152604482018f90529192507f000000000000000000000000000000000000000000000000000000000000000090911690632590dc0490606401600060405180830381600087803b15801561193f57600080fd5b505af1158015611953573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a437ecd5338f8f6040518463ffffffff1660e01b81526004016119e09392919073ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600060405180830381600087803b1580156119fa57600080fd5b505af1158015611a0e573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a082319060240160206040518083038186803b158015611a7a57600080fd5b505afa158015611a8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab29190613b10565b9050611abe8282613b58565b925060008311611b2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f2062616c616e63650000000000000000000000000000000000000000604482015260640161016a565b50600090508967ffffffffffffffff811115611b4857611b48613a12565b604051908082528060200260200182016040528015611b71578160200160208202803683370190505b50905060008a67ffffffffffffffff811115611b8f57611b8f613a12565b604051908082528060200260200182016040528015611bb8578160200160208202803683370190505b50905060005b8b811015611cbb578c8c82818110611bd857611bd8613b6f565b9050602002016020810190611bed91906137dd565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a082319060240160206040518083038186803b158015611c5457600080fd5b505afa158015611c68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8c9190613b10565b828281518110611c9e57611c9e613b6f565b602090810291909101015280611cb381613b9e565b915050611bbe565b50600154611ce39073ffffffffffffffffffffffffffffffffffffffff868116911685612c12565b611d7187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600c81527f6a756e6f3a206661696c65640000000000000000000000000000000000000000602082015260015473ffffffffffffffffffffffffffffffffffffffff169392509050612ceb565b5060005b8b811015611f385760008d8d83818110611d9157611d91613b6f565b9050602002016020810190611da691906137dd565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a082319060240160206040518083038186803b158015611e0d57600080fd5b505afa158015611e21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e459190613b10565b9050828281518110611e5957611e59613b6f565b602002602001015181611e6c9190613b58565b848381518110611e7e57611e7e613b6f565b6020026020010181815250508b8b83818110611e9c57611e9c613b6f565b90506020020135848381518110611eb557611eb5613b6f565b60200260200101511015611f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f696e73756666696369656e74206f757470757420616d6f756e74000000000000604482015260640161016a565b5080611f3081613b9e565b915050611d75565b505060005b8a8110156120c057736d6ad95425fcf315c39fa6f3226471d4f16f27b38c8c83818110611f6c57611f6c613b6f565b9050602002016020810190611f8191906137dd565b73ffffffffffffffffffffffffffffffffffffffff16141561207e57736d6ad95425fcf315c39fa6f3226471d4f16f27b373ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d838381518110611fdf57611fdf613b6f565b60200260200101516040518263ffffffff1660e01b815260040161200591815260200190565b600060405180830381600087803b15801561201f57600080fd5b505af1158015612033573d6000803e3d6000fd5b5050505061207982828151811061204c5761204c613b6f565b60200260200101513373ffffffffffffffffffffffffffffffffffffffff1661325590919063ffffffff16565b6120ae565b6120ae3383838151811061209457612094613b6f565b60200260200101518e8e858181106111e5576111e5613b6f565b806120b881613b9e565b915050611f3d565b508c73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f1341e95bd965db30db26212fcbfbf117ed841037302e21f3c6d0be6d6ef9f5fb8e8e8e866040516121249493929190613ca8565b60405180910390a350505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b15801561222457600080fd5b505afa158015612238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225c9190613b10565b905061227f73ffffffffffffffffffffffffffffffffffffffff83163383612c12565b5050565b60005474010000000000000000000000000000000000000000900460ff1615612308576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161016a565b8242811015612373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f50726f6e7465726156324b616672613a20455850495245440000000000000000604482015260640161016a565b6040517f9a7b5f1100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690639a7b5f119060240160a06040518083038186803b1580156123ff57600080fd5b505afa158015612413573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124379190613a5e565b516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b1580156124a357600080fd5b505afa1580156124b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124db9190613b10565b6040517f2590dc0400000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8b81166024830152604482018b90529192507f000000000000000000000000000000000000000000000000000000000000000090911690632590dc0490606401600060405180830381600087803b15801561257657600080fd5b505af115801561258a573d6000803e3d6000fd5b50506040517fa437ecd500000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c81166024830152604482018c90527f000000000000000000000000000000000000000000000000000000000000000016925063a437ecd59150606401600060405180830381600087803b15801561262457600080fd5b505af1158015612638573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff851691506370a082319060240160206040518083038186803b1580156126a457600080fd5b505afa1580156126b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126dc9190613b10565b905060006126ea8383613b58565b905060008111612756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f2062616c616e63650000000000000000000000000000000000000000604482015260640161016a565b73ffffffffffffffffffffffffffffffffffffffff8416736d6ad95425fcf315c39fa6f3226471d4f16f27b3146129f7576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090736d6ad95425fcf315c39fa6f3226471d4f16f27b3906370a082319060240160206040518083038186803b1580156127ed57600080fd5b505afa158015612801573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128259190613b10565b60015490915061284f9073ffffffffffffffffffffffffffffffffffffffff878116911684612c12565b6128dd88888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600c81527f6a756e6f3a206661696c65640000000000000000000000000000000000000000602082015260015473ffffffffffffffffffffffffffffffffffffffff169392509050612ceb565b506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090736d6ad95425fcf315c39fa6f3226471d4f16f27b3906370a082319060240160206040518083038186803b15801561294457600080fd5b505afa158015612958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297c9190613b10565b90506129888282613b58565b92508a8310156129f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f696e73756666696369656e74206f757470757420616d6f756e74000000000000604482015260640161016a565b50505b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101829052736d6ad95425fcf315c39fa6f3226471d4f16f27b390632e1a7d4d90602401600060405180830381600087803b158015612a5d57600080fd5b505af1158015612a71573d6000803e3d6000fd5b50612a829250339150839050613255565b604080518b81526020810183905273ffffffffffffffffffffffffffffffffffffffff8d169133917f7af7d9e5b71152303ff7a5221e1a22febc3cf6407ea2a05f870d770097177db0910160405180910390a35050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612b63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161016a565b73ffffffffffffffffffffffffffffffffffffffff8116612c06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161016a565b612c0f816130f4565b50565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612ce69084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526133af565b505050565b6060612cfa84846000856134bb565b90505b9392505050565b60005474010000000000000000000000000000000000000000900460ff16612d88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161016a565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6000808211612e68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f7a65726f20616d6f756e74000000000000000000000000000000000000000000604482015260640161016a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8516906370a082319060240160206040518083038186803b158015612ed057600080fd5b505afa158015612ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f089190613b10565b9050612f2c73ffffffffffffffffffffffffffffffffffffffff851633308661363b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8616906370a082319060240160206040518083038186803b158015612f9457600080fd5b505afa158015612fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fcc9190613b10565b9050612fd88282613b58565b95945050505050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b15801561305357600080fd5b505afa158015613067573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061308b9190613b10565b6130959190613d05565b60405173ffffffffffffffffffffffffffffffffffffffff85166024820152604481018290529091506130ee9085907f095ea7b30000000000000000000000000000000000000000000000000000000090606401612c64565b50505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005474010000000000000000000000000000000000000000900460ff16156131ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161016a565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612dd33390565b804710156132bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161016a565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613319576040519150601f19603f3d011682016040523d82523d6000602084013e61331e565b606091505b5050905080612ce6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161016a565b6000613411826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ceb9092919063ffffffff16565b805190915015612ce6578080602001905181019061342f9190613d1d565b612ce6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161016a565b60608247101561354d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161016a565b843b6135b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161016a565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135de9190613d6b565b60006040518083038185875af1925050503d806000811461361b576040519150601f19603f3d011682016040523d82523d6000602084013e613620565b606091505b5091509150613630828286613699565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526130ee9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612c64565b606083156136a8575081612cfd565b8251156136b85782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016a9190613d87565b73ffffffffffffffffffffffffffffffffffffffff81168114612c0f57600080fd5b60008083601f84011261372057600080fd5b50813567ffffffffffffffff81111561373857600080fd5b60208301915083602082850101111561375057600080fd5b9250929050565b600080600080600080600060c0888a03121561377257600080fd5b873561377d816136ec565b9650602088013595506040880135613794816136ec565b9450606088013593506080880135925060a088013567ffffffffffffffff8111156137be57600080fd5b6137ca8a828b0161370e565b989b979a50959850939692959293505050565b6000602082840312156137ef57600080fd5b8135612cfd816136ec565b60008083601f84011261380c57600080fd5b50813567ffffffffffffffff81111561382457600080fd5b6020830191508360208260051b850101111561375057600080fd5b600080600080600080600080600060c08a8c03121561385d57600080fd5b8935613868816136ec565b985060208a013567ffffffffffffffff8082111561388557600080fd5b6138918d838e016137fa565b909a50985060408c01359150808211156138aa57600080fd5b6138b68d838e016137fa565b909850965060608c0135955060808c0135945060a08c01359150808211156138dd57600080fd5b506138ea8c828d0161370e565b915080935050809150509295985092959850929598565b600080600080600080600080600060c08a8c03121561391f57600080fd5b893561392a816136ec565b985060208a0135975060408a013567ffffffffffffffff8082111561394e57600080fd5b61395a8d838e016137fa565b909950975060608c013591508082111561397357600080fd5b61397f8d838e016137fa565b909750955060808c0135945060a08c01359150808211156138dd57600080fd5b60008060008060008060a087890312156139b857600080fd5b86356139c3816136ec565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff8111156139f457600080fd5b613a0089828a0161370e565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b805167ffffffffffffffff81168114613a5957600080fd5b919050565b600060a08284031215613a7057600080fd5b60405160a0810181811067ffffffffffffffff82111715613aba577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040528251613ac8816136ec565b81526020830151613ad8816136ec565b602082015260408381015190820152613af360608401613a41565b6060820152613b0460808401613a41565b60808201529392505050565b600060208284031215613b2257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613b6a57613b6a613b29565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bd057613bd0613b29565b5060010190565b8183526000602080850194508260005b85811015613c22578135613bfa816136ec565b73ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101613be7565b509495945050505050565b868152608060208201526000613c47608083018789613bd7565b82810360408401528481527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff851115613c7f57600080fd5b8460051b8087602084013760009101602001908152606092909201929092529695505050505050565b84815260006020606081840152613cc3606084018688613bd7565b838103604085015284518082528286019183019060005b81811015613cf657835183529284019291840191600101613cda565b50909998505050505050505050565b60008219821115613d1857613d18613b29565b500190565b600060208284031215613d2f57600080fd5b81518015158114612cfd57600080fd5b60005b83811015613d5a578181015183820152602001613d42565b838111156130ee5750506000910152565b60008251613d7d818460208701613d3f565b9190910192915050565b6020815260008251806020840152613da6816040850160208701613d3f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea26469706673582212202a450a13b51af1cecfee57550cf34177981ff911c05b87bdafa0bbd89793be0564736f6c634300080900330000000000000000000000004062400c54ffbe6209c5be655abe6b07b8d10e1900000000000000000000000093a0ca26d220a1e86b3b8d43d3255b36e480134f

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

0000000000000000000000004062400c54ffbe6209c5be655abe6b07b8d10e1900000000000000000000000093a0ca26d220a1e86b3b8d43d3255b36e480134f

-----Decoded View---------------
Arg [0] : _prontera (address): 0x4062400c54ffbe6209c5be655abe6b07b8d10e19
Arg [1] : _juno (address): 0x93a0ca26d220a1e86b3b8d43d3255b36e480134f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000004062400c54ffbe6209c5be655abe6b07b8d10e19
Arg [1] : 00000000000000000000000093a0ca26d220a1e86b3b8d43d3255b36e480134f


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.