Contract Overview
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x3a40ad89c5ba516bf723f7405c954bd60776879f515be49108d7935aa4fcd0bf | Add | 7430595 | 82 days 8 hrs ago | 0xc4af2bd0816cf85459a42ab80e9260af31968e44 | IN | 0x862c41c4a9b3a21989585fd92b66c7023fcf4c7d | 0 CRO | 0.675271623326 | |
0x9a13b6bff914502455fe0ec3f73f79a2acb1062e04d352a2f1cd5a2b06e70ae0 | 0x60e06040 | 7430448 | 82 days 8 hrs ago | 0xc4af2bd0816cf85459a42ab80e9260af31968e44 | IN | Contract Creation | 0 CRO | 7.796992162904 |
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x96917e287F04dd24720D3733dDe17967A67d08B8
Contract Name:
Rewarder
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-01-18 */ // Sources flattened with hardhat v2.6.7 https://hardhat.org // File @openzeppelin/contracts3/utils/[email protected] // SPDX-License-Identifier: MIT 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/contracts3/access/[email protected] 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/contracts3/math/[email protected] 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 @openzeppelin/contracts3/token/ERC20/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts3/token/ERC20/[email protected] pragma solidity >=0.6.0 <0.8.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 { 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 view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-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 virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-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 virtual 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 {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual 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 {IERC20-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 virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); 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"); _beforeTokenTransfer(sender, recipient, amount); _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 virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _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 virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _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 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 virtual { 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 Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal virtual { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File @openzeppelin/contracts3/utils/[email protected] 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 @openzeppelin/contracts3/token/ERC20/[email protected] 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 contracts/ICraftsman.sol pragma solidity 0.6.12; /** * @title ICraftsman * @notice It is an interface for Craftsman.sol */ interface ICraftsman { /** * @notice deposit LP tokens for VVS allocation. * @param _pid poolId * @param _amount amount of LP token to deposit */ function deposit(uint256 _pid, uint256 _amount) external; /** * @notice withdraw LP tokens * @param _pid poolId * @param _amount amount of LP token to deposit */ function withdraw(uint256 _pid, uint256 _amount) external; /** * @notice withdraw without caring about rewards. EMERGENCY ONLY. * @param _pid poolId */ function emergencyWithdraw(uint256 _pid) external; /** * @notice view function to check user pending vvs * @param _pid poolId * @param _user address of user */ function pendingVVS(uint256 _pid, address _user) external view returns (uint256); /** * @notice view function to check user's deposited LP and rewardDebt * @param _pid poolId * @param _user address of user */ function userInfo(uint256 _pid, address _user) external view returns (uint256 amount, uint256 rewardDebt); /** * @notice view function to check pool info * @param _pid poolId */ function poolInfo(uint256 _pid) external view returns ( address lpToken, uint256 allocPoint, uint256 lastRewardBlock, uint256 accVVSPerShare ); /** * @notice view function to check vvs token address registered in craftsman */ function vvs() external view returns (address); } // File contracts/Rewarder.sol pragma solidity 0.6.12; contract Rewarder is Ownable { using SafeMath for uint256; using SafeERC20 for ERC20; struct UserInfo { uint256 rewardDebt; // Reward debt - amount of reward token paid out to user } struct PoolInfo { uint256 allocPoint; uint256 lastRewardTime; uint256 accRewardPerShare; // Accumulated reward tokens per share, times ACC_TOKEN_PRECISION. See below. } ERC20 public immutable rewardToken; mapping(uint256 => PoolInfo) public poolInfo; uint256[] public poolIds; /// @notice Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; /// @dev Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; uint256 public rewardPerSecond; // number of token per sec uint256 public rewardStartTimestamp; // timestamp when reward emission starts uint256 public rewardEndTimestamp; // timestamp when reward emission ends uint256 public ACC_TOKEN_PRECISION; // precision factor ICraftsman public immutable craftsman; ICraftsman public immutable craftsmanV2; /// @dev pending represent how much rewardToken user received event OnVVSReward(uint256 indexed pid, address indexed user, uint256 amount, uint256 pending); event AddPool(uint256 indexed pid, uint256 allocPoint); event SetPool(uint256 indexed pid, uint256 allocPoint); event SetRewardPerSecond(uint256 rewardPerSecond); event SetRewardStartTimestamp(uint256 rewardStartTimestamp); event SetRewardEndTimestamp(uint256 rewardEndTimestamp); event EmergencyRewardWithdraw(address indexed user, uint256 amount); modifier onlyCraftsmanV2() { require(msg.sender == address(craftsmanV2), "Only CraftsmanV2 can call this function."); _; } constructor( ERC20 _rewardToken, uint256 _rewardPerSecond, uint256 _rewardStartTimestamp, uint256 _rewardEndTimestamp, ICraftsman _craftsman, ICraftsman _craftsmanV2 ) public { rewardToken = _rewardToken; rewardPerSecond = _rewardPerSecond; rewardStartTimestamp = _rewardStartTimestamp; rewardEndTimestamp = _rewardEndTimestamp; craftsman = _craftsman; craftsmanV2 = _craftsmanV2; uint256 decimalsRewardToken = uint256(_rewardToken.decimals()); require(decimalsRewardToken < 36, "Must be inferior to 36"); ACC_TOKEN_PRECISION = uint256(10**(uint256(36).sub(decimalsRewardToken))); } /// @notice send any pending rewardToken to user /// @dev MUST call this function before update user.amount at craftsmanV2. If contract has not enough /// reward token, this function will throw an error. /// @param _pid pid to check for reward /// @param _user address of user /// @param _currentAmount current amount of the user after deposit | withdraw function onVVSReward( uint256 _pid, address _user, uint256 _currentAmount ) external onlyCraftsmanV2 { updatePool(_pid); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; (uint256 userAmount, ) = craftsmanV2.userInfo(_pid, _user); uint256 pending; if (userAmount > 0) { pending = (userAmount.mul(pool.accRewardPerShare).div(ACC_TOKEN_PRECISION)).sub(user.rewardDebt); rewardToken.safeTransfer(_user, pending); } user.rewardDebt = _currentAmount.mul(pool.accRewardPerShare).div(ACC_TOKEN_PRECISION); emit OnVVSReward(_pid, _user, _currentAmount, pending); } /* * @notice withdraw excess token. * @dev Only callable by owner. Needs to be for emergency. */ function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { require(block.timestamp > rewardEndTimestamp, "Reward not ended"); rewardToken.safeTransfer(address(msg.sender), _amount); emit EmergencyRewardWithdraw(msg.sender, _amount); } /// @notice Sets the reward per second to be distributed. Can only be called by the owner. /// @param _rewardPerSecond The amount of reward token to be distributed per second. function setRewardPerSecond(uint256 _rewardPerSecond) public onlyOwner { massUpdatePools(); rewardPerSecond = _rewardPerSecond; emit SetRewardPerSecond(_rewardPerSecond); } /// @notice Returns the number of pools. function poolLength() public view returns (uint256 pools) { pools = poolIds.length; } /// @notice Add a new LP to the pool. Can only be called by the owner. /// @param _allocPoint AP of the new pool. /// @param _pid Pid on CraftsmanV2 function add( uint256 _allocPoint, uint256 _pid, bool _withUpdate ) public onlyOwner { require(poolInfo[_pid].lastRewardTime == 0, "Pool already exists"); if (_withUpdate) { massUpdatePools(); } uint256 lastRewardTime = block.timestamp > rewardStartTimestamp ? block.timestamp : rewardStartTimestamp; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo[_pid] = PoolInfo({allocPoint: _allocPoint, lastRewardTime: lastRewardTime, accRewardPerShare: 0}); poolIds.push(_pid); emit AddPool(_pid, _allocPoint); } /// @notice Update the given pool's reward allocation point. Can only be called by the owner. /// @param _pid The index of the pool. See `poolInfo`. /// @param _allocPoint New AP of the pool. /// @param _withUpdate Update the pool.accRewardPerShare before alloc point adjustment function set( uint256 _pid, uint256 _allocPoint, bool _withUpdate ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; emit SetPool(_pid, _allocPoint); } /// @notice View function to see pending Token /// @param _pid The index of the pool. See `poolInfo`. /// @param _user Address of user. /// @return pending reward for a given user. function pendingToken(uint256 _pid, address _user) public view returns (address, uint256) { PoolInfo memory pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accRewardPerShare = pool.accRewardPerShare; (uint256 lpSupply, ) = craftsman.userInfo(_pid, address(craftsmanV2)); if (block.timestamp > pool.lastRewardTime && lpSupply != 0) { uint256 multiplier = _getMultiplier(pool.lastRewardTime, block.timestamp); uint256 reward = multiplier.mul(rewardPerSecond).mul(pool.allocPoint).div(totalAllocPoint); accRewardPerShare = accRewardPerShare.add(reward.mul(ACC_TOKEN_PRECISION).div(lpSupply)); } (uint256 userAmount, ) = craftsmanV2.userInfo(_pid, _user); uint256 pending = userAmount.mul(accRewardPerShare).div(ACC_TOKEN_PRECISION).sub(user.rewardDebt); return (address(rewardToken), pending); } /// @dev if a pool has been added, we cannot set _rewardStartTimestamp to be earlier function setRewardStartTimestamp(uint256 _rewardStartTimestamp) public onlyOwner { require(block.timestamp < rewardStartTimestamp, "Reward has started"); require(block.timestamp < _rewardStartTimestamp, "New start time must be after current timestamp"); require(rewardEndTimestamp > _rewardStartTimestamp, "New start time must be before end timestamp"); rewardStartTimestamp = _rewardStartTimestamp; massUpdatePools(); emit SetRewardStartTimestamp(_rewardStartTimestamp); } function setRewardEndTimestamp(uint256 _rewardEndTimestamp) public onlyOwner { require(_rewardEndTimestamp > rewardStartTimestamp, "New end time must be after start timestamp"); rewardEndTimestamp = _rewardEndTimestamp; massUpdatePools(); emit SetRewardEndTimestamp(_rewardEndTimestamp); } /// Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolIds.length; for (uint256 i = 0; i < length; ++i) { updatePool(poolIds[i]); } } /// @notice Update reward variables of the given pool. /// @param _pid The index of the pool function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTime) { return; } (uint256 lpSupply, ) = craftsman.userInfo(_pid, address(craftsmanV2)); if (lpSupply == 0) { pool.lastRewardTime = block.timestamp; return; } uint256 multiplier = _getMultiplier(pool.lastRewardTime, block.timestamp); uint256 reward = multiplier.mul(rewardPerSecond).mul(pool.allocPoint).div(totalAllocPoint); pool.accRewardPerShare = pool.accRewardPerShare.add((reward.mul(ACC_TOKEN_PRECISION) / lpSupply)); pool.lastRewardTime = block.timestamp; } /// @dev get the number of seconds passed since the last reward /// @param _lastRewardTime pool.lastRewardTime /// @param _currentTimestamp - block.timestamp function _getMultiplier(uint256 _lastRewardTime, uint256 _currentTimestamp) internal view returns (uint256) { // Scenario 1: Not started yet if (block.timestamp < rewardStartTimestamp) { return 0; } // Scenario 2: Reward started and not ended. (on-going) if (_currentTimestamp <= rewardEndTimestamp) { return _currentTimestamp.sub(_lastRewardTime); } // Scenario 3: pool's last reward already over rewardEndTimestamp if (_lastRewardTime >= rewardEndTimestamp) { return 0; } // Scenario 4: reward ended, calculate the diff from last claim return rewardEndTimestamp.sub(_lastRewardTime); } }
[{"inputs":[{"internalType":"contract ERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"},{"internalType":"uint256","name":"_rewardStartTimestamp","type":"uint256"},{"internalType":"uint256","name":"_rewardEndTimestamp","type":"uint256"},{"internalType":"contract ICraftsman","name":"_craftsman","type":"address"},{"internalType":"contract ICraftsman","name":"_craftsmanV2","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"AddPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyRewardWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pending","type":"uint256"}],"name":"OnVVSReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"SetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardEndTimestamp","type":"uint256"}],"name":"SetRewardEndTimestamp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerSecond","type":"uint256"}],"name":"SetRewardPerSecond","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardStartTimestamp","type":"uint256"}],"name":"SetRewardStartTimestamp","type":"event"},{"inputs":[],"name":"ACC_TOKEN_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"craftsman","outputs":[{"internalType":"contract ICraftsman","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"craftsmanV2","outputs":[{"internalType":"contract ICraftsman","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_currentAmount","type":"uint256"}],"name":"onVVSReward","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":"pendingToken","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"pools","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardEndTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardEndTimestamp","type":"uint256"}],"name":"setRewardEndTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"}],"name":"setRewardPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardStartTimestamp","type":"uint256"}],"name":"setRewardStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e06040523480156200001157600080fd5b5060405162001cea38038062001cea833981810160405260c08110156200003757600080fd5b508051602082015160408301516060840151608085015160a0909501519394929391929091600062000068620001e0565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606087811b821660805260058790556006869055600785905583811b821660a05282901b1660c0526040805163313ce56760e01b815290516000916001600160a01b0389169163313ce56791600480820192602092909190829003018186803b1580156200012857600080fd5b505afa1580156200013d573d6000803e3d6000fd5b505050506040513d60208110156200015457600080fd5b505160ff16905060248110620001b1576040805162461bcd60e51b815260206004820152601660248201527f4d75737420626520696e666572696f7220746f20333600000000000000000000604482015290519081900360640190fd5b620001cc816024620001e460201b6200138f1790919060201c565b600a0a600855506200024295505050505050565b3390565b6000828211156200023c576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60805160601c60a05160601c60c05160601c611a40620002aa6000398061078652806108b252806109fa5280610f205280610fd752806113675250806105de52806107b852806109ca5250806106b85280610976528061108652806113435250611a406000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c8063715018a6116100de57806393f1a40b11610097578063f577988e11610071578063f577988e146103e5578063f7c618c114610402578063f861306e1461040a578063fcb685bc1461041257610173565b806393f1a40b1461038b578063eea01604146103b7578063f2fde38b146103bf57610173565b8063715018a61461031c578063823c27ff146103245780638b183040146103415780638bc1d8c0146103735780638da5cb5b1461037b5780638f10369a1461038357610173565b806348e43af41161013057806348e43af41461024357806351eb05a614610292578063630b5ba1146102af57806364482f79146102b757806366da5815146102e257806369883b4e146102ff57610173565b806307f6a6c214610178578063081e3eda146101a55780631526fe27146101bf57806317caf6f1146101fa57806327c2bca8146102025780633279beab14610226575b600080fd5b6101a36004803603606081101561018e57600080fd5b5080359060208101359060400135151561041a565b005b6101ad6105b0565b60408051918252519081900360200190f35b6101dc600480360360208110156101d557600080fd5b50356105b6565b60408051938452602084019290925282820152519081900360600190f35b6101ad6105d6565b61020a6105dc565b604080516001600160a01b039092168252519081900360200190f35b6101a36004803603602081101561023c57600080fd5b5035610600565b61026f6004803603604081101561025957600080fd5b50803590602001356001600160a01b0316610718565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6101a3600480360360208110156102a857600080fd5b50356109a5565b6101a3610b18565b6101a3600480360360608110156102cd57600080fd5b50803590602081013590604001351515610b52565b6101a3600480360360208110156102f857600080fd5b5035610c38565b6101ad6004803603602081101561031557600080fd5b5035610cdd565b6101a3610cfb565b6101a36004803603602081101561033a57600080fd5b5035610da7565b6101a36004803603606081101561035757600080fd5b508035906001600160a01b036020820135169060400135610f15565b6101ad61111d565b61020a611123565b6101ad611132565b6101ad600480360360408110156103a157600080fd5b50803590602001356001600160a01b0316611138565b6101ad611155565b6101a3600480360360208110156103d557600080fd5b50356001600160a01b031661115b565b6101a3600480360360208110156103fb57600080fd5b503561125d565b61020a611341565b61020a611365565b6101ad611389565b6104226113f1565b6001600160a01b0316610433611123565b6001600160a01b03161461047c576040805162461bcd60e51b81526020600482018190526024820152600080516020611916833981519152604482015290519081900360640190fd5b60008281526001602081905260409091200154156104d7576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c20616c72656164792065786973747360681b604482015290519081900360640190fd5b80156104e5576104e5610b18565b600060065442116104f8576006546104fa565b425b60045490915061050a90856113f5565b60045560408051606081018252858152602080820184815260008385018181528882526001808552868320955186559251858401555160029485015583549182018455929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9091018590558151868152915185927fa6b36ea399c1eae2ba98a011138f78722b48f46ad93349269348ccc6e8f1cced92908290030190a250505050565b60025490565b600160208190526000918252604090912080549181015460029091015483565b60045481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6106086113f1565b6001600160a01b0316610619611123565b6001600160a01b031614610662576040805162461bcd60e51b81526020600482018190526024820152600080516020611916833981519152604482015290519081900360640190fd5b60075442116106ab576040805162461bcd60e51b815260206004820152601060248201526f14995dd85c99081b9bdd08195b99195960821b604482015290519081900360640190fd5b6106df6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383611456565b60408051828152905133917f2d4434bb59801e733e9ce3df40b0c5518861a5fcdeec1906e83e03c755872b42919081900360200190a250565b600080610723611887565b506000848152600160208181526040808420815160608101835281548152938101548484015260020154838201908152888552600383528185206001600160a01b03808a1687529352818520905182516393f1a40b60e01b8152600481018b90527f000000000000000000000000000000000000000000000000000000000000000085166024820152835195969295919492937f0000000000000000000000000000000000000000000000000000000000000000909316926393f1a40b92604480840193829003018186803b1580156107fb57600080fd5b505afa15801561080f573d6000803e3d6000fd5b505050506040513d604081101561082557600080fd5b505160208501519091504211801561083c57508015155b156108ae5760006108518560200151426114ad565b9050600061088460045461087e8860000151610878600554876114f990919063ffffffff16565b906114f9565b90611552565b90506108a96108a28461087e600854856114f990919063ffffffff16565b85906113f5565b935050505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166393f1a40b8a8a6040518363ffffffff1660e01b815260040180838152602001826001600160a01b0316815260200192505050604080518083038186803b15801561092457600080fd5b505afa158015610938573d6000803e3d6000fd5b505050506040513d604081101561094e57600080fd5b50518454600854919250600091610974919061096e9061087e86896114f9565b9061138f565b7f00000000000000000000000000000000000000000000000000000000000000009b909a5098505050505050505050565b60008181526001602081905260409091209081015442116109c65750610b15565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166393f1a40b847f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b815260040180838152602001826001600160a01b0316815260200192505050604080518083038186803b158015610a5c57600080fd5b505afa158015610a70573d6000803e3d6000fd5b505050506040513d6040811015610a8657600080fd5b5051905080610a9c575042600190910155610b15565b6000610aac8360010154426114ad565b90506000610ad360045461087e8660000154610878600554876114f990919063ffffffff16565b9050610b0283610aee600854846114f990919063ffffffff16565b81610af557fe5b60028701549190046113f5565b6002850155505042600190920191909155505b50565b60025460005b81811015610b4e57610b4660028281548110610b3657fe5b90600052602060002001546109a5565b600101610b1e565b5050565b610b5a6113f1565b6001600160a01b0316610b6b611123565b6001600160a01b031614610bb4576040805162461bcd60e51b81526020600482018190526024820152600080516020611916833981519152604482015290519081900360640190fd5b8015610bc257610bc2610b18565b600083815260016020526040902054600454610be9918491610be39161138f565b906113f5565b6004556000838152600160209081526040918290208490558151848152915185927fc0cfd54d2de2b55f1e6e108d3ec53ff0a1abe6055401d32c61e9433b747ef9f892908290030190a2505050565b610c406113f1565b6001600160a01b0316610c51611123565b6001600160a01b031614610c9a576040805162461bcd60e51b81526020600482018190526024820152600080516020611916833981519152604482015290519081900360640190fd5b610ca2610b18565b60058190556040805182815290517f9981f93efb1f00e191e4911e94be7586e0643ea2948cd594baa6c3fe23ae654d9181900360200190a150565b60028181548110610cea57fe5b600091825260209091200154905081565b610d036113f1565b6001600160a01b0316610d14611123565b6001600160a01b031614610d5d576040805162461bcd60e51b81526020600482018190526024820152600080516020611916833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610daf6113f1565b6001600160a01b0316610dc0611123565b6001600160a01b031614610e09576040805162461bcd60e51b81526020600482018190526024820152600080516020611916833981519152604482015290519081900360640190fd5b6006544210610e54576040805162461bcd60e51b815260206004820152601260248201527114995dd85c99081a185cc81cdd185c9d195960721b604482015290519081900360640190fd5b804210610e925760405162461bcd60e51b815260040180806020018281038252602e8152602001806119dd602e913960400191505060405180910390fd5b8060075411610ed25760405162461bcd60e51b815260040180806020018281038252602b81526020018061195e602b913960400191505060405180910390fd5b6006819055610edf610b18565b6040805182815290517f333fbfe183fcd0d2b5c40ad00a9aea8f2ef8d7187c5e0d7c76f40b060286b87c9181900360200190a150565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f7c5760405162461bcd60e51b81526004018080602001828103825260288152602001806119366028913960400191505060405180910390fd5b610f85836109a5565b6000838152600160209081526040808320600383528184206001600160a01b038088168087529190945282852083516393f1a40b60e01b8152600481018a9052602481019290925283519295909490937f0000000000000000000000000000000000000000000000000000000000000000909116926393f1a40b926044808201939291829003018186803b15801561101c57600080fd5b505afa158015611030573d6000803e3d6000fd5b505050506040513d604081101561104657600080fd5b50519050600081156110ad57611077836000015461096e60085461087e8860020154876114f990919063ffffffff16565b90506110ad6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168783611456565b6110ca60085461087e8660020154886114f990919063ffffffff16565b8355604080518681526020810183905281516001600160a01b038916928a927fa5d23287037261ad22a2e3d11de58347493136c30d30cb40e1d1f746b69962b5929081900390910190a350505050505050565b60075481565b6000546001600160a01b031690565b60055481565b600360209081526000928352604080842090915290825290205481565b60085481565b6111636113f1565b6001600160a01b0316611174611123565b6001600160a01b0316146111bd576040805162461bcd60e51b81526020600482018190526024820152600080516020611916833981519152604482015290519081900360640190fd5b6001600160a01b0381166112025760405162461bcd60e51b81526004018080602001828103825260268152602001806118a96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6112656113f1565b6001600160a01b0316611276611123565b6001600160a01b0316146112bf576040805162461bcd60e51b81526020600482018190526024820152600080516020611916833981519152604482015290519081900360640190fd5b60065481116112ff5760405162461bcd60e51b815260040180806020018281038252602a8152602001806119b3602a913960400191505060405180910390fd5b600781905561130c610b18565b6040805182815290517ec120dc5e082694674c24ab7b88010f8ec91c9cfa404fc7b0418d5d267468ec9181900360200190a150565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60065481565b6000828211156113e6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b3390565b60008282018381101561144f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526114a89084906115b9565b505050565b60006006544210156114c1575060006113eb565b60075482116114db576114d4828461138f565b90506113eb565b60075483106114ec575060006113eb565b60075461144f908461138f565b600082611508575060006113eb565b8282028284828161151557fe5b041461144f5760405162461bcd60e51b81526004018080602001828103825260218152602001806118f56021913960400191505060405180910390fd5b60008082116115a8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816115b157fe5b049392505050565b606061160e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661166a9092919063ffffffff16565b8051909150156114a85780806020019051602081101561162d57600080fd5b50516114a85760405162461bcd60e51b815260040180806020018281038252602a815260200180611989602a913960400191505060405180910390fd5b60606116798484600085611681565b949350505050565b6060824710156116c25760405162461bcd60e51b81526004018080602001828103825260268152602001806118cf6026913960400191505060405180910390fd5b6116cb856117dd565b61171c576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061175b5780518252601f19909201916020918201910161173c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146117bd576040519150601f19603f3d011682016040523d82523d6000602084013e6117c2565b606091505b50915091506117d28282866117e3565b979650505050505050565b3b151590565b606083156117f257508161144f565b8251156118025782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561184c578181015183820152602001611834565b50505050905090810190601f1680156118795780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060600160405280600081526020016000815260200160008152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724f6e6c79204372616674736d616e56322063616e2063616c6c20746869732066756e6374696f6e2e4e65772073746172742074696d65206d757374206265206265666f726520656e642074696d657374616d705361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644e657720656e642074696d65206d7573742062652061667465722073746172742074696d657374616d704e65772073746172742074696d65206d7573742062652061667465722063757272656e742074696d657374616d70a2646970667358221220eda6eacc812c4671d4e544f377debb6bff87de93a7800f70c64bc66dea9204e364736f6c634300060c0033000000000000000000000000db7d0a1ec37de1de924f8e8adac6ed338d4404e900000000000000000000000000000000000000000000000000e470e2338fa0000000000000000000000000000000000000000000000000000000000063c7c32000000000000000000000000000000000000000000000000000000000643e6a20000000000000000000000000dccd6455ae04b03d785f12196b492b18129564bc000000000000000000000000bc149c62efe8afc61728fc58b1b66a0661712e76
Deployed ByteCode Sourcemap
38418:10401:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43327:645;;;;;;;;;;;;;;;;-1:-1:-1;43327:645:0;;;;;;;;;;;;;;:::i;:::-;;43056:99;;;:::i;:::-;;;;;;;;;;;;;;;;38890:44;;;;;;;;;;;;;;;;-1:-1:-1;38890:44:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;39199:30;;;:::i;39527:37::-;;;:::i;:::-;;;;-1:-1:-1;;;;;39527:37:0;;;;;;;;;;;;;;42324:278;;;;;;;;;;;;;;;;-1:-1:-1;42324:278:0;;:::i;44870:953::-;;;;;;;;;;;;;;;;-1:-1:-1;44870:953:0;;;;;;-1:-1:-1;;;;;44870:953:0;;:::i;:::-;;;;-1:-1:-1;;;;;44870:953:0;;;;;;;;;;;;;;;;;;;;;47175:724;;;;;;;;;;;;;;;;-1:-1:-1;47175:724:0;;:::i;46884:180::-;;;:::i;44279:382::-;;;;;;;;;;;;;;;;-1:-1:-1;44279:382:0;;;;;;;;;;;;;;:::i;42796:206::-;;;;;;;;;;;;;;;;-1:-1:-1;42796:206:0;;:::i;38943:24::-;;;;;;;;;;;;;;;;-1:-1:-1;38943:24:0;;:::i;2861:148::-;;;:::i;45922:536::-;;;;;;;;;;;;;;;;-1:-1:-1;45922:536:0;;:::i;41453:743::-;;;;;;;;;;;;;;;;-1:-1:-1;41453:743:0;;;-1:-1:-1;;;;;41453:743:0;;;;;;;;;;:::i;39385:33::-;;;:::i;2210:87::-;;;:::i;39238:30::-;;;:::i;39034:64::-;;;;;;;;;;;;;;;;-1:-1:-1;39034:64:0;;;;;;-1:-1:-1;;;;;39034:64:0;;:::i;39464:34::-;;;:::i;3164:244::-;;;;;;;;;;;;;;;;-1:-1:-1;3164:244:0;-1:-1:-1;;;;;3164:244:0;;:::i;46466:334::-;;;;;;;;;;;;;;;;-1:-1:-1;46466:334:0;;:::i;38847:34::-;;;:::i;39571:39::-;;;:::i;39302:35::-;;;:::i;43327:645::-;2441:12;:10;:12::i;:::-;-1:-1:-1;;;;;2430:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2430:23:0;;2422:68;;;;;-1:-1:-1;;;2422:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2422:68:0;;;;;;;;;;;;;;;43463:14:::1;::::0;;;:8:::1;:14;::::0;;;;;;;:29:::1;::::0;:34;43455:66:::1;;;::::0;;-1:-1:-1;;;43455:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43455:66:0;;;;;;;;;;;;;::::1;;43538:11;43534:61;;;43566:17;:15;:17::i;:::-;43607:22;43650:20;;43632:15;:38;:79;;43691:20;;43632:79;;;43673:15;43632:79;43740:15;::::0;43607:104;;-1:-1:-1;43740:32:0::1;::::0;43760:11;43740:19:::1;:32::i;:::-;43722:15;:50:::0;43802:89:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;43802:89:0;;;;;;43785:14;;;:8:::1;:14:::0;;;;;;:106;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;43902:18;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;43938:26;;;;;;;43794:4;;43938:26:::1;::::0;;;;;;;::::1;2501:1;43327:645:::0;;;:::o;43056:99::-;43133:7;:14;;43056:99::o;38890:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39199:30::-;;;;:::o;39527:37::-;;;:::o;42324:278::-;2441:12;:10;:12::i;:::-;-1:-1:-1;;;;;2430:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2430:23:0;;2422:68;;;;;-1:-1:-1;;;2422:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2422:68:0;;;;;;;;;;;;;;;42430:18:::1;;42412:15;:36;42404:65;;;::::0;;-1:-1:-1;;;42404:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42404:65:0;;;;;;;;;;;;;::::1;;42480:54;-1:-1:-1::0;;;;;42480:11:0::1;:24;42513:10;42526:7:::0;42480:24:::1;:54::i;:::-;42550:44;::::0;;;;;;;42574:10:::1;::::0;42550:44:::1;::::0;;;;;::::1;::::0;;::::1;42324:278:::0;:::o;44870:953::-;44942:7;44951;44971:20;;:::i;:::-;-1:-1:-1;44994:14:0;;;;:8;:14;;;;;;;;44971:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;45043:14;;;:8;:14;;;;;-1:-1:-1;;;;;45043:21:0;;;;;;;;;;45103:22;;45159:46;;-1:-1:-1;;;45159:46:0;;;;;;;;45192:11;45159:46;;;;;;;;44971:37;;45043:21;;45103:22;;44994:14;;45159:9;:18;;;;;;:46;;;;;;;;;;:18;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45159:46:0;;45238:19;;;45159:46;;-1:-1:-1;45220:15:0;:37;:54;;;;-1:-1:-1;45261:13:0;;;45220:54;45216:370;;;45291:18;45312:52;45327:4;:19;;;45348:15;45312:14;:52::i;:::-;45291:73;;45379:14;45396:73;45453:15;;45396:52;45432:4;:15;;;45396:31;45411:15;;45396:10;:14;;:31;;;;:::i;:::-;:35;;:52::i;:::-;:56;;:73::i;:::-;45379:90;;45506:68;45528:45;45564:8;45528:31;45539:19;;45528:6;:10;;:31;;;;:::i;:45::-;45506:17;;:21;:68::i;:::-;45486:88;;45216:370;;;45599:18;45623:11;-1:-1:-1;;;;;45623:20:0;;45644:4;45650:5;45623:33;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45623:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45623:33:0;45748:15;;45723:19;;45623:33;;-1:-1:-1;45667:15:0;;45685:79;;45748:15;45685:58;;:33;45623;45700:17;45685:14;:33::i;:58::-;:62;;:79::i;:::-;45793:11;;45667:97;;-1:-1:-1;44870:953:0;-1:-1:-1;;;;;;;;;44870:953:0:o;47175:724::-;47227:21;47251:14;;;:8;:14;;;;;;;;47299:19;;;;47280:15;:38;47276:77;;47335:7;;;47276:77;47366:16;47388:9;-1:-1:-1;;;;;47388:18:0;;47407:4;47421:11;47388:46;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47388:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47388:46:0;;-1:-1:-1;47449:13:0;47445:104;;-1:-1:-1;47501:15:0;47479:19;;;;:37;47531:7;;47445:104;47561:18;47582:52;47597:4;:19;;;47618:15;47582:14;:52::i;:::-;47561:73;;47645:14;47662:73;47719:15;;47662:52;47698:4;:15;;;47662:31;47677:15;;47662:10;:14;;:31;;;;:::i;:73::-;47645:90;;47771:72;47833:8;47799:31;47810:19;;47799:6;:10;;:31;;;;:::i;:::-;:42;;;;;47771:22;;;;;47799:42;;47771:26;:72::i;:::-;47746:22;;;:97;-1:-1:-1;;47876:15:0;47854:19;;;;:37;;;;-1:-1:-1;47175:724:0;;:::o;46884:180::-;46946:7;:14;46929;46971:86;46995:6;46991:1;:10;46971:86;;;47023:22;47034:7;47042:1;47034:10;;;;;;;;;;;;;;;;47023;:22::i;:::-;47003:3;;46971:86;;;;46884:180;:::o;44279:382::-;2441:12;:10;:12::i;:::-;-1:-1:-1;;;;;2430:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2430:23:0;;2422:68;;;;;-1:-1:-1;;;2422:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2422:68:0;;;;;;;;;;;;;;;44411:11:::1;44407:61;;;44439:17;:15;:17::i;:::-;44518:14;::::0;;;:8:::1;:14;::::0;;;;:25;44498:15:::1;::::0;:63:::1;::::0;44549:11;;44498:46:::1;::::0;:19:::1;:46::i;:::-;:50:::0;::::1;:63::i;:::-;44480:15;:81:::0;44572:14:::1;::::0;;;:8:::1;:14;::::0;;;;;;;;:39;;;44627:26;;;;;;;44581:4;;44627:26:::1;::::0;;;;;;;::::1;44279:382:::0;;;:::o;42796:206::-;2441:12;:10;:12::i;:::-;-1:-1:-1;;;;;2430:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2430:23:0;;2422:68;;;;;-1:-1:-1;;;2422:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2422:68:0;;;;;;;;;;;;;;;42878:17:::1;:15;:17::i;:::-;42908:15;:34:::0;;;42958:36:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;42796:206:::0;:::o;38943:24::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38943:24:0;:::o;2861:148::-;2441:12;:10;:12::i;:::-;-1:-1:-1;;;;;2430:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2430:23:0;;2422:68;;;;;-1:-1:-1;;;2422:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2422:68:0;;;;;;;;;;;;;;;2968:1:::1;2952:6:::0;;2931:40:::1;::::0;-1:-1:-1;;;;;2952:6:0;;::::1;::::0;2931:40:::1;::::0;2968:1;;2931:40:::1;2999:1;2982:19:::0;;-1:-1:-1;;;;;;2982:19:0::1;::::0;;2861:148::o;45922:536::-;2441:12;:10;:12::i;:::-;-1:-1:-1;;;;;2430:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2430:23:0;;2422:68;;;;;-1:-1:-1;;;2422:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2422:68:0;;;;;;;;;;;;;;;46040:20:::1;;46022:15;:38;46014:69;;;::::0;;-1:-1:-1;;;46014:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;46014:69:0;;;;;;;;;;;;;::::1;;46120:21;46102:15;:39;46094:98;;;;-1:-1:-1::0;;;46094:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46232:21;46211:18;;:42;46203:98;;;;-1:-1:-1::0;;;46203:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46314:20;:44:::0;;;46371:17:::1;:15;:17::i;:::-;46404:46;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;45922:536:::0;:::o;41453:743::-;40214:10;-1:-1:-1;;;;;40236:11:0;40214:34;;40206:87;;;;-1:-1:-1;;;40206:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41597:16:::1;41608:4;41597:10;:16::i;:::-;41626:21;41650:14:::0;;;:8:::1;:14;::::0;;;;;;;41699:8:::1;:14:::0;;;;;-1:-1:-1;;;;;41699:21:0;;::::1;::::0;;;;;;;;;;41756:33;;-1:-1:-1;;;41756:33:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;41650:14;;41699:21;;41626;;41756:11:::1;:20:::0;;::::1;::::0;::::1;::::0;:33;;;;;41650:14;41756:33;;;;;;:20;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41756:33:0;;-1:-1:-1;41802:15:0::1;41832:14:::0;;41828:198:::1;;41873:86;41943:4;:15;;;41874:63;41917:19;;41874:38;41889:4;:22;;;41874:10;:14;;:38;;;;:::i;41873:86::-;41863:96:::0;-1:-1:-1;41974:40:0::1;-1:-1:-1::0;;;;;41974:11:0::1;:24;41999:5:::0;41863:96;41974:24:::1;:40::i;:::-;42056:67;42103:19;;42056:42;42075:4;:22;;;42056:14;:18;;:42;;;;:::i;:67::-;42038:85:::0;;42139:49:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;42139:49:0;::::1;::::0;42151:4;;42139:49:::1;::::0;;;;;;;;;::::1;40304:1;;;;41453:743:::0;;;:::o;39385:33::-;;;;:::o;2210:87::-;2256:7;2283:6;-1:-1:-1;;;;;2283:6:0;2210:87;:::o;39238:30::-;;;;:::o;39034:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;39464:34::-;;;;:::o;3164:244::-;2441:12;:10;:12::i;:::-;-1:-1:-1;;;;;2430:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2430:23:0;;2422:68;;;;;-1:-1:-1;;;2422:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2422:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;3253:22:0;::::1;3245:73;;;;-1:-1:-1::0;;;3245:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3355:6;::::0;;3334:38:::1;::::0;-1:-1:-1;;;;;3334:38:0;;::::1;::::0;3355:6;::::1;::::0;3334:38:::1;::::0;::::1;3383:6;:17:::0;;-1:-1:-1;;;;;;3383:17:0::1;-1:-1:-1::0;;;;;3383:17:0;;;::::1;::::0;;;::::1;::::0;;3164:244::o;46466:334::-;2441:12;:10;:12::i;:::-;-1:-1:-1;;;;;2430:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2430:23:0;;2422:68;;;;;-1:-1:-1;;;2422:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2422:68:0;;;;;;;;;;;;;;;46584:20:::1;;46562:19;:42;46554:97;;;;-1:-1:-1::0;;;46554:97:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46664:18;:40:::0;;;46717:17:::1;:15;:17::i;:::-;46750:42;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;46466:334:::0;:::o;38847:34::-;;;:::o;39571:39::-;;;:::o;39302:35::-;;;;:::o;6681:158::-;6739:7;6772:1;6767;:6;;6759:49;;;;;-1:-1:-1;;;6759:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6826:5:0;;;6681:158;;;;;:::o;738:106::-;826:10;738:106;:::o;6219:179::-;6277:7;6309:5;;;6333:6;;;;6325:46;;;;;-1:-1:-1;;;6325:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6389:1;6219:179;-1:-1:-1;;;6219:179:0:o;33461:177::-;33571:58;;;-1:-1:-1;;;;;33571:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33571:58:0;-1:-1:-1;;;33571:58:0;;;33544:86;;33564:5;;33544:19;:86::i;:::-;33461:177;;;:::o;48080:736::-;48179:7;48261:20;;48243:15;:38;48239:79;;;-1:-1:-1;48305:1:0;48298:8;;48239:79;48420:18;;48399:17;:39;48395:117;;48462:38;:17;48484:15;48462:21;:38::i;:::-;48455:45;;;;48395:117;48622:18;;48603:15;:37;48599:78;;-1:-1:-1;48664:1:0;48657:8;;48599:78;48769:18;;:39;;48792:15;48769:22;:39::i;7098:220::-;7156:7;7180:6;7176:20;;-1:-1:-1;7195:1:0;7188:8;;7176:20;7219:5;;;7223:1;7219;:5;:1;7243:5;;;;;:10;7235:56;;;;-1:-1:-1;;;7235:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7796:153;7854:7;7886:1;7882;:5;7874:44;;;;;-1:-1:-1;;;7874:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7940:1;7936;:5;;;;;;;7796:153;-1:-1:-1;;;7796:153:0:o;35766:761::-;36190:23;36216:69;36244:4;36216:69;;;;;;;;;;;;;;;;;36224:5;-1:-1:-1;;;;;36216:27:0;;;:69;;;;;:::i;:::-;36300:17;;36190:95;;-1:-1:-1;36300:21:0;36296:224;;36442:10;36431:30;;;;;;;;;;;;;;;-1:-1:-1;36431:30:0;36423:85;;;;-1:-1:-1;;;36423:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28449:195;28552:12;28584:52;28606:6;28614:4;28620:1;28623:12;28584:21;:52::i;:::-;28577:59;28449:195;-1:-1:-1;;;;28449:195:0:o;29501:530::-;29628:12;29686:5;29661:21;:30;;29653:81;;;;-1:-1:-1;;;29653:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29753:18;29764:6;29753:10;:18::i;:::-;29745:60;;;;;-1:-1:-1;;;29745:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29879:12;29893:23;29920:6;-1:-1:-1;;;;;29920:11:0;29940:5;29948:4;29920:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29920:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29878:75;;;;29971:52;29989:7;29998:10;30010:12;29971:17;:52::i;:::-;29964:59;29501:530;-1:-1:-1;;;;;;;29501:530:0:o;25531:422::-;25898:20;25937:8;;;25531:422::o;32041:742::-;32156:12;32185:7;32181:595;;;-1:-1:-1;32216:10:0;32209:17;;32181:595;32330:17;;:21;32326:439;;32593:10;32587:17;32654:15;32641:10;32637:2;32633:19;32626:44;32541:148;32736:12;32729:20;;-1:-1:-1;;;32729:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://eda6eacc812c4671d4e544f377debb6bff87de93a7800f70c64bc66dea9204e3
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.