ERC-20
Overview
Max Total Supply
2.903826418206619113 REETH
Holders
31
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
1.87299610659265887 REETHValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
ReethToken
Compiler Version
v0.6.6+commit.6c089d02
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-03 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * 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/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * 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); /** * 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); /** * 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); /** * 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); /** * 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); /** * 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/math/SafeMath.sol pragma solidity ^0.6.0; /** * 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 { /** * 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; } /** * Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * 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); uint256 c = a - b; return c; } /** * 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) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.6.0; /** * 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 RebaseableERC20 is Context, IERC20 { using SafeMath for uint256; uint256 internal _totalSupply; string private _name; string private _symbol; uint8 private _decimals; uint256 public constant internalDecimals = 1e24; /** * @notice Used for percentage maths */ uint256 public constant BASE = 1e18; /** * @notice Scaling factor that adjusts everyone's balances */ uint256 public reethScalingFactor; mapping (address => uint256) internal _reethBalances; mapping (address => mapping (address => uint256)) internal _allowedFragments; uint256 public initSupply; /** * 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; } function _initialize(address recipient, uint256 initialSupply) internal { reethScalingFactor = BASE; initSupply = _fragmentToReeth(initialSupply); _totalSupply = initialSupply; _reethBalances[recipient] = initSupply; emit Transfer(address(0), recipient, initialSupply); } /** * @notice Event emitted when tokens are rebased */ // Prevent sending to this address or 0 address modifier validRecipient(address to) { require(to != address(0) && to != address(this), "Not a valid recipient"); _; } /** * @notice Computes the current max scaling factor */ function maxScalingFactor() external view returns (uint256) { return _maxScalingFactor(); } function _maxScalingFactor() internal view returns (uint256) { // scaling factor can only go up to 2**256-1 = initSupply * reethScalingFactor // this is used to check if reethScalingFactor will be too high to compute balances when rebasing. return uint256(-1) / initSupply; } /** * Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * 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 returns (uint8) { return _decimals; } /** * See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _reethToFragment(_reethBalances[account]); } /** /** * 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; } /** * See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowedFragments[owner][spender]; } /** * 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; } /** * 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(), _allowedFragments[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * 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, _allowedFragments[_msgSender()][spender].add(addedValue)); return true; } /** * 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, _allowedFragments[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * 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 validRecipient(recipient) { require(sender != address(0), "ERC20: transfer from the zero address"); _transferHook(); // underlying balance is stored in reeth subunit, so divide by current scaling factor // note, this means as scaling factor grows, dust will be untransferrable. // minimum transfer value == reethScalingFactor / 1e24; // get amount in underlying uint256 reethValue = _fragmentToReeth(amount); // sub from balance of sender _reethBalances[sender] = _reethBalances[sender].sub(reethValue, "ERC20: transfer amount exceeds balance"); // add to balance of receiver _reethBalances[recipient] = _reethBalances[recipient].add(reethValue); emit Transfer(sender, recipient, amount); } /** 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 to, uint256 amount) internal virtual validRecipient(to) { // increase totalSupply _totalSupply = _totalSupply.add(amount); // get underlying value uint256 reethValue = _fragmentToReeth(amount); // increase initSupply initSupply = initSupply.add(reethValue); // make sure the mint didnt push maxScalingFactor too low require(reethScalingFactor <= _maxScalingFactor(), "max scaling factor too low"); // add balance _reethBalances[to] = _reethBalances[to].add(reethValue); emit Transfer(address(0), to, amount); } /** * 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"); // decrease totalSupply _totalSupply = _totalSupply.sub(amount); // get underlying value uint256 reethValue = _fragmentToReeth(amount); // decrease initSupply initSupply = initSupply.sub(reethValue); // probably unnecessary check require(reethScalingFactor <= _maxScalingFactor(), "max scaling factor too low"); // sub balance _reethBalances[account] = _reethBalances[account].sub(reethValue, "ERC20: burn amount exceeds balance"); emit Transfer(account, address(0), amount); } /** * 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 virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowedFragments[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * 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 { _decimals = decimals_; } // Scaling functions function reethToFragment(uint256 val) external view returns (uint256) { return _reethToFragment(val); } function fragmentToReeth(uint256 val) external view returns (uint256) { return _fragmentToReeth(val); } function _reethToFragment(uint256 val) internal view returns (uint256) { return val.mul(reethScalingFactor).div(internalDecimals); } function _fragmentToReeth(uint256 val) internal view returns (uint256) { return val.mul(internalDecimals).div(reethScalingFactor); } /** * Hook that is called before any transfer of tokens. * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _transferHook() internal virtual returns (bool) {} } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); 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/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.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: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * 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. */ contract Ownable is Context { address private _owner; event GovernanceTransferred(address indexed previousOwner, address indexed newOwner); /** * Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit GovernanceTransferred(address(0), msgSender); } /** * Returns the address of the current owner. */ function governance() public view returns (address) { return _owner; } /** * Throws if called by any account other than the owner. */ modifier onlyGovernance() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function _transferGovernance(address newOwner) internal virtual onlyGovernance { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit GovernanceTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/ReethToken.sol pragma solidity =0.6.6; interface MonetaryPolicyInterface{ // This function is called whenever reeth is transferred function reethTransferActions() external; } // Reeth token whose supply can be altered by its price compared to ETH contract ReethToken is RebaseableERC20("Reeth Token", "REETH"), Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; address public monetaryPolicy; uint256 private _latestEpoch; bool public rebaseable; struct Epoch { uint256 price; int256 supplyChangeAmount; uint256 rebaseTime; } // These are addresses that are allowed to mint new tokens mapping (address => bool) internal _allowedMinters; mapping (uint256 => Epoch) internal _epochDetails; modifier onlyMonetaryPolicy() { require(_msgSender() == monetaryPolicy, "Not monetary policy"); _; } modifier onlyMinters() { require(isMinter(_msgSender()) == true, "Not a minter"); _; } event Rebase(uint256 epoch, uint256 currentPrice, int256 supplyChangeAmount, uint256 currentSupply); constructor(uint256 _initialSupply) public { _initialize(_msgSender(), _initialSupply); } function isMinter(address _addr) public view returns (bool) { return _allowedMinters[_addr]; } function latestEpoch() external view returns (uint256) { return _latestEpoch; } function getEpochDetails(uint256 _pos) external view returns (uint256, int256, uint256) { if(_pos == 0) { return (0, 0, 0); } // No epoch available yet as no rebases have happened yet _pos = _pos.sub(1); require(_pos < _latestEpoch, "Epoch doesn't yet exist"); return (_epochDetails[_pos].price, _epochDetails[_pos].supplyChangeAmount, _epochDetails[_pos].rebaseTime); } function isRebaseable() external view returns (bool) { return rebaseable; } // This function is called when tokens are being transferred function _transferHook() internal virtual override returns (bool) { super._transferHook(); // Call parent hook if(monetaryPolicy != address(0)){ MonetaryPolicyInterface(monetaryPolicy).reethTransferActions(); } } function mint(address recipient, uint256 amount) external onlyMinters returns (bool) { _mint(recipient, amount); return true; } // Users can burn their own tokens if they want to function burn(uint256 amount) external returns (bool) { _burn(_msgSender(), amount); return true; } /** * @notice Initiates a new rebase operation based on the current monetary policy */ function rebase( uint256 price, uint256 indexDelta, bool positive ) external onlyMonetaryPolicy returns (uint256) { require(rebaseable == true, "Not yet able to rebase token"); _latestEpoch = _latestEpoch.add(1); uint256 _EpochPos = _latestEpoch.sub(1); // no change if (indexDelta == 0) { emit Rebase(_latestEpoch, price, 0, _totalSupply); _epochDetails[_EpochPos].price = price; _epochDetails[_EpochPos].supplyChangeAmount = 0; _epochDetails[_EpochPos].rebaseTime = now; return _totalSupply; } if (!positive) { // negative rebase, decrease scaling factor reethScalingFactor = reethScalingFactor.mul(BASE.sub(indexDelta)).div(BASE); } else { // positive reabse, increase scaling factor uint256 newScalingFactor = reethScalingFactor.mul(BASE.add(indexDelta)).div(BASE); if (newScalingFactor < _maxScalingFactor()) { reethScalingFactor = newScalingFactor; } else { reethScalingFactor = _maxScalingFactor(); } } // update total supply, correctly uint256 oldSupply = _totalSupply; int256 supplyChange = 0; _totalSupply = _reethToFragment(initSupply); // Calculate the change in tokens if(oldSupply < _totalSupply){ // Expanded supply oldSupply = _totalSupply.sub(oldSupply); supplyChange = int256(oldSupply); }else if(oldSupply > _totalSupply){ // Supply shrank oldSupply = oldSupply.sub(_totalSupply); supplyChange = 0 - int256(oldSupply); } emit Rebase(_latestEpoch, price, supplyChange, _totalSupply); _epochDetails[_EpochPos].price = price; _epochDetails[_EpochPos].supplyChangeAmount = supplyChange; _epochDetails[_EpochPos].rebaseTime = now; return _totalSupply; } // Governance functions function governanceActivateRebasing() external onlyGovernance { require(rebaseable == false, "Already rebaseable"); rebaseable = true; } // Now add some governance functions behind 24 hour timelock // Timelock variables uint256 private _timelockStart; // The start of the timelock to change governance variables uint256 private _timelockType; // The function that needs to be changed uint256 constant TIMELOCK_DURATION = 86400; // Timelock is 24 hours // Reusable timelock variables address private _timelock_address; modifier timelockConditionsMet(uint256 _type) { require(_timelockType == _type, "Timelock not acquired for this function"); _timelockType = 0; // Reset the type once the timelock is used if(rebaseable == true){ require(now >= _timelockStart + TIMELOCK_DURATION, "Timelock time not met"); } _; } // Change the governance // -------------------- function startChangeGovernance(address _address) external onlyGovernance { _timelockStart = now; _timelockType = 1; _timelock_address = _address; } function finishChangeGovernance() external onlyGovernance timelockConditionsMet(1) { _transferGovernance(_timelock_address); } // -------------------- // Add a new minter // -------------------- function startAddMinter(address _address) external onlyGovernance { _timelockStart = now; _timelockType = 2; _timelock_address = _address; } function finishAddMinter() external onlyGovernance timelockConditionsMet(2) { _allowedMinters[_timelock_address] = true; } // -------------------- // Remove a minter // -------------------- function startRemoveMinter(address _address) external onlyGovernance { _timelockStart = now; _timelockType = 3; _timelock_address = _address; } function finishRemoveMinter() external onlyGovernance timelockConditionsMet(3) { _allowedMinters[_timelock_address] = false; } // -------------------- // Change the monetary policy // -------------------- function startChangeMonetaryPolicy(address _address) external onlyGovernance { _timelockStart = now; _timelockType = 4; _timelock_address = _address; } function finishChangeMonetaryPolicy() external onlyGovernance timelockConditionsMet(4) { monetaryPolicy = _timelock_address; } // -------------------- }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_initialSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"GovernanceTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentPrice","type":"uint256"},{"indexed":false,"internalType":"int256","name":"supplyChangeAmount","type":"int256"},{"indexed":false,"internalType":"uint256","name":"currentSupply","type":"uint256"}],"name":"Rebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishAddMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishChangeGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishChangeMonetaryPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishRemoveMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"fragmentToReeth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pos","type":"uint256"}],"name":"getEpochDetails","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceActivateRebasing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"internalDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRebaseable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxScalingFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"monetaryPolicy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"indexDelta","type":"uint256"},{"internalType":"bool","name":"positive","type":"bool"}],"name":"rebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebaseable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reethScalingFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"reethToFragment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"startAddMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"startChangeGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"startChangeMonetaryPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"startRemoveMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620024ef380380620024ef833981810160405260208110156200003757600080fd5b5051604080518082018252600b81526a2932b2ba34102a37b5b2b760a91b6020828101918252835180850190945260058452640a48a8aa8960db1b908401528151919291620000899160019162000361565b5080516200009f90600290602084019062000361565b50506003805460ff19166012179055506000620000c46001600160e01b036200014016565b600880546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce80908290a35062000139620001296001600160e01b036200014016565b826001600160e01b036200014516565b5062000403565b335b90565b670de0b6b3a764000060045562000165816001600160e01b03620001c416565b600781905560008281556001600160a01b038416808252600560209081526040808420949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b600062000205600454620001f169d3c21bcecceda1000000856200020b60201b62001c511790919060201c565b6200027060201b62001caa1790919060201c565b92915050565b6000826200021c5750600062000205565b828202828482816200022a57fe5b0414620002695760405162461bcd60e51b8152600401808060200182810382526021815260200180620024ce6021913960400191505060405180910390fd5b9392505050565b60006200026983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620002ba60201b60201c565b600081836200034a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200030e578181015183820152602001620002f4565b50505050905090810190601f1680156200033c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816200035757fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003a457805160ff1916838001178555620003d4565b82800160010185558215620003d4579182015b82811115620003d4578251825591602001919060010190620003b7565b50620003e2929150620003e6565b5090565b6200014291905b80821115620003e25760008155600101620003ed565b6120bb80620004136000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806364dd48f511610130578063a457c2d7116100b8578063da9182f41161007c578063da9182f414610626578063dd62ed3e1461062e578063e9a3a0591461065c578063ec096c5414610664578063ec342ad01461066c57610227565b8063a457c2d714610583578063a9059cbb146105af578063aa271e1a146105db578063d560cf6014610601578063d5f56d7a1461060957610227565b8063904fe336116100ff578063904fe3361461053d57806395d89b411461054557806397d63f931461054d578063992acccd146105555780639cb118bf1461057b57610227565b806364dd48f5146104dc57806370a08231146104e45780637af548c11461050a5780638e27d7d71461053557610227565b806336125c8f116101b35780634f9b8802116101825780634f9b88021461042957806352cc3f63146104315780635a7f3cb6146104575780635aa6e6751461047d5780635c3d7516146104a157610227565b806336125c8f1461039757806339509351146103b457806340c10f19146103e057806342966c681461040c57610227565b806311d3e6c4116101fa57806311d3e6c41461030d57806318160ddd1461031557806323b872dd1461031d578063313ce56714610353578063339dae101461037157610227565b806304b066531461022c57806306fdde0314610236578063095ea7b3146102b35780630be2e4ee146102f3575b600080fd5b610234610674565b005b61023e610728565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610278578181015183820152602001610260565b50505050905090810190601f1680156102a55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102df600480360360408110156102c957600080fd5b506001600160a01b0381351690602001356107be565b604080519115158252519081900360200190f35b6102fb6107dc565b60408051918252519081900360200190f35b6102fb6107e2565b6102fb6107f1565b6102df6004803603606081101561033357600080fd5b506001600160a01b038135811691602081013590911690604001356107f7565b61035b610885565b6040805160ff9092168252519081900360200190f35b6102346004803603602081101561038757600080fd5b50356001600160a01b031661088e565b6102fb600480360360208110156103ad57600080fd5b5035610911565b6102df600480360360408110156103ca57600080fd5b506001600160a01b03813516906020013561091c565b6102df600480360360408110156103f657600080fd5b506001600160a01b038135169060200135610970565b6102df6004803603602081101561042257600080fd5b50356109d1565b6102346109ec565b6102346004803603602081101561044757600080fd5b50356001600160a01b0316610b14565b6102346004803603602081101561046d57600080fd5b50356001600160a01b0316610b97565b610485610c1a565b604080516001600160a01b039092168252519081900360200190f35b6104be600480360360208110156104b757600080fd5b5035610c29565b60408051938452602084019290925282820152519081900360600190f35b6102fb610cd2565b6102fb600480360360208110156104fa57600080fd5b50356001600160a01b0316610ce0565b6102fb6004803603606081101561052057600080fd5b50803590602081013590604001351515610d02565b610485610fd8565b610234610fe7565b61023e611112565b6102fb611170565b6102346004803603602081101561056b57600080fd5b50356001600160a01b0316611176565b6102fb6111f9565b6102df6004803603604081101561059957600080fd5b506001600160a01b0381351690602001356111ff565b6102df600480360360408110156105c557600080fd5b506001600160a01b03813516906020013561126d565b6102df600480360360208110156105f157600080fd5b50356001600160a01b0316611281565b6102df61129f565b6102fb6004803603602081101561061f57600080fd5b50356112a8565b6102df6112b3565b6102fb6004803603604081101561064457600080fd5b506001600160a01b03813581169160200135166112bc565b6102346112e7565b61023461140f565b6102fb61152a565b61067c611536565b6008546001600160a01b039081169116146106cc576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600b5460ff1615610719576040805162461bcd60e51b8152602060048201526012602482015271416c72656164792072656261736561626c6560701b604482015290519081900360640190fd5b600b805460ff19166001179055565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156107b35780601f10610788576101008083540402835291602001916107b3565b820191906000526020600020905b81548152906001019060200180831161079657829003601f168201915b505050505090505b90565b60006107d26107cb611536565b848461153a565b5060015b92915050565b60045481565b60006107ec611626565b905090565b60005490565b600061080484848461163b565b61087a84610810611536565b61087585604051806060016040528060288152602001611faf602891396001600160a01b038a1660009081526006602052604081209061084e611536565b6001600160a01b03168152602081019190915260400160002054919063ffffffff6117d716565b61153a565b5060015b9392505050565b60035460ff1690565b610896611536565b6008546001600160a01b039081169116146108e6576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556004600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b60006107d68261186e565b60006107d2610929611536565b84610875856006600061093a611536565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61189216565b600061098261097d611536565b611281565b15156001146109c7576040805162461bcd60e51b815260206004820152600c60248201526b2737ba10309036b4b73a32b960a11b604482015290519081900360640190fd5b6107d283836118ec565b60006109e46109de611536565b83611a72565b506001919050565b6109f4611536565b6008546001600160a01b03908116911614610a44576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600380600f5414610a865760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff16151560011415610aef5762015180600e5401421015610aef576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b506010546001600160a01b03166000908152600c60205260409020805460ff19169055565b610b1c611536565b6008546001600160a01b03908116911614610b6c576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556003600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b610b9f611536565b6008546001600160a01b03908116911614610bef576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556001600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031690565b6000808083610c4057506000915081905080610ccb565b610c5184600163ffffffff611bea16565b9350600a548410610ca9576040805162461bcd60e51b815260206004820152601760248201527f45706f636820646f65736e277420796574206578697374000000000000000000604482015290519081900360640190fd5b5050506000818152600d60205260409020805460018201546002909201549091905b9193909250565b69d3c21bcecceda100000081565b6001600160a01b0381166000908152600560205260408120546107d690611c2c565b6009546000906001600160a01b0316610d19611536565b6001600160a01b031614610d6a576040805162461bcd60e51b81526020600482015260136024820152724e6f74206d6f6e657461727920706f6c69637960681b604482015290519081900360640190fd5b600b5460ff161515600114610dc6576040805162461bcd60e51b815260206004820152601c60248201527f4e6f74207965742061626c6520746f2072656261736520746f6b656e00000000604482015290519081900360640190fd5b600a54610dda90600163ffffffff61189216565b600a819055600090610df390600163ffffffff611bea16565b905083610e6d57600a54600080546040805193845260208401899052838101929092526060830152517f50740223231e0ae1928fa374dc4ce56223846191faeb0ea9fb0c66d2f035db119181900360800190a16000908152600d60205260408120858155600181018290554260029091015554905061087e565b82610eb457610eac670de0b6b3a7640000610ea0610e91828863ffffffff611bea16565b6004549063ffffffff611c5116565b9063ffffffff611caa16565b600455610efe565b6000610ed5670de0b6b3a7640000610ea0610e91828963ffffffff61189216565b9050610edf611626565b811015610ef0576004819055610efc565b610ef8611626565b6004555b505b60008054600754909190610f1190611c2c565b6000819055821015610f3a57600054610f30908363ffffffff611bea16565b9150819050610f61565b600054821115610f6157600054610f5890839063ffffffff611bea16565b91508160000390505b600a5460005460408051928352602083018a90528281018490526060830191909152517f50740223231e0ae1928fa374dc4ce56223846191faeb0ea9fb0c66d2f035db119181900360800190a16000928352600d602052604083209687556001870155504260029095019490945550509054919050565b6009546001600160a01b031681565b610fef611536565b6008546001600160a01b0390811691161461103f576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600280600f54146110815760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff161515600114156110ea5762015180600e54014210156110ea576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b506010546001600160a01b03166000908152600c60205260409020805460ff19166001179055565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156107b35780601f10610788576101008083540402835291602001916107b3565b60075481565b61117e611536565b6008546001600160a01b039081169116146111ce576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556002600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b600a5490565b60006107d261120c611536565b84610875856040518060600160405280602581526020016120616025913960066000611236611536565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff6117d716565b60006107d261127a611536565b848461163b565b6001600160a01b03166000908152600c602052604090205460ff1690565b600b5460ff1690565b60006107d682611c2c565b600b5460ff1681565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6112ef611536565b6008546001600160a01b0390811691161461133f576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600480600f54146113815760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff161515600114156113ea5762015180600e54014210156113ea576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b50601054600980546001600160a01b0319166001600160a01b03909216919091179055565b611417611536565b6008546001600160a01b03908116911614611467576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600180600f54146114a95760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff161515600114156115125762015180600e5401421015611512576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b601054611527906001600160a01b0316611cec565b50565b670de0b6b3a764000081565b3390565b6001600160a01b03831661157f5760405162461bcd60e51b815260040180806020018281038252602481526020018061203d6024913960400191505060405180910390fd5b6001600160a01b0382166115c45760405162461bcd60e51b8152600401808060200182810382526022815260200180611f1f6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260066020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006007546000198161163557fe5b04905090565b816001600160a01b0381161580159061165d57506001600160a01b0381163014155b6116a6576040805162461bcd60e51b8152602060048201526015602482015274139bdd0818481d985b1a59081c9958da5c1a595b9d605a1b604482015290519081900360640190fd5b6001600160a01b0384166116eb5760405162461bcd60e51b81526004018080602001828103825260258152602001806120186025913960400191505060405180910390fd5b6116f3611de5565b5060006116ff8361186e565b905061174481604051806060016040528060268152602001611f41602691396001600160a01b038816600090815260056020526040902054919063ffffffff6117d716565b6001600160a01b038087166000908152600560205260408082209390935590861681522054611779908263ffffffff61189216565b6001600160a01b0380861660008181526005602090815260409182902094909455805187815290519193928916927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35050505050565b600081848411156118665760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561182b578181015183820152602001611813565b50505050905090810190601f1680156118585780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6004546000906107d690610ea08469d3c21bcecceda100000063ffffffff611c5116565b60008282018381101561087e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b816001600160a01b0381161580159061190e57506001600160a01b0381163014155b611957576040805162461bcd60e51b8152602060048201526015602482015274139bdd0818481d985b1a59081c9958da5c1a595b9d605a1b604482015290519081900360640190fd5b60005461196a908363ffffffff61189216565b60009081556119788361186e565b60075490915061198e908263ffffffff61189216565b600755611999611626565b60045411156119ef576040805162461bcd60e51b815260206004820152601a60248201527f6d6178207363616c696e6720666163746f7220746f6f206c6f77000000000000604482015290519081900360640190fd5b6001600160a01b038416600090815260056020526040902054611a18908263ffffffff61189216565b6001600160a01b03851660008181526005602090815260408083209490945583518781529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350505050565b6001600160a01b038216611ab75760405162461bcd60e51b8152600401808060200182810382526021815260200180611ff76021913960400191505060405180910390fd5b600054611aca908263ffffffff611bea16565b6000908155611ad88261186e565b600754909150611aee908263ffffffff611bea16565b600755611af9611626565b6004541115611b4f576040805162461bcd60e51b815260206004820152601a60248201527f6d6178207363616c696e6720666163746f7220746f6f206c6f77000000000000604482015290519081900360640190fd5b611b9281604051806060016040528060228152602001611ed7602291396001600160a01b038616600090815260056020526040902054919063ffffffff6117d716565b6001600160a01b0384166000818152600560209081526040808320949094558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a3505050565b600061087e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117d7565b60006107d669d3c21bcecceda1000000610ea060045485611c5190919063ffffffff16565b600082611c60575060006107d6565b82820282848281611c6d57fe5b041461087e5760405162461bcd60e51b8152600401808060200182810382526021815260200180611f8e6021913960400191505060405180910390fd5b600061087e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e6c565b611cf4611536565b6008546001600160a01b03908116911614611d44576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b6001600160a01b038116611d895760405162461bcd60e51b8152600401808060200182810382526026815260200180611ef96026913960400191505060405180910390fd5b6008546040516001600160a01b038084169216907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce8090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000611def611ed1565b506009546001600160a01b0316156107bb57600960009054906101000a90046001600160a01b03166001600160a01b031663b9abdfef6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e5157600080fd5b505af1158015611e65573d6000803e3d6000fd5b5050505090565b60008183611ebb5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561182b578181015183820152602001611813565b506000838581611ec757fe5b0495945050505050565b60009056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636554696d656c6f636b206e6f7420616371756972656420666f7220746869732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e8c746626cae2f6be5923dcb2e8f38254b677ae5fafcbd300954b42fb6c1145564736f6c63430006060033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7700000000000000000000000000000000000000000000000392c2d8d1b3669d23
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c806364dd48f511610130578063a457c2d7116100b8578063da9182f41161007c578063da9182f414610626578063dd62ed3e1461062e578063e9a3a0591461065c578063ec096c5414610664578063ec342ad01461066c57610227565b8063a457c2d714610583578063a9059cbb146105af578063aa271e1a146105db578063d560cf6014610601578063d5f56d7a1461060957610227565b8063904fe336116100ff578063904fe3361461053d57806395d89b411461054557806397d63f931461054d578063992acccd146105555780639cb118bf1461057b57610227565b806364dd48f5146104dc57806370a08231146104e45780637af548c11461050a5780638e27d7d71461053557610227565b806336125c8f116101b35780634f9b8802116101825780634f9b88021461042957806352cc3f63146104315780635a7f3cb6146104575780635aa6e6751461047d5780635c3d7516146104a157610227565b806336125c8f1461039757806339509351146103b457806340c10f19146103e057806342966c681461040c57610227565b806311d3e6c4116101fa57806311d3e6c41461030d57806318160ddd1461031557806323b872dd1461031d578063313ce56714610353578063339dae101461037157610227565b806304b066531461022c57806306fdde0314610236578063095ea7b3146102b35780630be2e4ee146102f3575b600080fd5b610234610674565b005b61023e610728565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610278578181015183820152602001610260565b50505050905090810190601f1680156102a55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102df600480360360408110156102c957600080fd5b506001600160a01b0381351690602001356107be565b604080519115158252519081900360200190f35b6102fb6107dc565b60408051918252519081900360200190f35b6102fb6107e2565b6102fb6107f1565b6102df6004803603606081101561033357600080fd5b506001600160a01b038135811691602081013590911690604001356107f7565b61035b610885565b6040805160ff9092168252519081900360200190f35b6102346004803603602081101561038757600080fd5b50356001600160a01b031661088e565b6102fb600480360360208110156103ad57600080fd5b5035610911565b6102df600480360360408110156103ca57600080fd5b506001600160a01b03813516906020013561091c565b6102df600480360360408110156103f657600080fd5b506001600160a01b038135169060200135610970565b6102df6004803603602081101561042257600080fd5b50356109d1565b6102346109ec565b6102346004803603602081101561044757600080fd5b50356001600160a01b0316610b14565b6102346004803603602081101561046d57600080fd5b50356001600160a01b0316610b97565b610485610c1a565b604080516001600160a01b039092168252519081900360200190f35b6104be600480360360208110156104b757600080fd5b5035610c29565b60408051938452602084019290925282820152519081900360600190f35b6102fb610cd2565b6102fb600480360360208110156104fa57600080fd5b50356001600160a01b0316610ce0565b6102fb6004803603606081101561052057600080fd5b50803590602081013590604001351515610d02565b610485610fd8565b610234610fe7565b61023e611112565b6102fb611170565b6102346004803603602081101561056b57600080fd5b50356001600160a01b0316611176565b6102fb6111f9565b6102df6004803603604081101561059957600080fd5b506001600160a01b0381351690602001356111ff565b6102df600480360360408110156105c557600080fd5b506001600160a01b03813516906020013561126d565b6102df600480360360208110156105f157600080fd5b50356001600160a01b0316611281565b6102df61129f565b6102fb6004803603602081101561061f57600080fd5b50356112a8565b6102df6112b3565b6102fb6004803603604081101561064457600080fd5b506001600160a01b03813581169160200135166112bc565b6102346112e7565b61023461140f565b6102fb61152a565b61067c611536565b6008546001600160a01b039081169116146106cc576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600b5460ff1615610719576040805162461bcd60e51b8152602060048201526012602482015271416c72656164792072656261736561626c6560701b604482015290519081900360640190fd5b600b805460ff19166001179055565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156107b35780601f10610788576101008083540402835291602001916107b3565b820191906000526020600020905b81548152906001019060200180831161079657829003601f168201915b505050505090505b90565b60006107d26107cb611536565b848461153a565b5060015b92915050565b60045481565b60006107ec611626565b905090565b60005490565b600061080484848461163b565b61087a84610810611536565b61087585604051806060016040528060288152602001611faf602891396001600160a01b038a1660009081526006602052604081209061084e611536565b6001600160a01b03168152602081019190915260400160002054919063ffffffff6117d716565b61153a565b5060015b9392505050565b60035460ff1690565b610896611536565b6008546001600160a01b039081169116146108e6576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556004600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b60006107d68261186e565b60006107d2610929611536565b84610875856006600061093a611536565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61189216565b600061098261097d611536565b611281565b15156001146109c7576040805162461bcd60e51b815260206004820152600c60248201526b2737ba10309036b4b73a32b960a11b604482015290519081900360640190fd5b6107d283836118ec565b60006109e46109de611536565b83611a72565b506001919050565b6109f4611536565b6008546001600160a01b03908116911614610a44576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600380600f5414610a865760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff16151560011415610aef5762015180600e5401421015610aef576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b506010546001600160a01b03166000908152600c60205260409020805460ff19169055565b610b1c611536565b6008546001600160a01b03908116911614610b6c576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556003600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b610b9f611536565b6008546001600160a01b03908116911614610bef576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556001600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031690565b6000808083610c4057506000915081905080610ccb565b610c5184600163ffffffff611bea16565b9350600a548410610ca9576040805162461bcd60e51b815260206004820152601760248201527f45706f636820646f65736e277420796574206578697374000000000000000000604482015290519081900360640190fd5b5050506000818152600d60205260409020805460018201546002909201549091905b9193909250565b69d3c21bcecceda100000081565b6001600160a01b0381166000908152600560205260408120546107d690611c2c565b6009546000906001600160a01b0316610d19611536565b6001600160a01b031614610d6a576040805162461bcd60e51b81526020600482015260136024820152724e6f74206d6f6e657461727920706f6c69637960681b604482015290519081900360640190fd5b600b5460ff161515600114610dc6576040805162461bcd60e51b815260206004820152601c60248201527f4e6f74207965742061626c6520746f2072656261736520746f6b656e00000000604482015290519081900360640190fd5b600a54610dda90600163ffffffff61189216565b600a819055600090610df390600163ffffffff611bea16565b905083610e6d57600a54600080546040805193845260208401899052838101929092526060830152517f50740223231e0ae1928fa374dc4ce56223846191faeb0ea9fb0c66d2f035db119181900360800190a16000908152600d60205260408120858155600181018290554260029091015554905061087e565b82610eb457610eac670de0b6b3a7640000610ea0610e91828863ffffffff611bea16565b6004549063ffffffff611c5116565b9063ffffffff611caa16565b600455610efe565b6000610ed5670de0b6b3a7640000610ea0610e91828963ffffffff61189216565b9050610edf611626565b811015610ef0576004819055610efc565b610ef8611626565b6004555b505b60008054600754909190610f1190611c2c565b6000819055821015610f3a57600054610f30908363ffffffff611bea16565b9150819050610f61565b600054821115610f6157600054610f5890839063ffffffff611bea16565b91508160000390505b600a5460005460408051928352602083018a90528281018490526060830191909152517f50740223231e0ae1928fa374dc4ce56223846191faeb0ea9fb0c66d2f035db119181900360800190a16000928352600d602052604083209687556001870155504260029095019490945550509054919050565b6009546001600160a01b031681565b610fef611536565b6008546001600160a01b0390811691161461103f576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600280600f54146110815760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff161515600114156110ea5762015180600e54014210156110ea576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b506010546001600160a01b03166000908152600c60205260409020805460ff19166001179055565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156107b35780601f10610788576101008083540402835291602001916107b3565b60075481565b61117e611536565b6008546001600160a01b039081169116146111ce576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556002600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b600a5490565b60006107d261120c611536565b84610875856040518060600160405280602581526020016120616025913960066000611236611536565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff6117d716565b60006107d261127a611536565b848461163b565b6001600160a01b03166000908152600c602052604090205460ff1690565b600b5460ff1690565b60006107d682611c2c565b600b5460ff1681565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6112ef611536565b6008546001600160a01b0390811691161461133f576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600480600f54146113815760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff161515600114156113ea5762015180600e54014210156113ea576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b50601054600980546001600160a01b0319166001600160a01b03909216919091179055565b611417611536565b6008546001600160a01b03908116911614611467576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600180600f54146114a95760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff161515600114156115125762015180600e5401421015611512576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b601054611527906001600160a01b0316611cec565b50565b670de0b6b3a764000081565b3390565b6001600160a01b03831661157f5760405162461bcd60e51b815260040180806020018281038252602481526020018061203d6024913960400191505060405180910390fd5b6001600160a01b0382166115c45760405162461bcd60e51b8152600401808060200182810382526022815260200180611f1f6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260066020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006007546000198161163557fe5b04905090565b816001600160a01b0381161580159061165d57506001600160a01b0381163014155b6116a6576040805162461bcd60e51b8152602060048201526015602482015274139bdd0818481d985b1a59081c9958da5c1a595b9d605a1b604482015290519081900360640190fd5b6001600160a01b0384166116eb5760405162461bcd60e51b81526004018080602001828103825260258152602001806120186025913960400191505060405180910390fd5b6116f3611de5565b5060006116ff8361186e565b905061174481604051806060016040528060268152602001611f41602691396001600160a01b038816600090815260056020526040902054919063ffffffff6117d716565b6001600160a01b038087166000908152600560205260408082209390935590861681522054611779908263ffffffff61189216565b6001600160a01b0380861660008181526005602090815260409182902094909455805187815290519193928916927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35050505050565b600081848411156118665760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561182b578181015183820152602001611813565b50505050905090810190601f1680156118585780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6004546000906107d690610ea08469d3c21bcecceda100000063ffffffff611c5116565b60008282018381101561087e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b816001600160a01b0381161580159061190e57506001600160a01b0381163014155b611957576040805162461bcd60e51b8152602060048201526015602482015274139bdd0818481d985b1a59081c9958da5c1a595b9d605a1b604482015290519081900360640190fd5b60005461196a908363ffffffff61189216565b60009081556119788361186e565b60075490915061198e908263ffffffff61189216565b600755611999611626565b60045411156119ef576040805162461bcd60e51b815260206004820152601a60248201527f6d6178207363616c696e6720666163746f7220746f6f206c6f77000000000000604482015290519081900360640190fd5b6001600160a01b038416600090815260056020526040902054611a18908263ffffffff61189216565b6001600160a01b03851660008181526005602090815260408083209490945583518781529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350505050565b6001600160a01b038216611ab75760405162461bcd60e51b8152600401808060200182810382526021815260200180611ff76021913960400191505060405180910390fd5b600054611aca908263ffffffff611bea16565b6000908155611ad88261186e565b600754909150611aee908263ffffffff611bea16565b600755611af9611626565b6004541115611b4f576040805162461bcd60e51b815260206004820152601a60248201527f6d6178207363616c696e6720666163746f7220746f6f206c6f77000000000000604482015290519081900360640190fd5b611b9281604051806060016040528060228152602001611ed7602291396001600160a01b038616600090815260056020526040902054919063ffffffff6117d716565b6001600160a01b0384166000818152600560209081526040808320949094558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a3505050565b600061087e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117d7565b60006107d669d3c21bcecceda1000000610ea060045485611c5190919063ffffffff16565b600082611c60575060006107d6565b82820282848281611c6d57fe5b041461087e5760405162461bcd60e51b8152600401808060200182810382526021815260200180611f8e6021913960400191505060405180910390fd5b600061087e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e6c565b611cf4611536565b6008546001600160a01b03908116911614611d44576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b6001600160a01b038116611d895760405162461bcd60e51b8152600401808060200182810382526026815260200180611ef96026913960400191505060405180910390fd5b6008546040516001600160a01b038084169216907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce8090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000611def611ed1565b506009546001600160a01b0316156107bb57600960009054906101000a90046001600160a01b03166001600160a01b031663b9abdfef6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e5157600080fd5b505af1158015611e65573d6000803e3d6000fd5b5050505090565b60008183611ebb5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561182b578181015183820152602001611813565b506000838581611ec757fe5b0495945050505050565b60009056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636554696d656c6f636b206e6f7420616371756972656420666f7220746869732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e8c746626cae2f6be5923dcb2e8f38254b677ae5fafcbd300954b42fb6c1145564736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000392c2d8d1b3669d23
-----Decoded View---------------
Arg [0] : _initialSupply (uint256): 65915485491317611811
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000392c2d8d1b3669d23
Deployed Bytecode Sourcemap
34838:7432:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34838:7432:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;39568:159:0;;;:::i;:::-;;12763:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;12763:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14872:169;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;14872:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;10823:33;;;:::i;:::-;;;;;;;;;;;;;;;;12214:137;;;:::i;13823:100::-;;;:::i;15510:327::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;15510:327:0;;;;;;;;;;;;;;;;;:::i;13680:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41896:190;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41896:190:0;-1:-1:-1;;;;;41896:190:0;;:::i;22024:149::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22024:149:0;;:::i;16241:224::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;16241:224:0;;;;;;;;:::i;36959:150::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;36959:150:0;;;;;;;;:::i;37177:122::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37177:122:0;;:::i;41651:140::-;;;:::i;41457:182::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41457:182:0;-1:-1:-1;;;;;41457:182:0;;:::i;40603:186::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40603:186:0;-1:-1:-1;;;;;40603:186:0;;:::i;33842:84::-;;;:::i;:::-;;;;-1:-1:-1;;;;;33842:84:0;;;;;;;;;;;;;;36100:411;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36100:411:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;10581:47;;;:::i;13981:142::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13981:142:0;-1:-1:-1;;;;;13981:142:0;;:::i;37413:2118::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37413:2118:0;;;;;;;;;;;;;;:::i;34989:29::-;;;:::i;41227:136::-;;;:::i;12960:87::-;;;:::i;11015:25::-;;;:::i;41036:179::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41036:179:0;-1:-1:-1;;;;;41036:179:0;;:::i;35995:93::-;;;:::i;16963:275::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;16963:275:0;;;;;;;;:::i;14340:175::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;14340:175:0;;;;;;;;:::i;35875:108::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35875:108:0;-1:-1:-1;;;;;35875:108:0;;:::i;36523:89::-;;;:::i;21867:149::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21867:149:0;;:::i;35060:22::-;;;:::i;14573:157::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;14573:157:0;;;;;;;;;;:::i;42098:140::-;;;:::i;40801:::-;;;:::i;10697:35::-;;;:::i;39568:159::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;39649:10:::1;::::0;::::1;;:19;39641:50;;;::::0;;-1:-1:-1;;;39641:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39641:50:0;;;;;;;;;;;;;::::1;;39702:10;:17:::0;;-1:-1:-1;;39702:17:0::1;39715:4;39702:17;::::0;;39568:159::o;12763:83::-;12833:5;12826:12;;;;;;;;-1:-1:-1;;12826:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12800:13;;12826:12;;12833:5;;12826:12;;12833:5;12826:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12763:83;;:::o;14872:169::-;14955:4;14972:39;14981:12;:10;:12::i;:::-;14995:7;15004:6;14972:8;:39::i;:::-;-1:-1:-1;15029:4:0;14872:169;;;;;:::o;10823:33::-;;;;:::o;12214:137::-;12292:7;12324:19;:17;:19::i;:::-;12317:26;;12214:137;:::o;13823:100::-;13876:7;13903:12;13823:100;:::o;15510:327::-;15616:4;15633:36;15643:6;15651:9;15662:6;15633:9;:36::i;:::-;15680:127;15689:6;15697:12;:10;:12::i;:::-;15711:95;15755:6;15711:95;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15711:25:0;;;;;;:17;:25;;;;;;15737:12;:10;:12::i;:::-;-1:-1:-1;;;;;15711:39:0;;;;;;;;;;;;-1:-1:-1;15711:39:0;;;:95;;:43;:95;:::i;:::-;15680:8;:127::i;:::-;-1:-1:-1;15825:4:0;15510:327;;;;;;:::o;13680:83::-;13746:9;;;;13680:83;:::o;41896:190::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;42001:3:::1;41984:14;:20:::0;42031:1:::1;42015:13;:17:::0;42043::::1;:28:::0;;-1:-1:-1;;;;;;42043:28:0::1;-1:-1:-1::0;;;;;42043:28:0;;;::::1;::::0;;;::::1;::::0;;41896:190::o;22024:149::-;22112:7;22144:21;22161:3;22144:16;:21::i;16241:224::-;16329:4;16346:89;16355:12;:10;:12::i;:::-;16369:7;16378:56;16423:10;16378:17;:31;16396:12;:10;:12::i;:::-;-1:-1:-1;;;;;16378:31:0;;;;;;;;;;;;;;;;;-1:-1:-1;16378:31:0;;;:40;;;;;;;;;;;:56;:44;:56;:::i;36959:150::-;37038:4;35577:22;35586:12;:10;:12::i;:::-;35577:8;:22::i;:::-;:30;;35603:4;35577:30;35569:55;;;;;-1:-1:-1;;;35569:55:0;;;;;;;;;;;;-1:-1:-1;;;35569:55:0;;;;;;;;;;;;;;;37055:24:::1;37061:9;37072:6;37055:5;:24::i;37177:122::-:0;37225:4;37242:27;37248:12;:10;:12::i;:::-;37262:6;37242:5;:27::i;:::-;-1:-1:-1;37287:4:0;37177:122;;;:::o;41651:140::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;41727:1:::1;40257:5;40240:13;;:22;40232:74;;;;-1:-1:-1::0;;;40232:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40333:1;40317:13;:17:::0;40392:10:::1;::::0;::::1;;:18;;:10:::0;:18:::1;40389:124;;;40051:5;40441:14;;:34;40434:3;:41;;40426:75;;;::::0;;-1:-1:-1;;;40426:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40426:75:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;41757:17:0::2;::::0;-1:-1:-1;;;;;41757:17:0::2;41778:5;41741:34:::0;;;:15:::2;:34;::::0;;;;:42;;-1:-1:-1;;41741:42:0::2;::::0;;41651:140::o;41457:182::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;41554:3:::1;41537:14;:20:::0;41584:1:::1;41568:13;:17:::0;41596::::1;:28:::0;;-1:-1:-1;;;;;;41596:28:0::1;-1:-1:-1::0;;;;;41596:28:0;;;::::1;::::0;;;::::1;::::0;;41457:182::o;40603:186::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;40704:3:::1;40687:14;:20:::0;40734:1:::1;40718:13;:17:::0;40746::::1;:28:::0;;-1:-1:-1;;;;;;40746:28:0::1;-1:-1:-1::0;;;;;40746:28:0;;;::::1;::::0;;;::::1;::::0;;40603:186::o;33842:84::-;33912:6;;-1:-1:-1;;;;;33912:6:0;33842:84;:::o;36100:411::-;36162:7;;;36202:9;36199:35;;-1:-1:-1;36223:1:0;;-1:-1:-1;36223:1:0;;-1:-1:-1;36223:1:0;36215:16;;36199:35;36309:11;:4;36318:1;36309:11;:8;:11;:::i;:::-;36302:18;;36346:12;;36339:4;:19;36331:55;;;;;-1:-1:-1;;;36331:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36405:19:0;;;;:13;:19;;;;;:25;;36432:38;;;;36472:30;;;;;36405:25;;36432:38;36100:411;;;;;;:::o;10581:47::-;10624:4;10581:47;:::o;13981:142::-;-1:-1:-1;;;;;14091:23:0;;14047:7;14091:23;;;:14;:23;;;;;;14074:41;;:16;:41::i;37413:2118::-;35465:14;;37577:7;;-1:-1:-1;;;;;35465:14:0;35449:12;:10;:12::i;:::-;-1:-1:-1;;;;;35449:30:0;;35441:62;;;;;-1:-1:-1;;;35441:62:0;;;;;;;;;;;;-1:-1:-1;;;35441:62:0;;;;;;;;;;;;;;;37610:10:::1;::::0;::::1;;:18;;:10:::0;:18:::1;37602:59;;;::::0;;-1:-1:-1;;;37602:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37687:12;::::0;:19:::1;::::0;37704:1:::1;37687:19;:16;:19;:::i;:::-;37672:12;:34:::0;;;37717:17:::1;::::0;37737:19:::1;::::0;37754:1:::1;37737:19;:16;:19;:::i;:::-;37717:39:::0;-1:-1:-1;37803:15:0;37799:292:::1;;37845:12;::::0;37866:1:::1;37869:12:::0;;37838:44:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;37895:24;::::0;;;:13:::1;:24;::::0;;;;:38;;;37946:43:::1;::::0;::::1;:47:::0;;;38044:3:::1;38006:35;::::0;;::::1;:41:::0;38067:12;;-1:-1:-1;38060:19:0::1;;37799:292;38108:8;38103:556;;38211:54;10728:4;38211:44;38234:20;10728:4:::0;38243:10;38234:20:::1;:8;:20;:::i;:::-;38211:18;::::0;;:44:::1;:22;:44;:::i;:::-;:48:::0;:54:::1;:48;:54;:::i;:::-;38190:18;:75:::0;38103:556:::1;;;38355:24;38382:54;10728:4;38382:44;38405:20;10728:4:::0;38414:10;38405:20:::1;:8;:20;:::i;38382:54::-;38355:81;;38474:19;:17;:19::i;:::-;38455:16;:38;38451:197;;;38514:18;:37:::0;;;38451:197:::1;;;38613:19;:17;:19::i;:::-;38592:18;:40:::0;38451:197:::1;38103:556;;38714:17;38734:12:::0;;38823:10:::1;::::0;38734:12;;38714:17;38806:28:::1;::::0;:16:::1;:28::i;:::-;38791:12;:43:::0;;;38901:24;::::1;38898:353;;;38985:12;::::0;:27:::1;::::0;39002:9;38985:27:::1;:16;:27;:::i;:::-;38973:39;;39049:9;39027:32;;38898:353;;;39091:12;;39079:9;:24;39076:175;;;39175:12;::::0;39161:27:::1;::::0;:9;;:27:::1;:13;:27;:::i;:::-;39149:39;;39229:9;39218:1;:21;39203:36;;39076:175;39275:12;::::0;39310::::1;::::0;39268:55:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;39334:24;::::0;;;:13:::1;:24;::::0;;;;:38;;;39383:43:::1;::::0;::::1;:58:::0;-1:-1:-1;39490:3:0::1;39452:35;::::0;;::::1;:41:::0;;;;-1:-1:-1;;39511:12:0;;;37413:2118;-1:-1:-1;37413:2118:0:o;34989:29::-;;;-1:-1:-1;;;;;34989:29:0;;:::o;41227:136::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;41300:1:::1;40257:5;40240:13;;:22;40232:74;;;;-1:-1:-1::0;;;40232:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40333:1;40317:13;:17:::0;40392:10:::1;::::0;::::1;;:18;;:10:::0;:18:::1;40389:124;;;40051:5;40441:14;;:34;40434:3;:41;;40426:75;;;::::0;;-1:-1:-1;;;40426:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40426:75:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;41330:17:0::2;::::0;-1:-1:-1;;;;;41330:17:0::2;41314:34;::::0;;;:15:::2;:34;::::0;;;;:41;;-1:-1:-1;;41314:41:0::2;41351:4;41314:41;::::0;;41227:136::o;12960:87::-;13032:7;13025:14;;;;;;;-1:-1:-1;;13025:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12999:13;;13025:14;;13032:7;;13025:14;;13032:7;13025:14;;;;;;;;;;;;;;;;;;;;;;;;11015:25;;;;:::o;41036:179::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;41130:3:::1;41113:14;:20:::0;41160:1:::1;41144:13;:17:::0;41172::::1;:28:::0;;-1:-1:-1;;;;;;41172:28:0::1;-1:-1:-1::0;;;;;41172:28:0;;;::::1;::::0;;;::::1;::::0;;41036:179::o;35995:93::-;36068:12;;35995:93;:::o;16963:275::-;17056:4;17073:135;17082:12;:10;:12::i;:::-;17096:7;17105:102;17150:15;17105:102;;;;;;;;;;;;;;;;;:17;:31;17123:12;:10;:12::i;:::-;-1:-1:-1;;;;;17105:31:0;;;;;;;;;;;;;;;;;-1:-1:-1;17105:31:0;;;:40;;;;;;;;;;;:102;;:44;:102;:::i;14340:175::-;14426:4;14443:42;14453:12;:10;:12::i;:::-;14467:9;14478:6;14443:9;:42::i;35875:108::-;-1:-1:-1;;;;;35953:22:0;35929:4;35953:22;;;:15;:22;;;;;;;;;35875:108::o;36523:89::-;36594:10;;;;36523:89;:::o;21867:149::-;21955:7;21987:21;22004:3;21987:16;:21::i;35060:22::-;;;;;;:::o;14573:157::-;-1:-1:-1;;;;;14689:24:0;;;14662:7;14689:24;;;:17;:24;;;;;;;;:33;;;;;;;;;;;;;14573:157::o;42098:140::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;42182:1:::1;40257:5;40240:13;;:22;40232:74;;;;-1:-1:-1::0;;;40232:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40333:1;40317:13;:17:::0;40392:10:::1;::::0;::::1;;:18;;:10:::0;:18:::1;40389:124;;;40051:5;40441:14;;:34;40434:3;:41;;40426:75;;;::::0;;-1:-1:-1;;;40426:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40426:75:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;42213:17:0::2;::::0;42196:14:::2;:34:::0;;-1:-1:-1;;;;;;42196:34:0::2;-1:-1:-1::0;;;;;42213:17:0;;::::2;42196:34:::0;;;::::2;::::0;;42098:140::o;40801:::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;40881:1:::1;40257:5;40240:13;;:22;40232:74;;;;-1:-1:-1::0;;;40232:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40333:1;40317:13;:17:::0;40392:10:::1;::::0;::::1;;:18;;:10:::0;:18:::1;40389:124;;;40051:5;40441:14;;:34;40434:3;:41;;40426:75;;;::::0;;-1:-1:-1;;;40426:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40426:75:0;;;;;;;;;;;;;::::1;;40915:17:::2;::::0;40895:38:::2;::::0;-1:-1:-1;;;;;40915:17:0::2;40895:19;:38::i;:::-;34129:1:::1;40801:140::o:0;10697:35::-;10728:4;10697:35;:::o;650:106::-;738:10;650:106;:::o;21060:352::-;-1:-1:-1;;;;;21162:19:0;;21154:68;;;;-1:-1:-1;;;21154:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21241:21:0;;21233:68;;;;-1:-1:-1;;;21233:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21314:24:0;;;;;;;:17;:24;;;;;;;;:33;;;;;;;;;;;;;:42;;;21372:32;;;;;;;;;;;;;;;;;21060:352;;;:::o;12359:339::-;12438:7;12680:10;;-1:-1:-1;;12666:24:0;;;;;;12659:31;;12359:339;:::o;17723:910::-;17825:9;-1:-1:-1;;;;;12045:16:0;;;;;;:39;;-1:-1:-1;;;;;;12065:19:0;;12079:4;12065:19;;12045:39;12037:73;;;;;-1:-1:-1;;;12037:73:0;;;;;;;;;;;;-1:-1:-1;;;12037:73:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17855:20:0;::::1;17847:70;;;;-1:-1:-1::0;;;17847:70:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17938:15;:13;:15::i;:::-;;18251:18;18272:24;18289:6;18272:16;:24::i;:::-;18251:45;;18373:80;18400:10;18373:80;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;18373:22:0;::::1;;::::0;;;:14:::1;:22;::::0;;;;;;:80;::::1;:26;:80;:::i;:::-;-1:-1:-1::0;;;;;18348:22:0;;::::1;;::::0;;;:14:::1;:22;::::0;;;;;:105;;;;18533:25;;::::1;::::0;;;;:41:::1;::::0;18563:10;18533:41:::1;:29;:41;:::i;:::-;-1:-1:-1::0;;;;;18505:25:0;;::::1;;::::0;;;:14:::1;:25;::::0;;;;;;;;:69;;;;18590:35;;;;;;;18505:25;;18590:35;;::::1;::::0;::::1;::::0;;;;;;;::::1;12121:1;17723:910:::0;;;;:::o;5562:192::-;5648:7;5684:12;5676:6;;;;5668:29;;;;-1:-1:-1;;;5668:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5668:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5720:5:0;;;5562:192::o;22367:178::-;22518:18;;22456:7;;22488:49;;:25;:3;10624:4;22488:25;:7;:25;:::i;4669:181::-;4727:7;4759:5;;;4783:6;;;;4775:46;;;;;-1:-1:-1;;;4775:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;18909:647;18984:2;-1:-1:-1;;;;;12045:16:0;;;;;;:39;;-1:-1:-1;;;;;;12065:19:0;;12079:4;12065:19;;12045:39;12037:73;;;;;-1:-1:-1;;;12037:73:0;;;;;;;;;;;;-1:-1:-1;;;12037:73:0;;;;;;;;;;;;;;;19047:12:::1;::::0;:24:::1;::::0;19064:6;19047:24:::1;:16;:24;:::i;:::-;19032:12;:39:::0;;;19138:24:::1;19155:6:::0;19138:16:::1;:24::i;:::-;19220:10;::::0;19117:45;;-1:-1:-1;19220:26:0::1;::::0;19117:45;19220:26:::1;:14;:26;:::i;:::-;19207:10;:39:::0;19356:19:::1;:17;:19::i;:::-;19334:18;;:41;;19326:80;;;::::0;;-1:-1:-1;;;19326:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;19464:18:0;::::1;;::::0;;;:14:::1;:18;::::0;;;;;:34:::1;::::0;19487:10;19464:34:::1;:22;:34;:::i;:::-;-1:-1:-1::0;;;;;19443:18:0;::::1;;::::0;;;:14:::1;:18;::::0;;;;;;;:55;;;;19516:32;;;;;;;19443:18;;;;19516:32:::1;::::0;;;;;;;;::::1;12121:1;18909:647:::0;;;:::o;19887:738::-;-1:-1:-1;;;;;19971:21:0;;19963:67;;;;-1:-1:-1;;;19963:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20091:12;;:24;;20108:6;20091:24;:16;:24;:::i;:::-;20076:12;:39;;;20182:24;20199:6;20182:16;:24::i;:::-;20264:10;;20161:45;;-1:-1:-1;20264:26:0;;20161:45;20264:26;:14;:26;:::i;:::-;20251:10;:39;20372:19;:17;:19::i;:::-;20350:18;;:41;;20342:80;;;;;-1:-1:-1;;;20342:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20485:77;20513:10;20485:77;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20485:23:0;;;;;;:14;:23;;;;;;;:77;;:27;:77;:::i;:::-;-1:-1:-1;;;;;20459:23:0;;;;;;:14;:23;;;;;;;;:103;;;;20580:37;;;;;;;20459:23;;20580:37;;;;;;;;;;;19887:738;;;:::o;5128:136::-;5186:7;5213:43;5217:1;5220;5213:43;;;;;;;;;;;;;;;;;:3;:43::i;22181:178::-;22270:7;22302:49;10624:4;22302:27;22310:18;;22302:3;:7;;:27;;;;:::i;6008:471::-;6066:7;6311:6;6307:47;;-1:-1:-1;6341:1:0;6334:8;;6307:47;6378:5;;;6382:1;6378;:5;:1;6402:5;;;;;:10;6394:56;;;;-1:-1:-1;;;6394:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6950:132;7008:7;7035:39;7039:1;7042;7035:39;;;;;;;;;;;;;;;;;:3;:39::i;34288:254::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34386:22:0;::::1;34378:73;;;;-1:-1:-1::0;;;34378:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34489:6;::::0;34467:39:::1;::::0;-1:-1:-1;;;;;34467:39:0;;::::1;::::0;34489:6:::1;::::0;34467:39:::1;::::0;34489:6:::1;::::0;34467:39:::1;34517:6;:17:::0;;-1:-1:-1;;;;;;34517:17:0::1;-1:-1:-1::0;;;;;34517:17:0;;;::::1;::::0;;;::::1;::::0;;34288:254::o;36690:257::-;36750:4;36767:21;:19;:21::i;:::-;-1:-1:-1;36822:14:0;;-1:-1:-1;;;;;36822:14:0;:28;36819:121;;36890:14;;;;;;;;;-1:-1:-1;;;;;36890:14:0;-1:-1:-1;;;;;36866:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36866:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36866:62:0;;;;36690:257;:::o;7573:278::-;7659:7;7694:12;7687:5;7679:28;;;;-1:-1:-1;;;7679:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7679:28:0;;7718:9;7734:1;7730;:5;;;;;;;7573:278;-1:-1:-1;;;;;7573:278:0:o;22738:59::-;22789:4;22738:59;:::o
Swarm Source
ipfs://e8c746626cae2f6be5923dcb2e8f38254b677ae5fafcbd300954b42fb6c11455
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.