Address Details
contract

0x359a3060A68488F0ea43D5cD8F6F53fe81A15f59

Contract Name
SymmChef
Creator
0xbd4446–c9804e at 0xf9fbed–67ce3d
Balance
1,312.504182475282257906 CELO ( )
Tokens
Fetching tokens...
Transactions
7,501 Transactions
Transfers
8,279 Transfers
Gas Used
853,357,493
Last Balance Update
18464035
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
SymmChef




Optimization enabled
false
Compiler version
v0.6.12+commit.27d51765




EVM Version
istanbul




Verified at
2022-04-21T11:26:03.481831Z

SymmChef.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import "./libs/BoringMath.sol";
import "./libs/BaseBoringBatchable.sol";
import "./libs/BoringOwnable.sol";
import "./libs/SignedSafeMath.sol";
import "./libs/IRewarder.sol";


contract SymmChef is BoringOwnable, BoringBatchable {
    using BoringMath for uint256;
    using BoringMath128 for uint128;
    using BoringERC20 for IERC20;
    using SignedSafeMath for int256;

    /// @notice Info of each Chef user.
    /// `amount` LP token amount the user has provided.
    /// `rewardDebt` The amount of SYMM entitled to the user.
    struct UserInfo {
        uint256 amount;
        int256 rewardDebt;
    }

    /// @notice Info of each Chef pool.
    /// `allocPoint` The amount of allocation points assigned to the pool.
    /// Also known as the amount of SYMM to distribute per block.
    struct PoolInfo {
        uint128 accSymmPerShare;
        uint64 lastRewardTime;
        uint64 allocPoint;
    }

    /// @notice Address of SYMM contract.
    IERC20 public immutable SYMM;


    /// @notice Info of each Chef pool.
    PoolInfo[] public poolInfo;
    /// @notice Address of the LP token for each Chef pool.
    IERC20[] public lpToken;
    /// @notice Address of each `IRewarder` contract in Chef.
    IRewarder[] public rewarder;

    /// @notice Info of each user that stakes LP tokens.
    mapping (uint256 => mapping (address => UserInfo)) public userInfo;
    /// @dev Total allocation points. Must be the sum of all allocation points in all pools.
    uint256 public totalAllocPoint;

    uint256 public symmPerSecond;
    uint256 private constant ACC_SYMM_PRECISION = 1e12;

    event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
    event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);
    event Harvest(address indexed user, uint256 indexed pid, uint256 amount);
    event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder);
    event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite);
    event LogUpdatePool(uint256 indexed pid, uint64 lastRewardTime, uint256 lpSupply, uint256 accSymmPerShare);
    event LogSymmPerSecond(uint256 symmPerSecond);

    /// @param _symm The SYMM token contract address.
    constructor(IERC20 _symm) public {
        SYMM = _symm;
    }

    /// @notice Returns the number of Chef pools.
    function poolLength() public view returns (uint256 pools) {
        pools = poolInfo.length;
    }

    /// @notice Add a new LP to the pool. Can only be called by the owner.
    /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.
    /// @param allocPoint AP of the new pool.
    /// @param _lpToken Address of the LP ERC-20 token.
    /// @param _rewarder Address of the rewarder delegate.
    function add(uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder) public onlyOwner {
        totalAllocPoint = totalAllocPoint.add(allocPoint);
        lpToken.push(_lpToken);
        rewarder.push(_rewarder);

        poolInfo.push(PoolInfo({
            allocPoint: allocPoint.to64(),
            lastRewardTime: block.timestamp.to64(),
            accSymmPerShare: 0
        }));
        emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder);
    }

    /// @notice Update the given pool's SYMM allocation point and `IRewarder` contract. Can only be called by the owner.
    /// @param _pid The index of the pool. See `poolInfo`.
    /// @param _allocPoint New AP of the pool.
    /// @param _rewarder Address of the rewarder delegate.
    /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored.
    function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite) public onlyOwner {
        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint.to64();
        if (overwrite) { rewarder[_pid] = _rewarder; }
        emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite);
    }

    /// @notice Sets the symm per second to be distributed. Can only be called by the owner.
    /// @param _symmPerSecond The amount of Symm to be distributed per second.
    function setSymmPerSecond(uint256 _symmPerSecond) public onlyOwner {
        symmPerSecond = _symmPerSecond;
        emit LogSymmPerSecond(_symmPerSecond);
    }


    /// @notice View function to see pending SYMM on frontend.
    /// @param _pid The index of the pool. See `poolInfo`.
    /// @param _user Address of user.
    /// @return pending SYMM reward for a given user.
    function pendingSymm(uint256 _pid, address _user) external view returns (uint256 pending) {
        PoolInfo memory pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accSymmPerShare = pool.accSymmPerShare;
        uint256 lpSupply = lpToken[_pid].balanceOf(address(this));
        if (block.timestamp > pool.lastRewardTime && lpSupply != 0) {
            uint256 time = block.timestamp.sub(pool.lastRewardTime);
            uint256 symmReward = time.mul(symmPerSecond).mul(pool.allocPoint) / totalAllocPoint;
            accSymmPerShare = accSymmPerShare.add(symmReward.mul(ACC_SYMM_PRECISION) / lpSupply);
        }
        pending = int256(user.amount.mul(accSymmPerShare) / ACC_SYMM_PRECISION).sub(user.rewardDebt).toUInt256();
    }

    /// @notice Update reward variables for all pools. Be careful of gas spending!
    /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.
    function massUpdatePools(uint256[] calldata pids) external {
        uint256 len = pids.length;
        for (uint256 i = 0; i < len; ++i) {
            updatePool(pids[i]);
        }
    }

    /// @notice Update reward variables of the given pool.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @return pool Returns the pool that was updated.
    function updatePool(uint256 pid) public returns (PoolInfo memory pool) {
        pool = poolInfo[pid];
        if (block.timestamp > pool.lastRewardTime) {
            uint256 lpSupply = lpToken[pid].balanceOf(address(this));
            if (lpSupply > 0) {
                uint256 time = block.timestamp.sub(pool.lastRewardTime);
                uint256 symmReward = time.mul(symmPerSecond).mul(pool.allocPoint) / totalAllocPoint;
                pool.accSymmPerShare = pool.accSymmPerShare.add((symmReward.mul(ACC_SYMM_PRECISION) / lpSupply).to128());
            }
            pool.lastRewardTime = block.timestamp.to64();
            poolInfo[pid] = pool;
            emit LogUpdatePool(pid, pool.lastRewardTime, lpSupply, pool.accSymmPerShare);
        }
    }

    /// @notice Deposit LP tokens to Chef for SYMM allocation.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param amount LP token amount to deposit.
    /// @param to The receiver of `amount` deposit benefit.
    function deposit(uint256 pid, uint256 amount, address to) public {
        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][to];

        // Effects
        user.amount = user.amount.add(amount);
        user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accSymmPerShare) / ACC_SYMM_PRECISION));

        // Interactions
        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.onSymmReward(pid, to, to, 0, user.amount);
        }

        lpToken[pid].safeTransferFrom(msg.sender, address(this), amount);

        emit Deposit(msg.sender, pid, amount, to);
    }

    /// @notice Withdraw LP tokens from Chef.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param amount LP token amount to withdraw.
    /// @param to Receiver of the LP tokens.
    function withdraw(uint256 pid, uint256 amount, address to) public {
        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][msg.sender];

        // Effects
        user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accSymmPerShare) / ACC_SYMM_PRECISION));
        user.amount = user.amount.sub(amount);

        // Interactions
        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.onSymmReward(pid, msg.sender, to, 0, user.amount);
        }

        lpToken[pid].safeTransfer(to, amount);

        emit Withdraw(msg.sender, pid, amount, to);
    }

    /// @notice Harvest proceeds for transaction sender to `to`.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param to Receiver of SYMM rewards.
    function harvest(uint256 pid, address to) public {
        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][msg.sender];
        int256 accumulatedSymm = int256(user.amount.mul(pool.accSymmPerShare) / ACC_SYMM_PRECISION);
        uint256 _pendingSymm = accumulatedSymm.sub(user.rewardDebt).toUInt256();

        // Effects
        user.rewardDebt = accumulatedSymm;

        // Interactions
        if (_pendingSymm != 0) {
            SYMM.safeTransfer(to, _pendingSymm);
        }

        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.onSymmReward( pid, msg.sender, to, _pendingSymm, user.amount);
        }

        emit Harvest(msg.sender, pid, _pendingSymm);
    }

    /// @notice Withdraw LP tokens from Chef and harvest proceeds for transaction sender to `to`.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param amount LP token amount to withdraw.
    /// @param to Receiver of the LP tokens and SYMM rewards.
    function withdrawAndHarvest(uint256 pid, uint256 amount, address to) public {
        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][msg.sender];
        int256 accumulatedSymm = int256(user.amount.mul(pool.accSymmPerShare) / ACC_SYMM_PRECISION);
        uint256 _pendingSymm = accumulatedSymm.sub(user.rewardDebt).toUInt256();

        // Effects
        user.rewardDebt = accumulatedSymm.sub(int256(amount.mul(pool.accSymmPerShare) / ACC_SYMM_PRECISION));
        user.amount = user.amount.sub(amount);

        // Interactions
        SYMM.safeTransfer(to, _pendingSymm);

        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.onSymmReward(pid, msg.sender, to, _pendingSymm, user.amount);
        }

        lpToken[pid].safeTransfer(to, amount);

        emit Withdraw(msg.sender, pid, amount, to);
        emit Harvest(msg.sender, pid, _pendingSymm);
    }

    /// @notice Withdraw without caring about rewards. EMERGENCY ONLY.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param to Receiver of the LP tokens.
    function emergencyWithdraw(uint256 pid, address to) public {
        UserInfo storage user = userInfo[pid][msg.sender];
        uint256 amount = user.amount;
        user.amount = 0;
        user.rewardDebt = 0;

        IRewarder _rewarder = rewarder[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.onSymmReward(pid, msg.sender, to, 0, 0);
        }

        // Note: transfer can fail or succeed if `amount` is zero.
        lpToken[pid].safeTransfer(to, amount);
        emit EmergencyWithdraw(msg.sender, pid, amount, to);
    }
}
        

/libs/BaseBoringBatchable.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

import "./IERC20.sol";


pragma experimental ABIEncoderV2;
// solhint-disable avoid-low-level-calls
// T1 - T4: OK
contract BaseBoringBatchable {
    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {
        // If the _res length is less than 68, then the transaction failed silently (without a revert message)
        if (_returnData.length < 68) return "Transaction reverted silently";
        assembly {
            // Slice the sighash.
            _returnData := add(_returnData, 0x04)
        }
        return abi.decode(_returnData, (string)); // All that remains is the revert string
    }    
    
    // F3 - F9: OK
    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense
    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value
    // C1 - C21: OK
    // C3: The length of the loop is fully under user control, so can't be exploited
    // C7: Delegatecall is only used on the same contract, so it's safe
    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns(bool[] memory successes, bytes[] memory results) {
        // Interactions
        successes = new bool[](calls.length);
        results = new bytes[](calls.length);
        for (uint256 i = 0; i < calls.length; i++) {
            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);
            require(success || !revertOnFail, _getRevertMsg(result));
            successes[i] = success;
            results[i] = result;
        }
    }
}
contract BoringBatchable is BaseBoringBatchable {
    // F1 - F9: OK
    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)
    //     if part of a batch this could be used to grief once as the second call would not need the permit
    // C1 - C21: OK
    function permitToken(IERC20 token, address from, address to, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
        // Interactions
        // X1 - X5
        token.permit(from, to, amount, deadline, v, r, s);
    }
}
          

/libs/BoringERC20.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

import "./IERC20.sol";

library BoringERC20 {
    function safeSymbol(IERC20 token) internal view returns(string memory) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));
        return success && data.length > 0 ? abi.decode(data, (string)) : "???";
    }
    function safeName(IERC20 token) internal view returns(string memory) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));
        return success && data.length > 0 ? abi.decode(data, (string)) : "???";
    }
    function safeDecimals(IERC20 token) internal view returns (uint8) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));
        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
    }
    function safeTransfer(IERC20 token, address to, uint256 amount) internal {
        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed");
    }
    function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {
        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed");
    }
}
          

/libs/BoringMath.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
// a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math)
library BoringMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b)/b == a, "BoringMath: Mul Overflow");}
    function to128(uint256 a) internal pure returns (uint128 c) {
        require(a <= uint128(-1), "BoringMath: uint128 Overflow");
        c = uint128(a);
    }
    function to64(uint256 a) internal pure returns (uint64 c) {
        require(a <= uint64(-1), "BoringMath: uint64 Overflow");
        c = uint64(a);
    }
    function to32(uint256 a) internal pure returns (uint32 c) {
        require(a <= uint32(-1), "BoringMath: uint32 Overflow");
        c = uint32(a);
    }
}
library BoringMath128 {
    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
}
library BoringMath64 {
    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
}
library BoringMath32 {
    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}
    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a - b) <= a, "BoringMath: Underflow");}
}
          

/libs/BoringOwnable.sol

// SPDX-License-Identifier: MIT

// P1 - P3: OK
pragma solidity 0.6.12;
// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol
// Edited by BoringCrypto
// T1 - T4: OK
contract BoringOwnableData {
    // V1 - V5: OK
    address public owner;
    // V1 - V5: OK
    address public pendingOwner;
}
// T1 - T4: OK
contract BoringOwnable is BoringOwnableData {
    // E1: OK
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor () public {
        owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }
    // F1 - F9: OK
    // C1 - C21: OK
    function transferOwnership(address newOwner, bool direct, bool renounce) public onlyOwner {
        if (direct) {
            // Checks
            require(newOwner != address(0) || renounce, "Ownable: zero address");
            // Effects
            emit OwnershipTransferred(owner, newOwner);
            owner = newOwner;
            pendingOwner = address(0);
        } else {
            // Effects
            pendingOwner = newOwner;
        }
    }
    // F1 - F9: OK
    // C1 - C21: OK
    function claimOwnership() public {
        address _pendingOwner = pendingOwner;
        
        // Checks
        require(msg.sender == _pendingOwner, "Ownable: caller != pending owner");
        // Effects
        emit OwnershipTransferred(owner, _pendingOwner);
        owner = _pendingOwner;
        pendingOwner = address(0);
    }
    // M1 - M5: OK
    // C1 - C21: OK
    modifier onlyOwner() {
        require(msg.sender == owner, "Ownable: caller is not the owner");
        _;
    }
}
          

/libs/IERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;


interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    // EIP 2612
    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
}
          

/libs/IRewarder.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

import "./BoringERC20.sol";
import "./IERC20.sol";


interface IRewarder {
    using BoringERC20 for IERC20;
    function onSymmReward(uint256 pid, address user, address recipient, uint256 symmAmount, uint256 newLpAmount) external;
    function pendingTokens(uint256 pid, address user, uint256 symmAmount) external view returns (IERC20[] memory, uint256[] memory);
}
          

/libs/SignedSafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;
library SignedSafeMath {
    int256 constant private _INT256_MIN = -2**255;
    /**
     * @dev Returns the multiplication of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // 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;
        }
        require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");
        int256 c = a * b;
        require(c / a == b, "SignedSafeMath: multiplication overflow");
        return c;
    }
    /**
     * @dev Returns the integer division of two signed 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(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0, "SignedSafeMath: division by zero");
        require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");
        int256 c = a / b;
        return c;
    }
    /**
     * @dev Returns the subtraction of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");
        return c;
    }
    /**
     * @dev Returns the addition of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");
        return c;
    }
    function toUInt256(int256 a) internal pure returns (uint256) {
        require(a >= 0, "Integer < 0");
        return uint256(a);
    }
}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_symm","internalType":"contract IERC20"}]},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"EmergencyWithdraw","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Harvest","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LogPoolAddition","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"allocPoint","internalType":"uint256","indexed":false},{"type":"address","name":"lpToken","internalType":"contract IERC20","indexed":true},{"type":"address","name":"rewarder","internalType":"contract IRewarder","indexed":true}],"anonymous":false},{"type":"event","name":"LogSetPool","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"allocPoint","internalType":"uint256","indexed":false},{"type":"address","name":"rewarder","internalType":"contract IRewarder","indexed":true},{"type":"bool","name":"overwrite","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"LogSymmPerSecond","inputs":[{"type":"uint256","name":"symmPerSecond","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LogUpdatePool","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint64","name":"lastRewardTime","internalType":"uint64","indexed":false},{"type":"uint256","name":"lpSupply","internalType":"uint256","indexed":false},{"type":"uint256","name":"accSymmPerShare","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"SYMM","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"add","inputs":[{"type":"uint256","name":"allocPoint","internalType":"uint256"},{"type":"address","name":"_lpToken","internalType":"contract IERC20"},{"type":"address","name":"_rewarder","internalType":"contract IRewarder"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"bool[]","name":"successes","internalType":"bool[]"},{"type":"bytes[]","name":"results","internalType":"bytes[]"}],"name":"batch","inputs":[{"type":"bytes[]","name":"calls","internalType":"bytes[]"},{"type":"bool","name":"revertOnFail","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deposit","inputs":[{"type":"uint256","name":"pid","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdraw","inputs":[{"type":"uint256","name":"pid","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"harvest","inputs":[{"type":"uint256","name":"pid","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"lpToken","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"massUpdatePools","inputs":[{"type":"uint256[]","name":"pids","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pendingOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"pending","internalType":"uint256"}],"name":"pendingSymm","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"permitToken","inputs":[{"type":"address","name":"token","internalType":"contract IERC20"},{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint128","name":"accSymmPerShare","internalType":"uint128"},{"type":"uint64","name":"lastRewardTime","internalType":"uint64"},{"type":"uint64","name":"allocPoint","internalType":"uint64"}],"name":"poolInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"pools","internalType":"uint256"}],"name":"poolLength","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IRewarder"}],"name":"rewarder","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_allocPoint","internalType":"uint256"},{"type":"address","name":"_rewarder","internalType":"contract IRewarder"},{"type":"bool","name":"overwrite","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSymmPerSecond","inputs":[{"type":"uint256","name":"_symmPerSecond","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"symmPerSecond","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalAllocPoint","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"},{"type":"bool","name":"direct","internalType":"bool"},{"type":"bool","name":"renounce","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"tuple","name":"pool","internalType":"struct SymmChef.PoolInfo","components":[{"type":"uint128","name":"accSymmPerShare","internalType":"uint128"},{"type":"uint64","name":"lastRewardTime","internalType":"uint64"},{"type":"uint64","name":"allocPoint","internalType":"uint64"}]}],"name":"updatePool","inputs":[{"type":"uint256","name":"pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"int256","name":"rewardDebt","internalType":"int256"}],"name":"userInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"pid","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawAndHarvest","inputs":[{"type":"uint256","name":"pid","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"}]}]
            

Deployed ByteCode

0x6080604052600436106101665760003560e01c80637c516e94116100d15780639a0c77731161008a578063d1abb90711610064578063d1abb90714610539578063d2423b5114610562578063db6a6cea14610593578063e30c3978146105be57610166565b80639a0c7773146104a8578063ab7de098146104d3578063c346253d146104fc57610166565b80637c516e941461039b57806387df708f146103c457806388bba42f146103ed5780638da5cb5b146104165780638dbdbe6d1461044157806393f1a40b1461046a57610166565b80632f940c70116101235780632f940c701461027b5780634e71e0c8146102a457806351eb05a6146102bb57806357a5b58c146102f85780635ebe28531461032157806378ed5d1f1461035e57610166565b8063078dfbe71461016b578063081e3eda146101945780630ad58d2f146101bf5780631526fe27146101e857806317caf6f11461022757806318fccc7614610252575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906130cc565b6105e9565b005b3480156101a057600080fd5b506101a961083d565b6040516101b69190613e83565b60405180910390f35b3480156101cb57600080fd5b506101e660048036038101906101e191906133b1565b61084a565b005b3480156101f457600080fd5b5061020f600480360381019061020a91906132d4565b610ade565b60405161021e93929190613e4c565b60405180910390f35b34801561023357600080fd5b5061023c610b55565b6040516102499190613e83565b60405180910390f35b34801561025e57600080fd5b5061027960048036038101906102749190613326565b610b5b565b005b34801561028757600080fd5b506102a2600480360381019061029d9190613326565b610dc1565b005b3480156102b057600080fd5b506102b9610fe6565b005b3480156102c757600080fd5b506102e260048036038101906102dd91906132d4565b61117a565b6040516102ef9190613e31565b60405180910390f35b34801561030457600080fd5b5061031f600480360381019061031a9190613173565b61154e565b005b34801561032d57600080fd5b5061034860048036038101906103439190613326565b61158e565b6040516103559190613e83565b60405180910390f35b34801561036a57600080fd5b50610385600480360381019061038091906132d4565b6118b0565b6040516103929190613c39565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd91906131e1565b6118ec565b005b3480156103d057600080fd5b506103eb60048036038101906103e691906132d4565b61196d565b005b3480156103f957600080fd5b50610414600480360381019061040f9190613400565b611a3c565b005b34801561042257600080fd5b5061042b611c6f565b6040516104389190613b18565b60405180910390f35b34801561044d57600080fd5b50610468600480360381019061046391906133b1565b611c93565b005b34801561047657600080fd5b50610491600480360381019061048c9190613326565b611f29565b60405161049f929190614013565b60405180910390f35b3480156104b457600080fd5b506104bd611f5a565b6040516104ca9190613c39565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f59190613362565b611f7e565b005b34801561050857600080fd5b50610523600480360381019061051e91906132d4565b612288565b6040516105309190613c54565b60405180910390f35b34801561054557600080fd5b50610560600480360381019061055b91906133b1565b6122c4565b005b61057c6004803603810190610577919061311b565b612651565b60405161058a929190613c02565b60405180910390f35b34801561059f57600080fd5b506105a861282f565b6040516105b59190613e83565b60405180910390f35b3480156105ca57600080fd5b506105d3612835565b6040516105e09190613b18565b60405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066e90613d71565b60405180910390fd5b81156107f657600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415806106b65750805b6106f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ec90613d11565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610838565b82600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050565b6000600280549050905090565b610852612ee0565b61085b8461117a565b905060006005600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506108fe64e8d4a510006108e384600001516fffffffffffffffffffffffffffffffff168761285b90919063ffffffff16565b816108ea57fe5b0482600101546128bd90919063ffffffff16565b816001018190555061091d84826000015461293590919063ffffffff16565b816000018190555060006004868154811061093457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a0e578073ffffffffffffffffffffffffffffffffffffffff1663ac9e6d92873387600087600001546040518663ffffffff1660e01b81526004016109db959493929190613ef1565b600060405180830381600087803b1580156109f557600080fd5b505af1158015610a09573d6000803e3d6000fd5b505050505b610a70848660038981548110610a2057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166129859092919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff16863373ffffffffffffffffffffffffffffffffffffffff167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec213288604051610ace9190613e83565b60405180910390a4505050505050565b60028181548110610aeb57fe5b906000526020600020016000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a900467ffffffffffffffff16908060000160189054906101000a900467ffffffffffffffff16905083565b60065481565b610b63612ee0565b610b6c8361117a565b905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600064e8d4a51000610bf784600001516fffffffffffffffffffffffffffffffff16846000015461285b90919063ffffffff16565b81610bfe57fe5b0490506000610c22610c1d8460010154846128bd90919063ffffffff16565b612abc565b905081836001018190555060008114610c8157610c8085827f0000000000000000000000008427bd503dd3169ccc9aff7326c15258bc30547873ffffffffffffffffffffffffffffffffffffffff166129859092919063ffffffff16565b5b600060048781548110610c9057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d69578073ffffffffffffffffffffffffffffffffffffffff1663ac9e6d928833898689600001546040518663ffffffff1660e01b8152600401610d36959493929190613f44565b600060405180830381600087803b158015610d5057600080fd5b505af1158015610d64573d6000803e3d6000fd5b505050505b863373ffffffffffffffffffffffffffffffffffffffff167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051610db09190613e83565b60405180910390a350505050505050565b60006005600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506000826000018190555060008260010181905550600060048581548110610e4157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f17578073ffffffffffffffffffffffffffffffffffffffff1663ac9e6d928633876000806040518663ffffffff1660e01b8152600401610ee4959493929190613e9e565b600060405180830381600087803b158015610efe57600080fd5b505af1158015610f12573d6000803e3d6000fd5b505050505b610f79848360038881548110610f2957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166129859092919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff16853373ffffffffffffffffffffffffffffffffffffffff167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b85604051610fd79190613e83565b60405180910390a45050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107290613d91565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611182612ee0565b6002828154811061118f57fe5b906000526020600020016040518060600160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050806020015167ffffffffffffffff164211156115495760006003838154811061127957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112dc9190613b18565b60206040518083038186803b1580156112f457600080fd5b505afa158015611308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132c91906132fd565b9050600081111561142357600061135a836020015167ffffffffffffffff164261293590919063ffffffff16565b90506000600654611396856040015167ffffffffffffffff166113886007548661285b90919063ffffffff16565b61285b90919063ffffffff16565b8161139d57fe5b0490506113f16113cc846113bf64e8d4a510008561285b90919063ffffffff16565b816113c657fe5b04612b09565b85600001516fffffffffffffffffffffffffffffffff16612b8890919063ffffffff16565b84600001906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff168152505050505b61142c42612bfc565b826020019067ffffffffffffffff16908167ffffffffffffffff1681525050816002848154811061145957fe5b9060005260206000200160008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050827f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad353836020015183856000015160405161153f9392919061403c565b60405180910390a2505b919050565b600082829050905060005b818110156115885761157c84848381811061157057fe5b9050602002013561117a565b50806001019050611559565b50505050565b6000611598612ee0565b600284815481106115a557fe5b906000526020600020016040518060600160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050905060006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600001516fffffffffffffffffffffffffffffffff1690506000600387815481106116e857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161174b9190613b18565b60206040518083038186803b15801561176357600080fd5b505afa158015611777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179b91906132fd565b9050836020015167ffffffffffffffff16421180156117bb575060008114155b156118615760006117e3856020015167ffffffffffffffff164261293590919063ffffffff16565b9050600060065461181f876040015167ffffffffffffffff166118116007548661285b90919063ffffffff16565b61285b90919063ffffffff16565b8161182657fe5b04905061185c8361184564e8d4a510008461285b90919063ffffffff16565b8161184c57fe5b0485612c7390919063ffffffff16565b935050505b6118a461189f846001015464e8d4a5100061188986886000015461285b90919063ffffffff16565b8161189057fe5b046128bd90919063ffffffff16565b612abc565b94505050505092915050565b600381815481106118bd57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8773ffffffffffffffffffffffffffffffffffffffff1663d505accf888888888888886040518863ffffffff1660e01b81526004016119319796959493929190613b6a565b600060405180830381600087803b15801561194b57600080fd5b505af115801561195f573d6000803e3d6000fd5b505050505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f290613d71565b60405180910390fd5b806007819055507f5d0ff106b0ea4327bbc370b1c9f5edef9d8603ffe11a66b3dd3d22054118171e81604051611a319190613e83565b60405180910390a150565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac190613d71565b60405180910390fd5b611b2983611b1b60028781548110611ade57fe5b9060005260206000200160000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1660065461293590919063ffffffff16565b612c7390919063ffffffff16565b600681905550611b3883612bfc565b60028581548110611b4557fe5b9060005260206000200160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508015611bd5578160048581548110611b8c57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b80611c175760048481548110611be757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611c19565b815b73ffffffffffffffffffffffffffffffffffffffff16847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e18658584604051611c61929190613fea565b60405180910390a350505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c9b612ee0565b611ca48461117a565b905060006005600086815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611d11848260000154612c7390919063ffffffff16565b8160000181905550611d6664e8d4a51000611d4b84600001516fffffffffffffffffffffffffffffffff168761285b90919063ffffffff16565b81611d5257fe5b048260010154612cc390919063ffffffff16565b8160010181905550600060048681548110611d7d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e57578073ffffffffffffffffffffffffffffffffffffffff1663ac9e6d92878687600087600001546040518663ffffffff1660e01b8152600401611e24959493929190613f97565b600060405180830381600087803b158015611e3e57600080fd5b505af1158015611e52573d6000803e3d6000fd5b505050505b611ebb33308760038a81548110611e6a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612d3b909392919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff16863373ffffffffffffffffffffffffffffffffffffffff167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b4788604051611f199190613e83565b60405180910390a4505050505050565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b7f0000000000000000000000008427bd503dd3169ccc9aff7326c15258bc30547881565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461200c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200390613d71565b60405180910390fd5b61202183600654612c7390919063ffffffff16565b6006819055506003829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506004819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002604051806060016040528060006fffffffffffffffffffffffffffffffff16815260200161211c42612bfc565b67ffffffffffffffff16815260200161213486612bfc565b67ffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1661224c600160038054905061293590919063ffffffff16565b7f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e58660405161227b9190613e83565b60405180910390a4505050565b6004818154811061229557fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122cc612ee0565b6122d58461117a565b905060006005600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600064e8d4a5100061236084600001516fffffffffffffffffffffffffffffffff16846000015461285b90919063ffffffff16565b8161236757fe5b049050600061238b6123868460010154846128bd90919063ffffffff16565b612abc565b90506123d664e8d4a510006123bf86600001516fffffffffffffffffffffffffffffffff168961285b90919063ffffffff16565b816123c657fe5b04836128bd90919063ffffffff16565b83600101819055506123f586846000015461293590919063ffffffff16565b836000018190555061244885827f0000000000000000000000008427bd503dd3169ccc9aff7326c15258bc30547873ffffffffffffffffffffffffffffffffffffffff166129859092919063ffffffff16565b60006004888154811061245757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612530578073ffffffffffffffffffffffffffffffffffffffff1663ac9e6d928933898689600001546040518663ffffffff1660e01b81526004016124fd959493929190613f44565b600060405180830381600087803b15801561251757600080fd5b505af115801561252b573d6000803e3d6000fd5b505050505b612592868860038b8154811061254257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166129859092919063ffffffff16565b8573ffffffffffffffffffffffffffffffffffffffff16883373ffffffffffffffffffffffffffffffffffffffff167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a6040516125f09190613e83565b60405180910390a4873373ffffffffffffffffffffffffffffffffffffffff167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249548460405161263f9190613e83565b60405180910390a35050505050505050565b6060808484905067ffffffffffffffff8111801561266e57600080fd5b5060405190808252806020026020018201604052801561269d5781602001602082028036833780820191505090505b5091508484905067ffffffffffffffff811180156126ba57600080fd5b506040519080825280602002602001820160405280156126ee57816020015b60608152602001906001900390816126d95790505b50905060005b8585905081101561282657600060603073ffffffffffffffffffffffffffffffffffffffff1688888581811061272657fe5b90506020028101906127389190614073565b604051612746929190613ae8565b600060405180830381855af49150503d8060008114612781576040519150601f19603f3d011682016040523d82523d6000602084013e612786565b606091505b50915091508180612795575085155b61279e82612e75565b906127df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d69190613c6f565b60405180910390fd5b50818584815181106127ed57fe5b6020026020010190151590811515815250508084848151811061280c57fe5b6020026020010181905250505080806001019150506126f4565b50935093915050565b60075481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080821480612878575082828385029250828161287557fe5b04145b6128b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ae90613e11565b60405180910390fd5b92915050565b6000808284039050600083121580156128d65750838113155b806128ec57506000831280156128eb57508381135b5b61292b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292290613dd1565b60405180910390fd5b8091505092915050565b600082828403915081111561297f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297690613c91565b60405180910390fd5b92915050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016129b8929190613bd9565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612a069190613b01565b6000604051808303816000865af19150503d8060008114612a43576040519150601f19603f3d011682016040523d82523d6000602084013e612a48565b606091505b5091509150818015612a765750600081511480612a75575080806020019051810190612a7491906131b8565b5b5b612ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aac90613cd1565b60405180910390fd5b5050505050565b600080821215612b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af890613cb1565b60405180910390fd5b819050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff16821115612b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7790613d31565b60405180910390fd5b819050919050565b6000816fffffffffffffffffffffffffffffffff168284019150816fffffffffffffffffffffffffffffffff161015612bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bed90613d51565b60405180910390fd5b92915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff16821115612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6290613db1565b60405180910390fd5b819050919050565b6000818284019150811015612cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb490613d51565b60405180910390fd5b92915050565b600080828401905060008312158015612cdc5750838112155b80612cf25750600083128015612cf157508381125b5b612d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2890613cf1565b60405180910390fd5b8091505092915050565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401612d7093929190613b33565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612dbe9190613b01565b6000604051808303816000865af19150503d8060008114612dfb576040519150601f19603f3d011682016040523d82523d6000602084013e612e00565b606091505b5091509150818015612e2e5750600081511480612e2d575080806020019051810190612e2c91906131b8565b5b5b612e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6490613df1565b60405180910390fd5b505050505050565b6060604482511015612ebe576040518060400160405280601d81526020017f5472616e73616374696f6e2072657665727465642073696c656e746c790000008152509050612edb565b60048201915081806020019051810190612ed89190613293565b90505b919050565b604051806060016040528060006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681525090565b600081359050612f368161438a565b92915050565b60008083601f840112612f4e57600080fd5b8235905067ffffffffffffffff811115612f6757600080fd5b602083019150836020820283011115612f7f57600080fd5b9250929050565b60008083601f840112612f9857600080fd5b8235905067ffffffffffffffff811115612fb157600080fd5b602083019150836020820283011115612fc957600080fd5b9250929050565b600081359050612fdf816143a1565b92915050565b600081519050612ff4816143a1565b92915050565b600081359050613009816143b8565b92915050565b60008135905061301e816143cf565b92915050565b600081359050613033816143e6565b92915050565b600082601f83011261304a57600080fd5b815161305d613058826140f7565b6140ca565b9150808252602083016020830185838301111561307957600080fd5b613084838284614346565b50505092915050565b60008135905061309c816143fd565b92915050565b6000815190506130b1816143fd565b92915050565b6000813590506130c681614414565b92915050565b6000806000606084860312156130e157600080fd5b60006130ef86828701612f27565b935050602061310086828701612fd0565b925050604061311186828701612fd0565b9150509250925092565b60008060006040848603121561313057600080fd5b600084013567ffffffffffffffff81111561314a57600080fd5b61315686828701612f3c565b9350935050602061316986828701612fd0565b9150509250925092565b6000806020838503121561318657600080fd5b600083013567ffffffffffffffff8111156131a057600080fd5b6131ac85828601612f86565b92509250509250929050565b6000602082840312156131ca57600080fd5b60006131d884828501612fe5565b91505092915050565b600080600080600080600080610100898b0312156131fe57600080fd5b600061320c8b828c0161300f565b985050602061321d8b828c01612f27565b975050604061322e8b828c01612f27565b965050606061323f8b828c0161308d565b95505060806132508b828c0161308d565b94505060a06132618b828c016130b7565b93505060c06132728b828c01612ffa565b92505060e06132838b828c01612ffa565b9150509295985092959890939650565b6000602082840312156132a557600080fd5b600082015167ffffffffffffffff8111156132bf57600080fd5b6132cb84828501613039565b91505092915050565b6000602082840312156132e657600080fd5b60006132f48482850161308d565b91505092915050565b60006020828403121561330f57600080fd5b600061331d848285016130a2565b91505092915050565b6000806040838503121561333957600080fd5b60006133478582860161308d565b925050602061335885828601612f27565b9150509250929050565b60008060006060848603121561337757600080fd5b60006133858682870161308d565b93505060206133968682870161300f565b92505060406133a786828701613024565b9150509250925092565b6000806000606084860312156133c657600080fd5b60006133d48682870161308d565b93505060206133e58682870161308d565b92505060406133f686828701612f27565b9150509250925092565b6000806000806080858703121561341657600080fd5b60006134248782880161308d565b94505060206134358782880161308d565b935050604061344687828801613024565b925050606061345787828801612fd0565b91505092959194509250565b600061346f8383613580565b60208301905092915050565b600061348783836135d2565b905092915050565b61349881614295565b82525050565b6134a7816141d8565b82525050565b60006134b882614143565b6134c28185614189565b93506134cd83614123565b8060005b838110156134fe5781516134e58882613463565b97506134f08361416f565b9250506001810190506134d1565b5085935050505092915050565b60006135168261414e565b613520818561419a565b93508360208202850161353285614133565b8060005b8581101561356e578484038952815161354f858261347b565b945061355a8361417c565b925060208a01995050600181019050613536565b50829750879550505050505092915050565b613589816141ea565b82525050565b613598816141ea565b82525050565b6135a7816141f6565b82525050565b60006135b983856141bc565b93506135c6838584614337565b82840190509392505050565b60006135dd82614159565b6135e781856141ab565b93506135f7818560208601614346565b61360081614379565b840191505092915050565b600061361682614159565b61362081856141bc565b9350613630818560208601614346565b80840191505092915050565b613645816142a7565b82525050565b613654816142cb565b82525050565b61366381614224565b82525050565b613672816142ef565b82525050565b600061368382614164565b61368d81856141c7565b935061369d818560208601614346565b6136a681614379565b840191505092915050565b60006136be6015836141c7565b91507f426f72696e674d6174683a20556e646572666c6f7700000000000000000000006000830152602082019050919050565b60006136fe600b836141c7565b91507f496e7465676572203c20300000000000000000000000000000000000000000006000830152602082019050919050565b600061373e601c836141c7565b91507f426f72696e6745524332303a205472616e73666572206661696c6564000000006000830152602082019050919050565b600061377e6021836141c7565b91507f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137e46015836141c7565b91507f4f776e61626c653a207a65726f206164647265737300000000000000000000006000830152602082019050919050565b6000613824601c836141c7565b91507f426f72696e674d6174683a2075696e74313238204f766572666c6f77000000006000830152602082019050919050565b60006138646018836141c7565b91507f426f72696e674d6174683a20416464204f766572666c6f7700000000000000006000830152602082019050919050565b60006138a46020836141c7565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006138e46020836141c7565b91507f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e65726000830152602082019050919050565b6000613924601b836141c7565b91507f426f72696e674d6174683a2075696e743634204f766572666c6f7700000000006000830152602082019050919050565b60006139646024836141c7565b91507f5369676e6564536166654d6174683a207375627472616374696f6e206f76657260008301527f666c6f77000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139ca6020836141c7565b91507f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646000830152602082019050919050565b6000613a0a6018836141c7565b91507f426f72696e674d6174683a204d756c204f766572666c6f7700000000000000006000830152602082019050919050565b606082016000820151613a536000850182613a7f565b506020820151613a666020850182613abb565b506040820151613a796040850182613abb565b50505050565b613a888161422e565b82525050565b613a978161422e565b82525050565b613aa681614301565b82525050565b613ab58161426a565b82525050565b613ac481614274565b82525050565b613ad381614274565b82525050565b613ae281614288565b82525050565b6000613af58284866135ad565b91508190509392505050565b6000613b0d828461360b565b915081905092915050565b6000602082019050613b2d600083018461349e565b92915050565b6000606082019050613b48600083018661349e565b613b55602083018561349e565b613b626040830184613aac565b949350505050565b600060e082019050613b7f600083018a61349e565b613b8c602083018961349e565b613b996040830188613aac565b613ba66060830187613aac565b613bb36080830186613ad9565b613bc060a083018561359e565b613bcd60c083018461359e565b98975050505050505050565b6000604082019050613bee600083018561349e565b613bfb6020830184613aac565b9392505050565b60006040820190508181036000830152613c1c81856134ad565b90508181036020830152613c30818461350b565b90509392505050565b6000602082019050613c4e600083018461363c565b92915050565b6000602082019050613c69600083018461364b565b92915050565b60006020820190508181036000830152613c898184613678565b905092915050565b60006020820190508181036000830152613caa816136b1565b9050919050565b60006020820190508181036000830152613cca816136f1565b9050919050565b60006020820190508181036000830152613cea81613731565b9050919050565b60006020820190508181036000830152613d0a81613771565b9050919050565b60006020820190508181036000830152613d2a816137d7565b9050919050565b60006020820190508181036000830152613d4a81613817565b9050919050565b60006020820190508181036000830152613d6a81613857565b9050919050565b60006020820190508181036000830152613d8a81613897565b9050919050565b60006020820190508181036000830152613daa816138d7565b9050919050565b60006020820190508181036000830152613dca81613917565b9050919050565b60006020820190508181036000830152613dea81613957565b9050919050565b60006020820190508181036000830152613e0a816139bd565b9050919050565b60006020820190508181036000830152613e2a816139fd565b9050919050565b6000606082019050613e466000830184613a3d565b92915050565b6000606082019050613e616000830186613a8e565b613e6e6020830185613aca565b613e7b6040830184613aca565b949350505050565b6000602082019050613e986000830184613aac565b92915050565b600060a082019050613eb36000830188613aac565b613ec0602083018761348f565b613ecd604083018661349e565b613eda6060830185613669565b613ee76080830184613669565b9695505050505050565b600060a082019050613f066000830188613aac565b613f13602083018761348f565b613f20604083018661349e565b613f2d6060830185613669565b613f3a6080830184613aac565b9695505050505050565b600060a082019050613f596000830188613aac565b613f66602083018761348f565b613f73604083018661349e565b613f806060830185613aac565b613f8d6080830184613aac565b9695505050505050565b600060a082019050613fac6000830188613aac565b613fb9602083018761349e565b613fc6604083018661349e565b613fd36060830185613669565b613fe06080830184613aac565b9695505050505050565b6000604082019050613fff6000830185613aac565b61400c602083018461358f565b9392505050565b60006040820190506140286000830185613aac565b614035602083018461365a565b9392505050565b60006060820190506140516000830186613aca565b61405e6020830185613aac565b61406b6040830184613a9d565b949350505050565b6000808335600160200384360303811261408c57600080fd5b80840192508235915067ffffffffffffffff8211156140aa57600080fd5b6020830192506001820236038313156140c257600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff821117156140ed57600080fd5b8060405250919050565b600067ffffffffffffffff82111561410e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006141e38261424a565b9050919050565b60008115159050919050565b6000819050919050565b600061420b826141d8565b9050919050565b600061421d826141d8565b9050919050565b6000819050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60006142a082614313565b9050919050565b60006142b2826142b9565b9050919050565b60006142c48261424a565b9050919050565b60006142d6826142dd565b9050919050565b60006142e88261424a565b9050919050565b60006142fa8261426a565b9050919050565b600061430c8261422e565b9050919050565b600061431e82614325565b9050919050565b60006143308261424a565b9050919050565b82818337600083830152505050565b60005b83811015614364578082015181840152602081019050614349565b83811115614373576000848401525b50505050565b6000601f19601f8301169050919050565b614393816141d8565b811461439e57600080fd5b50565b6143aa816141ea565b81146143b557600080fd5b50565b6143c1816141f6565b81146143cc57600080fd5b50565b6143d881614200565b81146143e357600080fd5b50565b6143ef81614212565b81146143fa57600080fd5b50565b6144068161426a565b811461441157600080fd5b50565b61441d81614288565b811461442857600080fd5b5056fea26469706673582212207fde30e09c55335441a11747828bcb48bd7ae2b144392f831a1f5935a1719a9564736f6c634300060c0033