Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
DustyMasterChef
Compiler Version
v0.8.8+commit.dddeac2f
Contract Source Code (Solidity)
/** *Submitted for verification at moonbeam.moonscan.io on 2022-01-27 */ // File @openzeppelin/contracts/token/ERC20/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @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 @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/utils/math/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // 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 generally not needed starting with Solidity 0.8, since 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; } } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File contracts/farm/IDustyERC20.sol pragma solidity ^0.8.2; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IDustyERC20 is IERC20, IERC20Permit { function mint(address to, uint256 amount) external; } // File contracts/farm/DustyMasterChef.sol pragma solidity ^0.8.2; contract DustyMasterChef is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. uint256 rewardLockedUp; // Reward locked up. uint256 nextHarvestUntil; // When can the user harvest again. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. Dusty to distribute per block. uint256 lastRewardBlock; // Last block number that Dusty distribution occurs. uint256 accDustyPerShare; // Accumulated Dusty per share, times 1e12. See below. uint16 depositFeeBP; // Deposit fee in basis points uint256 harvestInterval; // Harvest interval in seconds uint256 totalLp; // Total token in Pool } IDustyERC20 public dusty; // The operator can only update EmissionRate and AllocPoint to protect tokenomics //i.e some wrong setting and a pools get too much allocation accidentally address private _operator; // Dev address. address public devAddress; // Deposit Fee address address public feeAddress; // Dusty tokens created per block uint256 public dustyPerBlock; // Max harvest interval: 14 days uint256 public constant MAXIMUM_HARVEST_INTERVAL = 14 days; // Maximum deposit fee rate: 10% uint16 public constant MAXIMUM_DEPOSIT_FEE_RATE = 1000; // Info of each pool PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. 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; // The block number when Dusty mining starts. uint256 public startBlock; // Total locked up rewards uint256 public totalLockedUpRewards; // Total Dusty in Dusty Pools (can be multiple pools) uint256 public totalDustyInPools = 0; // Control support for EIP-2771 Meta Transactions bool public metaTxnsEnabled = false; 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 ); event EmissionRateUpdated( address indexed caller, uint256 previousAmount, uint256 newAmount ); event RewardLockedUp( address indexed user, uint256 indexed pid, uint256 amountLockedUp ); event OperatorTransferred( address indexed previousOperator, address indexed newOperator ); event DevAddressChanged( address indexed caller, address oldAddress, address newAddress ); event FeeAddressChanged( address indexed caller, address oldAddress, address newAddress ); event AllocPointsUpdated( address indexed caller, uint256 previousAmount, uint256 newAmount ); event MetaTxnsEnabled(address indexed caller); event MetaTxnsDisabled(address indexed caller); modifier onlyOperator() { require( _operator == msg.sender, "Operator: caller is not the operator" ); _; } constructor(IDustyERC20 _dusty, uint256 _dustyPerBlock,address _devAddress) { //StartBlock always many years later from contract construct, will be set later in StartFarming function startBlock = block.number + (10 * 365 * 24 * 60 * 60); dusty = _dusty; dustyPerBlock = _dustyPerBlock; devAddress = _devAddress; feeAddress = _devAddress; _operator = msg.sender; emit OperatorTransferred(address(0), _operator); } function _msgSender() internal view virtual override returns (address sender) { return super._msgSender(); } function _msgData() internal view virtual override returns (bytes calldata) { return super._msgData(); } function operator() public view returns (address) { return _operator; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) { return _to.sub(_from); } function transferOperator(address newOperator) public onlyOperator { require( newOperator != address(0), "TransferOperator: new operator is the zero address" ); emit OperatorTransferred(_operator, newOperator); _operator = newOperator; } // Set farming start, can call only once function startFarming() public onlyOwner { require(block.number < startBlock, "Error::Farm started already"); uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { PoolInfo storage pool = poolInfo[pid]; pool.lastRewardBlock = block.number; } startBlock = block.number; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the owner. // Can add multiple pool with same lp token without messing up rewards, because each pool's balance is tracked using its own totalLp function add( uint256 _allocPoint, IERC20 _lpToken, uint16 _depositFeeBP, uint256 _harvestInterval, bool _withUpdate ) public onlyOwner { require( _depositFeeBP <= MAXIMUM_DEPOSIT_FEE_RATE, "add: deposit fee too high" ); require( _harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "add: invalid harvest interval" ); if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accDustyPerShare: 0, depositFeeBP: _depositFeeBP, harvestInterval: _harvestInterval, totalLp: 0 }) ); } // Update the given pool's Dusty allocation point and deposit fee. Can only be called by the owner. function set( uint256 _pid, uint256 _allocPoint, uint16 _depositFeeBP, uint256 _harvestInterval, bool _withUpdate ) public onlyOwner { require( _depositFeeBP <= MAXIMUM_DEPOSIT_FEE_RATE, "set: deposit fee too high" ); require( _harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "set: invalid harvest interval" ); if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; poolInfo[_pid].depositFeeBP = _depositFeeBP; poolInfo[_pid].harvestInterval = _harvestInterval; } // View function to see pending Dusty on frontend. function pendingDusty(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accDustyPerShare = pool.accDustyPerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier( pool.lastRewardBlock, block.number ); uint256 dustyReward = multiplier .mul(dustyPerBlock) .mul(pool.allocPoint) .div(totalAllocPoint); accDustyPerShare = accDustyPerShare.add( dustyReward.mul(1e12).div(lpSupply) ); } uint256 pending = user.amount.mul(accDustyPerShare).div(1e12).sub( user.rewardDebt ); return pending.add(user.rewardLockedUp); } // View function to see if user can harvest Dusty. function canHarvest(uint256 _pid, address _user) public view returns (bool) { UserInfo storage user = userInfo[_pid][_user]; return block.number >= startBlock && block.timestamp >= user.nextHarvestUntil; } // Update reward vairables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.totalLp; if (lpSupply == 0 || pool.allocPoint == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 dustyReward = multiplier .mul(dustyPerBlock) .mul(pool.allocPoint) .div(totalAllocPoint); dusty.mint(devAddress, dustyReward.div(5)); dusty.mint(address(this), dustyReward); pool.accDustyPerShare = pool.accDustyPerShare.add( dustyReward.mul(1e12).div(pool.totalLp) ); pool.lastRewardBlock = block.number; } // Deposit LP tokens to MasterChef for Dusty allocation. function deposit(uint256 _pid, uint256 _amount) public nonReentrant { require( block.number >= startBlock, "DustyDistributor: Can not deposit before start" ); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_msgSender()]; updatePool(_pid); payOrLockupPendingDusty(_pid); if (_amount > 0) { uint256 beforeDeposit = pool.lpToken.balanceOf(address(this)); pool.lpToken.safeTransferFrom(_msgSender(), address(this), _amount); uint256 afterDeposit = pool.lpToken.balanceOf(address(this)); _amount = afterDeposit.sub(beforeDeposit); if (pool.depositFeeBP > 0) { uint256 depositFee = _amount.mul(pool.depositFeeBP).div(10000); pool.lpToken.safeTransfer(feeAddress, depositFee); _amount = _amount.sub(depositFee); } user.amount = user.amount.add(_amount); pool.totalLp = pool.totalLp.add(_amount); if (address(pool.lpToken) == address(dusty)) { totalDustyInPools = totalDustyInPools.add(_amount); } } user.rewardDebt = user.amount.mul(pool.accDustyPerShare).div(1e12); emit Deposit(_msgSender(), _pid, _amount); } // Withdraw tokens function withdraw(uint256 _pid, uint256 _amount) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_msgSender()]; //this will make sure that user can only withdraw from his pool require(user.amount >= _amount, "Withdraw: User amount not enough"); //Cannot withdraw more than pool's balance require(pool.totalLp >= _amount, "Withdraw: Pool total not enough"); updatePool(_pid); payOrLockupPendingDusty(_pid); if (_amount > 0) { user.amount = user.amount.sub(_amount); pool.totalLp = pool.totalLp.sub(_amount); if (address(pool.lpToken) == address(dusty)) { totalDustyInPools = totalDustyInPools.sub(_amount); } pool.lpToken.safeTransfer(_msgSender(), _amount); } user.rewardDebt = user.amount.mul(pool.accDustyPerShare).div(1e12); emit Withdraw(_msgSender(), _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_msgSender()]; uint256 amount = user.amount; //Cannot withdraw more than pool's balance require( pool.totalLp >= amount, "EmergencyWithdraw: Pool total not enough" ); user.amount = 0; user.rewardDebt = 0; user.rewardLockedUp = 0; user.nextHarvestUntil = 0; pool.totalLp = pool.totalLp.sub(amount); if (address(pool.lpToken) == address(dusty)) { totalDustyInPools = totalDustyInPools.sub(amount); } pool.lpToken.safeTransfer(_msgSender(), amount); emit EmergencyWithdraw(_msgSender(), _pid, amount); } // Pay or lockup pending Dusty. function payOrLockupPendingDusty(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_msgSender()]; if (user.nextHarvestUntil == 0 && block.number >= startBlock) { user.nextHarvestUntil = block.timestamp.add(pool.harvestInterval); } uint256 pending = user.amount.mul(pool.accDustyPerShare).div(1e12).sub( user.rewardDebt ); if (canHarvest(_pid, _msgSender())) { if (pending > 0 || user.rewardLockedUp > 0) { uint256 totalRewards = pending.add(user.rewardLockedUp); // reset lockup totalLockedUpRewards = totalLockedUpRewards.sub( user.rewardLockedUp ); user.rewardLockedUp = 0; user.nextHarvestUntil = block.timestamp.add( pool.harvestInterval ); // send rewards safeDustyTransfer(_msgSender(), totalRewards); } } else if (pending > 0) { user.rewardLockedUp = user.rewardLockedUp.add(pending); totalLockedUpRewards = totalLockedUpRewards.add(pending); emit RewardLockedUp(_msgSender(), _pid, pending); } } // Safe Dusty transfer function, just in case if rounding error causes pool do not have enough Dusty. function safeDustyTransfer(address _to, uint256 _amount) internal { if (dusty.balanceOf(address(this)) > totalDustyInPools) { //DustyBal = total Dusty in DustyDistributor - total Dusty in Dusty pools, this will make sure that DustyDistributor never transfer rewards from deposited Dusty pools uint256 DustyBal = dusty.balanceOf(address(this)).sub( totalDustyInPools ); if (_amount >= DustyBal) { dusty.transfer(_to, DustyBal); } else if (_amount > 0) { dusty.transfer(_to, _amount); } } } // Update dev address by the previous dev. function setDevAddress(address _devAddress) public { require(_msgSender() == devAddress, "setDevAddress: FORBIDDEN"); require(_devAddress != address(0), "setDevAddress: ZERO"); emit DevAddressChanged(_msgSender(), devAddress, _devAddress); devAddress = _devAddress; } function setFeeAddress(address _feeAddress) public { require(_msgSender() == feeAddress, "setFeeAddress: FORBIDDEN"); require(_feeAddress != address(0), "setFeeAddress: ZERO"); emit FeeAddressChanged(_msgSender(), feeAddress, _feeAddress); feeAddress = _feeAddress; } // Pancake has to add hidden dummy pools in order to alter the emission, here we make it simple and transparent to all. function updateEmissionRate(uint256 _dustyPerBlock) public onlyOperator { massUpdatePools(); emit EmissionRateUpdated(msg.sender, dustyPerBlock, _dustyPerBlock); dustyPerBlock = _dustyPerBlock; } function updateAllocPoint( uint256 _pid, uint256 _allocPoint, bool _withUpdate ) public onlyOperator { if (_withUpdate) { massUpdatePools(); } emit AllocPointsUpdated( _msgSender(), poolInfo[_pid].allocPoint, _allocPoint ); totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; } // Enable support for meta transactions function enableMetaTxns() public onlyOperator { require(!metaTxnsEnabled, "Meta transactions are already enabled"); metaTxnsEnabled = true; emit MetaTxnsEnabled(_msgSender()); } // Disable support for meta transactions function disableMetaTxns() public onlyOperator { require(metaTxnsEnabled, "Meta transactions are already disabled"); metaTxnsEnabled = false; emit MetaTxnsDisabled(_msgSender()); } }
[{"inputs":[{"internalType":"contract IDustyERC20","name":"_dusty","type":"address"},{"internalType":"uint256","name":"_dustyPerBlock","type":"uint256"},{"internalType":"address","name":"_devAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"AllocPointsUpdated","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":"caller","type":"address"},{"indexed":false,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"DevAddressChanged","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":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"EmissionRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"FeeAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"MetaTxnsDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"MetaTxnsEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","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":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountLockedUp","type":"uint256"}],"name":"RewardLockedUp","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":"MAXIMUM_DEPOSIT_FEE_RATE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_HARVEST_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"canHarvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableMetaTxns","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dusty","outputs":[{"internalType":"contract IDustyERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dustyPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableMetaTxns","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"pure","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metaTxnsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingDusty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accDustyPerShare","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"internalType":"uint256","name":"totalLp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAddress","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startFarming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDustyInPools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedUpRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"updateAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dustyPerBlock","type":"uint256"}],"name":"updateEmissionRate","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":"rewardLockedUp","type":"uint256"},{"internalType":"uint256","name":"nextHarvestUntil","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
608060405260006009819055600c55600d805460ff191690553480156200002557600080fd5b50604051620035583803806200355883398101604081905262000048916200017c565b6200005c62000056620000f3565b6200010f565b6001805562000070436312cc0300620001c4565b600a55600280546001600160a01b038086166001600160a01b0319928316179092556006849055600480549284169282168317905560058054821690921790915560038054909116339081179091556040516000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3505050620001eb565b60006200010a6200015f60201b620027111760201c565b905090565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3390565b6001600160a01b03811681146200017957600080fd5b50565b6000806000606084860312156200019257600080fd5b83516200019f8162000163565b602085015160408601519194509250620001b98162000163565b809150509250925092565b60008219821115620001e657634e487b7160e01b600052601160045260246000fd5b500190565b61335d80620001fb6000396000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c8063570ca7351161014557806393f1a40b116100bd578063bde4aeca1161008c578063de73149d11610071578063de73149d14610583578063e2bbb1581461058d578063f2fde38b146105a057600080fd5b8063bde4aeca1461055d578063d0d41fe11461057057600080fd5b806393f1a40b146104d5578063a8c95dc014610535578063af018de814610542578063afbcfea11461055557600080fd5b8063715018a6116101145780638705fcd4116100f95780638705fcd4146104915780638da5cb5b146104a45780638dbb1e3a146104c257600080fd5b8063715018a61461046d578063812c64f11461047557600080fd5b8063570ca7351461042c578063578bb42d1461044a5780635e74583e14610452578063630b5ba11461046557600080fd5b80632e6c998d116101d8578063441a3e70116101a757806348cd4cb11161018c57806348cd4cb1146103fd57806351eb05a6146104065780635312ea8e1461041957600080fd5b8063441a3e70146103e1578063474fa630146103f457600080fd5b80632e6c998d146103755780633810a1d4146103985780633ad10ef6146103a157806341275358146103c157600080fd5b8063138474561161022f57806317caf6f11161021457806317caf6f1146103465780632143e5451461034f57806329605e771461036257600080fd5b806313847456146102da5780631526fe27146102e357600080fd5b806304d3e35714610261578063081e3eda146102ab57806308383640146102bd5780630ba84cd2146102c7575b600080fd5b6002546102819073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6007545b6040519081526020016102a2565b6102c56105b3565b005b6102c56102d5366004612f86565b610745565b6102af60065481565b6102f66102f1366004612f86565b610836565b6040805173ffffffffffffffffffffffffffffffffffffffff9098168852602088019690965294860193909352606085019190915261ffff16608084015260a083015260c082015260e0016102a2565b6102af60095481565b6102c561035d366004612fc4565b6108a0565b6102c561037036600461303a565b610aed565b610388610383366004613057565b610cc4565b60405190151581526020016102a2565b6102af600c5481565b6004546102819073ffffffffffffffffffffffffffffffffffffffff1681565b6005546102819073ffffffffffffffffffffffffffffffffffffffff1681565b6102c56103ef366004613087565b610d11565b6102af600b5481565b6102af600a5481565b6102c5610414366004612f86565b610fd4565b6102c5610427366004612f86565b6111e6565b60035473ffffffffffffffffffffffffffffffffffffffff16610281565b6102c561140f565b6102af610460366004613057565b6115be565b6102c5611771565b6102c561179c565b61047e6103e881565b60405161ffff90911681526020016102a2565b6102c561049f36600461303a565b611829565b60005473ffffffffffffffffffffffffffffffffffffffff16610281565b6102af6104d0366004613087565b6119da565b6105156104e3366004613057565b600860209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102a2565b600d546103889060ff1681565b6102c56105503660046130a9565b6119ed565b6102c5611d4f565b6102c561056b3660046130e1565b611e91565b6102c561057e36600461303a565b612010565b6102af6212750081565b6102c561059b366004613087565b6121c1565b6102c56105ae36600461303a565b6125e1565b60035473ffffffffffffffffffffffffffffffffffffffff16331461065e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201527f61746f720000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b600d5460ff166106f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d657461207472616e73616374696f6e732061726520616c726561647920646960448201527f7361626c656400000000000000000000000000000000000000000000000000006064820152608401610655565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405133907f096be170ccc67847e55535e7d8334b2afedd95805baedc160005addb9144745090600090a2565b60035473ffffffffffffffffffffffffffffffffffffffff1633146107eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201527f61746f72000000000000000000000000000000000000000000000000000000006064820152608401610655565b6107f3611771565b600654604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2600655565b6007818154811061084657600080fd5b6000918252602090912060079091020180546001820154600283015460038401546004850154600586015460069096015473ffffffffffffffffffffffffffffffffffffffff909516965092949193909261ffff16919087565b60005473ffffffffffffffffffffffffffffffffffffffff163314610921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610655565b6103e861ffff84161115610991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f7365743a206465706f7369742066656520746f6f2068696768000000000000006044820152606401610655565b621275008211156109fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610655565b8015610a0c57610a0c611771565b610a4f84610a4960078881548110610a2657610a2661311a565b90600052602060002090600702016001015460095461271590919063ffffffff16565b90612721565b6009819055508360078681548110610a6957610a6961311a565b9060005260206000209060070201600101819055508260078681548110610a9257610a9261311a565b906000526020600020906007020160040160006101000a81548161ffff021916908361ffff1602179055508160078681548110610ad157610ad161311a565b9060005260206000209060070201600501819055505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201527f61746f72000000000000000000000000000000000000000000000000000000006064820152608401610655565b73ffffffffffffffffffffffffffffffffffffffff8116610c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f5472616e736665724f70657261746f723a206e6577206f70657261746f72206960448201527f7320746865207a65726f206164647265737300000000000000000000000000006064820152608401610655565b60035460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed90600090a3600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff851684529091528120600a544310801590610d09575080600301544210155b949350505050565b60026001541415610d7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610655565b6002600181905550600060078381548110610d9b57610d9b61311a565b60009182526020808320868452600890915260408320600790920201925081610dc13390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f57697468647261773a205573657220616d6f756e74206e6f7420656e6f7567686044820152606401610655565b8282600601541015610ed9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f57697468647261773a20506f6f6c20746f74616c206e6f7420656e6f756768006044820152606401610655565b610ee284610fd4565b610eeb8461272d565b8215610f6c578054610efd9084612715565b81556006820154610f0e9084612715565b6006830155600254825473ffffffffffffffffffffffffffffffffffffffff90811691161415610f4957600c54610f459084612715565b600c555b610f6c33835473ffffffffffffffffffffffffffffffffffffffff1690856128f8565b60038201548154610f8d9164e8d4a5100091610f87916129d1565b906129dd565b6001820155604051838152849033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568906020015b60405180910390a35050600180555050565b600060078281548110610fe957610fe961311a565b9060005260206000209060070201905080600201544311611008575050565b600681015480158061101c57506001820154155b1561102c57504360029091015550565b600061103c8360020154436119da565b90506000611069600954610f878660010154611063600654876129d190919063ffffffff16565b906129d1565b60025460045491925073ffffffffffffffffffffffffffffffffffffffff908116916340c10f19911661109d8460056129dd565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b15801561110857600080fd5b505af115801561111c573d6000803e3d6000fd5b50506002546040517f40c10f190000000000000000000000000000000000000000000000000000000081523060048201526024810185905273ffffffffffffffffffffffffffffffffffffffff90911692506340c10f199150604401600060405180830381600087803b15801561119257600080fd5b505af11580156111a6573d6000803e3d6000fd5b50505060068501546111d191506111c690610f878464e8d4a510006129d1565b600386015490612721565b60038501555050436002909201919091555050565b60026001541415611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610655565b60026001819055506000600782815481106112705761127061311a565b600091825260208083208584526008909152604083206007909202019250816112963390565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000208054600684015491925090811115611356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f456d657267656e637957697468647261773a20506f6f6c20746f74616c206e6f60448201527f7420656e6f7567680000000000000000000000000000000000000000000000006064820152608401610655565b600080835560018301819055600283018190556003830155600683015461137d9082612715565b6006840155600254835473ffffffffffffffffffffffffffffffffffffffff908116911614156113b857600c546113b49082612715565b600c555b6113db33845473ffffffffffffffffffffffffffffffffffffffff1690836128f8565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059590602001610fc2565b60035473ffffffffffffffffffffffffffffffffffffffff1633146114b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201527f61746f72000000000000000000000000000000000000000000000000000000006064820152608401610655565b600d5460ff1615611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d657461207472616e73616374696f6e732061726520616c726561647920656e60448201527f61626c65640000000000000000000000000000000000000000000000000000006064820152608401610655565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561157a3390565b73ffffffffffffffffffffffffffffffffffffffff167f92e4c08d47b71e8dc051232b8e475ec296489a67a4ba5cca88ff20fb6ac499e660405160405180910390a2565b600080600784815481106115d4576115d461311a565b6000918252602080832087845260088252604080852073ffffffffffffffffffffffffffffffffffffffff898116875293528085206007949094029091016003810154815492517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291965093949291909116906370a082319060240160206040518083038186803b15801561167057600080fd5b505afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a89190613149565b90508360020154431180156116bc57508015155b1561171c5760006116d18560020154436119da565b905060006116f8600954610f878860010154611063600654876129d190919063ffffffff16565b905061171761171084610f878464e8d4a510006129d1565b8590612721565b935050505b600061174c846001015461174664e8d4a51000610f878789600001546129d190919063ffffffff16565b90612715565b905061176584600201548261272190919063ffffffff16565b98975050505050505050565b60075460005b818110156117985761178881610fd4565b61179181613191565b9050611777565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610655565b61182760006129e9565b565b60055473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f736574466565416464726573733a20464f5242494444454e00000000000000006044820152606401610655565b73ffffffffffffffffffffffffffffffffffffffff811661193d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f736574466565416464726573733a205a45524f000000000000000000000000006044820152606401610655565b6005546040805173ffffffffffffffffffffffffffffffffffffffff92831681529183166020830152805133927f6690a53895b5691c039238b384bd857e65c42adcc727775381e02cb90a12261392908290030190a2600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006119e68284612715565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610655565b6103e861ffff84161115611ade576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6164643a206465706f7369742066656520746f6f2068696768000000000000006044820152606401610655565b62127500821115611b4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610655565b8015611b5957611b59611771565b6000600a544311611b6c57600a54611b6e565b435b600954909150611b7e9087612721565b6009556040805160e08101825273ffffffffffffffffffffffffffffffffffffffff96871681526020810197885290810191825260006060820181815261ffff9687166080840190815260a0840196875260c08401838152600780546001810182559481905294517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889490950293840180547fffffffffffffffffffffffff00000000000000000000000000000000000000001695909a169490941790985597517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68982015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a83015595517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b82015593517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68c850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169190941617909255517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68d8301555090517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68e90910155565b60005473ffffffffffffffffffffffffffffffffffffffff163314611dd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610655565b600a544310611e3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4572726f723a3a4661726d207374617274656420616c726561647900000000006044820152606401610655565b60075460005b81811015611e8957600060078281548110611e5e57611e5e61311a565b906000526020600020906007020190504381600201819055505080611e8290613191565b9050611e41565b505043600a55565b60035473ffffffffffffffffffffffffffffffffffffffff163314611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201527f61746f72000000000000000000000000000000000000000000000000000000006064820152608401610655565b8015611f4557611f45611771565b3373ffffffffffffffffffffffffffffffffffffffff167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef360078581548110611f9057611f9061311a565b90600052602060002090600702016001015484604051611fba929190918252602082015260400190565b60405180910390a2611fdc82610a4960078681548110610a2657610a2661311a565b6009819055508160078481548110611ff657611ff661311a565b906000526020600020906007020160010181905550505050565b60045473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f736574446576416464726573733a20464f5242494444454e00000000000000006044820152606401610655565b73ffffffffffffffffffffffffffffffffffffffff8116612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f736574446576416464726573733a205a45524f000000000000000000000000006044820152606401610655565b6004546040805173ffffffffffffffffffffffffffffffffffffffff92831681529183166020830152805133927fd36d63f6c513a911d7912853de740af476b0fbb569aa769e1a4f5bfa37a325c492908290030190a2600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6002600154141561222e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610655565b6002600155600a544310156122c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f44757374794469737472696275746f723a2043616e206e6f74206465706f736960448201527f74206265666f72652073746172740000000000000000000000000000000000006064820152608401610655565b6000600783815481106122da576122da61311a565b600091825260208083208684526008909152604083206007909202019250816123003390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061234584610fd4565b61234e8461272d565b821561258d5781546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156123bd57600080fd5b505afa1580156123d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f59190613149565b905061241b33845473ffffffffffffffffffffffffffffffffffffffff16903087612a5e565b82546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561248457600080fd5b505afa158015612498573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124bc9190613149565b90506124c88183612715565b600485015490955061ffff16156125325760048401546000906124f89061271090610f8790899061ffff166129d1565b60055486549192506125249173ffffffffffffffffffffffffffffffffffffffff9081169116836128f8565b61252e8682612715565b9550505b825461253e9086612721565b8355600684015461254f9086612721565b6006850155600254845473ffffffffffffffffffffffffffffffffffffffff9081169116141561258a57600c546125869086612721565b600c555b50505b600382015481546125a89164e8d4a5100091610f87916129d1565b6001820155604051838152849033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1590602001610fc2565b60005473ffffffffffffffffffffffffffffffffffffffff163314612662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610655565b73ffffffffffffffffffffffffffffffffffffffff8116612705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610655565b61270e816129e9565b50565b3390565b60006119e682846131ca565b60006119e682846131e1565b6000600782815481106127425761274261311a565b600091825260208083208584526008909152604083206007909202019250816127683390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806003015460001480156127ba5750600a544310155b156127d55760058201546127cf904290612721565b60038201555b6000612803826001015461174664e8d4a51000610f87876003015487600001546129d190919063ffffffff16565b905061280f8433610cc4565b15612890576000811180612827575060008260020154115b1561288b57600061284583600201548361272190919063ffffffff16565b90506128608360020154600b5461271590919063ffffffff16565b600b5560006002840155600584015461287a904290612721565b60038401556128893382612abc565b505b6128f2565b80156128f25760028201546128a59082612721565b6002830155600b546128b79082612721565b600b55604051818152849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c19060200160405180910390a35b50505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526129cc9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612d2e565b505050565b60006119e682846131f9565b60006119e68284613236565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526128f29085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161294a565b600c546002546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b158015612b2857600080fd5b505afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190613149565b111561179857600c546002546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600092612c1392909173ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b158015612bdb57600080fd5b505afa158015612bef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117469190613149565b9050808210612cc9576002546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018490529091169063a9059cbb906044015b602060405180830381600087803b158015612c9157600080fd5b505af1158015612ca5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128f29190613271565b81156129cc576002546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529091169063a9059cbb90604401612c77565b6000612d90826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612e3a9092919063ffffffff16565b8051909150156129cc5780806020019051810190612dae9190613271565b6129cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610655565b6060610d09848460008585843b612ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610655565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612ed691906132ba565b60006040518083038185875af1925050503d8060008114612f13576040519150601f19603f3d011682016040523d82523d6000602084013e612f18565b606091505b5091509150612f28828286612f33565b979650505050505050565b60608315612f425750816119e6565b825115612f525782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065591906132d6565b600060208284031215612f9857600080fd5b5035919050565b803561ffff81168114612fb157600080fd5b919050565b801515811461270e57600080fd5b600080600080600060a08688031215612fdc57600080fd5b8535945060208601359350612ff360408701612f9f565b925060608601359150608086013561300a81612fb6565b809150509295509295909350565b73ffffffffffffffffffffffffffffffffffffffff8116811461270e57600080fd5b60006020828403121561304c57600080fd5b81356119e681613018565b6000806040838503121561306a57600080fd5b82359150602083013561307c81613018565b809150509250929050565b6000806040838503121561309a57600080fd5b50508035926020909101359150565b600080600080600060a086880312156130c157600080fd5b8535945060208601356130d381613018565b9350612ff360408701612f9f565b6000806000606084860312156130f657600080fd5b8335925060208401359150604084013561310f81612fb6565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561315b57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131c3576131c3613162565b5060010190565b6000828210156131dc576131dc613162565b500390565b600082198211156131f4576131f4613162565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561323157613231613162565b500290565b60008261326c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561328357600080fd5b81516119e681612fb6565b60005b838110156132a9578181015183820152602001613291565b838111156128f25750506000910152565b600082516132cc81846020870161328e565b9190910192915050565b60208152600082518060208401526132f581604085016020870161328e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea2646970667358221220067dc92dc6a968b7e8ebaf17c148b1804f5fabf14a4d3a826eddd095cf93dbd364736f6c63430008080033000000000000000000000000f2dc7653a5af3512dd64a7dfb36f7a7ff9c0540d0000000000000000000000000000000000000000000000260e3500a504380000000000000000000000000000d72736851e2a4a631cefe62d64a3e8d1939934b3
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f2dc7653a5af3512dd64a7dfb36f7a7ff9c0540d0000000000000000000000000000000000000000000000260e3500a504380000000000000000000000000000d72736851e2a4a631cefe62d64a3e8d1939934b3
-----Decoded View---------------
Arg [0] : _dusty (address): 0xf2dc7653a5af3512dd64a7dfb36f7a7ff9c0540d
Arg [1] : _dustyPerBlock (uint256): 702000000000000000000
Arg [2] : _devAddress (address): 0xd72736851e2a4a631cefe62d64a3e8d1939934b3
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f2dc7653a5af3512dd64a7dfb36f7a7ff9c0540d
Arg [1] : 0000000000000000000000000000000000000000000000260e3500a504380000
Arg [2] : 000000000000000000000000d72736851e2a4a631cefe62d64a3e8d1939934b3
Deployed ByteCode Sourcemap
31038:18191:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32070:24;;;;;;;;;;;;210:42:1;198:55;;;180:74;;168:2;153:18;32070:24:0;;;;;;;;36631:95;36703:8;:15;36631:95;;;411:25:1;;;399:2;384:18;36631:95:0;265:177:1;49012:214:0;;;:::i;:::-;;47937:229;;;;;;:::i;:::-;;:::i;32459:28::-;;;;;;32728:26;;;;;;:::i;:::-;;:::i;:::-;;;;988:42:1;976:55;;;958:74;;1063:2;1048:18;;1041:34;;;;1091:18;;;1084:34;;;;1149:2;1134:18;;1127:34;;;;1210:6;1198:19;1192:3;1177:19;;1170:48;1249:3;1234:19;;1227:35;1293:3;1278:19;;1271:35;945:3;930:19;32728:26:0;632:680:1;32973:34:0;;;;;;38124:803;;;;;;:::i;:::-;;:::i;35890:304::-;;;;;;:::i;:::-;;:::i;40079:286::-;;;;;;:::i;:::-;;:::i;:::-;;;3024:14:1;;3017:22;2999:41;;2987:2;2972:18;40079:286:0;2859:187:1;33236:36:0;;;;;;32324:25;;;;;;;;;32386;;;;;;;;;43048:1031;;;;;;:::i;:::-;;:::i;33133:35::-;;;;;;33067:25;;;;;;40704:869;;;;;;:::i;:::-;;:::i;44150:829::-;;;;;;:::i;:::-;;:::i;35568:85::-;35636:9;;;;35568:85;;48747:211;;;:::i;38991:1024::-;;;;;;:::i;:::-;;:::i;40448:180::-;;;:::i;17711:103::-;;;:::i;32639:54::-;;32689:4;32639:54;;;;;3709:6:1;3697:19;;;3679:38;;3667:2;3652:18;32639:54:0;3535:188:1;47492:312:0;;;;;;:::i;:::-;;:::i;17060:87::-;17106:7;17133:6;;;17060:87;;35729:153;;;;;;:::i;:::-;;:::i;32812:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3959:25:1;;;4015:2;4000:18;;3993:34;;;;4043:18;;;4036:34;4101:2;4086:18;;4079:34;3946:3;3931:19;32812:64:0;3728:391:1;33336:35:0;;;;;;;;;36939:1072;;;;;;:::i;:::-;;:::i;36248:375::-;;;:::i;48174:520::-;;;;;;:::i;:::-;;:::i;47172:312::-;;;;;;:::i;:::-;;:::i;32534:58::-;;32585:7;32534:58;;41643:1373;;;;;;:::i;:::-;;:::i;17969:201::-;;;;;;:::i;:::-;;:::i;49012:214::-;34595:9;;:23;:9;34608:10;34595:23;34573:109;;;;;;;5318:2:1;34573:109:0;;;5300:21:1;5357:2;5337:18;;;5330:30;5396:34;5376:18;;;5369:62;5467:6;5447:18;;;5440:34;5491:19;;34573:109:0;;;;;;;;;49078:15:::1;::::0;::::1;;49070:66;;;::::0;::::1;::::0;;5723:2:1;49070:66:0::1;::::0;::::1;5705:21:1::0;5762:2;5742:18;;;5735:30;5801:34;5781:18;;;5774:62;5872:8;5852:18;;;5845:36;5898:19;;49070:66:0::1;5521:402:1::0;49070:66:0::1;49149:15;:23:::0;;;::::1;::::0;;49188:30:::1;::::0;15858:10;;49188:30:::1;::::0;-1:-1:-1;;49188:30:0::1;49012:214::o:0;47937:229::-;34595:9;;:23;:9;34608:10;34595:23;34573:109;;;;;;;5318:2:1;34573:109:0;;;5300:21:1;5357:2;5337:18;;;5330:30;5396:34;5376:18;;;5369:62;5467:6;5447:18;;;5440:34;5491:19;;34573:109:0;5116:400:1;34573:109:0;48020:17:::1;:15;:17::i;:::-;48087:13;::::0;48055:62:::1;::::0;;6102:25:1;;;6158:2;6143:18;;6136:34;;;48075:10:0::1;::::0;48055:62:::1;::::0;6075:18:1;48055:62:0::1;;;;;;;48128:13;:30:::0;47937:229::o;32728:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32728:26:0;;;;;;;;;;;:::o;38124:803::-;17106:7;17133:6;17280:23;17133:6;15858:10;17280:23;17272:68;;;;;;;6383:2:1;17272:68:0;;;6365:21:1;;;6402:18;;;6395:30;6461:34;6441:18;;;6434:62;6513:18;;17272:68:0;6181:356:1;17272:68:0;32689:4:::1;38340:41;::::0;::::1;;;38318:116;;;::::0;::::1;::::0;;6744:2:1;38318:116:0::1;::::0;::::1;6726:21:1::0;6783:2;6763:18;;;6756:30;6822:27;6802:18;;;6795:55;6867:18;;38318:116:0::1;6542:349:1::0;38318:116:0::1;32585:7;38467:16;:44;;38445:123;;;::::0;::::1;::::0;;7098:2:1;38445:123:0::1;::::0;::::1;7080:21:1::0;7137:2;7117:18;;;7110:30;7176:31;7156:18;;;7149:59;7225:18;;38445:123:0::1;6896:353:1::0;38445:123:0::1;38583:11;38579:61;;;38611:17;:15;:17::i;:::-;38668:87;38733:11;38668:46;38688:8;38697:4;38688:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;38668:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:87::i;:::-;38650:15;:105;;;;38794:11;38766:8;38775:4;38766:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;38846:13;38816:8;38825:4;38816:14;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;38903:16;38870:8;38879:4;38870:14;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;:49;;;;38124:803:::0;;;;;:::o;35890:304::-;34595:9;;:23;:9;34608:10;34595:23;34573:109;;;;;;;5318:2:1;34573:109:0;;;5300:21:1;5357:2;5337:18;;;5330:30;5396:34;5376:18;;;5369:62;5467:6;5447:18;;;5440:34;5491:19;;34573:109:0;5116:400:1;34573:109:0;35990:25:::1;::::0;::::1;35968:125;;;::::0;::::1;::::0;;7645:2:1;35968:125:0::1;::::0;::::1;7627:21:1::0;7684:2;7664:18;;;7657:30;7723:34;7703:18;;;7696:62;7794:20;7774:18;;;7767:48;7832:19;;35968:125:0::1;7443:414:1::0;35968:125:0::1;36129:9;::::0;36109:43:::1;::::0;::::1;::::0;;::::1;::::0;36129:9:::1;::::0;36109:43:::1;::::0;36129:9:::1;::::0;36109:43:::1;36163:9;:23:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;35890:304::o;40079:286::-;40176:4;40222:14;;;:8;:14;;;;;;;;:21;;;;;;;;;;40290:10;;40274:12;:26;;;;:83;;;40336:4;:21;;;40317:15;:40;;40274:83;40254:103;40079:286;-1:-1:-1;;;;40079:286:0:o;43048:1031::-;20348:1;20946:7;;:19;;20938:63;;;;;;;8064:2:1;20938:63:0;;;8046:21:1;8103:2;8083:18;;;8076:30;8142:33;8122:18;;;8115:61;8193:18;;20938:63:0;7862:355:1;20938:63:0;20348:1;21079:7;:18;;;;43128:21:::1;43152:8;43161:4;43152:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;43201;;;:8:::1;:14:::0;;;;;;43152::::1;::::0;;::::1;;::::0;-1:-1:-1;43152:14:0;43216:12:::1;15858:10:::0;;35213:171;43216:12:::1;43201:28;;;;;;;;;;;;;;;43177:52;;43338:7;43323:4;:11;;;:22;;43315:67;;;::::0;::::1;::::0;;8424:2:1;43315:67:0::1;::::0;::::1;8406:21:1::0;;;8443:18;;;8436:30;8502:34;8482:18;;;8475:62;8554:18;;43315:67:0::1;8222:356:1::0;43315:67:0::1;43471:7;43455:4;:12;;;:23;;43447:67;;;::::0;::::1;::::0;;8785:2:1;43447:67:0::1;::::0;::::1;8767:21:1::0;8824:2;8804:18;;;8797:30;8863:33;8843:18;;;8836:61;8914:18;;43447:67:0::1;8583:355:1::0;43447:67:0::1;43527:16;43538:4;43527:10;:16::i;:::-;43556:29;43580:4;43556:23;:29::i;:::-;43602:11:::0;;43598:344:::1;;43644:11:::0;;:24:::1;::::0;43660:7;43644:15:::1;:24::i;:::-;43630:38:::0;;43698:12:::1;::::0;::::1;::::0;:25:::1;::::0;43715:7;43698:16:::1;:25::i;:::-;43683:12;::::0;::::1;:40:::0;43775:5:::1;::::0;43750:12;;43775:5:::1;43750:12:::0;;::::1;43775:5:::0;::::1;43742:39;43738:130;;;43822:17;::::0;:30:::1;::::0;43844:7;43822:21:::1;:30::i;:::-;43802:17;:50:::0;43738:130:::1;43882:48;15858:10:::0;43882:12;;::::1;;::::0;43922:7;43882:25:::1;:48::i;:::-;43986:21;::::0;::::1;::::0;43970:11;;:48:::1;::::0;44013:4:::1;::::0;43970:38:::1;::::0;:15:::1;:38::i;:::-;:42:::0;::::1;:48::i;:::-;43952:15;::::0;::::1;:66:::0;44034:37:::1;::::0;411:25:1;;;44057:4:0;;15858:10;;44034:37:::1;::::0;399:2:1;384:18;44034:37:0::1;;;;;;;;-1:-1:-1::0;;20304:1:0;21258:22;;-1:-1:-1;;43048:1031:0:o;40704:869::-;40756:21;40780:8;40789:4;40780:14;;;;;;;;:::i;:::-;;;;;;;;;;;40756:38;;40825:4;:20;;;40809:12;:36;40805:75;;40862:7;40704:869;:::o;40805:75::-;40911:12;;;;40938:13;;;:37;;-1:-1:-1;40955:15:0;;;;:20;40938:37;40934:126;;;-1:-1:-1;41015:12:0;40992:20;;;;:35;-1:-1:-1;40704:869:0:o;40934:126::-;41072:18;41093:49;41107:4;:20;;;41129:12;41093:13;:49::i;:::-;41072:70;;41153:19;41175:113;41272:15;;41175:78;41237:4;:15;;;41175:43;41204:13;;41175:10;:28;;:43;;;;:::i;:::-;:61;;:78::i;:113::-;41301:5;;41312:10;;41153:135;;-1:-1:-1;41301:5:0;;;;;:10;;41312;41324:18;41153:135;41340:1;41324:15;:18::i;:::-;41301:42;;;;;;;;;;9147::1;9135:55;;;41301:42:0;;;9117:74:1;9207:18;;;9200:34;9090:18;;41301:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41354:5:0;;:38;;;;;41373:4;41354:38;;;9117:74:1;9207:18;;;9200:34;;;41354:5:0;;;;;-1:-1:-1;41354:10:0;;-1:-1:-1;9090:18:1;;41354:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41495:12:0;;;;41429:90;;-1:-1:-1;41469:39:0;;:21;:11;41485:4;41469:15;:21::i;:39::-;41429:21;;;;;:25;:90::i;:::-;41405:21;;;:114;-1:-1:-1;;41553:12:0;41530:20;;;;:35;;;;-1:-1:-1;;40704:869:0:o;44150:829::-;20348:1;20946:7;;:19;;20938:63;;;;;;;8064:2:1;20938:63:0;;;8046:21:1;8103:2;8083:18;;;8076:30;8142:33;8122:18;;;8115:61;8193:18;;20938:63:0;7862:355:1;20938:63:0;20348:1;21079:7;:18;;;;44222:21:::1;44246:8;44255:4;44246:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;44295;;;:8:::1;:14:::0;;;;;;44246::::1;::::0;;::::1;;::::0;-1:-1:-1;44246:14:0;44310:12:::1;15858:10:::0;;35213:171;44310:12:::1;44295:28;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;44295:28:0;44351:11;;44449:12:::1;::::0;::::1;::::0;44295:28;;-1:-1:-1;44351:11:0;44449:22;-1:-1:-1;44449:22:0::1;44427:112;;;::::0;::::1;::::0;;9447:2:1;44427:112:0::1;::::0;::::1;9429:21:1::0;9486:2;9466:18;;;9459:30;9525:34;9505:18;;;9498:62;9596:10;9576:18;;;9569:38;9624:19;;44427:112:0::1;9245:404:1::0;44427:112:0::1;44566:1;44552:15:::0;;;44578::::1;::::0;::::1;:19:::0;;;44608::::1;::::0;::::1;:23:::0;;;44642:21:::1;::::0;::::1;:25:::0;44693:12:::1;::::0;::::1;::::0;:24:::1;::::0;44710:6;44693:16:::1;:24::i;:::-;44678:12;::::0;::::1;:39:::0;44767:5:::1;::::0;44742:12;;44767:5:::1;44742:12:::0;;::::1;44767:5:::0;::::1;44734:39;44730:121;;;44810:17;::::0;:29:::1;::::0;44832:6;44810:21:::1;:29::i;:::-;44790:17;:49:::0;44730:121:::1;44861:47;15858:10:::0;44861:12;;::::1;;::::0;44901:6;44861:25:::1;:47::i;:::-;44926:45;::::0;411:25:1;;;44958:4:0;;15858:10;;44926:45:::1;::::0;399:2:1;384:18;44926:45:0::1;265:177:1::0;48747:211:0;34595:9;;:23;:9;34608:10;34595:23;34573:109;;;;;;;5318:2:1;34573:109:0;;;5300:21:1;5357:2;5337:18;;;5330:30;5396:34;5376:18;;;5369:62;5467:6;5447:18;;;5440:34;5491:19;;34573:109:0;5116:400:1;34573:109:0;48813:15:::1;::::0;::::1;;48812:16;48804:66;;;::::0;::::1;::::0;;9856:2:1;48804:66:0::1;::::0;::::1;9838:21:1::0;9895:2;9875:18;;;9868:30;9934:34;9914:18;;;9907:62;10005:7;9985:18;;;9978:35;10030:19;;48804:66:0::1;9654:401:1::0;48804:66:0::1;48883:15;:22:::0;;;::::1;48901:4;48883:22;::::0;;48937:12:::1;15858:10:::0;;35213:171;48937:12:::1;48921:29;;;;;;;;;;;;48747:211::o:0;38991:1024::-;39092:7;39117:21;39141:8;39150:4;39141:14;;;;;;;;:::i;:::-;;;;;;;;;39190;;;:8;:14;;;;;;:21;;;;;;;;;;;39141:14;;;;;;;;39249:21;;;;39300:12;;:37;;;;;39331:4;39300:37;;;180:74:1;39141:14:0;;-1:-1:-1;39190:21:0;;39141:14;39300:12;;;;;:22;;153:18:1;;39300:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39281:56;;39369:4;:20;;;39354:12;:35;:52;;;;-1:-1:-1;39393:13:0;;;39354:52;39350:489;;;39423:18;39444:98;39476:4;:20;;;39515:12;39444:13;:98::i;:::-;39423:119;;39557:19;39579:125;39688:15;;39579:86;39649:4;:15;;;39579:47;39612:13;;39579:10;:32;;:47;;;;:::i;:125::-;39557:147;-1:-1:-1;39738:89:0;39777:35;39803:8;39777:21;39557:147;39793:4;39777:15;:21::i;:35::-;39738:16;;:20;:89::i;:::-;39719:108;;39408:431;;39350:489;39851:15;39869:88;39931:4;:15;;;39869:43;39907:4;39869:33;39885:16;39869:4;:11;;;:15;;:33;;;;:::i;:43::-;:47;;:88::i;:::-;39851:106;;39975:32;39987:4;:19;;;39975:7;:11;;:32;;;;:::i;:::-;39968:39;38991:1024;-1:-1:-1;;;;;;;;38991:1024:0:o;40448:180::-;40510:8;:15;40493:14;40536:85;40564:6;40558:3;:12;40536:85;;;40594:15;40605:3;40594:10;:15::i;:::-;40572:5;;;:::i;:::-;;;40536:85;;;;40482:146;40448:180::o;17711:103::-;17106:7;17133:6;17280:23;17133:6;15858:10;17280:23;17272:68;;;;;;;6383:2:1;17272:68:0;;;6365:21:1;;;6402:18;;;6395:30;6461:34;6441:18;;;6434:62;6513:18;;17272:68:0;6181:356:1;17272:68:0;17776:30:::1;17803:1;17776:18;:30::i;:::-;17711:103::o:0;47492:312::-;47578:10;;;;15858;47562:26;;;47554:63;;;;;;;10840:2:1;47554:63:0;;;10822:21:1;10879:2;10859:18;;;10852:30;10918:26;10898:18;;;10891:54;10962:18;;47554:63:0;10638:348:1;47554:63:0;47636:25;;;47628:57;;;;;;;11193:2:1;47628:57:0;;;11175:21:1;11232:2;11212:18;;;11205:30;11271:21;11251:18;;;11244:49;11310:18;;47628:57:0;10991:343:1;47628:57:0;47735:10;;47703:56;;;;47735:10;;;11574:34:1;;11644:15;;;11639:2;11624:18;;11617:43;47703:56:0;;15858:10;;47703:56;;;;;;;;;47772:10;:24;;;;;;;;;;;;;;;47492:312::o;35729:153::-;35828:7;35860:14;:3;35868:5;35860:7;:14::i;:::-;35853:21;35729:153;-1:-1:-1;;;35729:153:0:o;36939:1072::-;17106:7;17133:6;17280:23;17133:6;15858:10;17280:23;17272:68;;;;;;;6383:2:1;17272:68:0;;;6365:21:1;;;6402:18;;;6395:30;6461:34;6441:18;;;6434:62;6513:18;;17272:68:0;6181:356:1;17272:68:0;32689:4:::1;37158:41;::::0;::::1;;;37136:116;;;::::0;::::1;::::0;;11873:2:1;37136:116:0::1;::::0;::::1;11855:21:1::0;11912:2;11892:18;;;11885:30;11951:27;11931:18;;;11924:55;11996:18;;37136:116:0::1;11671:349:1::0;37136:116:0::1;32585:7;37285:16;:44;;37263:123;;;::::0;::::1;::::0;;12227:2:1;37263:123:0::1;::::0;::::1;12209:21:1::0;12266:2;12246:18;;;12239:30;12305:31;12285:18;;;12278:59;12354:18;;37263:123:0::1;12025:353:1::0;37263:123:0::1;37401:11;37397:61;;;37429:17;:15;:17::i;:::-;37468:23;37509:10;;37494:12;:25;:79;;37563:10;;37494:79;;;37535:12;37494:79;37602:15;::::0;37468:105;;-1:-1:-1;37602:32:0::1;::::0;37622:11;37602:19:::1;:32::i;:::-;37584:15;:50:::0;37673:319:::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;37673:319:0;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;37645:8:::1;:358:::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;::::1;;::::0;;;;;;;;-1:-1:-1;37645:358:0;;;;;;;36939:1072::o;36248:375::-;17106:7;17133:6;17280:23;17133:6;15858:10;17280:23;17272:68;;;;;;;6383:2:1;17272:68:0;;;6365:21:1;;;6402:18;;;6395:30;6461:34;6441:18;;;6434:62;6513:18;;17272:68:0;6181:356:1;17272:68:0;36323:10:::1;;36308:12;:25;36300:65;;;::::0;::::1;::::0;;12585:2:1;36300:65:0::1;::::0;::::1;12567:21:1::0;12624:2;12604:18;;;12597:30;12663:29;12643:18;;;12636:57;12710:18;;36300:65:0::1;12383:351:1::0;36300:65:0::1;36395:8;:15:::0;36378:14:::1;36421:157;36449:6;36443:3;:12;36421:157;;;36479:21;36503:8;36512:3;36503:13;;;;;;;;:::i;:::-;;;;;;;;;;;36479:37;;36554:12;36531:4;:20;;:35;;;;36464:114;36457:5;;;;:::i;:::-;;;36421:157;;;-1:-1:-1::0;;36603:12:0::1;36590:10;:25:::0;36248:375::o;48174:520::-;34595:9;;:23;:9;34608:10;34595:23;34573:109;;;;;;;5318:2:1;34573:109:0;;;5300:21:1;5357:2;5337:18;;;5330:30;5396:34;5376:18;;;5369:62;5467:6;5447:18;;;5440:34;5491:19;;34573:109:0;5116:400:1;34573:109:0;48322:11:::1;48318:61;;;48350:17;:15;:17::i;:::-;15858:10:::0;48396:122:::1;;;48456:8;48465:4;48456:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;48496:11;48396:122;;;;;;6102:25:1::0;;;6158:2;6143:18;;6136:34;6090:2;6075:18;;5928:248;48396:122:0::1;;;;;;;;48549:87;48614:11;48549:46;48569:8;48578:4;48569:14;;;;;;;;:::i;48549:87::-;48531:15;:105;;;;48675:11;48647:8;48656:4;48647:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;48174:520:::0;;;:::o;47172:312::-;47258:10;;;;15858;47242:26;;;47234:63;;;;;;;12941:2:1;47234:63:0;;;12923:21:1;12980:2;12960:18;;;12953:30;13019:26;12999:18;;;12992:54;13063:18;;47234:63:0;12739:348:1;47234:63:0;47316:25;;;47308:57;;;;;;;13294:2:1;47308:57:0;;;13276:21:1;13333:2;13313:18;;;13306:30;13372:21;13352:18;;;13345:49;13411:18;;47308:57:0;13092:343:1;47308:57:0;47415:10;;47383:56;;;;47415:10;;;11574:34:1;;11644:15;;;11639:2;11624:18;;11617:43;47383:56:0;;15858:10;;47383:56;;;;;;;;;47452:10;:24;;;;;;;;;;;;;;;47172:312::o;41643:1373::-;20348:1;20946:7;;:19;;20938:63;;;;;;;8064:2:1;20938:63:0;;;8046:21:1;8103:2;8083:18;;;8076:30;8142:33;8122:18;;;8115:61;8193:18;;20938:63:0;7862:355:1;20938:63:0;20348:1;21079:7;:18;41760:10:::1;::::0;41744:12:::1;:26;;41722:122;;;::::0;::::1;::::0;;13642:2:1;41722:122:0::1;::::0;::::1;13624:21:1::0;13681:2;13661:18;;;13654:30;13720:34;13700:18;;;13693:62;13791:16;13771:18;;;13764:44;13825:19;;41722:122:0::1;13440:410:1::0;41722:122:0::1;41857:21;41881:8;41890:4;41881:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;41930;;;:8:::1;:14:::0;;;;;;41881::::1;::::0;;::::1;;::::0;-1:-1:-1;41881:14:0;41945:12:::1;15858:10:::0;;35213:171;41945:12:::1;41930:28;;;;;;;;;;;;;;;41906:52;;41971:16;41982:4;41971:10;:16::i;:::-;42000:29;42024:4;42000:23;:29::i;:::-;42046:11:::0;;42042:838:::1;;42098:12:::0;;:37:::1;::::0;;;;42129:4:::1;42098:37;::::0;::::1;180:74:1::0;42074:21:0::1;::::0;42098:12:::1;;::::0;:22:::1;::::0;153:18:1;;42098:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42074:61:::0;-1:-1:-1;42150:67:0::1;15858:10:::0;42150:12;;::::1;;::::0;42202:4:::1;42209:7:::0;42150:29:::1;:67::i;:::-;42255:12:::0;;:37:::1;::::0;;;;42286:4:::1;42255:37;::::0;::::1;180:74:1::0;42232:20:0::1;::::0;42255:12:::1;;::::0;:22:::1;::::0;153:18:1;;42255:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42232:60:::0;-1:-1:-1;42319:31:0::1;42232:60:::0;42336:13;42319:16:::1;:31::i;:::-;42371:17;::::0;::::1;::::0;42309:41;;-1:-1:-1;42371:17:0::1;;:21:::0;42367:246:::1;;42446:17;::::0;::::1;::::0;42413:18:::1;::::0;42434:41:::1;::::0;42469:5:::1;::::0;42434:30:::1;::::0;:7;;42446:17:::1;;42434:11;:30::i;:41::-;42520:10;::::0;42494:12;;42413:62;;-1:-1:-1;42494:49:0::1;::::0;42520:10:::1;42494:12:::0;;::::1;::::0;42520:10:::1;42413:62:::0;42494:25:::1;:49::i;:::-;42574:23;:7:::0;42586:10;42574:11:::1;:23::i;:::-;42564:33;;42394:219;42367:246;42643:11:::0;;:24:::1;::::0;42659:7;42643:15:::1;:24::i;:::-;42629:38:::0;;42697:12:::1;::::0;::::1;::::0;:25:::1;::::0;42714:7;42697:16:::1;:25::i;:::-;42682:12;::::0;::::1;:40:::0;42776:5:::1;::::0;42751:12;;42776:5:::1;42751:12:::0;;::::1;42776:5:::0;::::1;42743:39;42739:130;;;42823:17;::::0;:30:::1;::::0;42845:7;42823:21:::1;:30::i;:::-;42803:17;:50:::0;42739:130:::1;42059:821;;42042:838;42924:21;::::0;::::1;::::0;42908:11;;:48:::1;::::0;42951:4:::1;::::0;42908:38:::1;::::0;:15:::1;:38::i;:48::-;42890:15;::::0;::::1;:66:::0;42972:36:::1;::::0;411:25:1;;;42994:4:0;;15858:10;;42972:36:::1;::::0;399:2:1;384:18;42972:36:0::1;265:177:1::0;17969:201:0;17106:7;17133:6;17280:23;17133:6;15858:10;17280:23;17272:68;;;;;;;6383:2:1;17272:68:0;;;6365:21:1;;;6402:18;;;6395:30;6461:34;6441:18;;;6434:62;6513:18;;17272:68:0;6181:356:1;17272:68:0;18058:22:::1;::::0;::::1;18050:73;;;::::0;::::1;::::0;;14057:2:1;18050:73:0::1;::::0;::::1;14039:21:1::0;14096:2;14076:18;;;14069:30;14135:34;14115:18;;;14108:62;14206:8;14186:18;;;14179:36;14232:19;;18050:73:0::1;13855:402:1::0;18050:73:0::1;18134:28;18153:8;18134:18;:28::i;:::-;17969:201:::0;:::o;15778:98::-;15858:10;;15778:98::o;24546:::-;24604:7;24631:5;24635:1;24631;:5;:::i;24165:98::-;24223:7;24250:5;24254:1;24250;:5;:::i;45024:1337::-;45091:21;45115:8;45124:4;45115:14;;;;;;;;:::i;:::-;;;;;;;;;45164;;;:8;:14;;;;;;45115;;;;;;-1:-1:-1;45115:14:0;45179:12;15858:10;;35213:171;45179:12;45164:28;;;;;;;;;;;;;;;45140:52;;45209:4;:21;;;45234:1;45209:26;:56;;;;;45255:10;;45239:12;:26;;45209:56;45205:154;;;45326:20;;;;45306:41;;:15;;:19;:41::i;:::-;45282:21;;;:65;45205:154;45371:15;45389:93;45456:4;:15;;;45389:48;45432:4;45389:38;45405:4;:21;;;45389:4;:11;;;:15;;:38;;;;:::i;:93::-;45371:111;-1:-1:-1;45497:30:0;45508:4;15858:10;40079:286;:::i;45497:30::-;45493:861;;;45558:1;45548:7;:11;:38;;;;45585:1;45563:4;:19;;;:23;45548:38;45544:561;;;45607:20;45630:32;45642:4;:19;;;45630:7;:11;;:32;;;;:::i;:::-;45607:55;;45739:85;45786:4;:19;;;45739:20;;:24;;:85;;;;:::i;:::-;45716:20;:108;45865:1;45843:19;;;:23;45951:20;;;;45909:81;;:15;;:19;:81::i;:::-;45885:21;;;:105;46044:45;15858:10;46076:12;46044:17;:45::i;:::-;45588:517;45544:561;45493:861;;;46126:11;;46122:232;;46176:19;;;;:32;;46200:7;46176:23;:32::i;:::-;46154:19;;;:54;46246:20;;:33;;46271:7;46246:24;:33::i;:::-;46223:20;:56;46299:43;;411:25:1;;;46328:4:0;;15858:10;;46299:43;;399:2:1;384:18;46299:43:0;;;;;;;46122:232;45080:1281;;;45024:1337;:::o;11795:211::-;11939:58;;9147:42:1;9135:55;;11939:58:0;;;9117:74:1;9207:18;;;9200:34;;;11912:86:0;;11932:5;;11962:23;;9090:18:1;;11939:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11912:19;:86::i;:::-;11795:211;;;:::o;24903:98::-;24961:7;24988:5;24992:1;24988;:5;:::i;25302:98::-;25360:7;25387:5;25391:1;25387;:5;:::i;18330:191::-;18404:16;18423:6;;;18440:17;;;;;;;;;;18473:40;;18423:6;;;;;;;18473:40;;18404:16;18473:40;18393:128;18330:191;:::o;12014:248::-;12185:68;;15249:42:1;15318:15;;;12185:68:0;;;15300:34:1;15370:15;;15350:18;;;15343:43;15402:18;;;15395:34;;;12158:96:0;;12178:5;;12208:27;;15212:18:1;;12185:68:0;15037:398:1;46476:640:0;46590:17;;46557:5;;:30;;;;;46581:4;46557:30;;;180:74:1;46557:5:0;;;;;:15;;153:18:1;;46557:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;46553:556;;;46876:17;;46823:5;;:30;;;;;46847:4;46823:30;;;180:74:1;46804:16:0;;46823:85;;46876:17;;46823:5;;;;;:15;;153:18:1;;46823:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:85::-;46804:104;;46938:8;46927:7;:19;46923:175;;46967:5;;:29;;;;;:5;9135:55:1;;;46967:29:0;;;9117:74:1;9207:18;;;9200:34;;;46967:5:0;;;;:14;;9090:18:1;;46967:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;46923:175::-;47022:11;;47018:80;;47054:5;;:28;;;;;:5;9135:55:1;;;47054:28:0;;;9117:74:1;9207:18;;;9200:34;;;47054:5:0;;;;:14;;9090:18:1;;47054:28:0;8943:297:1;14368:716:0;14792:23;14818:69;14846:4;14818:69;;;;;;;;;;;;;;;;;14826:5;14818:27;;;;:69;;;;;:::i;:::-;14902:17;;14792:95;;-1:-1:-1;14902:21:0;14898:179;;14999:10;14988:30;;;;;;;;;;;;:::i;:::-;14980:85;;;;;;;15892:2:1;14980:85:0;;;15874:21:1;15931:2;15911:18;;;15904:30;15970:34;15950:18;;;15943:62;16041:12;16021:18;;;16014:40;16071:19;;14980:85:0;15690:406:1;6567:229:0;6704:12;6736:52;6758:6;6766:4;6772:1;6775:12;6704;4084:20;;7974:60;;;;;;;16710:2:1;7974:60:0;;;16692:21:1;16749:2;16729:18;;;16722:30;16788:31;16768:18;;;16761:59;16837:18;;7974:60:0;16508:353:1;7974:60:0;8048:12;8062:23;8089:6;:11;;8108:5;8115:4;8089:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8047:73;;;;8138:51;8155:7;8164:10;8176:12;8138:16;:51::i;:::-;8131:58;7687:510;-1:-1:-1;;;;;;;7687:510:0:o;10373:712::-;10523:12;10552:7;10548:530;;;-1:-1:-1;10583:10:0;10576:17;;10548:530;10697:17;;:21;10693:374;;10895:10;10889:17;10956:15;10943:10;10939:2;10935:19;10928:44;10693:374;11038:12;11031:20;;;;;;;;;;;:::i;447:180:1:-;506:6;559:2;547:9;538:7;534:23;530:32;527:52;;;575:1;572;565:12;527:52;-1:-1:-1;598:23:1;;447:180;-1:-1:-1;447:180:1:o;1317:159::-;1384:20;;1444:6;1433:18;;1423:29;;1413:57;;1466:1;1463;1456:12;1413:57;1317:159;;;:::o;1481:118::-;1567:5;1560:13;1553:21;1546:5;1543:32;1533:60;;1589:1;1586;1579:12;1604:519;1695:6;1703;1711;1719;1727;1780:3;1768:9;1759:7;1755:23;1751:33;1748:53;;;1797:1;1794;1787:12;1748:53;1833:9;1820:23;1810:33;;1890:2;1879:9;1875:18;1862:32;1852:42;;1913:37;1946:2;1935:9;1931:18;1913:37;:::i;:::-;1903:47;;1997:2;1986:9;1982:18;1969:32;1959:42;;2051:3;2040:9;2036:19;2023:33;2065:28;2087:5;2065:28;:::i;:::-;2112:5;2102:15;;;1604:519;;;;;;;;:::o;2128:154::-;2214:42;2207:5;2203:54;2196:5;2193:65;2183:93;;2272:1;2269;2262:12;2287:247;2346:6;2399:2;2387:9;2378:7;2374:23;2370:32;2367:52;;;2415:1;2412;2405:12;2367:52;2454:9;2441:23;2473:31;2498:5;2473:31;:::i;2539:315::-;2607:6;2615;2668:2;2656:9;2647:7;2643:23;2639:32;2636:52;;;2684:1;2681;2674:12;2636:52;2720:9;2707:23;2697:33;;2780:2;2769:9;2765:18;2752:32;2793:31;2818:5;2793:31;:::i;:::-;2843:5;2833:15;;;2539:315;;;;;:::o;3282:248::-;3350:6;3358;3411:2;3399:9;3390:7;3386:23;3382:32;3379:52;;;3427:1;3424;3417:12;3379:52;-1:-1:-1;;3450:23:1;;;3520:2;3505:18;;;3492:32;;-1:-1:-1;3282:248:1:o;4124:605::-;4228:6;4236;4244;4252;4260;4313:3;4301:9;4292:7;4288:23;4284:33;4281:53;;;4330:1;4327;4320:12;4281:53;4366:9;4353:23;4343:33;;4426:2;4415:9;4411:18;4398:32;4439:31;4464:5;4439:31;:::i;:::-;4489:5;-1:-1:-1;4513:37:1;4546:2;4531:18;;4513:37;:::i;4734:377::-;4808:6;4816;4824;4877:2;4865:9;4856:7;4852:23;4848:32;4845:52;;;4893:1;4890;4883:12;4845:52;4929:9;4916:23;4906:33;;4986:2;4975:9;4971:18;4958:32;4948:42;;5040:2;5029:9;5025:18;5012:32;5053:28;5075:5;5053:28;:::i;:::-;5100:5;5090:15;;;4734:377;;;;;:::o;7254:184::-;7306:77;7303:1;7296:88;7403:4;7400:1;7393:15;7427:4;7424:1;7417:15;10060:184;10130:6;10183:2;10171:9;10162:7;10158:23;10154:32;10151:52;;;10199:1;10196;10189:12;10151:52;-1:-1:-1;10222:16:1;;10060:184;-1:-1:-1;10060:184:1:o;10249:::-;10301:77;10298:1;10291:88;10398:4;10395:1;10388:15;10422:4;10419:1;10412:15;10438:195;10477:3;10508:66;10501:5;10498:77;10495:103;;;10578:18;;:::i;:::-;-1:-1:-1;10625:1:1;10614:13;;10438:195::o;14262:125::-;14302:4;14330:1;14327;14324:8;14321:34;;;14335:18;;:::i;:::-;-1:-1:-1;14372:9:1;;14262:125::o;14392:128::-;14432:3;14463:1;14459:6;14456:1;14453:13;14450:39;;;14469:18;;:::i;:::-;-1:-1:-1;14505:9:1;;14392:128::o;14525:228::-;14565:7;14691:1;14623:66;14619:74;14616:1;14613:81;14608:1;14601:9;14594:17;14590:105;14587:131;;;14698:18;;:::i;:::-;-1:-1:-1;14738:9:1;;14525:228::o;14758:274::-;14798:1;14824;14814:189;;14859:77;14856:1;14849:88;14960:4;14957:1;14950:15;14988:4;14985:1;14978:15;14814:189;-1:-1:-1;15017:9:1;;14758:274::o;15440:245::-;15507:6;15560:2;15548:9;15539:7;15535:23;15531:32;15528:52;;;15576:1;15573;15566:12;15528:52;15608:9;15602:16;15627:28;15649:5;15627:28;:::i;16866:258::-;16938:1;16948:113;16962:6;16959:1;16956:13;16948:113;;;17038:11;;;17032:18;17019:11;;;17012:39;16984:2;16977:10;16948:113;;;17079:6;17076:1;17073:13;17070:48;;;-1:-1:-1;;17114:1:1;17096:16;;17089:27;16866:258::o;17129:274::-;17258:3;17296:6;17290:13;17312:53;17358:6;17353:3;17346:4;17338:6;17334:17;17312:53;:::i;:::-;17381:16;;;;;17129:274;-1:-1:-1;;17129:274:1:o;17408:442::-;17557:2;17546:9;17539:21;17520:4;17589:6;17583:13;17632:6;17627:2;17616:9;17612:18;17605:34;17648:66;17707:6;17702:2;17691:9;17687:18;17682:2;17674:6;17670:15;17648:66;:::i;:::-;17766:2;17754:15;17771:66;17750:88;17735:104;;;;17841:2;17731:113;;17408:442;-1:-1:-1;;17408:442:1:o
Swarm Source
ipfs://067dc92dc6a968b7e8ebaf17c148b1804f5fabf14a4d3a826eddd095cf93dbd3
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.