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
Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
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