Polygon Sponsored slots available. Book your slot here!
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
MasterChef
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-09 */ // File: @openzeppelin\contracts\math\SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ 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) { 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) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @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. 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) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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) { 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) { require(b > 0, errorMessage); return a % b; } } // File: contracts\libs\IERC20.sol pragma solidity >=0.6.4; interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @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\Address.sol pragma solidity >=0.6.2 <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; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts\libs\SafeERC20.sol pragma solidity >=0.6.0 <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 SafeMath for uint256; 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' // solhint-disable-next-line max-line-length 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).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _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 // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: node_modules\@openzeppelin\contracts\utils\Context.sol pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin\contracts\access\Ownable.sol pragma solidity >=0.6.0 <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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin\contracts\utils\ReentrancyGuard.sol pragma solidity >=0.6.0 <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 () internal { _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 make 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: contracts\libs\ERC20.sol pragma solidity >=0.4.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-ERC20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, Ownable { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor(string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public override view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public override view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. */ function decimals() public override view returns (uint8) { return _decimals; } /** * @dev See {ERC20-totalSupply}. */ function totalSupply() public override view returns (uint256) { return _totalSupply; } /** * @dev See {ERC20-balanceOf}. */ function balanceOf(address account) public override view returns (uint256) { return _balances[account]; } /** * @dev See {ERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {ERC20-allowance}. */ function allowance(address owner, address spender) public override view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {ERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {ERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom (address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, 'ERC20: transfer amount exceeds allowance') ); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {ERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {ERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, 'ERC20: decreased allowance below zero')); return true; } /** * @dev Creates `amount` tokens and assigns them to `msg.sender`, increasing * the total supply. * * Requirements * * - `msg.sender` must be the token owner */ function mint(uint256 amount) public onlyOwner returns (bool) { _mint(_msgSender(), amount); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer (address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), 'ERC20: transfer from the zero address'); require(recipient != address(0), 'ERC20: transfer to the zero address'); _balances[sender] = _balances[sender].sub(amount, 'ERC20: transfer amount exceeds balance'); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), 'ERC20: mint to the zero address'); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal { require(account != address(0), 'ERC20: burn from the zero address'); _balances[account] = _balances[account].sub(amount, 'ERC20: burn amount exceeds balance'); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve (address owner, address spender, uint256 amount) internal { require(owner != address(0), 'ERC20: approve from the zero address'); require(spender != address(0), 'ERC20: approve to the zero address'); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, 'ERC20: burn amount exceeds allowance')); } } // File: contracts\GoldenBullToken.sol pragma solidity 0.6.12; // GoldenBull Token with Governance. contract GoldenBullToken is ERC20 { /// @dev Creates `_amount` token to `_to`. Must only be called by the owner (MasterChef). function mint(address _to, uint256 _amount) public onlyOwner { _mint(_to, _amount); _moveDelegates(address(0), _delegates[_to], _amount); } // Addresses that excluded from antiWhale mapping(address => bool) private _excludedFromAntiWhale; // Max transfer amount rate in basis points. Eg: 100 - 1% of total supply uint16 public maxTransferAmountRate = 100; // The operator can only update the Anti Whale Settings address private _operator; // Events event OperatorTransferred(address indexed previousOperator, address indexed newOperator); event MaxTransferAmountRateUpdated(address indexed operator, uint256 previousRate, uint256 newRate); /** * @notice Constructs the GBULL contract. */ constructor() public ERC20('GoldenBullToken', 'GBULL') { _operator = _msgSender(); emit OperatorTransferred(address(0), _operator); _excludedFromAntiWhale[msg.sender] = true; _excludedFromAntiWhale[address(0)] = true; _excludedFromAntiWhale[address(this)] = true; } modifier onlyOperator() { require(_operator == msg.sender, "operator: caller is not the operator"); _; } modifier antiWhale(address sender, address recipient, uint256 amount) { if (maxTransferAmount() > 0) { if ( _excludedFromAntiWhale[sender] == false ) { require(amount <= maxTransferAmount(), "GBULL::antiWhale: Transfer amount exceeds the maxTransferAmount"); } } _; } /** * @dev Returns the max transfer amount. */ function maxTransferAmount() public view returns (uint256) { uint256 maxValue = totalSupply().mul(maxTransferAmountRate).div(10000); if(maxValue > 500 ether) return maxValue; return 500 ether; } /** * @dev Update the max transfer amount rate. * Can only be called by the current operator. */ function updateMaxTransferAmountRate(uint16 _maxTransferAmountRate) public onlyOperator { require(_maxTransferAmountRate <= 10000, "GBULL::updateMaxTransferAmountRate: Max transfer amount rate must not exceed the maximum rate."); emit MaxTransferAmountRateUpdated(msg.sender, maxTransferAmountRate, _maxTransferAmountRate); maxTransferAmountRate = _maxTransferAmountRate; } /** * @dev Returns the address is excluded from antiWhale or not. */ function isExcludedFromAntiWhale(address _account) public view returns (bool) { return _excludedFromAntiWhale[_account]; } /** * @dev Exclude or include an address from antiWhale. * Can only be called by the current operator. */ function setExcludedFromAntiWhale(address _account, bool _excluded) public onlyOperator { _excludedFromAntiWhale[_account] = _excluded; } /// @dev overrides transfer function to meet tokenomics of GBULL function _transfer(address sender, address recipient, uint256 amount) internal virtual override antiWhale(sender, recipient, amount) { super._transfer(sender, recipient, amount); } /** * @dev Transfers operator of the contract to a new account (`newOperator`). * Can only be called by the current operator. */ function transferOperator(address newOperator) public onlyOperator { require(newOperator != address(0), "GoldenBullToken::transferOperator: new operator is the zero address"); emit OperatorTransferred(_operator, newOperator); _operator = newOperator; } // Copied and modified from YAM code: // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol /// @dev A record of each accounts delegate mapping (address => address) internal _delegates; /// @dev A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @dev A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @dev The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @dev The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @dev The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @dev A record of states for signing / validating signatures mapping (address => uint) public nonces; /// @dev An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @dev An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); /** * @dev Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @dev Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "GBULL::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "GBULL::delegateBySig: invalid nonce"); require(now <= expiry, "GBULL::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @dev Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @dev Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "GBULL::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying GBULLs (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32(block.number, "GBULL::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } } // File: contracts\MasterChef.sol // SPDX-License-Identifier: MIT pragma solidity 0.6.12; // MasterChef is the master of GoldenBullToken (GBULL). He can make GBULL and he is a fair guy. // // Note that it's ownable and the owner wields tremendous power. Initially the ownership is // transferred to TimeLock contract and Later the ownership will be transferred to a governance smart // contract once $GBULL is sufficiently distributed and the community can show to govern itself. // // Have fun reading it. Hopefully it's bug-free. God bless. contract MasterChef 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. // // We do some fancy math here. Basically, any point in time, the amount of GBULLs // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accGBullPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accGBullPerShare` (and `lastRewardBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. GBULLs to distribute per block. uint256 lastRewardBlock; // Last block number that GBULLs distribution occurs. uint256 accGBullPerShare; // Accumulated GBULLs per share, times 1e12. See below. uint16 depositFeeBP; // Deposit fee in basis points uint256 harvestInterval; // Harvest interval in seconds } // The GoldenBullToken! GoldenBullToken public gBull; // Dev address. address public devAddr; // Deposit Fee address address public feeAddress; // GBULL tokens created per block. uint256 public gBullPerBlock; // Max harvest interval: 2 days. uint256 public constant MAXIMUM_HARVEST_INTERVAL = 2 days; // Total locked up rewards uint256 public totalLockedUpRewards; // 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 GBULL mining starts. uint256 public startBlock; // Referral Bonus in basis points. Initially set to 5% uint256 public refBonusBP = 500; // Max deposit fee: 4%. uint16 public constant MAXIMUM_DEPOSIT_FEE_BP = 400; // Max referral commission rate: 10%. uint16 public constant MAXIMUM_REFERRAL_BP = 1000; // Referral Mapping mapping(address => address) public referrers; // account_address -> referrer_address mapping(address => uint256) public referredCount; // referrer_address -> num_of_referred // Pool Exists Mapper mapping(IERC20 => bool) public poolExistence; // Pool ID Tracker Mapper mapping(IERC20 => uint256) public poolIdForLpAddress; // Initial emission rate: 1 GBULL per block. uint256 public constant INITIAL_EMISSION_RATE = 1 ether; // Max GBULL Supply uint256 public constant MAX_SUPPLY_CAP = 9999999 ether; 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 SetFeeAddress(address indexed user, address indexed _devAddress); event SetDevAddress(address indexed user, address indexed _feeAddress); event Referral(address indexed _referrer, address indexed _user); event ReferralPaid(address indexed _user, address indexed _userTo, uint256 _reward); event ReferralBonusBpChanged(uint256 _oldBp, uint256 _newBp); event UpdateEmissionRate(address indexed user, uint256 indexed _gBullPerBlock); event RewardLockedUp(address indexed user, uint256 indexed pid, uint256 amountLockedUp); constructor( GoldenBullToken _gBull, address _devAddr, address _feeAddress, uint256 _startBlock ) public { gBull = _gBull; devAddr = _devAddr; feeAddress = _feeAddress; gBullPerBlock = INITIAL_EMISSION_RATE; startBlock = _startBlock; } // Get number of pools added. function poolLength() external view returns (uint256) { return poolInfo.length; } function getPoolIdForLpToken(IERC20 _lpToken) external view returns (uint256) { require(poolExistence[_lpToken] != false, "getPoolIdForLpToken: do not exist"); return poolIdForLpAddress[_lpToken]; } // Modifier to check Duplicate pools modifier nonDuplicated(IERC20 _lpToken) { require(poolExistence[_lpToken] == false, "nonDuplicated: duplicated"); _; } // Add a new lp to the pool. Can only be called by the owner. function add( uint256 _allocPoint, IERC20 _lpToken, uint16 _depositFeeBP, uint256 _harvestInterval, bool _withUpdate ) public onlyOwner nonDuplicated(_lpToken) { require(_depositFeeBP <= MAXIMUM_DEPOSIT_FEE_BP, "add: invalid deposit fee basis points"); require(_harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "add: invalid harvest interval"); if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolExistence[_lpToken] = true; poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accGBullPerShare: 0, depositFeeBP: _depositFeeBP, harvestInterval: _harvestInterval }) ); poolIdForLpAddress[_lpToken] = poolInfo.length - 1; } // Update the given pool's GBULL 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_BP, "set: invalid deposit fee basis points"); if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; poolInfo[_pid].depositFeeBP = _depositFeeBP; poolInfo[_pid].harvestInterval = _harvestInterval; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { if (IERC20(gBull).totalSupply() + totalLockedUpRewards >= MAX_SUPPLY_CAP) { return 0; } return _to.sub(_from); } // View function to see pending GBULLs on frontend. function pendingGBull(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accGBullPerShare = pool.accGBullPerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 gBullReward = multiplier.mul(gBullPerBlock).mul(pool.allocPoint).div( totalAllocPoint ); accGBullPerShare = accGBullPerShare.add( gBullReward.mul(1e12).div(lpSupply) ); } uint256 pending = user.amount.mul(accGBullPerShare).div(1e12).sub(user.rewardDebt); return pending.add(user.rewardLockedUp); } // View function to see if user can harvest GBULL's. function canHarvest(uint256 _pid, address _user) public view returns (bool) { UserInfo storage user = userInfo[_pid][_user]; return block.timestamp >= user.nextHarvestUntil; } // View function to see if user harvest until time. function getHarvestUntil(uint256 _pid, address _user) public view returns (uint256) { UserInfo storage user = userInfo[_pid][_user]; return user.nextHarvestUntil; } // Update reward variables for all pools 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.lpToken.balanceOf(address(this)); if (lpSupply == 0 || pool.allocPoint == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 gBullReward = multiplier.mul(gBullPerBlock).mul(pool.allocPoint).div( totalAllocPoint ); gBull.mint(devAddr, gBullReward.div(25)); gBull.mint(address(this), gBullReward); pool.accGBullPerShare = pool.accGBullPerShare.add( gBullReward.mul(1e12).div(lpSupply) ); pool.lastRewardBlock = block.number; } // Deposit LP tokens to MasterChef for GBULL allocation. function deposit(uint256 _pid, uint256 _amount) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); payOrLockupPendingGBull(_pid); if (_amount > 0) { pool.lpToken.safeTransferFrom( address(msg.sender), address(this), _amount ); if (pool.depositFeeBP > 0) { uint256 depositFee = _amount.mul(pool.depositFeeBP).div(10000); user.amount = user.amount.add(_amount).sub(depositFee); pool.lpToken.safeTransfer(feeAddress, depositFee); } else { user.amount = user.amount.add(_amount); } user.nextHarvestUntil = block.timestamp.add(pool.harvestInterval); } user.rewardDebt = user.amount.mul(pool.accGBullPerShare).div(1e12); emit Deposit(msg.sender, _pid, _amount); } // Deposit LP tokens to MasterChef for GBULL allocation with referral. function deposit(uint256 _pid, uint256 _amount, address _referrer) public nonReentrant { require(_referrer == address(_referrer),"deposit: Invalid referrer address"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); payOrLockupPendingGBull(_pid); if (_amount > 0) { setReferral(msg.sender, _referrer); pool.lpToken.safeTransferFrom( address(msg.sender), address(this), _amount ); if (pool.depositFeeBP > 0) { uint256 depositFee = _amount.mul(pool.depositFeeBP).div(10000); user.amount = user.amount.add(_amount).sub(depositFee); pool.lpToken.safeTransfer(feeAddress, depositFee); } else { user.amount = user.amount.add(_amount); } user.nextHarvestUntil = block.timestamp.add(pool.harvestInterval); } user.rewardDebt = user.amount.mul(pool.accGBullPerShare).div(1e12); emit Deposit(msg.sender, _pid, _amount); } // Withdraw LP tokens from MasterChef. function withdraw(uint256 _pid, uint256 _amount) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(_pid); payOrLockupPendingGBull(_pid); if (_amount > 0) { user.amount = user.amount.sub(_amount); pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accGBullPerShare).div(1e12); emit Withdraw(msg.sender, _pid, _amount); } // Pay or lockup pending GBULL. function payOrLockupPendingGBull(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; if (user.nextHarvestUntil == 0) { user.nextHarvestUntil = block.timestamp.add(pool.harvestInterval); } uint256 pending = user.amount.mul(pool.accGBullPerShare).div(1e12).sub(user.rewardDebt); uint256 maxTx = gBull.maxTransferAmount(); if (canHarvest(_pid, msg.sender)) { if (pending > 0 || user.rewardLockedUp > 0) { uint256 totalRewards = pending.add(user.rewardLockedUp); // if totalRewards < maxTx, process as normal if(totalRewards < maxTx) { // reset lockup totalLockedUpRewards = totalLockedUpRewards.sub(user.rewardLockedUp); user.rewardLockedUp = 0; user.nextHarvestUntil = block.timestamp.add(pool.harvestInterval); // send rewards safeGBullTransfer(msg.sender, totalRewards); payReferralCommission(msg.sender, totalRewards); } else { // if totalRewards > maxTx, just send maxTx uint256 transferRewards = maxTx; totalLockedUpRewards = totalLockedUpRewards.add(totalRewards).sub(user.rewardLockedUp).sub(transferRewards); user.rewardLockedUp = totalRewards.sub(transferRewards); user.nextHarvestUntil = block.timestamp.add(pool.harvestInterval); // send rewards safeGBullTransfer(msg.sender, transferRewards); payReferralCommission(msg.sender, transferRewards); } } } else if (pending > 0) { user.rewardLockedUp = user.rewardLockedUp.add(pending); totalLockedUpRewards = totalLockedUpRewards.add(pending); emit RewardLockedUp(msg.sender, _pid, pending); } } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; pool.lpToken.safeTransfer(address(msg.sender), user.amount); emit EmergencyWithdraw(msg.sender, _pid, user.amount); user.amount = 0; user.rewardDebt = 0; user.rewardLockedUp = 0; user.nextHarvestUntil = 0; } // Safe gBull transfer function, just in case if rounding error causes pool to not have enough GBULLs. function safeGBullTransfer(address _to, uint256 _amount) internal { uint256 gBullBal = gBull.balanceOf(address(this)); bool transferSuccess = false; if (_amount > gBullBal) { transferSuccess = gBull.transfer(_to, gBullBal); } else { transferSuccess = gBull.transfer(_to, _amount); } require(transferSuccess, "safeGBullTransfer: transfer failed."); } // Update dev address by the previous dev. function setDevAddress(address _devaddr) public { require(_devaddr != address(0), "dev: invalid address"); require(msg.sender == devAddr, "dev: wut?"); devAddr = _devaddr; emit SetDevAddress(msg.sender, _devaddr); } // Update fee address by the previous fee address. function setFeeAddress(address _feeAddress) public { require(_feeAddress != address(0), "setFeeAddress: invalid address"); require(msg.sender == feeAddress, "setFeeAddress: FORBIDDEN"); feeAddress = _feeAddress; emit SetFeeAddress(msg.sender, _feeAddress); } // Update Emission Rate to control the emission per block (TimeLocked). function updateEmissionRate(uint256 _gBullPerBlock) public onlyOwner { massUpdatePools(); gBullPerBlock = _gBullPerBlock; emit UpdateEmissionRate(msg.sender, _gBullPerBlock); } // Set Referral Address for a user function setReferral(address _user, address _referrer) internal { if (_referrer == address(_referrer) && referrers[_user] == address(0) && _referrer != address(0) && _referrer != _user) { referrers[_user] = _referrer; referredCount[_referrer] += 1; emit Referral(_user, _referrer); } } // Get Referral Address for a Account function getReferral(address _user) public view returns (address) { return referrers[_user]; } // Pay referral commission to the referrer who referred this user. function payReferralCommission(address _user, uint256 _pending) internal { address referrer = getReferral(_user); if (referrer != address(0) && referrer != _user && refBonusBP > 0) { uint256 refBonusEarned = _pending.mul(refBonusBP).div(10000); gBull.mint(referrer, refBonusEarned); emit ReferralPaid(_user, referrer, refBonusEarned); } } // Referral Bonus in basis points. // Initially set to 2.5%, this this the ability to increase or decrease the Bonus percentage based on // community voting and feedback. function updateReferralBonusBp(uint256 _newRefBonusBp) public onlyOwner { require(_newRefBonusBp <= MAXIMUM_REFERRAL_BP, "updateRefBonusPercent: invalid referral bonus basis points"); require(_newRefBonusBp != refBonusBP, "updateRefBonusPercent: same bonus bp set"); uint256 previousRefBonusBP = refBonusBP; refBonusBP = _newRefBonusBp; emit ReferralBonusBpChanged(previousRefBonusBP, _newRefBonusBp); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract GoldenBullToken","name":"_gBull","type":"address"},{"internalType":"address","name":"_devAddr","type":"address"},{"internalType":"address","name":"_feeAddress","type":"address"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_referrer","type":"address"},{"indexed":true,"internalType":"address","name":"_user","type":"address"}],"name":"Referral","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_oldBp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newBp","type":"uint256"}],"name":"ReferralBonusBpChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":true,"internalType":"address","name":"_userTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"_reward","type":"uint256"}],"name":"ReferralPaid","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":"address","name":"_feeAddress","type":"address"}],"name":"SetDevAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"_devAddress","type":"address"}],"name":"SetFeeAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"_gBullPerBlock","type":"uint256"}],"name":"UpdateEmissionRate","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":"INITIAL_EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_DEPOSIT_FEE_BP","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":[],"name":"MAXIMUM_REFERRAL_BP","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_CAP","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"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gBull","outputs":[{"internalType":"contract GoldenBullToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gBullPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getHarvestUntil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_lpToken","type":"address"}],"name":"getPoolIdForLpToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getReferral","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","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":"pendingGBull","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"poolExistence","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"poolIdForLpAddress","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":"accGBullPerShare","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"harvestInterval","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refBonusBP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referredCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrers","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"_devaddr","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":"totalAllocPoint","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gBullPerBlock","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":"_newRefBonusBp","type":"uint256"}],"name":"updateReferralBonusBp","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
608060405260006009556101f4600b5534801561001b57600080fd5b5060405162002c1238038062002c128339818101604052608081101561004057600080fd5b50805160208201516040830151606090930151919290916000610061610100565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055600280546001600160a01b03199081166001600160a01b0396871617909155600380548216948616949094179093556004805490931691909316179055670de0b6b3a7640000600555600a55610104565b3390565b612afe80620001146000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c806364ed743b1161014657806393f1a40b116100c3578063d0d41fe111610087578063d0d41fe1146106a8578063da09c72c146106ce578063de73149d146106d6578063e2bbb158146106de578063f2fde38b14610701578063fbcb42141461072757610253565b806393f1a40b146105be578063955c9b93146106105780639bf62f7e14610618578063af018de81461063e578063cbd258b51461068257610253565b80638da5cb5b1161010a5780638da5cb5b146105515780638dbb1e3a146105595780638dbdbe6d1461057c578063904b69b5146105ae57806391bb809c146105b657610253565b806364ed743b146104d257806366f685ea146104ef5780636ec5ab12146104f7578063715018a6146105235780638705fcd41461052b57610253565b80633f7b06d8116101d45780634a3b68cc116101985780634a3b68cc1461046257806351eb05a6146104885780635312ea8e146104a557806360caae58146104c2578063630b5ba1146104ca57610253565b80633f7b06d8146104015780634127535814610427578063441a3e701461042f578063474fa6301461045257806348cd4cb11461045a57610253565b8063190f39f01161021b578063190f39f01461031b5780632143e545146103415780632e6c998d1461037c5780633a22df78146103bc5780633b0f0f2f146103db57610253565b8063081e3eda146102585780630ba84cd214610272578063116d70de146102915780631526fe27146102b557806317caf6f114610313575b600080fd5b610260610753565b60408051918252519081900360200190f35b61028f6004803603602081101561028857600080fd5b5035610759565b005b6102996107f8565b604080516001600160a01b039092168252519081900360200190f35b6102d2600480360360208110156102cb57600080fd5b5035610807565b604080516001600160a01b039097168752602087019590955285850193909352606085019190915261ffff16608084015260a0830152519081900360c00190f35b61026061085b565b6102606004803603602081101561033157600080fd5b50356001600160a01b0316610861565b61028f600480360360a081101561035757600080fd5b5080359060208101359061ffff604082013516906060810135906080013515156108d4565b6103a86004803603604081101561039257600080fd5b50803590602001356001600160a01b0316610a52565b604080519115158252519081900360200190f35b6103c4610a82565b6040805161ffff9092168252519081900360200190f35b610299600480360360208110156103f157600080fd5b50356001600160a01b0316610a88565b6102606004803603602081101561041757600080fd5b50356001600160a01b0316610aa6565b610299610ab8565b61028f6004803603604081101561044557600080fd5b5080359060200135610ac7565b610260610c3a565b610260610c40565b6102996004803603602081101561047857600080fd5b50356001600160a01b0316610c46565b61028f6004803603602081101561049e57600080fd5b5035610c61565b61028f600480360360208110156104bb57600080fd5b5035610e97565b610260610f91565b61028f610fa0565b61028f600480360360208110156104e857600080fd5b5035610fc3565b6102606110ee565b6102606004803603604081101561050d57600080fd5b50803590602001356001600160a01b03166110f4565b61028f61111f565b61028f6004803603602081101561054157600080fd5b50356001600160a01b03166111cb565b6102996112d1565b6102606004803603604081101561056f57600080fd5b50803590602001356112e0565b61028f6004803603606081101561059257600080fd5b50803590602081013590604001356001600160a01b031661138a565b610260611538565b61026061153e565b6105ea600480360360408110156105d457600080fd5b50803590602001356001600160a01b031661154a565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6103c461157c565b6102606004803603602081101561062e57600080fd5b50356001600160a01b0316611582565b61028f600480360360a081101561065457600080fd5b508035906001600160a01b036020820135169061ffff60408201351690606081013590608001351515611594565b6103a86004803603602081101561069857600080fd5b50356001600160a01b03166118c8565b61028f600480360360208110156106be57600080fd5b50356001600160a01b03166118dd565b6102996119c6565b6102606119d5565b61028f600480360360408110156106f457600080fd5b50803590602001356119dc565b61028f6004803603602081101561071757600080fd5b50356001600160a01b0316611b7c565b6102606004803603604081101561073d57600080fd5b50803590602001356001600160a01b0316611c7e565b60075490565b610761611df8565b6001600160a01b03166107726112d1565b6001600160a01b0316146107bb576040805162461bcd60e51b81526020600482018190526024820152600080516020612a36833981519152604482015290519081900360640190fd5b6107c3610fa0565b6005819055604051819033907fe2492e003bbe8afa53088b406f0c1cb5d9e280370fc72a74cf116ffd343c405390600090a350565b6002546001600160a01b031681565b6007818154811061081457fe5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b0390941695509193909261ffff9091169086565b60095481565b6001600160a01b0381166000908152600e602052604081205460ff166108b85760405162461bcd60e51b8152600401808060200182810382526021815260200180612a7e6021913960400191505060405180910390fd5b506001600160a01b03166000908152600f602052604090205490565b6108dc611df8565b6001600160a01b03166108ed6112d1565b6001600160a01b031614610936576040805162461bcd60e51b81526020600482018190526024820152600080516020612a36833981519152604482015290519081900360640190fd5b61019061ffff8416111561097b5760405162461bcd60e51b8152600401808060200182810382526025815260200180612a116025913960400191505060405180910390fd5b801561098957610989610fa0565b6109c6846109c06007888154811061099d57fe5b906000526020600020906006020160010154600954611dfc90919063ffffffff16565b90611e59565b60098190555083600786815481106109da57fe5b90600052602060002090600602016001018190555082600786815481106109fd57fe5b906000526020600020906006020160040160006101000a81548161ffff021916908361ffff1602179055508160078681548110610a3657fe5b9060005260206000209060060201600501819055505050505050565b60008281526008602090815260408083206001600160a01b03851684529091529020600301544210155b92915050565b6103e881565b6001600160a01b039081166000908152600c60205260409020541690565b600d6020526000908152604090205481565b6004546001600160a01b031681565b60026001541415610b0d576040805162461bcd60e51b815260206004820152601f6024820152600080516020612925833981519152604482015290519081900360640190fd5b6002600181905550600060078381548110610b2457fe5b600091825260208083208684526008825260408085203386529092529220805460069092029092019250831115610b97576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b610ba084610c61565b610ba984611eb3565b8215610bd3578054610bbb9084611dfc565b81558154610bd3906001600160a01b03163385612113565b60038201548154610bf49164e8d4a5100091610bee9161216a565b906121c3565b6001820155604080518481529051859133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a35050600180555050565b60065481565b600a5481565b600c602052600090815260409020546001600160a01b031681565b600060078281548110610c7057fe5b9060005260206000209060060201905080600201544311610c915750610e94565b8054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610cdb57600080fd5b505afa158015610cef573d6000803e3d6000fd5b505050506040513d6020811015610d0557600080fd5b50519050801580610d1857506001820154155b15610d2a575043600290910155610e94565b6000610d3a8360020154436112e0565b90506000610d67600954610bee8660010154610d616005548761216a90919063ffffffff16565b9061216a565b6002546003549192506001600160a01b03908116916340c10f199116610d8e8460196121c3565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610dd457600080fd5b505af1158015610de8573d6000803e3d6000fd5b5050600254604080516340c10f1960e01b81523060048201526024810186905290516001600160a01b0390921693506340c10f19925060448082019260009290919082900301818387803b158015610e3f57600080fd5b505af1158015610e53573d6000803e3d6000fd5b50505050610e81610e7684610bee64e8d4a510008561216a90919063ffffffff16565b600386015490611e59565b6003850155505043600290920191909155505b50565b60026001541415610edd576040805162461bcd60e51b815260206004820152601f6024820152600080516020612925833981519152604482015290519081900360640190fd5b6002600181905550600060078281548110610ef457fe5b60009182526020808320858452600882526040808520338087529352909320805460069093029093018054909450610f39926001600160a01b03919091169190612113565b80546040805191825251849133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a3600080825560018083018290556002830182905560039092015580555050565b6a08459508334a94a29c000081565b60075460005b81811015610fbf57610fb781610c61565b600101610fa6565b5050565b610fcb611df8565b6001600160a01b0316610fdc6112d1565b6001600160a01b031614611025576040805162461bcd60e51b81526020600482018190526024820152600080516020612a36833981519152604482015290519081900360640190fd5b6103e88111156110665760405162461bcd60e51b815260040180806020018281038252603a81526020018061296a603a913960400191505060405180910390fd5b600b548114156110a75760405162461bcd60e51b8152600401808060200182810382526028815260200180612a566028913960400191505060405180910390fd5b600b805490829055604080518281526020810184905281517f3282b692bfebf5f35b198a229212cf532c72099026ab54c4b8665382d1086b3f929181900390910190a15050565b600b5481565b60009182526008602090815260408084206001600160a01b0393909316845291905290206003015490565b611127611df8565b6001600160a01b03166111386112d1565b6001600160a01b031614611181576040805162461bcd60e51b81526020600482018190526024820152600080516020612a36833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b038116611226576040805162461bcd60e51b815260206004820152601e60248201527f736574466565416464726573733a20696e76616c696420616464726573730000604482015290519081900360640190fd5b6004546001600160a01b03163314611285576040805162461bcd60e51b815260206004820152601860248201527f736574466565416464726573733a20464f5242494444454e0000000000000000604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b03831690811790915560405133907fd44190acf9d04bdb5d3a1aafff7e6dee8b40b93dfb8c5d3f0eea4b9f4539c3f790600090a350565b6000546001600160a01b031690565b60006a08459508334a94a29c0000600654600260009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561133f57600080fd5b505afa158015611353573d6000803e3d6000fd5b505050506040513d602081101561136957600080fd5b5051011061137957506000610a7c565b6113838284611dfc565b9392505050565b600260015414156113d0576040805162461bcd60e51b815260206004820152601f6024820152600080516020612925833981519152604482015290519081900360640190fd5b60026001556000600784815481106113e457fe5b6000918252602080832087845260088252604080852033865290925292206006909102909101915061141585610c61565b61141e85611eb3565b83156114d65761142e338461222a565b8154611445906001600160a01b03163330876122e8565b600482015461ffff16156114b15760048201546000906114729061271090610bee90889061ffff1661216a565b825490915061148d9082906114879088611e59565b90611dfc565b825560045483546114ab916001600160a01b03918216911683612113565b506114c0565b80546114bd9085611e59565b81555b60058201546114d0904290611e59565b60038201555b600382015481546114f19164e8d4a5100091610bee9161216a565b6001820155604080518581529051869133917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a3505060018055505050565b60055481565b670de0b6b3a764000081565b600860209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b61019081565b600f6020526000908152604090205481565b61159c611df8565b6001600160a01b03166115ad6112d1565b6001600160a01b0316146115f6576040805162461bcd60e51b81526020600482018190526024820152600080516020612a36833981519152604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902054849060ff1615611666576040805162461bcd60e51b815260206004820152601960248201527f6e6f6e4475706c6963617465643a206475706c69636174656400000000000000604482015290519081900360640190fd5b61019061ffff851611156116ab5760405162461bcd60e51b81526004018080602001828103825260258152602001806129456025913960400191505060405180910390fd5b6202a300831115611703576040805162461bcd60e51b815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c000000604482015290519081900360640190fd5b811561171157611711610fa0565b6000600a54431161172457600a54611726565b435b6009549091506117369088611e59565b6009556001600160a01b039586166000818152600e602090815260408083208054600160ff199091168117909155815160c0810183528581528084019c8d528083019687526060810185815261ffff9b8c166080830190815260a083019b8c5260078054948501815580885292517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600690950294850180546001600160a01b03191691909f1617909d559c517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68983015595517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a8201559a517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b8c015598517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68c8b01805461ffff1916919099161790975594517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68d90980197909755549583525050600f90915220600019919091019055565b600e6020526000908152604090205460ff1681565b6001600160a01b03811661192f576040805162461bcd60e51b81526020600482015260146024820152736465763a20696e76616c6964206164647265737360601b604482015290519081900360640190fd5b6003546001600160a01b0316331461197a576040805162461bcd60e51b81526020600482015260096024820152686465763a207775743f60b81b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b03831690811790915560405133907f618c54559e94f1499a808aad71ee8729f8e74e8c48e979616328ce493a1a52e790600090a350565b6003546001600160a01b031681565b6202a30081565b60026001541415611a22576040805162461bcd60e51b815260206004820152601f6024820152600080516020612925833981519152604482015290519081900360640190fd5b6002600181905550600060078381548110611a3957fe5b60009182526020808320868452600882526040808520338652909252922060069091029091019150611a6a84610c61565b611a7384611eb3565b8215611b1b578154611a90906001600160a01b03163330866122e8565b600482015461ffff1615611af6576004820154600090611abd9061271090610bee90879061ffff1661216a565b8254909150611ad29082906114879087611e59565b82556004548354611af0916001600160a01b03918216911683612113565b50611b05565b8054611b029084611e59565b81555b6005820154611b15904290611e59565b60038201555b60038201548154611b369164e8d4a5100091610bee9161216a565b6001820155604080518481529051859133917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050600180555050565b611b84611df8565b6001600160a01b0316611b956112d1565b6001600160a01b031614611bde576040805162461bcd60e51b81526020600482018190526024820152600080516020612a36833981519152604482015290519081900360640190fd5b6001600160a01b038116611c235760405162461bcd60e51b81526004018080602001828103825260268152602001806129a46026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008060078481548110611c8e57fe5b600091825260208083208784526008825260408085206001600160a01b0389811687529084528186206006959095029092016003810154815483516370a0823160e01b815230600482015293519298509596909590949316926370a082319260248082019391829003018186803b158015611d0857600080fd5b505afa158015611d1c573d6000803e3d6000fd5b505050506040513d6020811015611d3257600080fd5b5051600285015490915043118015611d4957508015155b15611da9576000611d5e8560020154436112e0565b90506000611d85600954610bee8860010154610d616005548761216a90919063ffffffff16565b9050611da4611d9d84610bee8464e8d4a5100061216a565b8590611e59565b935050505b6000611dd3846001015461148764e8d4a51000610bee87896000015461216a90919063ffffffff16565b9050611dec846002015482611e5990919063ffffffff16565b98975050505050505050565b3390565b600082821115611e53576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611383576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600060078281548110611ec257fe5b600091825260208083208584526008825260408085203386529092529220600381015460069092029092019250611f09576005820154611f03904290611e59565b60038201555b6000611f37826001015461148764e8d4a51000610bee8760030154876000015461216a90919063ffffffff16565b90506000600260009054906101000a90046001600160a01b03166001600160a01b031663a9e757236040518163ffffffff1660e01b815260040160206040518083038186803b158015611f8957600080fd5b505afa158015611f9d573d6000803e3d6000fd5b505050506040513d6020811015611fb357600080fd5b50519050611fc18533610a52565b156120aa576000821180611fd9575060008360020154115b156120a5576000611ff7846002015484611e5990919063ffffffff16565b90508181101561204a57600284015460065461201291611dfc565b60065560006002850155600585015461202c904290611e59565b600385015561203b3382612348565b6120453382612515565b6120a3565b6002840154600654839161206691839161148791829087611e59565b6006556120738282611dfc565b60028601556005860154612088904290611e59565b60038601556120973382612348565b6120a13382612515565b505b505b61210c565b811561210c5760028301546120bf9083611e59565b60028401556006546120d19083611e59565b600655604080518381529051869133917fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c19181900360200190a35b5050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612165908490612633565b505050565b60008261217957506000610a7c565b8282028284828161218657fe5b04146113835760405162461bcd60e51b81526004018080602001828103825260218152602001806129f06021913960400191505060405180910390fd5b6000808211612219576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161222257fe5b049392505050565b6001600160a01b038281166000908152600c60205260409020541615801561225a57506001600160a01b03811615155b80156122785750816001600160a01b0316816001600160a01b031614155b15610fbf576001600160a01b038281166000818152600c6020908152604080832080546001600160a01b0319169587169586179055848352600d90915280822080546001019055517f9d05414fb79fac216c15606de5cc06664e91a254e4d5f57664d5f1beaf7fb7ef9190a35050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612342908590612633565b50505050565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561239357600080fd5b505afa1580156123a7573d6000803e3d6000fd5b505050506040513d60208110156123bd57600080fd5b50519050600081831115612454576002546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561242157600080fd5b505af1158015612435573d6000803e3d6000fd5b505050506040513d602081101561244b57600080fd5b505190506124d9565b6002546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156124aa57600080fd5b505af11580156124be573d6000803e3d6000fd5b505050506040513d60208110156124d457600080fd5b505190505b806123425760405162461bcd60e51b81526004018080602001828103825260238152602001806129026023913960400191505060405180910390fd5b600061252083610a88565b90506001600160a01b0381161580159061254c5750826001600160a01b0316816001600160a01b031614155b801561255a57506000600b54115b1561216557600061257c612710610bee600b548661216a90919063ffffffff16565b600254604080516340c10f1960e01b81526001600160a01b0386811660048301526024820185905291519394509116916340c10f199160448082019260009290919082900301818387803b1580156125d357600080fd5b505af11580156125e7573d6000803e3d6000fd5b50506040805184815290516001600160a01b038087169450881692507f0a721ab4682ceb61c7e4d264ef879fc419a6d764b136e7d96ef54b2053c756739181900360200190a350505050565b6060612688826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126e49092919063ffffffff16565b805190915015612165578080602001905160208110156126a757600080fd5b50516121655760405162461bcd60e51b815260040180806020018281038252602a815260200180612a9f602a913960400191505060405180910390fd5b60606126f384846000856126fb565b949350505050565b60608247101561273c5760405162461bcd60e51b81526004018080602001828103825260268152602001806129ca6026913960400191505060405180910390fd5b61274585612857565b612796576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106127d55780518252601f1990920191602091820191016127b6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612837576040519150601f19603f3d011682016040523d82523d6000602084013e61283c565b606091505b509150915061284c82828661285d565b979650505050505050565b3b151590565b6060831561286c575081611383565b82511561287c5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156128c65781810151838201526020016128ae565b50505050905090810190601f1680156128f35780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe736166654742756c6c5472616e736665723a207472616e73666572206661696c65642e5265656e7472616e637947756172643a207265656e7472616e742063616c6c006164643a20696e76616c6964206465706f7369742066656520626173697320706f696e7473757064617465526566426f6e757350657263656e743a20696e76616c696420726566657272616c20626f6e757320626173697320706f696e74734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777365743a20696e76616c6964206465706f7369742066656520626173697320706f696e74734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572757064617465526566426f6e757350657263656e743a2073616d6520626f6e757320627020736574676574506f6f6c4964466f724c70546f6b656e3a20646f206e6f742065786973745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212208a829cc56768010ffa593c802a4320a8ac046287b91ae8d46da1a960a749461a64736f6c634300060c00330000000000000000000000003e9b01762a82c12151cde2094f8ef9bcab774c8e00000000000000000000000017a7e051eb586f7ad05decb5e8c83d0c8b3d808700000000000000000000000017a7e051eb586f7ad05decb5e8c83d0c8b3d80870000000000000000000000000000000000000000000000000000000000ea3498
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003e9b01762a82c12151cde2094f8ef9bcab774c8e00000000000000000000000017a7e051eb586f7ad05decb5e8c83d0c8b3d808700000000000000000000000017a7e051eb586f7ad05decb5e8c83d0c8b3d80870000000000000000000000000000000000000000000000000000000000ea3498
-----Decoded View---------------
Arg [0] : _gBull (address): 0x3e9b01762a82c12151cde2094f8ef9bcab774c8e
Arg [1] : _devAddr (address): 0x17a7e051eb586f7ad05decb5e8c83d0c8b3d8087
Arg [2] : _feeAddress (address): 0x17a7e051eb586f7ad05decb5e8c83d0c8b3d8087
Arg [3] : _startBlock (uint256): 15348888
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000003e9b01762a82c12151cde2094f8ef9bcab774c8e
Arg [1] : 00000000000000000000000017a7e051eb586f7ad05decb5e8c83d0c8b3d8087
Arg [2] : 00000000000000000000000017a7e051eb586f7ad05decb5e8c83d0c8b3d8087
Arg [3] : 0000000000000000000000000000000000000000000000000000000000ea3498
Deployed ByteCode Sourcemap
51174:18853:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55685:95;;;:::i;:::-;;;;;;;;;;;;;;;;68126:208;;;;;;;;;;;;;;;;-1:-1:-1;68126:208:0;;:::i;:::-;;52818:28;;;:::i;:::-;;;;-1:-1:-1;;;;;52818:28:0;;;;;;;;;;;;;;53241:26;;;;;;;;;;;;;;;;-1:-1:-1;53241:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;53241:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53482:34;;;:::i;55788:221::-;;;;;;;;;;;;;;;;-1:-1:-1;55788:221:0;-1:-1:-1;;;;;55788:221:0;;:::i;57467:642::-;;;;;;;;;;;;;;;;-1:-1:-1;57467:642:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;59557:198::-;;;;;;;;;;;;;;;;-1:-1:-1;59557:198:0;;;;;;-1:-1:-1;;;;;59557:198:0;;:::i;:::-;;;;;;;;;;;;;;;;;;53834:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;68780:108;;;;;;;;;;;;;;;;-1:-1:-1;68780:108:0;-1:-1:-1;;;;;68780:108:0;;:::i;54005:48::-;;;;;;;;;;;;;;;;-1:-1:-1;54005:48:0;-1:-1:-1;;;;;54005:48:0;;:::i;52931:25::-;;;:::i;63585:608::-;;;;;;;;;;;;;;;;-1:-1:-1;63585:608:0;;;;;;;:::i;53172:35::-;;;:::i;53574:25::-;;;:::i;53915:44::-;;;;;;;;;;;;;;;;-1:-1:-1;53915:44:0;-1:-1:-1;;;;;53915:44:0;;:::i;60317:883::-;;;;;;;;;;;;;;;;-1:-1:-1;60317:883:0;;:::i;66377:439::-;;;;;;;;;;;;;;;;-1:-1:-1;66377:439:0;;:::i;54406:54::-;;;:::i;60061:180::-;;;:::i;69571:453::-;;;;;;;;;;;;;;;;-1:-1:-1;69571:453:0;;:::i;53666:31::-;;;:::i;59820:187::-;;;;;;;;;;;;;;;;-1:-1:-1;59820:187:0;;;;;;-1:-1:-1;;;;;59820:187:0;;:::i;25001:148::-;;;:::i;67742:299::-;;;;;;;;;;;;;;;;-1:-1:-1;67742:299:0;-1:-1:-1;;;;;67742:299:0;;:::i;24350:87::-;;;:::i;58185:273::-;;;;;;;;;;;;;;;;-1:-1:-1;58185:273:0;;;;;;;:::i;62366:1167::-;;;;;;;;;;;;;;;;-1:-1:-1;62366:1167:0;;;;;;;;;;;-1:-1:-1;;;;;62366:1167:0;;:::i;53003:28::-;;;:::i;54319:55::-;;;:::i;53323:64::-;;;;;;;;;;;;;;;;-1:-1:-1;53323:64:0;;;;;;-1:-1:-1;;;;;53323:64:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53733:51;;;:::i;54208:52::-;;;;;;;;;;;;;;;;-1:-1:-1;54208:52:0;-1:-1:-1;;;;;54208:52:0;;:::i;56275:1079::-;;;;;;;;;;;;;;;;-1:-1:-1;56275:1079:0;;;-1:-1:-1;;;;;56275:1079:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;54126:44::-;;;;;;;;;;;;;;;;-1:-1:-1;54126:44:0;-1:-1:-1;;;;;54126:44:0;;:::i;67422:256::-;;;;;;;;;;;;;;;;-1:-1:-1;67422:256:0;-1:-1:-1;;;;;67422:256:0;;:::i;52874:22::-;;;:::i;53076:57::-;;;:::i;61270:1012::-;;;;;;;;;;;;;;;;-1:-1:-1;61270:1012:0;;;;;;;:::i;25304:244::-;;;;;;;;;;;;;;;;-1:-1:-1;25304:244:0;-1:-1:-1;;;;;25304:244:0;;:::i;58523:968::-;;;;;;;;;;;;;;;;-1:-1:-1;58523:968:0;;;;;;-1:-1:-1;;;;;58523:968:0;;:::i;55685:95::-;55757:8;:15;55685:95;:::o;68126:208::-;24581:12;:10;:12::i;:::-;-1:-1:-1;;;;;24570:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24570:23:0;;24562:68;;;;;-1:-1:-1;;;24562:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24562:68:0;;;;;;;;;;;;;;;68206:17:::1;:15;:17::i;:::-;68234:13;:30:::0;;;68280:46:::1;::::0;68250:14;;68299:10:::1;::::0;68280:46:::1;::::0;;;::::1;68126:208:::0;:::o;52818:28::-;;;-1:-1:-1;;;;;52818:28:0;;:::o;53241:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53241:26:0;;;;-1:-1:-1;53241:26:0;;;;;;;;;;:::o;53482:34::-;;;;:::o;55788:221::-;-1:-1:-1;;;;;55885:23:0;;55857:7;55885:23;;;:13;:23;;;;;;;;55877:78;;;;-1:-1:-1;;;55877:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;55973:28:0;;;;;:18;:28;;;;;;;55788:221::o;57467:642::-;24581:12;:10;:12::i;:::-;-1:-1:-1;;;;;24570:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24570:23:0;;24562:68;;;;;-1:-1:-1;;;24562:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24562:68:0;;;;;;;;;;;;;;;53781:3:::1;57669:39;::::0;::::1;;;57661:89;;;;-1:-1:-1::0;;;57661:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57765:11;57761:61;;;57793:17;:15;:17::i;:::-;57850:87;57915:11;57850:46;57870:8;57879:4;57870:14;;;;;;;;;;;;;;;;;;:25;;;57850:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:87::i;:::-;57832:15;:105;;;;57976:11;57948:8;57957:4;57948:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;58028:13;57998:8;58007:4;57998:14;;;;;;;;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;58085:16;58052:8;58061:4;58052:14;;;;;;;;;;;;;;;;;;:30;;:49;;;;57467:642:::0;;;;;:::o;59557:198::-;59627:4;59668:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;59668:21:0;;;;;;;;;59726;;;59707:15;:40;;59557:198;;;;;:::o;53834:49::-;53879:4;53834:49;:::o;68780:108::-;-1:-1:-1;;;;;68864:16:0;;;68837:7;68864:16;;;:9;:16;;;;;;;;68780:108::o;54005:48::-;;;;;;;;;;;;;:::o;52931:25::-;;;-1:-1:-1;;;;;52931:25:0;;:::o;63585:608::-;27301:1;27907:7;;:19;;27899:63;;;;;-1:-1:-1;;;27899:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27899:63:0;;;;;;;;;;;;;;;27301:1;28040:7;:18;;;;63665:21:::1;63689:8;63698:4;63689:14;;;;;;;;;::::0;;;::::1;::::0;;;63738;;;:8:::1;:14:::0;;;;;;63753:10:::1;63738:26:::0;;;;;;;63783:11;;63689:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;63783:22:0;-1:-1:-1;63783:22:0::1;63775:53;;;::::0;;-1:-1:-1;;;63775:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;63775:53:0;;;;;;;;;;;;;::::1;;63839:16;63850:4;63839:10;:16::i;:::-;63866:29;63890:4;63866:23;:29::i;:::-;63910:11:::0;;63906:152:::1;;63952:11:::0;;:24:::1;::::0;63968:7;63952:15:::1;:24::i;:::-;63938:38:::0;;63991:12;;:55:::1;::::0;-1:-1:-1;;;;;63991:12:0::1;64025:10;64038:7:::0;63991:25:::1;:55::i;:::-;64102:21;::::0;::::1;::::0;64086:11;;:48:::1;::::0;64129:4:::1;::::0;64086:38:::1;::::0;:15:::1;:38::i;:::-;:42:::0;::::1;:48::i;:::-;64068:15;::::0;::::1;:66:::0;64150:35:::1;::::0;;;;;;;64171:4;;64159:10:::1;::::0;64150:35:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;27257:1:0;28219:22;;-1:-1:-1;;63585:608:0:o;53172:35::-;;;;:::o;53574:25::-;;;;:::o;53915:44::-;;;;;;;;;;;;-1:-1:-1;;;;;53915:44:0;;:::o;60317:883::-;60369:21;60393:8;60402:4;60393:14;;;;;;;;;;;;;;;;;;60369:38;;60438:4;:20;;;60422:12;:36;60418:75;;60475:7;;;60418:75;60522:12;;:37;;;-1:-1:-1;;;60522:37:0;;60553:4;60522:37;;;;;;60503:16;;-1:-1:-1;;;;;60522:12:0;;:22;;:37;;;;;;;;;;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60522:37:0;;-1:-1:-1;60574:13:0;;;:37;;-1:-1:-1;60591:15:0;;;;:20;60574:37;60570:126;;;-1:-1:-1;60651:12:0;60628:20;;;;:35;60678:7;;60570:126;60706:18;60727:49;60741:4;:20;;;60763:12;60727:13;:49::i;:::-;60706:70;;60787:19;60822:103;60895:15;;60822:50;60856:4;:15;;;60822:29;60837:13;;60822:10;:14;;:29;;;;:::i;:::-;:33;;:50::i;:103::-;60936:5;;60947:7;;60787:138;;-1:-1:-1;;;;;;60936:5:0;;;;:10;;60947:7;60956:19;60787:138;60972:2;60956:15;:19::i;:::-;60936:40;;;;;;;;;;;;;-1:-1:-1;;;;;60936:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60987:5:0;;:38;;;-1:-1:-1;;;60987:38:0;;61006:4;60987:38;;;;;;;;;;;;-1:-1:-1;;;;;60987:5:0;;;;-1:-1:-1;60987:10:0;;-1:-1:-1;60987:38:0;;;;;:5;;:38;;;;;;;;:5;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61060:86;61100:35;61126:8;61100:21;61116:4;61100:11;:15;;:21;;;;:::i;:35::-;61060:21;;;;;:25;:86::i;:::-;61036:21;;;:110;-1:-1:-1;;61180:12:0;61157:20;;;;:35;;;;-1:-1:-1;60317:883:0;;:::o;66377:439::-;27301:1;27907:7;;:19;;27899:63;;;;;-1:-1:-1;;;27899:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27899:63:0;;;;;;;;;;;;;;;27301:1;28040:7;:18;;;;66449:21:::1;66473:8;66482:4;66473:14;;;;;;;;;::::0;;;::::1;::::0;;;66522;;;:8:::1;:14:::0;;;;;;66537:10:::1;66522:26:::0;;;;;;;;66606:11;;66473:14:::1;::::0;;::::1;::::0;;::::1;66559:12:::0;;66473:14;;-1:-1:-1;66559:59:0::1;::::0;-1:-1:-1;;;;;66559:12:0;;;::::1;::::0;66537:10;66559:25:::1;:59::i;:::-;66670:11:::0;;66634:48:::1;::::0;;;;;;66664:4;;66652:10:::1;::::0;66634:48:::1;::::0;;;;::::1;::::0;;::::1;66707:1;66693:15:::0;;;66719::::1;::::0;;::::1;:19:::0;;;66749::::1;::::0;::::1;:23:::0;;;66783:21:::1;::::0;;::::1;:25:::0;28219:22;;-1:-1:-1;;66377:439:0:o;54406:54::-;54447:13;54406:54;:::o;60061:180::-;60123:8;:15;60106:14;60149:85;60177:6;60171:3;:12;60149:85;;;60207:15;60218:3;60207:10;:15::i;:::-;60185:5;;60149:85;;;;60061:180;:::o;69571:453::-;24581:12;:10;:12::i;:::-;-1:-1:-1;;;;;24570:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24570:23:0;;24562:68;;;;;-1:-1:-1;;;24562:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24562:68:0;;;;;;;;;;;;;;;53879:4:::1;69662:37:::0;::::1;;69654:108;;;;-1:-1:-1::0;;;69654:108:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69799:10;;69781:14;:28;;69773:81;;;;-1:-1:-1::0;;;69773:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69894:10;::::0;;69915:27;;;;69958:58:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;24641:1;69571:453:::0;:::o;53666:31::-;;;;:::o;59820:187::-;59895:7;59939:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;59939:21:0;;;;;;;;;;;59978;;;;59820:187::o;25001:148::-;24581:12;:10;:12::i;:::-;-1:-1:-1;;;;;24570:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24570:23:0;;24562:68;;;;;-1:-1:-1;;;24562:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24562:68:0;;;;;;;;;;;;;;;25108:1:::1;25092:6:::0;;25071:40:::1;::::0;-1:-1:-1;;;;;25092:6:0;;::::1;::::0;25071:40:::1;::::0;25108:1;;25071:40:::1;25139:1;25122:19:::0;;-1:-1:-1;;;;;;25122:19:0::1;::::0;;25001:148::o;67742:299::-;-1:-1:-1;;;;;67812:25:0;;67804:68;;;;;-1:-1:-1;;;67804:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;67905:10;;-1:-1:-1;;;;;67905:10:0;67891;:24;67883:61;;;;;-1:-1:-1;;;67883:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;67955:10;:24;;-1:-1:-1;;;;;;67955:24:0;-1:-1:-1;;;;;67955:24:0;;;;;;;;67995:38;;68009:10;;67995:38;;-1:-1:-1;;67995:38:0;67742:299;:::o;24350:87::-;24396:7;24423:6;-1:-1:-1;;;;;24423:6:0;24350:87;:::o;58185:273::-;58284:7;54447:13;58343:20;;58320:5;;;;;;;;;-1:-1:-1;;;;;58320:5:0;-1:-1:-1;;;;;58313:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58313:27:0;:50;:69;58309:110;;-1:-1:-1;58406:1:0;58399:8;;58309:110;58436:14;:3;58444:5;58436:7;:14::i;:::-;58429:21;58185:273;-1:-1:-1;;;58185:273:0:o;62366:1167::-;27301:1;27907:7;;:19;;27899:63;;;;;-1:-1:-1;;;27899:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27899:63:0;;;;;;;;;;;;;;;27301:1;28040:7;:18;62551:21:::1;62575:8;62584:4;62575:14;;;;;;;;;::::0;;;::::1;::::0;;;62624;;;:8:::1;:14:::0;;;;;;62639:10:::1;62624:26:::0;;;;;;;62575:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;62661:16:0::1;62633:4:::0;62661:10:::1;:16::i;:::-;62688:29;62712:4;62688:23;:29::i;:::-;62732:11:::0;;62728:671:::1;;62760:34;62772:10;62784:9;62760:11;:34::i;:::-;62809:12:::0;;:140:::1;::::0;-1:-1:-1;;;;;62809:12:0::1;62865:10;62903:4;62927:7:::0;62809:29:::1;:140::i;:::-;62968:17;::::0;::::1;::::0;::::1;;:21:::0;62964:344:::1;;63043:17;::::0;::::1;::::0;63010:18:::1;::::0;63031:41:::1;::::0;63066:5:::1;::::0;63031:30:::1;::::0;:7;;63043:17:::1;;63031:11;:30::i;:41::-;63105:11:::0;;63010:62;;-1:-1:-1;63105:40:0::1;::::0;63010:62;;63105:24:::1;::::0;63121:7;63105:15:::1;:24::i;:::-;:28:::0;::::1;:40::i;:::-;63091:54:::0;;63190:10:::1;::::0;63164:12;;:49:::1;::::0;-1:-1:-1;;;;;63164:12:0;;::::1;::::0;63190:10:::1;63202::::0;63164:25:::1;:49::i;:::-;62964:344;;;;63268:11:::0;;:24:::1;::::0;63284:7;63268:15:::1;:24::i;:::-;63254:38:::0;;62964:344:::1;63366:20;::::0;::::1;::::0;63346:41:::1;::::0;:15:::1;::::0;:19:::1;:41::i;:::-;63322:21;::::0;::::1;:65:::0;62728:671:::1;63443:21;::::0;::::1;::::0;63427:11;;:48:::1;::::0;63470:4:::1;::::0;63427:38:::1;::::0;:15:::1;:38::i;:48::-;63409:15;::::0;::::1;:66:::0;63491:34:::1;::::0;;;;;;;63511:4;;63499:10:::1;::::0;63491:34:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;27257:1:0;28219:22;;-1:-1:-1;;;62366:1167:0:o;53003:28::-;;;;:::o;54319:55::-;54367:7;54319:55;:::o;53323:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53733:51::-;53781:3;53733:51;:::o;54208:52::-;;;;;;;;;;;;;:::o;56275:1079::-;24581:12;:10;:12::i;:::-;-1:-1:-1;;;;;24570:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24570:23:0;;24562:68;;;;;-1:-1:-1;;;24562:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24562:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;56118:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;56475:8;;56118:23:::1;;:32;56110:70;;;::::0;;-1:-1:-1;;;56110:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;53781:3:::2;56504:39;::::0;::::2;;;56496:89;;;;-1:-1:-1::0;;;56496:89:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53127:6;56604:16;:44;;56596:86;;;::::0;;-1:-1:-1;;;56596:86:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;56697:11;56693:61;;;56725:17;:15;:17::i;:::-;56764:23;56805:10;;56790:12;:25;:53;;56833:10;;56790:53;;;56818:12;56790:53;56872:15;::::0;56764:79;;-1:-1:-1;56872:32:0::2;::::0;56892:11;56872:19:::2;:32::i;:::-;56854:15;:50:::0;-1:-1:-1;;;;;56915:23:0;;::::2;;::::0;;;:13:::2;:23;::::0;;;;;;;:30;;56941:4:::2;-1:-1:-1::0;;56915:30:0;;::::2;::::0;::::2;::::0;;;56984:290;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;;;;;;;;::::2;::::0;;::::2;::::0;;;;;;;;;;;;56956:8:::2;:329:::0;;;;::::2;::::0;;;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;;;;56956:329:0::2;::::0;;;::::2;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56956:329:0::2;::::0;;;::::2;;::::0;;;;;;;;;;;;;57327:15;57296:28;;;-1:-1:-1;;57296:18:0::2;:28:::0;;;;-1:-1:-1;;57327:19:0;;;;57296:50;;56275:1079::o;54126:44::-;;;;;;;;;;;;;;;:::o;67422:256::-;-1:-1:-1;;;;;67489:22:0;;67481:55;;;;;-1:-1:-1;;;67481:55:0;;;;;;;;;;;;-1:-1:-1;;;67481:55:0;;;;;;;;;;;;;;;67569:7;;-1:-1:-1;;;;;67569:7:0;67555:10;:21;67547:43;;;;;-1:-1:-1;;;67547:43:0;;;;;;;;;;;;-1:-1:-1;;;67547:43:0;;;;;;;;;;;;;;;67601:7;:18;;-1:-1:-1;;;;;;67601:18:0;-1:-1:-1;;;;;67601:18:0;;;;;;;;67635:35;;67649:10;;67635:35;;-1:-1:-1;;67635:35:0;67422:256;:::o;52874:22::-;;;-1:-1:-1;;;;;52874:22:0;;:::o;53076:57::-;53127:6;53076:57;:::o;61270:1012::-;27301:1;27907:7;;:19;;27899:63;;;;;-1:-1:-1;;;27899:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;27899:63:0;;;;;;;;;;;;;;;27301:1;28040:7;:18;;;;61349:21:::1;61373:8;61382:4;61373:14;;;;;;;;;::::0;;;::::1;::::0;;;61422;;;:8:::1;:14:::0;;;;;;61437:10:::1;61422:26:::0;;;;;;;61373:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;61459:16:0::1;61431:4:::0;61459:10:::1;:16::i;:::-;61486:29;61510:4;61486:23;:29::i;:::-;61530:11:::0;;61526:622:::1;;61558:12:::0;;:140:::1;::::0;-1:-1:-1;;;;;61558:12:0::1;61614:10;61652:4;61676:7:::0;61558:29:::1;:140::i;:::-;61717:17;::::0;::::1;::::0;::::1;;:21:::0;61713:344:::1;;61792:17;::::0;::::1;::::0;61759:18:::1;::::0;61780:41:::1;::::0;61815:5:::1;::::0;61780:30:::1;::::0;:7;;61792:17:::1;;61780:11;:30::i;:41::-;61854:11:::0;;61759:62;;-1:-1:-1;61854:40:0::1;::::0;61759:62;;61854:24:::1;::::0;61870:7;61854:15:::1;:24::i;:40::-;61840:54:::0;;61939:10:::1;::::0;61913:12;;:49:::1;::::0;-1:-1:-1;;;;;61913:12:0;;::::1;::::0;61939:10:::1;61951::::0;61913:25:::1;:49::i;:::-;61713:344;;;;62017:11:::0;;:24:::1;::::0;62033:7;62017:15:::1;:24::i;:::-;62003:38:::0;;61713:344:::1;62115:20;::::0;::::1;::::0;62095:41:::1;::::0;:15:::1;::::0;:19:::1;:41::i;:::-;62071:21;::::0;::::1;:65:::0;61526:622:::1;62192:21;::::0;::::1;::::0;62176:11;;:48:::1;::::0;62219:4:::1;::::0;62176:38:::1;::::0;:15:::1;:38::i;:48::-;62158:15;::::0;::::1;:66:::0;62240:34:::1;::::0;;;;;;;62260:4;;62248:10:::1;::::0;62240:34:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;27257:1:0;28219:22;;-1:-1:-1;;61270:1012:0:o;25304:244::-;24581:12;:10;:12::i;:::-;-1:-1:-1;;;;;24570:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;24570:23:0;;24562:68;;;;;-1:-1:-1;;;24562:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;24562:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25393:22:0;::::1;25385:73;;;;-1:-1:-1::0;;;25385:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25495:6;::::0;;25474:38:::1;::::0;-1:-1:-1;;;;;25474:38:0;;::::1;::::0;25495:6;::::1;::::0;25474:38:::1;::::0;::::1;25523:6;:17:::0;;-1:-1:-1;;;;;;25523:17:0::1;-1:-1:-1::0;;;;;25523:17:0;;;::::1;::::0;;;::::1;::::0;;25304:244::o;58523:968::-;58624:7;58649:21;58673:8;58682:4;58673:14;;;;;;;;;;;;;;;;58722;;;:8;:14;;;;;;-1:-1:-1;;;;;58722:21:0;;;;;;;;;;;58673:14;;;;;;;;58781:21;;;;58832:12;;:37;;-1:-1:-1;;;58832:37:0;;58863:4;58832:37;;;;;;58673:14;;-1:-1:-1;58722:21:0;;58781;;58673:14;;58832:12;;;:22;;:37;;;;;;;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58832:37:0;58899:20;;;;58832:37;;-1:-1:-1;58884:12:0;:35;:52;;;;-1:-1:-1;58923:13:0;;;58884:52;58880:460;;;58953:18;58991:49;59005:4;:20;;;59027:12;58991:13;:49::i;:::-;58953:87;;59055:19;59094:111;59171:15;;59094:50;59128:4;:15;;;59094:29;59109:13;;59094:10;:14;;:29;;;;:::i;:111::-;59055:150;-1:-1:-1;59239:89:0;59278:35;59304:8;59278:21;59055:150;59294:4;59278:15;:21::i;:35::-;59239:16;;:20;:89::i;:::-;59220:108;;58880:460;;;59350:15;59369:64;59417:4;:15;;;59369:43;59407:4;59369:33;59385:16;59369:4;:11;;;:15;;:33;;;;:::i;:64::-;59350:83;;59451:32;59463:4;:19;;;59451:7;:11;;:32;;;;:::i;:::-;59444:39;58523:968;-1:-1:-1;;;;;;;;58523:968:0:o;22891:106::-;22979:10;22891:106;:::o;3253:158::-;3311:7;3344:1;3339;:6;;3331:49;;;;;-1:-1:-1;;;3331:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3398:5:0;;;3253:158::o;2791:179::-;2849:7;2881:5;;;2905:6;;;;2897:46;;;;;-1:-1:-1;;;2897:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;64238:2068;64305:21;64329:8;64338:4;64329:14;;;;;;;;;;;;;;;;64378;;;:8;:14;;;;;;64393:10;64378:26;;;;;;;64421:21;;;;64329:14;;;;;;;;-1:-1:-1;64417:124:0;;64508:20;;;;64488:41;;:15;;:19;:41::i;:::-;64464:21;;;:65;64417:124;64553:15;64571:69;64624:4;:15;;;64571:48;64614:4;64571:38;64587:4;:21;;;64571:4;:11;;;:15;;:38;;;;:::i;:69::-;64553:87;;64651:13;64667:5;;;;;;;;;-1:-1:-1;;;;;64667:5:0;-1:-1:-1;;;;;64667:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64667:25:0;;-1:-1:-1;64709:28:0;64720:4;64726:10;64709;:28::i;:::-;64705:1594;;;64768:1;64758:7;:11;:38;;;;64795:1;64773:4;:19;;;:23;64758:38;64754:1298;;;64817:20;64840:32;64852:4;:19;;;64840:7;:11;;:32;;;;:::i;:::-;64817:55;;64972:5;64957:12;:20;64954:1083;;;65087:19;;;;65062:20;;:45;;:24;:45::i;:::-;65039:20;:68;65152:1;65130:19;;;:23;65220:20;;;;65200:41;;:15;;:19;:41::i;:::-;65176:21;;;:65;65303:43;65321:10;65333:12;65303:17;:43::i;:::-;65369:47;65391:10;65403:12;65369:21;:47::i;:::-;64954:1083;;;65629:19;;;;65586:20;;65535:5;;65586:84;;65535:5;;65586:63;;;;65611:12;65586:24;:38::i;:84::-;65563:20;:107;65715:33;:12;65732:15;65715:16;:33::i;:::-;65693:19;;;:55;65815:20;;;;65795:41;;:15;;:19;:41::i;:::-;65771:21;;;:65;65898:46;65916:10;65928:15;65898:17;:46::i;:::-;65967:50;65989:10;66001:15;65967:21;:50::i;:::-;64954:1083;;64754:1298;;64705:1594;;;66073:11;;66069:230;;66123:19;;;;:32;;66147:7;66123:23;:32::i;:::-;66101:19;;;:54;66193:20;;:33;;66218:7;66193:24;:33::i;:::-;66170:20;:56;66246:41;;;;;;;;66273:4;;66261:10;;66246:41;;;;;;;;;66069:230;64238:2068;;;;;:::o;19175:177::-;19285:58;;;-1:-1:-1;;;;;19285:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19285:58:0;-1:-1:-1;;;19285:58:0;;;19258:86;;19278:5;;19258:19;:86::i;:::-;19175:177;;;:::o;3670:220::-;3728:7;3752:6;3748:20;;-1:-1:-1;3767:1:0;3760:8;;3748:20;3791:5;;;3795:1;3791;:5;:1;3815:5;;;;;:10;3807:56;;;;-1:-1:-1;;;3807:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4368:153;4426:7;4458:1;4454;:5;4446:44;;;;;-1:-1:-1;;;4446:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4512:1;4508;:5;;;;;;;4368:153;-1:-1:-1;;;4368:153:0:o;68382:347::-;-1:-1:-1;;;;;68496:16:0;;;68524:1;68496:16;;;:9;:16;;;;;;;:30;68461:92;;;;-1:-1:-1;;;;;;68530:23:0;;;;68461:92;:114;;;;;68570:5;-1:-1:-1;;;;;68557:18:0;:9;-1:-1:-1;;;;;68557:18:0;;;68461:114;68457:265;;;-1:-1:-1;;;;;68592:16:0;;;;;;;:9;:16;;;;;;;;:28;;-1:-1:-1;;;;;;68592:28:0;;;;;;;;;68635:24;;;:13;:24;;;;;;:29;;-1:-1:-1;68635:29:0;;;68684:26;;;68592:16;68684:26;68382:347;;:::o;19360:205::-;19488:68;;;-1:-1:-1;;;;;19488:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19488:68:0;-1:-1:-1;;;19488:68:0;;;19461:96;;19481:5;;19461:19;:96::i;:::-;19360:205;;;;:::o;66932:434::-;67028:5;;:30;;;-1:-1:-1;;;67028:30:0;;67052:4;67028:30;;;;;;67009:16;;-1:-1:-1;;;;;67028:5:0;;:15;;:30;;;;;;;;;;;;;;:5;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67028:30:0;;-1:-1:-1;67069:20:0;67112:18;;;67108:177;;;67165:5;;:29;;;-1:-1:-1;;;67165:29:0;;-1:-1:-1;;;;;67165:29:0;;;;;;;;;;;;;;;:5;;;;;:14;;:29;;;;;;;;;;;;;;:5;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67165:29:0;;-1:-1:-1;67108:177:0;;;67245:5;;:28;;;-1:-1:-1;;;67245:28:0;;-1:-1:-1;;;;;67245:28:0;;;;;;;;;;;;;;;:5;;;;;:14;;:28;;;;;;;;;;;;;;:5;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67245:28:0;;-1:-1:-1;67108:177:0;67303:15;67295:63;;;;-1:-1:-1;;;67295:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68968:409;69052:16;69071:18;69083:5;69071:11;:18::i;:::-;69052:37;-1:-1:-1;;;;;;69104:22:0;;;;;;:43;;;69142:5;-1:-1:-1;;;;;69130:17:0;:8;-1:-1:-1;;;;;69130:17:0;;;69104:43;:61;;;;;69164:1;69151:10;;:14;69104:61;69100:270;;;69182:22;69207:35;69236:5;69207:24;69220:10;;69207:8;:12;;:24;;;;:::i;:35::-;69257:5;;:36;;;-1:-1:-1;;;69257:36:0;;-1:-1:-1;;;;;69257:36:0;;;;;;;;;;;;;;;69182:60;;-1:-1:-1;69257:5:0;;;:10;;:36;;;;;:5;;:36;;;;;;;;:5;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69313:45:0;;;;;;;;-1:-1:-1;;;;;69313:45:0;;;;-1:-1:-1;69313:45:0;;;-1:-1:-1;69313:45:0;;;;;;;;;69100:270;68968:409;;;:::o;21480:761::-;21904:23;21930:69;21958:4;21930:69;;;;;;;;;;;;;;;;;21938:5;-1:-1:-1;;;;;21930:27:0;;;:69;;;;;:::i;:::-;22014:17;;21904:95;;-1:-1:-1;22014:21:0;22010:224;;22156:10;22145:30;;;;;;;;;;;;;;;-1:-1:-1;22145:30:0;22137:85;;;;-1:-1:-1;;;22137:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14203:195;14306:12;14338:52;14360:6;14368:4;14374:1;14377:12;14338:21;:52::i;:::-;14331:59;14203:195;-1:-1:-1;;;;14203:195:0:o;15255:530::-;15382:12;15440:5;15415:21;:30;;15407:81;;;;-1:-1:-1;;;15407:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15507:18;15518:6;15507:10;:18::i;:::-;15499:60;;;;;-1:-1:-1;;;15499:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15633:12;15647:23;15674:6;-1:-1:-1;;;;;15674:11:0;15694:5;15702:4;15674:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15674:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15632:75;;;;15725:52;15743:7;15752:10;15764:12;15725:17;:52::i;:::-;15718:59;15255:530;-1:-1:-1;;;;;;;15255:530:0:o;11285:422::-;11652:20;11691:8;;;11285:422::o;17795:742::-;17910:12;17939:7;17935:595;;;-1:-1:-1;17970:10:0;17963:17;;17935:595;18084:17;;:21;18080:439;;18347:10;18341:17;18408:15;18395:10;18391:2;18387:19;18380:44;18295:148;18490:12;18483:20;;-1:-1:-1;;;18483:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://8a829cc56768010ffa593c802a4320a8ac046287b91ae8d46da1a960a749461a
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.