Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xd468a8bce7684d6d033832bcdabaf9439d392f5d
Contract Name:
CraftStaking
Compiler Version
v0.8.5+commit.a4f2e591
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2021-12-15 */ /** *Submitted for verification at snowtrace.io on 2021-11-29 */ // SPDX-License-Identifier: NONE pragma solidity 0.8.5; // Part: OpenZeppelin/[email protected]/Address /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Part: OpenZeppelin/[email protected]/Context /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // Part: OpenZeppelin/[email protected]/IERC20 /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // Part: OpenZeppelin/[email protected]/SafeMath // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // Part: OpenZeppelin/[email protected]/Ownable /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // Part: OpenZeppelin/[email protected]/SafeERC20 /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: CraftStaking.sol contract CraftStaking is Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; struct UserInfo { uint256 amount; // How many staking tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. uint256 rewardDebtAtTimestamp; // the last timestamp user stake uint256 lastWithdrawTimestamp; // the last timestamp user withdrew at. uint256 firstDepositTimestamp; // the first timestamp user deposited at. uint256 lastDepositTimestamp; // the last timestamp user deposited at. } struct PoolInfo { IERC20 token; // Address of staking token contract. uint256 supply; // supply for this pool uint256 allocPoint; // How many allocation points assigned to this pool. uint256 lastRewardTimestamp; // Last timestamp that tokens distribution occurs. uint256 accTokenPerShare; // Accumulated tokens per share, times 1e12. See below. uint256 totalAllocation; // Total allocation for the pool uint256 totalReward; // Total rewards for the pool } // Basis point base to calculate fees uint256 public constant FEE_BASE = 10000; // Reward token instance IERC20 public immutable rewardToken; // Address where all fees goes, can be adjusted by the owner address public feeRecipient; // Reward token per second, can be adjusted by the owner uint256 public tokenPerSecond = 1e17; // Reward bonus multipliers, can be adjusted by the owner uint256 public bonusMultiplier = 1; // The timestamp when rewards starts. uint256 public startTimestamp; // The timestamp when rewards ends uint256 public endTimestamp; // Pools array PoolInfo[] public poolInfo; // Users mapping, poolId => userAddress => UserInfo mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // Array with fee amount (in basis points) for given stage uint256[] public feeStage; // Array with timestamp deltas, used to calculate fee stage, uint256[] public timestampDeltaFeeStage; event CreatePool(address indexed stakingToken, address indexed rewardToken, uint256 indexed allocation); event UpdatePoolAllocation(uint256 indexed pid, uint256 indexed allocation); event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); constructor( IERC20 _rewardToken, IERC20 _stakingToken, uint256 _startTimestamp, uint256 _endTimestamp, uint256 _allocation, address _feeRecipient, uint256[] memory _feeStage, uint256[] memory _timestampDeltaFeeStage ) public { rewardToken = _rewardToken; feeRecipient = _feeRecipient; startTimestamp = _startTimestamp; endTimestamp = _endTimestamp; feeStage = _feeStage; timestampDeltaFeeStage = _timestampDeltaFeeStage; poolInfo.push( PoolInfo({ token: _stakingToken, supply: 0, allocPoint: 1, lastRewardTimestamp: _startTimestamp, accTokenPerShare: 0, totalAllocation: _allocation, totalReward: 0 }) ); totalAllocPoint = 1; emit CreatePool(address(_stakingToken), address(_rewardToken), _allocation); } /** * @dev Updates reward vairables for the pool. */ function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTimestamp || pool.lastRewardTimestamp >= endTimestamp) { return; } if (pool.supply <= 0) { pool.lastRewardTimestamp = block.timestamp; return; } uint256 toTimestamp = block.timestamp > endTimestamp ? endTimestamp : block.timestamp; uint256 multiplier = getMultiplier(pool.lastRewardTimestamp, toTimestamp); uint256 reward = multiplier.mul(tokenPerSecond).mul(pool.allocPoint).div(totalAllocPoint); if (pool.totalReward.add(reward) >= pool.totalAllocation) { reward = pool.totalAllocation.sub(pool.totalReward); } pool.accTokenPerShare = pool.accTokenPerShare.add(reward.mul(1e12).div(pool.supply)); pool.lastRewardTimestamp = toTimestamp; pool.totalReward = pool.totalReward.add(reward); } /** * @dev Deposit tokens to DuelStaking for reward token allocation. */ function deposit(uint256 _pid, uint256 _amount) external { require(block.timestamp < endTimestamp, "DuelStaking: Deposit deadline"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { uint256 pending = user.amount.mul(pool.accTokenPerShare).div(1e12).sub(user.rewardDebt); if (pending > 0) { safeTokenTransfer(msg.sender, pending); } } user.amount = user.amount.add(_amount); user.rewardDebt = user.amount.mul(pool.accTokenPerShare).div(1e12); if (user.firstDepositTimestamp == 0) { user.firstDepositTimestamp = block.timestamp; } user.lastDepositTimestamp = block.timestamp; pool.supply = pool.supply.add(_amount); pool.token.safeTransferFrom(address(msg.sender), address(this), _amount); emit Deposit(msg.sender, _pid, _amount); } /** * @dev Withdraw LP tokens from DuelStaking. */ function withdraw(uint256 _pid, uint256 _amount) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "DuelStaking: Withdraw amount exceeds user amount"); updatePool(_pid); uint256 pending = user.amount.mul(pool.accTokenPerShare).div(1e12).sub(user.rewardDebt); if (pending > 0) { safeTokenTransfer(msg.sender, pending); } if (_amount > 0) { uint256 fee = getWithdrawalFee(_pid, msg.sender); uint256 amount = applyFee(fee, _amount); uint256 feeAmount = calculateFee(fee, _amount); user.amount = user.amount.sub(_amount); user.lastWithdrawTimestamp = block.timestamp; pool.supply = pool.supply.sub(_amount); pool.token.safeTransfer(address(msg.sender), amount); if (feeAmount > 0) { pool.token.safeTransfer(address(feeRecipient), feeAmount); } } user.rewardDebt = user.amount.mul(pool.accTokenPerShare).div(1e12); emit Withdraw(msg.sender, _pid, _amount); } /** * @dev Withdraw without caring about rewards. EMERGENCY ONLY. * This has 25% slashing fee as same block withdrawals to prevent abuse of this function. */ function emergencyWithdraw(uint256 _pid) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; pool.supply = pool.supply.sub(user.amount); uint256 amount = applyFee(feeStage[0], user.amount); uint256 feeAmount = calculateFee(feeStage[0], user.amount); user.amount = 0; user.rewardDebt = 0; pool.token.safeTransfer(address(msg.sender), amount); if (feeAmount > 0) { pool.token.safeTransfer(address(feeRecipient), feeAmount); } emit EmergencyWithdraw(msg.sender, _pid, amount); } /** * @dev Returns reward multiplier over the given _from to _to block. */ function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { return _to.sub(_from).mul(bonusMultiplier); } /** * @dev Returns pending rewards for user. */ function getPendingRewards(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; if (block.timestamp < startTimestamp) { return 0; } uint256 accTokenPerShare = pool.accTokenPerShare; if (block.timestamp > pool.lastRewardTimestamp && pool.supply != 0) { uint256 toTimestamp = block.timestamp > endTimestamp ? endTimestamp : block.timestamp; uint256 multiplier = getMultiplier(pool.lastRewardTimestamp, toTimestamp); uint256 reward = multiplier.mul(tokenPerSecond).mul(pool.allocPoint).div(totalAllocPoint); if (pool.totalReward.add(reward) >= pool.totalAllocation) { reward = pool.totalAllocation.sub(pool.totalReward); } accTokenPerShare = accTokenPerShare.add(reward.mul(1e12).div(pool.supply)); } return user.amount.mul(accTokenPerShare).div(1e12).sub(user.rewardDebt); } /** * @dev Add pool reward allocation. Can only be called by the owner. */ function addAllocation(uint256 _pid, uint256 _amount) public onlyOwner { updatePool(_pid); poolInfo[_pid].totalAllocation = poolInfo[_pid].totalAllocation.add(_amount); emit UpdatePoolAllocation(_pid, _amount); } /** * @dev Updates reward multiplier, only owner. */ function setMultiplier(uint256 _multiplier) external onlyOwner { require(_multiplier > 0, "DuelStaking: Zero multiplier"); bonusMultiplier = _multiplier; } /** * @dev Updates fee recipient, only owner. */ function setFeeRecipient(address _feeRecipient) external onlyOwner { require(_feeRecipient != address(0), "DuelStaking: Zero fee recipient"); feeRecipient = _feeRecipient; } /** * @dev Updates reward per second, only owner. */ function setTokenPerSecond(uint256 _amount) external onlyOwner { require(_amount <= 30 ether, "DuelStaking: Max 30 tokens per second"); require(_amount >= .0001 ether, "DuelStaking: Min .0001 token per second"); tokenPerSecond = _amount; } /** * @dev Updates start timestamp, only owner. */ function setStartTimestamp(uint256 _timestamp) external onlyOwner { require(startTimestamp > block.timestamp, "DuelStaking: Farming has been started"); require(_timestamp < endTimestamp, "DuelStaking: Start timestamp should be less then endTimestamp"); startTimestamp = _timestamp; poolInfo[0].lastRewardTimestamp = startTimestamp; } /** * @dev Updates end timestamp, only owner. */ function setEndTimestamp(uint256 _timestamp) external onlyOwner { require(endTimestamp > block.timestamp, "DuelStaking: Farming has been finished"); require(_timestamp > startTimestamp, "DuelStaking: End timestamp should be greater then startTimestamp"); endTimestamp = _timestamp; } /** * @dev Updates fee stage, only owner. * i.e. [2500,400,300,200,100] = [25%,4%,3%,2%,1%] * must be length of 5 */ function setFeeStage(uint256[] memory _feeStage) external onlyOwner { require(_feeStage.length == feeStage.length, "DuelStaking: FeeStage array mismatch"); feeStage = _feeStage; } /** * @dev Updates timestamp delta fee stage array, only owner. * i.e. [0,3600,7200,10800,14400] for BSC 3600 sec = 1 hour * must be length of 5 */ function setTimestampDeltaFeeStage(uint256[] memory _timestampDeltas) external onlyOwner { require(_timestampDeltas.length == timestampDeltaFeeStage.length, "DuelStaking: TimestampDeltaFeeStage array mismatch"); timestampDeltaFeeStage = _timestampDeltas; } /** * @dev Sends leftover tokens to the fee recipient, only owner. */ function claimLeftovers() external onlyOwner { require(poolInfo[0].supply == 0, "DuelStaking: Not all users has claimed"); uint256 balance = rewardToken.balanceOf(address(this)); require(balance > 0, "DuelStaking: Zero balance"); safeTokenTransfer(msg.sender, balance); } /** * @dev Safe token transfer function, just in case if rounding error * causes pool to not have enough token balance. */ function safeTokenTransfer(address _to, uint256 _amount) internal { uint256 balance = rewardToken.balanceOf(address(this)); if (_amount > balance) { rewardToken.transfer(_to, balance); } else { rewardToken.transfer(_to, _amount); } } /** * @dev it calculates (1 - fee) * amount * Applies the fee by subtracting fees from the amount and returns * the amount after deducting the fee. */ function applyFee(uint256 _feeInBips, uint256 _amount) internal pure returns (uint256) { return _amount.mul(FEE_BASE.sub(_feeInBips)).div(FEE_BASE); } /** * @dev it calculates fee * amount * Calculates the fee amount. */ function calculateFee(uint256 _feeInBips, uint256 _amount) internal pure returns (uint256) { return _amount.mul(_feeInBips).div(FEE_BASE); } /** * @dev Get withdrawal fee in basis points for the user of the given pool. */ function getWithdrawalFee(uint256 _pid, address _user) internal view returns (uint256) { uint256 userTimestampDelta = getUserDelta(_pid, _user); uint256 fee; if (userTimestampDelta == 0 || userTimestampDelta <= timestampDeltaFeeStage[0]) { //25% fee for withdrawals in the same timestamp to prevent abuse from flashloans fee = feeStage[0]; } else if (userTimestampDelta > timestampDeltaFeeStage[0] && userTimestampDelta <= timestampDeltaFeeStage[1]) { fee = feeStage[1]; } else if (userTimestampDelta > timestampDeltaFeeStage[1] && userTimestampDelta <= timestampDeltaFeeStage[2]) { fee = feeStage[2]; } else if (userTimestampDelta > timestampDeltaFeeStage[2] && userTimestampDelta <= timestampDeltaFeeStage[3]) { fee = feeStage[3]; } else if (userTimestampDelta > timestampDeltaFeeStage[3] && userTimestampDelta <= timestampDeltaFeeStage[4]) { fee = feeStage[4]; } return fee; } /** * @dev Get user timestamp delta from last deposit timestamp to current timestamp. */ function getUserDelta(uint256 _pid, address _user) internal view returns (uint256) { UserInfo storage user = userInfo[_pid][_user]; if (user.lastWithdrawTimestamp > 0) { uint256 estDelta = block.timestamp.sub(user.lastWithdrawTimestamp); return estDelta; } else { uint256 estDelta = block.timestamp.sub(user.firstDepositTimestamp); return estDelta; } } }
[{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"contract IERC20","name":"_stakingToken","type":"address"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"},{"internalType":"uint256","name":"_allocation","type":"uint256"},{"internalType":"address","name":"_feeRecipient","type":"address"},{"internalType":"uint256[]","name":"_feeStage","type":"uint256[]"},{"internalType":"uint256[]","name":"_timestampDeltaFeeStage","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakingToken","type":"address"},{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"allocation","type":"uint256"}],"name":"CreatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"allocation","type":"uint256"}],"name":"UpdatePoolAllocation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"FEE_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addAllocation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bonusMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimLeftovers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getPendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"totalAllocation","type":"uint256"},{"internalType":"uint256","name":"totalReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setEndTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeRecipient","type":"address"}],"name":"setFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_feeStage","type":"uint256[]"}],"name":"setFeeStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_multiplier","type":"uint256"}],"name":"setMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_timestampDeltas","type":"uint256[]"}],"name":"setTimestampDeltaFeeStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setTokenPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"timestampDeltaFeeStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"rewardDebtAtTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastWithdrawTimestamp","type":"uint256"},{"internalType":"uint256","name":"firstDepositTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastDepositTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405267016345785d8a0000600255600160035560006008553480156200002757600080fd5b506040516200255c3803806200255c8339810160408190526200004a91620003cf565b62000055336200026e565b606088901b6001600160601b031916608052600180546001600160a01b0319166001600160a01b038516179055600486905560058590558151620000a1906009906020850190620002be565b508051620000b790600a906020840190620002be565b506040805160e0810182526001600160a01b038981168083526000602084018181526001858701818152606087018e81526080880185815260a089018e815260c08a018781526006805480880182559089529a517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f6007909c029b8c0180546001600160a01b031916918c1691909117905595517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d408b015592517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d418a015590517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d42890155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d43880155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4487015590517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d459095019490945560089390935592518793918c16927f0e66fff3899e1e2549b2e77654939827a893aadcf0ecb66e5d3b07c357a4162f91a45050505050505050620004c7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215620002fc579160200282015b82811115620002fc578251825591602001919060010190620002df565b506200030a9291506200030e565b5090565b5b808211156200030a57600081556001016200030f565b600082601f8301126200033757600080fd5b815160206001600160401b038083111562000356576200035662000498565b8260051b604051601f19603f830116810181811084821117156200037e576200037e62000498565b604052848152838101925086840182880185018910156200039e57600080fd5b600092505b85831015620003c3578051845292840192600192909201918401620003a3565b50979650505050505050565b600080600080600080600080610100898b031215620003ed57600080fd5b8851620003fa81620004ae565b60208a01519098506200040d81620004ae565b8097505060408901519550606089015194506080890151935060a08901516200043681620004ae565b60c08a01519093506001600160401b03808211156200045457600080fd5b620004628c838d0162000325565b935060e08b01519150808211156200047957600080fd5b50620004888b828c0162000325565b9150509295985092959890939650565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114620004c457600080fd5b50565b60805160601c61205a620005026000396000818161048b0152818161100a015281816115be015281816116700152611719015261205a6000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80638dbb1e3a11610104578063c44bef75116100a2578063e74b981b11610071578063e74b981b14610457578063ecefc7051461046a578063f2fde38b14610473578063f7c618c11461048657600080fd5b8063c44bef7514610415578063e2bbb15814610428578063e6014e021461043b578063e6fd48bc1461044e57600080fd5b80639ac0d2c0116100de5780639ac0d2c0146103e8578063a408bb4c146103fb578063a85adeab14610403578063a8b973a11461040c57600080fd5b80638dbb1e3a1461034757806393f1a40b1461035a57806398c95c2c146103d557600080fd5b806351eb05a61161017c578063715018a61161014b578063715018a6146103085780637df6a6c81461031057806385dc0aaf146103235780638da5cb5b1461033657600080fd5b806351eb05a6146102c65780635312ea8e146102d95780635fa7b83f146102ec578063641579a6146102f557600080fd5b806335f013a1116101b857806335f013a114610262578063441a3e7014610275578063451c9eb014610288578063469048401461029b57600080fd5b80631526fe27146101df57806317caf6f1146102365780631f5cad9d1461024d575b600080fd5b6101f26101ed366004611e42565b6104ad565b604080516001600160a01b0390981688526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0015b60405180910390f35b61023f60085481565b60405190815260200161022d565b61026061025b366004611d5b565b610506565b005b61023f610270366004611e42565b6105bd565b610260610283366004611ea0565b6105de565b610260610296366004611e42565b6107d0565b6001546102ae906001600160a01b031681565b6040516001600160a01b03909116815260200161022d565b6102606102d4366004611e42565b6108cc565b6102606102e7366004611e42565b610a07565b61023f60025481565b610260610303366004611e42565b610b36565b610260610bb5565b61026061031e366004611e42565b610beb565b61023f610331366004611e74565b610cf3565b6000546001600160a01b03166102ae565b61023f610355366004611ea0565b610e55565b6103a8610368366004611e74565b6007602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c00161022d565b61023f6103e3366004611e42565b610e70565b6102606103f6366004611ea0565b610e80565b610260610f44565b61023f60055481565b61023f60035481565b610260610423366004611e42565b6110eb565b610260610436366004611ea0565b611221565b610260610449366004611d5b565b6113ad565b61023f60045481565b610260610465366004611d40565b611448565b61023f61271081565b610260610481366004611d40565b6114ea565b6102ae7f000000000000000000000000000000000000000000000000000000000000000081565b600681815481106104bd57600080fd5b600091825260209091206007909102018054600182015460028301546003840154600485015460058601546006909601546001600160a01b039095169650929491939092919087565b6000546001600160a01b031633146105395760405162461bcd60e51b815260040161053090611f11565b60405180910390fd5b600a548151146105a65760405162461bcd60e51b815260206004820152603260248201527f4475656c5374616b696e673a2054696d657374616d7044656c746146656553746044820152710c2ceca40c2e4e4c2f240dad2e6dac2e8c6d60731b6064820152608401610530565b80516105b990600a906020840190611cc4565b5050565b600a81815481106105cd57600080fd5b600091825260209091200154905081565b6000600683815481106105f3576105f3611ff8565b60009182526020808320868452600780835260408086203387529093529190932080549290910290920192508311156106875760405162461bcd60e51b815260206004820152603060248201527f4475656c5374616b696e673a20576974686472617720616d6f756e742065786360448201526f1959591cc81d5cd95c88185b5bdd5b9d60821b6064820152608401610530565b610690846108cc565b60006106ca82600101546106c464e8d4a510006106be8760040154876000015461158290919063ffffffff16565b9061158e565b9061159a565b905080156106dc576106dc33826115a6565b83156107715760006106ee863361174d565b905060006106fc828761195a565b9050600061070a8388611976565b8554909150610719908861159a565b85554260038601556001860154610730908861159a565b6001870155855461074b906001600160a01b03163384611988565b801561076d57600154865461076d916001600160a01b03918216911683611988565b5050505b6004830154825461078c9164e8d4a51000916106be91611582565b6001830155604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568906020015b60405180910390a35050505050565b6000546001600160a01b031633146107fa5760405162461bcd60e51b815260040161053090611f11565b6801a055690d9db800008111156108615760405162461bcd60e51b815260206004820152602560248201527f4475656c5374616b696e673a204d617820333020746f6b656e732070657220736044820152641958dbdb9960da1b6064820152608401610530565b655af3107a40008110156108c75760405162461bcd60e51b815260206004820152602760248201527f4475656c5374616b696e673a204d696e202e3030303120746f6b656e20706572604482015266081cd958dbdb9960ca1b6064820152608401610530565b600255565b6000600682815481106108e1576108e1611ff8565b9060005260206000209060070201905080600301544211158061090a5750600554816003015410155b15610913575050565b6000816001015411610929574260039091015550565b6000600554421161093a574261093e565b6005545b90506000610950836003015483610e55565b9050600061097d6008546106be86600201546109776002548761158290919063ffffffff16565b90611582565b9050836005015461099b8286600601546119eb90919063ffffffff16565b106109b657600684015460058501546109b39161159a565b90505b60018401546109dd906109d2906106be8464e8d4a51000611582565b6004860154906119eb565b60048501556003840183905560068401546109f890826119eb565b84600601819055505050505050565b600060068281548110610a1c57610a1c611ff8565b6000918252602080832085845260078083526040808620338752909352919093208054929091029092016001810154909350610a579161159a565b82600101819055506000610a8d6009600081548110610a7857610a78611ff8565b9060005260206000200154836000015461195a565b90506000610abd6009600081548110610aa857610aa8611ff8565b90600052602060002001548460000154611976565b600080855560018501558454909150610ae0906001600160a01b03163384611988565b8015610b02576001548454610b02916001600160a01b03918216911683611988565b604051828152859033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595906020016107c1565b6000546001600160a01b03163314610b605760405162461bcd60e51b815260040161053090611f11565b60008111610bb05760405162461bcd60e51b815260206004820152601c60248201527f4475656c5374616b696e673a205a65726f206d756c7469706c696572000000006044820152606401610530565b600355565b6000546001600160a01b03163314610bdf5760405162461bcd60e51b815260040161053090611f11565b610be960006119f7565b565b6000546001600160a01b03163314610c155760405162461bcd60e51b815260040161053090611f11565b4260055411610c755760405162461bcd60e51b815260206004820152602660248201527f4475656c5374616b696e673a204661726d696e6720686173206265656e2066696044820152651b9a5cda195960d21b6064820152608401610530565b6004548111610cee576040805162461bcd60e51b81526020600482015260248101919091527f4475656c5374616b696e673a20456e642074696d657374616d702073686f756c60448201527f642062652067726561746572207468656e20737461727454696d657374616d706064820152608401610530565b600555565b60008060068481548110610d0957610d09611ff8565b60009182526020808320878452600780835260408086206001600160a01b038a16875290935291909320600454929091029092019250421015610d5157600092505050610e4f565b6004820154600383015442118015610d6c5750600183015415155b15610e215760006005544211610d825742610d86565b6005545b90506000610d98856003015483610e55565b90506000610dbf6008546106be88600201546109776002548761158290919063ffffffff16565b90508560050154610ddd8288600601546119eb90919063ffffffff16565b10610df85760068601546005870154610df59161159a565b90505b6001860154610e1b90610e14906106be8464e8d4a51000611582565b85906119eb565b93505050505b610e4982600101546106c464e8d4a510006106be85876000015461158290919063ffffffff16565b93505050505b92915050565b600354600090610e6990610977848661159a565b9392505050565b600981815481106105cd57600080fd5b6000546001600160a01b03163314610eaa5760405162461bcd60e51b815260040161053090611f11565b610eb3826108cc565b610eea8160068481548110610eca57610eca611ff8565b9060005260206000209060070201600501546119eb90919063ffffffff16565b60068381548110610efd57610efd611ff8565b90600052602060002090600702016005018190555080827f9d62c4db36ca3dbbe725182d6fd89028014a7d014452b72741207cde80c7d11f60405160405180910390a35050565b6000546001600160a01b03163314610f6e5760405162461bcd60e51b815260040161053090611f11565b6006600081548110610f8257610f82611ff8565b906000526020600020906007020160010154600014610ff25760405162461bcd60e51b815260206004820152602660248201527f4475656c5374616b696e673a204e6f7420616c6c2075736572732068617320636044820152651b185a5b595960d21b6064820152608401610530565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561105457600080fd5b505afa158015611068573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108c9190611e5b565b9050600081116110de5760405162461bcd60e51b815260206004820152601960248201527f4475656c5374616b696e673a205a65726f2062616c616e6365000000000000006044820152606401610530565b6110e833826115a6565b50565b6000546001600160a01b031633146111155760405162461bcd60e51b815260040161053090611f11565b42600454116111745760405162461bcd60e51b815260206004820152602560248201527f4475656c5374616b696e673a204661726d696e6720686173206265656e207374604482015264185c9d195960da1b6064820152608401610530565b60055481106111eb5760405162461bcd60e51b815260206004820152603d60248201527f4475656c5374616b696e673a2053746172742074696d657374616d702073686f60448201527f756c64206265206c657373207468656e20656e6454696d657374616d700000006064820152608401610530565b80600481905550600454600660008154811061120957611209611ff8565b90600052602060002090600702016003018190555050565b60055442106112725760405162461bcd60e51b815260206004820152601d60248201527f4475656c5374616b696e673a204465706f73697420646561646c696e650000006044820152606401610530565b60006006838154811061128757611287611ff8565b600091825260208083208684526007808352604080862033875290935291909320910290910191506112b8846108cc565b8054156113015760006112ed82600101546106c464e8d4a510006106be8760040154876000015461158290919063ffffffff16565b905080156112ff576112ff33826115a6565b505b805461130d90846119eb565b808255600483015461132a9164e8d4a51000916106be9190611582565b6001820155600481015461133f574260048201555b426005820155600182015461135490846119eb565b60018301558154611370906001600160a01b0316333086611a47565b604051838152849033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a350505050565b6000546001600160a01b031633146113d75760405162461bcd60e51b815260040161053090611f11565b6009548151146114355760405162461bcd60e51b8152602060048201526024808201527f4475656c5374616b696e673a204665655374616765206172726179206d69736d6044820152630c2e8c6d60e31b6064820152608401610530565b80516105b9906009906020840190611cc4565b6000546001600160a01b031633146114725760405162461bcd60e51b815260040161053090611f11565b6001600160a01b0381166114c85760405162461bcd60e51b815260206004820152601f60248201527f4475656c5374616b696e673a205a65726f2066656520726563697069656e74006044820152606401610530565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146115145760405162461bcd60e51b815260040161053090611f11565b6001600160a01b0381166115795760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610530565b6110e8816119f7565b6000610e698284611f80565b6000610e698284611f5e565b6000610e698284611f9f565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561160857600080fd5b505afa15801561161c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116409190611e5b565b9050808211156116f35760405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044015b602060405180830381600087803b1580156116b557600080fd5b505af11580156116c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ed9190611e20565b50505050565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9060440161169b565b505050565b60008061175a8484611a7f565b905060008115806117895750600a60008154811061177a5761177a611ff8565b90600052602060002001548211155b156117b45760096000815481106117a2576117a2611ff8565b90600052602060002001549050611952565b600a6000815481106117c8576117c8611ff8565b9060005260206000200154821180156117ff5750600a6001815481106117f0576117f0611ff8565b90600052602060002001548211155b156118185760096001815481106117a2576117a2611ff8565b600a60018154811061182c5761182c611ff8565b9060005260206000200154821180156118635750600a60028154811061185457611854611ff8565b90600052602060002001548211155b1561187c5760096002815481106117a2576117a2611ff8565b600a60028154811061189057611890611ff8565b9060005260206000200154821180156118c75750600a6003815481106118b8576118b8611ff8565b90600052602060002001548211155b156118e05760096003815481106117a2576117a2611ff8565b600a6003815481106118f4576118f4611ff8565b90600052602060002001548211801561192b5750600a60048154811061191c5761191c611ff8565b90600052602060002001548211155b1561195257600960048154811061194457611944611ff8565b906000526020600020015490505b949350505050565b6000610e696127106106be61196f828761159a565b8590611582565b6000610e696127106106be8486611582565b6040516001600160a01b03831660248201526044810182905261174890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611ae7565b6000610e698284611f46565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526116ed9085906323b872dd60e01b906084016119b4565b60008281526007602090815260408083206001600160a01b03851684529091528120600381015415611ace576000611ac482600301544261159a90919063ffffffff16565b9250610e4f915050565b6000611ac482600401544261159a90919063ffffffff16565b6000611b3c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611bb99092919063ffffffff16565b8051909150156117485780806020019051810190611b5a9190611e20565b6117485760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610530565b6060611952848460008585843b611c125760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610530565b600080866001600160a01b03168587604051611c2e9190611ec2565b60006040518083038185875af1925050503d8060008114611c6b576040519150601f19603f3d011682016040523d82523d6000602084013e611c70565b606091505b5091509150611c80828286611c8b565b979650505050505050565b60608315611c9a575081610e69565b825115611caa5782518084602001fd5b8160405162461bcd60e51b81526004016105309190611ede565b828054828255906000526020600020908101928215611cff579160200282015b82811115611cff578251825591602001919060010190611ce4565b50611d0b929150611d0f565b5090565b5b80821115611d0b5760008155600101611d10565b80356001600160a01b0381168114611d3b57600080fd5b919050565b600060208284031215611d5257600080fd5b610e6982611d24565b60006020808385031215611d6e57600080fd5b823567ffffffffffffffff80821115611d8657600080fd5b818501915085601f830112611d9a57600080fd5b813581811115611dac57611dac61200e565b8060051b604051601f19603f83011681018181108582111715611dd157611dd161200e565b604052828152858101935084860182860187018a1015611df057600080fd5b600095505b83861015611e13578035855260019590950194938601938601611df5565b5098975050505050505050565b600060208284031215611e3257600080fd5b81518015158114610e6957600080fd5b600060208284031215611e5457600080fd5b5035919050565b600060208284031215611e6d57600080fd5b5051919050565b60008060408385031215611e8757600080fd5b82359150611e9760208401611d24565b90509250929050565b60008060408385031215611eb357600080fd5b50508035926020909101359150565b60008251611ed4818460208701611fb6565b9190910192915050565b6020815260008251806020840152611efd816040850160208701611fb6565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611f5957611f59611fe2565b500190565b600082611f7b57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611f9a57611f9a611fe2565b500290565b600082821015611fb157611fb1611fe2565b500390565b60005b83811015611fd1578181015183820152602001611fb9565b838111156116ed5750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212205c263d5b066ca3f875f136ce7e4099e6be9ecaa5b33092a349c7e01111969f3a64736f6c634300080500330000000000000000000000008ae8be25c23833e0a01aa200403e826f611f9cd20000000000000000000000008ae8be25c23833e0a01aa200403e826f611f9cd20000000000000000000000000000000000000000000000000000000061ba1f10000000000000000000000000000000000000000000000000000000006230c61000000000000000000000000000000000000000000000107760c7a9dce7000000000000000000000000000000d4ae6402155ec508c6ca7dd833fd355c6edd1c14000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
24931:15538:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26716:26;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4397:32:1;;;4379:51;;4461:2;4446:18;;4439:34;;;;4489:18;;;4482:34;;;;4547:2;4532:18;;4525:34;;;;4590:3;4575:19;;4568:35;4417:3;4619:19;;4612:35;4678:3;4663:19;;4656:35;4366:3;4351:19;26716:26:0;;;;;;;;26969:34;;;;;;;;;12747:25:1;;;12735:2;12720:18;26969:34:0;12702:76:1;36999:279:0;;;;;;:::i;:::-;;:::i;:::-;;27176:39;;;;;;:::i;:::-;;:::i;30970:1211::-;;;;;;:::i;:::-;;:::i;35344:271::-;;;;;;:::i;:::-;;:::i;26290:27::-;;;;;-1:-1:-1;;;;;26290:27:0;;;;;;-1:-1:-1;;;;;3125:32:1;;;3107:51;;3095:2;3080:18;26290:27:0;3062:102:1;28770:996:0;;;;;;:::i;:::-;;:::i;32370:653::-;;;;;;:::i;:::-;;:::i;26388:36::-;;;;;;34818:178;;;;;;:::i;:::-;;:::i;20387:94::-;;;:::i;36141:317::-;;;;;;:::i;:::-;;:::i;33338:1058::-;;;;;;:::i;:::-;;:::i;19736:87::-;19782:7;19809:6;-1:-1:-1;;;;;19809:6:0;19736:87;;33123:142;;;;;;:::i;:::-;;:::i;26808:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13070:25:1;;;13126:2;13111:18;;13104:34;;;;13154:18;;;13147:34;;;;13212:2;13197:18;;13190:34;13255:3;13240:19;;13233:35;13299:3;13284:19;;13277:35;13057:3;13042:19;26808:64:0;13024:294:1;27076:25:0;;;;;;:::i;:::-;;:::i;34496:244::-;;;;;;:::i;:::-;;:::i;37373:318::-;;;:::i;26660:27::-;;;;;;26496:34;;;;;;35691:376;;;;;;:::i;:::-;;:::i;29864:1030::-;;;;;;:::i;:::-;;:::i;36612:202::-;;;;;;:::i;:::-;;:::i;26582:29::-;;;;;;35070:196;;;;;;:::i;:::-;;:::i;26101:40::-;;26136:5;26101:40;;20636:192;;;;;;:::i;:::-;;:::i;26180:35::-;;;;;26716:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26716:26:0;;;;-1:-1:-1;26716:26:0;;;;;;;;;:::o;36999:279::-;19782:7;19809:6;-1:-1:-1;;;;;19809:6:0;8893:10;19956:23;19948:68;;;;-1:-1:-1;;;19948:68:0;;;;;;;:::i;:::-;;;;;;;;;37134:22:::1;:29:::0;37107:23;;:56:::1;37099:119;;;::::0;-1:-1:-1;;;37099:119:0;;7637:2:1;37099:119:0::1;::::0;::::1;7619:21:1::0;7676:2;7656:18;;;7649:30;7715:34;7695:18;;;7688:62;-1:-1:-1;;;7766:18:1;;;7759:48;7824:19;;37099:119:0::1;7609:240:1::0;37099:119:0::1;37229:41:::0;;::::1;::::0;:22:::1;::::0;:41:::1;::::0;::::1;::::0;::::1;:::i;:::-;;36999:279:::0;:::o;27176:39::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27176:39:0;:::o;30970:1211::-;31039:21;31063:8;31072:4;31063:14;;;;;;;;:::i;:::-;;;;;;;;;31112;;;31063;31112;;;;;;;31127:10;31112:26;;;;;;;;;31159:11;;31063:14;;;;;;;;-1:-1:-1;;;31159:22:0;31151:83;;;;-1:-1:-1;;;31151:83:0;;11980:2:1;31151:83:0;;;11962:21:1;12019:2;11999:18;;;11992:30;12058:34;12038:18;;;12031:62;-1:-1:-1;;;12109:18:1;;;12102:46;12165:19;;31151:83:0;11952:238:1;31151:83:0;31247:16;31258:4;31247:10;:16::i;:::-;31276:15;31294:69;31347:4;:15;;;31294:48;31337:4;31294:38;31310:4;:21;;;31294:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48::i;:::-;:52;;:69::i;:::-;31276:87;-1:-1:-1;31380:11:0;;31376:82;;31408:38;31426:10;31438:7;31408:17;:38::i;:::-;31474:11;;31470:572;;31502:11;31516:34;31533:4;31539:10;31516:16;:34::i;:::-;31502:48;;31567:14;31584:22;31593:3;31598:7;31584:8;:22::i;:::-;31567:39;;31621:17;31641:26;31654:3;31659:7;31641:12;:26::i;:::-;31698:11;;31621:46;;-1:-1:-1;31698:24:0;;31714:7;31698:15;:24::i;:::-;31684:38;;31766:15;31737:26;;;:44;31812:11;;;;:24;;31828:7;31812:15;:24::i;:::-;31798:11;;;:38;31853:10;;:52;;-1:-1:-1;;;;;31853:10:0;31885;31898:6;31853:23;:52::i;:::-;31924:13;;31920:111;;31990:12;;31958:10;;:57;;-1:-1:-1;;;;;31958:10:0;;;;31990:12;32005:9;31958:23;:57::i;:::-;31487:555;;;31470:572;32088:21;;;;32072:11;;:48;;32115:4;;32072:38;;:15;:38::i;:48::-;32054:15;;;:66;32138:35;;12747:25:1;;;32159:4:0;;32147:10;;32138:35;;12735:2:1;12720:18;32138:35:0;;;;;;;;31028:1153;;;30970:1211;;:::o;35344:271::-;19782:7;19809:6;-1:-1:-1;;;;;19809:6:0;8893:10;19956:23;19948:68;;;;-1:-1:-1;;;19948:68:0;;;;;;;:::i;:::-;35437:8:::1;35426:7;:19;;35418:69;;;::::0;-1:-1:-1;;;35418:69:0;;5292:2:1;35418:69:0::1;::::0;::::1;5274:21:1::0;5331:2;5311:18;;;5304:30;5370:34;5350:18;;;5343:62;-1:-1:-1;;;5421:18:1;;;5414:35;5466:19;;35418:69:0::1;5264:227:1::0;35418:69:0::1;35517:11;35506:7;:22;;35498:74;;;::::0;-1:-1:-1;;;35498:74:0;;10013:2:1;35498:74:0::1;::::0;::::1;9995:21:1::0;10052:2;10032:18;;;10025:30;10091:34;10071:18;;;10064:62;-1:-1:-1;;;10142:18:1;;;10135:37;10189:19;;35498:74:0::1;9985:229:1::0;35498:74:0::1;35583:14;:24:::0;35344:271::o;28770:996::-;28822:21;28846:8;28855:4;28846:14;;;;;;;;:::i;:::-;;;;;;;;;;;28822:38;;28896:4;:24;;;28877:15;:43;;:87;;;;28952:12;;28924:4;:24;;;:40;;28877:87;28873:126;;;28981:7;28770:996;:::o;28873:126::-;29030:1;29015:4;:11;;;:16;29011:112;;29075:15;29048:24;;;;:42;-1:-1:-1;28770:996:0:o;29011:112::-;29135:19;29175:12;;29157:15;:30;:63;;29205:15;29157:63;;;29190:12;;29157:63;29135:85;;29233:18;29254:52;29268:4;:24;;;29294:11;29254:13;:52::i;:::-;29233:73;;29317:14;29334:72;29390:15;;29334:51;29369:4;:15;;;29334:30;29349:14;;29334:10;:14;;:30;;;;:::i;:::-;:34;;:51::i;:72::-;29317:89;;29455:4;:20;;;29423:28;29444:6;29423:4;:16;;;:20;;:28;;;;:::i;:::-;:52;29419:136;;29526:16;;;;29501:20;;;;:42;;:24;:42::i;:::-;29492:51;;29419:136;29638:11;;;;29591:60;;29617:33;;:16;:6;29628:4;29617:10;:16::i;:33::-;29591:21;;;;;:25;:60::i;:::-;29567:21;;;:84;29662:24;;;:38;;;29730:16;;;;:28;;29751:6;29730:20;:28::i;:::-;29711:4;:16;;:47;;;;28811:955;;;;28770:996;:::o;32370:653::-;32431:21;32455:8;32464:4;32455:14;;;;;;;;:::i;:::-;;;;;;;;;32504;;;32455;32504;;;;;;;32519:10;32504:26;;;;;;;;;32573:11;;32455:14;;;;;;;32557:11;;;;32455:14;;-1:-1:-1;32557:28:0;;:15;:28::i;:::-;32543:4;:11;;:42;;;;32598:14;32615:34;32624:8;32633:1;32624:11;;;;;;;;:::i;:::-;;;;;;;;;32637:4;:11;;;32615:8;:34::i;:::-;32598:51;;32660:17;32680:38;32693:8;32702:1;32693:11;;;;;;;;:::i;:::-;;;;;;;;;32706:4;:11;;;32680:12;:38::i;:::-;32745:1;32731:15;;;32757;;;:19;32789:10;;32660:58;;-1:-1:-1;32789:52:0;;-1:-1:-1;;;;;32789:10:0;32821;32834:6;32789:23;:52::i;:::-;32856:13;;32852:103;;32918:12;;32886:10;;:57;;-1:-1:-1;;;;;32886:10:0;;;;32918:12;32933:9;32886:23;:57::i;:::-;32972:43;;12747:25:1;;;33002:4:0;;32990:10;;32972:43;;12735:2:1;12720:18;32972:43:0;12702:76:1;34818:178:0;19782:7;19809:6;-1:-1:-1;;;;;19809:6:0;8893:10;19956:23;19948:68;;;;-1:-1:-1;;;19948:68:0;;;;;;;:::i;:::-;34914:1:::1;34900:11;:15;34892:56;;;::::0;-1:-1:-1;;;34892:56:0;;10421:2:1;34892:56:0::1;::::0;::::1;10403:21:1::0;10460:2;10440:18;;;10433:30;10499;10479:18;;;10472:58;10547:18;;34892:56:0::1;10393:178:1::0;34892:56:0::1;34959:15;:29:::0;34818:178::o;20387:94::-;19782:7;19809:6;-1:-1:-1;;;;;19809:6:0;8893:10;19956:23;19948:68;;;;-1:-1:-1;;;19948:68:0;;;;;;;:::i;:::-;20452:21:::1;20470:1;20452:9;:21::i;:::-;20387:94::o:0;36141:317::-;19782:7;19809:6;-1:-1:-1;;;;;19809:6:0;8893:10;19956:23;19948:68;;;;-1:-1:-1;;;19948:68:0;;;;;;;:::i;:::-;36239:15:::1;36224:12;;:30;36216:81;;;::::0;-1:-1:-1;;;36216:81:0;;8410:2:1;36216:81:0::1;::::0;::::1;8392:21:1::0;8449:2;8429:18;;;8422:30;8488:34;8468:18;;;8461:62;-1:-1:-1;;;8539:18:1;;;8532:36;8585:19;;36216:81:0::1;8382:228:1::0;36216:81:0::1;36329:14;;36316:10;:27;36308:104;;;::::0;;-1:-1:-1;;;36308:104:0;;11547:2:1;36308:104:0::1;::::0;::::1;11529:21:1::0;11566:18;;;11559:30;;;;11625:34;11605:18;;;11598:62;11696:34;11676:18;;;11669:62;11748:19;;36308:104:0::1;11519:254:1::0;36308:104:0::1;36425:12;:25:::0;36141:317::o;33338:1058::-;33417:7;33437:21;33461:8;33470:4;33461:14;;;;;;;;:::i;:::-;;;;;;;;;33510;;;33461;33510;;;;;;;-1:-1:-1;;;;;33510:21:0;;;;;;;;;;;33566:14;;33461;;;;;;;;-1:-1:-1;33548:15:0;:32;33544:73;;;33604:1;33597:8;;;;;;33544:73;33656:21;;;;33710:24;;;;33692:15;:42;:62;;;;-1:-1:-1;33738:11:0;;;;:16;;33692:62;33688:619;;;33771:19;33811:12;;33793:15;:30;:63;;33841:15;33793:63;;;33826:12;;33793:63;33771:85;;33871:18;33892:52;33906:4;:24;;;33932:11;33892:13;:52::i;:::-;33871:73;;33959:14;33976:72;34032:15;;33976:51;34011:4;:15;;;33976:30;33991:14;;33976:10;:14;;:30;;;;:::i;:72::-;33959:89;;34099:4;:20;;;34067:28;34088:6;34067:4;:16;;;:20;;:28;;;;:::i;:::-;:52;34063:144;;34174:16;;;;34149:20;;;;:42;;:24;:42::i;:::-;34140:51;;34063:144;34282:11;;;;34240:55;;34261:33;;:16;:6;34272:4;34261:10;:16::i;:33::-;34240:16;;:20;:55::i;:::-;34221:74;;33756:551;;;33688:619;34324:64;34372:4;:15;;;34324:43;34362:4;34324:33;34340:16;34324:4;:11;;;:15;;:33;;;;:::i;:64::-;34317:71;;;;;33338:1058;;;;;:::o;33123:142::-;33241:15;;33195:7;;33222:35;;:14;:3;33230:5;33222:7;:14::i;:35::-;33215:42;33123:142;-1:-1:-1;;;33123:142:0:o;27076:25::-;;;;;;;;;;;;34496:244;19782:7;19809:6;-1:-1:-1;;;;;19809:6:0;8893:10;19956:23;19948:68;;;;-1:-1:-1;;;19948:68:0;;;;;;;:::i;:::-;34578:16:::1;34589:4;34578:10;:16::i;:::-;34638:43;34673:7;34638:8;34647:4;34638:14;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;;:34;;:43;;;;:::i;:::-;34605:8;34614:4;34605:14;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;:76;;;;34724:7;34718:4;34697:35;;;;;;;;;;34496:244:::0;;:::o;37373:318::-;19782:7;19809:6;-1:-1:-1;;;;;19809:6:0;8893:10;19956:23;19948:68;;;;-1:-1:-1;;;19948:68:0;;;;;;;:::i;:::-;37437:8:::1;37446:1;37437:11;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;37459:1;37437:23;37429:74;;;::::0;-1:-1:-1;;;37429:74:0;;5698:2:1;37429:74:0::1;::::0;::::1;5680:21:1::0;5737:2;5717:18;;;5710:30;5776:34;5756:18;;;5749:62;-1:-1:-1;;;5827:18:1;;;5820:36;5873:19;;37429:74:0::1;5670:228:1::0;37429:74:0::1;37534:36;::::0;-1:-1:-1;;;37534:36:0;;37564:4:::1;37534:36;::::0;::::1;3107:51:1::0;37516:15:0::1;::::0;37534:11:::1;-1:-1:-1::0;;;;;37534:21:0::1;::::0;::::1;::::0;3080:18:1;;37534:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37516:54;;37601:1;37591:7;:11;37583:49;;;::::0;-1:-1:-1;;;37583:49:0;;8056:2:1;37583:49:0::1;::::0;::::1;8038:21:1::0;8095:2;8075:18;;;8068:30;8134:27;8114:18;;;8107:55;8179:18;;37583:49:0::1;8028:175:1::0;37583:49:0::1;37645:38;37663:10;37675:7;37645:17;:38::i;:::-;37418:273;37373:318::o:0;35691:376::-;19782:7;19809:6;-1:-1:-1;;;;;19809:6:0;8893:10;19956:23;19948:68;;;;-1:-1:-1;;;19948:68:0;;;;;;;:::i;:::-;35793:15:::1;35776:14;;:32;35768:82;;;::::0;-1:-1:-1;;;35768:82:0;;12397:2:1;35768:82:0::1;::::0;::::1;12379:21:1::0;12436:2;12416:18;;;12409:30;12475:34;12455:18;;;12448:62;-1:-1:-1;;;12526:18:1;;;12519:35;12571:19;;35768:82:0::1;12369:227:1::0;35768:82:0::1;35882:12;;35869:10;:25;35861:99;;;::::0;-1:-1:-1;;;35861:99:0;;9583:2:1;35861:99:0::1;::::0;::::1;9565:21:1::0;9622:2;9602:18;;;9595:30;9661:34;9641:18;;;9634:62;9732:31;9712:18;;;9705:59;9781:19;;35861:99:0::1;9555:251:1::0;35861:99:0::1;35990:10;35973:14;:27;;;;36045:14;;36011:8;36020:1;36011:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;:48;;;;35691:376:::0;:::o;29864:1030::-;29958:12;;29940:15;:30;29932:72;;;;-1:-1:-1;;;29932:72:0;;7279:2:1;29932:72:0;;;7261:21:1;7318:2;7298:18;;;7291:30;7357:31;7337:18;;;7330:59;7406:18;;29932:72:0;7251:179:1;29932:72:0;30017:21;30041:8;30050:4;30041:14;;;;;;;;:::i;:::-;;;;;;;;;30090;;;30041;30090;;;;;;;30105:10;30090:26;;;;;;;;;30041:14;;;;;;-1:-1:-1;30129:16:0;30099:4;30129:10;:16::i;:::-;30162:11;;:15;30158:239;;30194:15;30212:69;30265:4;:15;;;30212:48;30255:4;30212:38;30228:4;:21;;;30212:4;:11;;;:15;;:38;;;;:::i;:69::-;30194:87;-1:-1:-1;30300:11:0;;30296:90;;30332:38;30350:10;30362:7;30332:17;:38::i;:::-;30179:218;30158:239;30423:11;;:24;;30439:7;30423:15;:24::i;:::-;30409:38;;;30492:21;;;;30476:48;;30519:4;;30476:38;;30409;30476:15;:38::i;:48::-;30458:15;;;:66;30541:26;;;;30537:108;;30618:15;30589:26;;;:44;30537:108;30683:15;30655:25;;;:43;30725:11;;;;:24;;30741:7;30725:15;:24::i;:::-;30711:11;;;:38;30762:10;;:72;;-1:-1:-1;;;;;30762:10:0;30798;30819:4;30826:7;30762:27;:72::i;:::-;30852:34;;12747:25:1;;;30872:4:0;;30860:10;;30852:34;;12735:2:1;12720:18;30852:34:0;;;;;;;29921:973;;29864:1030;;:::o;36612:202::-;19782:7;19809:6;-1:-1:-1;;;;;19809:6:0;8893:10;19956:23;19948:68;;;;-1:-1:-1;;;19948:68:0;;;;;;;:::i;:::-;36719:8:::1;:15:::0;36699:16;;:35:::1;36691:84;;;::::0;-1:-1:-1;;;36691:84:0;;8817:2:1;36691:84:0::1;::::0;::::1;8799:21:1::0;8856:2;8836:18;;;8829:30;8895:34;8875:18;;;8868:62;-1:-1:-1;;;8946:18:1;;;8939:34;8990:19;;36691:84:0::1;8789:226:1::0;36691:84:0::1;36786:20:::0;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;35070:196::-:0;19782:7;19809:6;-1:-1:-1;;;;;19809:6:0;8893:10;19956:23;19948:68;;;;-1:-1:-1;;;19948:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35156:27:0;::::1;35148:71;;;::::0;-1:-1:-1;;;35148:71:0;;6512:2:1;35148:71:0::1;::::0;::::1;6494:21:1::0;6551:2;6531:18;;;6524:30;6590:33;6570:18;;;6563:61;6641:18;;35148:71:0::1;6484:181:1::0;35148:71:0::1;35230:12;:28:::0;;-1:-1:-1;;;;;;35230:28:0::1;-1:-1:-1::0;;;;;35230:28:0;;;::::1;::::0;;;::::1;::::0;;35070:196::o;20636:192::-;19782:7;19809:6;-1:-1:-1;;;;;19809:6:0;8893:10;19956:23;19948:68;;;;-1:-1:-1;;;19948:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20725:22:0;::::1;20717:73;;;::::0;-1:-1:-1;;;20717:73:0;;6105:2:1;20717:73:0::1;::::0;::::1;6087:21:1::0;6144:2;6124:18;;;6117:30;6183:34;6163:18;;;6156:62;-1:-1:-1;;;6234:18:1;;;6227:36;6280:19;;20717:73:0::1;6077:228:1::0;20717:73:0::1;20801:19;20811:8;20801:9;:19::i;15337:98::-:0;15395:7;15422:5;15426:1;15422;:5;:::i;15736:98::-;15794:7;15821:5;15825:1;15821;:5;:::i;14980:98::-;15038:7;15065:5;15069:1;15065;:5;:::i;37845:300::-;37940:36;;-1:-1:-1;;;37940:36:0;;37970:4;37940:36;;;3107:51:1;37922:15:0;;37940:11;-1:-1:-1;;;;;37940:21:0;;;;3080:18:1;;37940:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37922:54;;38001:7;37991;:17;37987:151;;;38025:34;;-1:-1:-1;;;38025:34:0;;-1:-1:-1;;;;;3741:32:1;;;38025:34:0;;;3723:51:1;3790:18;;;3783:34;;;38025:11:0;:20;;;;3696:18:1;;38025:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37911:234;37845:300;;:::o;37987:151::-;38092:34;;-1:-1:-1;;;38092:34:0;;-1:-1:-1;;;;;3741:32:1;;;38092:34:0;;;3723:51:1;3790:18;;;3783:34;;;38092:11:0;:20;;;;3696:18:1;;38092:34:0;3678:145:1;37987:151:0;37911:234;37845:300;;:::o;38858:1049::-;38936:7;38956:26;38985:25;38998:4;39004:5;38985:12;:25::i;:::-;38956:54;-1:-1:-1;39023:11:0;39051:23;;;:74;;;39100:22;39123:1;39100:25;;;;;;;;:::i;:::-;;;;;;;;;39078:18;:47;;39051:74;39047:830;;;39242:8;39251:1;39242:11;;;;;;;;:::i;:::-;;;;;;;;;39236:17;;39047:830;;;39296:22;39319:1;39296:25;;;;;;;;:::i;:::-;;;;;;;;;39275:18;:46;:97;;;;;39347:22;39370:1;39347:25;;;;;;;;:::i;:::-;;;;;;;;;39325:18;:47;;39275:97;39271:606;;;39395:8;39404:1;39395:11;;;;;;;;:::i;39271:606::-;39449:22;39472:1;39449:25;;;;;;;;:::i;:::-;;;;;;;;;39428:18;:46;:97;;;;;39500:22;39523:1;39500:25;;;;;;;;:::i;:::-;;;;;;;;;39478:18;:47;;39428:97;39424:453;;;39548:8;39557:1;39548:11;;;;;;;;:::i;39424:453::-;39602:22;39625:1;39602:25;;;;;;;;:::i;:::-;;;;;;;;;39581:18;:46;:97;;;;;39653:22;39676:1;39653:25;;;;;;;;:::i;:::-;;;;;;;;;39631:18;:47;;39581:97;39577:300;;;39701:8;39710:1;39701:11;;;;;;;;:::i;39577:300::-;39755:22;39778:1;39755:25;;;;;;;;:::i;:::-;;;;;;;;;39734:18;:46;:97;;;;;39806:22;39829:1;39806:25;;;;;;;;:::i;:::-;;;;;;;;;39784:18;:47;;39734:97;39730:147;;;39854:8;39863:1;39854:11;;;;;;;;:::i;:::-;;;;;;;;;39848:17;;39730:147;39896:3;38858:1049;-1:-1:-1;;;;38858:1049:0:o;38333:164::-;38411:7;38438:51;26136:5;38438:37;38450:24;26136:5;38463:10;38450:12;:24::i;:::-;38438:7;;:11;:37::i;38598:154::-;38680:7;38707:37;26136:5;38707:23;:7;38719:10;38707:11;:23::i;21606:211::-;21750:58;;-1:-1:-1;;;;;3741:32:1;;21750:58:0;;;3723:51:1;3790:18;;;3783:34;;;21723:86:0;;21743:5;;-1:-1:-1;;;21773:23:0;3696:18:1;;21750:58:0;;;;-1:-1:-1;;21750:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;21750:58:0;-1:-1:-1;;;;;;21750:58:0;;;;;;;;;;21723:19;:86::i;14599:98::-;14657:7;14684:5;14688:1;14684;:5;:::i;20836:173::-;20892:16;20911:6;;-1:-1:-1;;;;;20928:17:0;;;-1:-1:-1;;;;;;20928:17:0;;;;;;20961:40;;20911:6;;;;;;;20961:40;;20892:16;20961:40;20881:128;20836:173;:::o;21825:248::-;21996:68;;-1:-1:-1;;;;;3427:15:1;;;21996:68:0;;;3409:34:1;3479:15;;3459:18;;;3452:43;3511:18;;;3504:34;;;21969:96:0;;21989:5;;-1:-1:-1;;;22019:27:0;3344:18:1;;21996:68:0;3326:218:1;40021:445:0;40095:7;40139:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;40139:21:0;;;;;;;;;40175:26;;;;:30;40171:288;;40222:16;40241:47;40261:4;:26;;;40241:15;:19;;:47;;;;:::i;:::-;40222:66;-1:-1:-1;40303:15:0;;-1:-1:-1;;40303:15:0;40171:288;40351:16;40370:47;40390:4;:26;;;40370:15;:19;;:47;;;;:::i;24179:716::-;24603:23;24629:69;24657:4;24629:69;;;;;;;;;;;;;;;;;24637:5;-1:-1:-1;;;;;24629:27:0;;;:69;;;;;:::i;:::-;24713:17;;24603:95;;-1:-1:-1;24713:21:0;24709:179;;24810:10;24799:30;;;;;;;;;;;;:::i;:::-;24791:85;;;;-1:-1:-1;;;24791:85:0;;11136:2:1;24791:85:0;;;11118:21:1;11175:2;11155:18;;;11148:30;11214:34;11194:18;;;11187:62;-1:-1:-1;;;11265:18:1;;;11258:40;11315:19;;24791:85:0;11108:232:1;3686:229:0;3823:12;3855:52;3877:6;3885:4;3891:1;3894:12;3823;1203:20;;5093:60;;;;-1:-1:-1;;;5093:60:0;;10778:2:1;5093:60:0;;;10760:21:1;10817:2;10797:18;;;10790:30;10856:31;10836:18;;;10829:59;10905:18;;5093:60:0;10750:179:1;5093:60:0;5167:12;5181:23;5208:6;-1:-1:-1;;;;;5208:11:0;5227:5;5234:4;5208:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5166:73;;;;5257:51;5274:7;5283:10;5295:12;5257:16;:51::i;:::-;5250:58;4806:510;-1:-1:-1;;;;;;;4806:510:0:o;7492:712::-;7642:12;7671:7;7667:530;;;-1:-1:-1;7702:10:0;7695:17;;7667:530;7816:17;;:21;7812:374;;8014:10;8008:17;8075:15;8062:10;8058:2;8054:19;8047:44;7812:374;8157:12;8150:20;;-1:-1:-1;;;8150:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;320:1;317;310:12;272:2;343:29;362:9;343:29;:::i;383:1126::-;467:6;498:2;541;529:9;520:7;516:23;512:32;509:2;;;557:1;554;547:12;509:2;597:9;584:23;626:18;667:2;659:6;656:14;653:2;;;683:1;680;673:12;653:2;721:6;710:9;706:22;696:32;;766:7;759:4;755:2;751:13;747:27;737:2;;788:1;785;778:12;737:2;824;811:16;846:2;842;839:10;836:2;;;852:18;;:::i;:::-;898:2;895:1;891:10;930:2;924:9;993:2;989:7;984:2;980;976:11;972:25;964:6;960:38;1048:6;1036:10;1033:22;1028:2;1016:10;1013:18;1010:46;1007:2;;;1059:18;;:::i;:::-;1095:2;1088:22;1145:18;;;1179:15;;;;-1:-1:-1;1214:11:1;;;1244;;;1240:20;;1237:33;-1:-1:-1;1234:2:1;;;1283:1;1280;1273:12;1234:2;1305:1;1296:10;;1315:163;1329:2;1326:1;1323:9;1315:163;;;1386:17;;1374:30;;1347:1;1340:9;;;;;1424:12;;;;1456;;1315:163;;;-1:-1:-1;1497:6:1;478:1031;-1:-1:-1;;;;;;;;478:1031:1:o;1514:277::-;1581:6;1634:2;1622:9;1613:7;1609:23;1605:32;1602:2;;;1650:1;1647;1640:12;1602:2;1682:9;1676:16;1735:5;1728:13;1721:21;1714:5;1711:32;1701:2;;1757:1;1754;1747:12;1796:180;1855:6;1908:2;1896:9;1887:7;1883:23;1879:32;1876:2;;;1924:1;1921;1914:12;1876:2;-1:-1:-1;1947:23:1;;1866:110;-1:-1:-1;1866:110:1:o;1981:184::-;2051:6;2104:2;2092:9;2083:7;2079:23;2075:32;2072:2;;;2120:1;2117;2110:12;2072:2;-1:-1:-1;2143:16:1;;2062:103;-1:-1:-1;2062:103:1:o;2170:254::-;2238:6;2246;2299:2;2287:9;2278:7;2274:23;2270:32;2267:2;;;2315:1;2312;2305:12;2267:2;2351:9;2338:23;2328:33;;2380:38;2414:2;2403:9;2399:18;2380:38;:::i;:::-;2370:48;;2257:167;;;;;:::o;2429:248::-;2497:6;2505;2558:2;2546:9;2537:7;2533:23;2529:32;2526:2;;;2574:1;2571;2564:12;2526:2;-1:-1:-1;;2597:23:1;;;2667:2;2652:18;;;2639:32;;-1:-1:-1;2516:161:1:o;2682:274::-;2811:3;2849:6;2843:13;2865:53;2911:6;2906:3;2899:4;2891:6;2887:17;2865:53;:::i;:::-;2934:16;;;;;2819:137;-1:-1:-1;;2819:137:1:o;4702:383::-;4851:2;4840:9;4833:21;4814:4;4883:6;4877:13;4926:6;4921:2;4910:9;4906:18;4899:34;4942:66;5001:6;4996:2;4985:9;4981:18;4976:2;4968:6;4964:15;4942:66;:::i;:::-;5069:2;5048:15;-1:-1:-1;;5044:29:1;5029:45;;;;5076:2;5025:54;;4823:262;-1:-1:-1;;4823:262:1:o;9020:356::-;9222:2;9204:21;;;9241:18;;;9234:30;9300:34;9295:2;9280:18;;9273:62;9367:2;9352:18;;9194:182::o;13323:128::-;13363:3;13394:1;13390:6;13387:1;13384:13;13381:2;;;13400:18;;:::i;:::-;-1:-1:-1;13436:9:1;;13371:80::o;13456:217::-;13496:1;13522;13512:2;;13566:10;13561:3;13557:20;13554:1;13547:31;13601:4;13598:1;13591:15;13629:4;13626:1;13619:15;13512:2;-1:-1:-1;13658:9:1;;13502:171::o;13678:168::-;13718:7;13784:1;13780;13776:6;13772:14;13769:1;13766:21;13761:1;13754:9;13747:17;13743:45;13740:2;;;13791:18;;:::i;:::-;-1:-1:-1;13831:9:1;;13730:116::o;13851:125::-;13891:4;13919:1;13916;13913:8;13910:2;;;13924:18;;:::i;:::-;-1:-1:-1;13961:9:1;;13900:76::o;13981:258::-;14053:1;14063:113;14077:6;14074:1;14071:13;14063:113;;;14153:11;;;14147:18;14134:11;;;14127:39;14099:2;14092:10;14063:113;;;14194:6;14191:1;14188:13;14185:2;;;-1:-1:-1;;14229:1:1;14211:16;;14204:27;14034:205::o;14244:127::-;14305:10;14300:3;14296:20;14293:1;14286:31;14336:4;14333:1;14326:15;14360:4;14357:1;14350:15;14376:127;14437:10;14432:3;14428:20;14425:1;14418:31;14468:4;14465:1;14458:15;14492:4;14489:1;14482:15;14508:127;14569:10;14564:3;14560:20;14557:1;14550:31;14600:4;14597:1;14590:15;14624:4;14621:1;14614:15
Swarm Source
ipfs://5c263d5b066ca3f875f136ce7e4099e6be9ecaa5b33092a349c7e01111969f3a
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.