ERC-20
Overview
Max Total Supply
1,200 GOALD
Holders
4
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 6 Decimals)
Balance
1,199.994 GOALDValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GoaldProxy
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-20 */ pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev 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; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // 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; } /** * @dev 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"); } /** * @dev 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; } /** * @dev 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"); } /** * @dev 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; } } 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) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); 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); } } } } pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } pragma solidity ^0.6.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } pragma solidity ^0.6.2; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.6.0; contract GoaldProxy is ERC20 { /** * @dev The minimum amount of tokens necessary to be eligible for a dividend. This is "one token", considering decimal places. We * are choosing six decimal places because we are targeting WBTC, which has 8. This way we can do a minimum dividend ratio of * 1 / 100 of a WBTC, relative to our token. So at $25,000 (2020 value), the minimum dividend would be $250. */ uint256 private constant DIVIDEND_THRESHOLD = 10**6; /** @dev The current owner of the proxy. */ address public _owner = msg.sender; /** @dev Which Uniswap router we're currently using for trades. */ address private _uniswapRouterAddress; /** @dev The latest proxy address. This is private since Goald contracts use `getProxyAddress()` to determine the address. */ address private _proxyAddress; /** @dev Which deployer is the most recent version. Only the latest version can create new Goald. See: `_proxyAddress`. */ address private _latestDeployer; /** @dev Which ERC20 contract will be used for dividends (e.g., WBTC). */ address public _dividendContract; /** @dev How many holders are eligible for dividends. This is used to determine how much should be reserved. */ uint256 private _dividendHolders; /** @dev How much of the current balance is reserved for dividends. */ uint256 public _reservedBalance; /** @dev How many holders have yet to withdraw a given dividend. */ uint256[] private _dividendHolderCounts; /** @dev The multipliers for each dividend. */ uint256[] private _dividendMultipliers; /** @dev The remaining reserves for a given dividend. */ uint256[] private _dividendReserves; /** @dev The minimum dividend index to check eligibility against for a given address. */ mapping (address => uint256) private _minimumDividendIndex; /** @dev The available dividend balance for a given address. */ mapping (address => uint256) private _dividendBalance; /** * @dev The stage of the governance token. Tokens can be issued based on deployments regardless of what stage we are in. * 0: Created, with no governance protocol initiated. The initial governance issuance can be claimed. * 1: Initial governance issuance has been claimed. * 2: The governance protocal has been initiated. * 3: All governance tokens have been issued. */ uint256 private constant STAGE_INITIAL = 0; uint256 private constant STAGE_ISSUANCE_CLAIMED = 1; uint256 private constant STAGE_DAO_INITIATED = 2; uint256 private constant STAGE_ALL_GOVERNANCE_ISSUED = 3; uint256 private _governanceStage; uint256 private _goaldsDeployed; // Reentrancy reversions are the only calls to revert (in this contract) that do not have reasons. We add a third state, 'frozen' // to allow for locking non-admin functions. The contract may be permanently frozen if it has been upgraded. uint256 private constant RE_NOT_ENTERED = 1; uint256 private constant RE_ENTERED = 2; uint256 private constant RE_FROZEN = 3; uint256 private _status; // Override decimal places to 6. See `DIVIDEND_THRESHOLD`. constructor() ERC20("Goald", "GOALD") public { _setupDecimals(6); _status = RE_NOT_ENTERED; _proxyAddress = address(this); } /// Events /// event DividendCreated(uint256 multiplier, string reason); /// Admin Functions /// function changeOwner(address newOwner) external { // Reentrancy guard. require(_status == RE_NOT_ENTERED || _status == RE_FROZEN); require(msg.sender == _owner, "Not owner"); require(newOwner != address(0), "Can't be zero address"); _owner = newOwner; } /** * Sets the latest deployer. No other Goald deployers can create a new Goald. We do not restrict the address since we need to be * able to freeze deployments in the event of a severe vulnerability. */ function changeLatestDeployer(address newDeployer) external { // Reentrancy guard. require(_status == RE_NOT_ENTERED || _status == RE_FROZEN); require(msg.sender == _owner, "Not owner"); _latestDeployer = newDeployer; } /** The proxy address is what the Goald deployers send their fees to. */ function changeProxyAddress(address newAddress) external { // Reentrancy guard. require(_status == RE_NOT_ENTERED || _status == RE_FROZEN); require(msg.sender == _owner, "Not owner"); require(newAddress != address(0), "Can't be zero address"); _proxyAddress = newAddress; } /** The uniswap router for converting tokens within this proxys. */ function changeUniswapRouterAddress(address newAddress) external { // Reentrancy guard. require(_status == RE_NOT_ENTERED || _status == RE_FROZEN); require(msg.sender == _owner, "Not owner"); require(newAddress != address(0), "Can't be zero address"); _uniswapRouterAddress = newAddress; } /** Freezes the proxy contract. Only admin functions can be called. */ function freeze() external { // Reentrancy guard. require(_status == RE_NOT_ENTERED); require(msg.sender == _owner, "Not owner"); _status = RE_FROZEN; } /** Unfreezes the proxy contract. Non-admin functions can again be called. */ function unfreeze() external { // Reentrancy guard. require(_status == RE_FROZEN); require(msg.sender == _owner, "Not owner"); _status = RE_NOT_ENTERED; } /// Goald Deployers /// /** Returns the current address that fees will be sent to. */ function getProxyAddress() external view returns (address) { return _proxyAddress; } /** Returns the address of the deployer that is allowed to create new Goald. */ function getLatestDeployerAddress() external view returns (address) { return _latestDeployer; } /** Returns the address of the uniswap router. */ function getUniswapRouterAddress() external view returns (address) { return _uniswapRouterAddress; } /** * Called when a deployer deploys a new Goald. Currently we use this to distribute the governance token according to the * following schedule. An additional 11,000 tokens will be given to the deployer of this proxy. This will create a total supply of * 21,000 tokens. Once the governance protocal is set up, 10,000 tokens will be burned to initiate that mechanism. That will leave * ~9% ownership for the deployer of the contract, with the remaining 91% given to the community. No dividends can be paid out * before the governance protocal has been initiated. * * # Goalds # Tokens * 0 - 9 100 * 10 - 19 90 * 20 - 29 80 * 30 - 39 70 * 40 - 49 60 * 50 - 59 50 * 60 - 69 40 * 70 - 79 30 * 80 - 89 20 * 90 - 99 10 * < 4600 1 */ function notifyGoaldCreated(address creator) external { // Reentrancy guard. require(_status == RE_NOT_ENTERED); require(msg.sender == _latestDeployer, "Not latest deployer"); // All governance tokens have been issued. if (_governanceStage == STAGE_ALL_GOVERNANCE_ISSUED) { _goaldsDeployed++; return; } // Calculate the amount of tokens issued based on the schedule. uint256 goaldsDeployed = _goaldsDeployed; uint256 amount; if (goaldsDeployed < 10) { amount = 100; } else if (goaldsDeployed < 20) { amount = 90; } else if (goaldsDeployed < 30) { amount = 80; } else if (goaldsDeployed < 40) { amount = 70; } else if (goaldsDeployed < 50) { amount = 60; } else if (goaldsDeployed < 60) { amount = 50; } else if (goaldsDeployed < 70) { amount = 40; } else if (goaldsDeployed < 80) { amount = 30; } else if (goaldsDeployed < 90) { amount = 20; } else if (goaldsDeployed < 100) { amount = 10; } else if (goaldsDeployed < 4600) { amount = 1; } if (amount > 0) { // Update their dividend balance. _checkDividend(creator); // We are creating a new holder. if (balanceOf(creator) < DIVIDEND_THRESHOLD) { _dividendHolders ++; } // Give them the tokens. _mint(creator, amount * DIVIDEND_THRESHOLD); } // We are fully done. if (goaldsDeployed >= 4600 && _governanceStage == STAGE_DAO_INITIATED) { _governanceStage = STAGE_ALL_GOVERNANCE_ISSUED; } // Update the count. _goaldsDeployed = goaldsDeployed + 1; } /// Governance /// /** Changes which token will be the dividend token. This can only happen if there is no balance in reserve held for dividends. */ function changeDividendContract(address newContract) external { // Reentrancy guard. require(_status == RE_NOT_ENTERED || _status == RE_FROZEN); require(msg.sender == _owner, "Not owner"); require(newContract != address(0), "Can't be zero address"); require(newContract != address(this), "Can't be this address"); require(_governanceStage >= STAGE_DAO_INITIATED, "DAO not initiated"); require(_reservedBalance == 0, "Have reserved balance"); _dividendContract = newContract; } function claimIssuance() external { // Reentrancy guard. require(_status == RE_NOT_ENTERED || _status == RE_FROZEN); require(msg.sender == _owner, "Not owner"); require(_governanceStage == STAGE_INITIAL, "Already claimed"); _mint(_owner, 11000 * DIVIDEND_THRESHOLD); _governanceStage = STAGE_ISSUANCE_CLAIMED; } /** Uses Uniswap to convert all held amount of a specific token into the dividend token, using the provided path. */ function convertToken(address[] calldata path, uint256 deadline) external { // Reentrancy guard. require(_status == RE_NOT_ENTERED); _status = RE_ENTERED; require(msg.sender == _owner, "Not owner"); require(_governanceStage >= STAGE_DAO_INITIATED, "DAO not initiated"); // Make sure this contract actually has a balance. IERC20 tokenContract = IERC20(path[0]); uint256 amount = tokenContract.balanceOf(address(this)); require(amount > 0, "No balance for token"); // Swap the tokens. tokenContract.approve(_uniswapRouterAddress, amount); IUniswapV2Router02(_uniswapRouterAddress).swapExactTokensForTokens(amount, 1, path, address(this), deadline); // By storing the original amount once again, a refund is triggered (see https://eips.ethereum.org/EIPS/eip-2200). _status = RE_NOT_ENTERED; } /** Uses Uniswap to convert all held amount of specific tokens into the dividend token. The tokens must have a direct path. */ function convertTokens(address[] calldata tokenAddresses, uint256 deadline) external { // Reentrancy guard. require(_status == RE_NOT_ENTERED); _status = RE_ENTERED; require(msg.sender == _owner, "Not owner"); require(_governanceStage >= STAGE_DAO_INITIATED, "DAO not initiated"); // The path between a given token and the dividend token within Uniswap. address[] memory path; path[1] = _dividendContract; IUniswapV2Router02 uniswap = IUniswapV2Router02(_uniswapRouterAddress); address tokenAddress; IERC20 tokenContract; uint256 amount; uint256 count = tokenAddresses.length; for (uint256 i; i < count; i ++) { // Validate the token. tokenAddress = tokenAddresses[i]; require(tokenAddress != address(0), "Can't be zero address"); require(tokenAddress != address(this), "Can't be this address"); require(tokenAddress != _dividendContract, "Can't be target address"); // Make sure this contract actually has a balance. tokenContract = IERC20(tokenAddress); amount = tokenContract.balanceOf(address(this)); if (amount == 0) { continue; } // Swap the tokens. tokenContract.approve(_uniswapRouterAddress, amount); path[0] = tokenAddress; uniswap.swapExactTokensForTokens(amount, 1, path, address(this), deadline); } // By storing the original amount once again, a refund is triggered (see https://eips.ethereum.org/EIPS/eip-2200). _status = RE_NOT_ENTERED; } function initializeDAO() external { // Reentrancy guard. require(_status == RE_NOT_ENTERED); require(msg.sender == _owner, "Not owner"); require(_governanceStage == STAGE_ISSUANCE_CLAIMED, "Issuance unclaimed"); _burn(_owner, 10000 * DIVIDEND_THRESHOLD); _governanceStage = STAGE_DAO_INITIATED; } /// Dividends /// /** Check which dividends a given address is eligible for, and update their current dividend balance to reflect that total. */ function _checkDividend(address holder) internal { // There is no need for reentrancy since this only updates the `_dividendBalance` for a given holder according to the amounts // they are already owed according to the current state. If this is an unexpected reentrant call, then that holder gets the // benefit of this math without having to pay the gas. // The total number of dividends issued. uint256 count = _dividendMultipliers.length; // The holder has already claimed all dividends. uint256 currentMinimumIndex = _minimumDividendIndex[holder]; if (currentMinimumIndex == count) { return; } // The holder is not eligible for a dividend according to their current balance. uint256 balance = balanceOf(holder); if (balance < DIVIDEND_THRESHOLD) { // Mark that they have been checked for all dividends. if (currentMinimumIndex < count) { _minimumDividendIndex[holder] = count; } return; } // Calculate the balance increase according to which dividends the holder has yet to claim. Also calculate the amount of the // reserve should be released if a given dividend has been fully collected by all holders. uint256 multiplier; uint256 reserveDecrease; for (; currentMinimumIndex < count; currentMinimumIndex ++) { // This can never overflow since a dividend can't be created unless there is enough reserve balance to cover its // multiplier, which already checks for overflows, likewise `multiplier * balance` can never overflow. multiplier += _dividendMultipliers[currentMinimumIndex]; // Reduce the holder count and reserve for this dividend. If this is the last holder, we refund the remainder of the held // reserve back to the main pool. We don't need to worry about underflows here because these values never increase. They // are set once when the dividend is created, based on the total supply of the governance token at that time. if (_dividendHolderCounts[currentMinimumIndex] == 1) { reserveDecrease += _dividendReserves[currentMinimumIndex] - (multiplier * balance); _dividendHolderCounts[currentMinimumIndex] = 0; _dividendReserves[currentMinimumIndex] = 0; } else { _dividendHolderCounts[currentMinimumIndex]--; _dividendReserves[currentMinimumIndex] -= multiplier * balance; } } _minimumDividendIndex[holder] = count; // Update the balance. uint256 currentBalance = _dividendBalance[holder]; require(currentBalance + (multiplier * balance) > currentBalance, "Balance overflow"); _dividendBalance[holder] = currentBalance + (multiplier * balance); // Update the reserve balance. if (reserveDecrease > 0) { _reservedBalance -= reserveDecrease; } } /** * Creates a new dividend. Dividends are only paid out to holders who have at least "one token" at time of creation. The dividend * is a multiplier, representing how many dividend tokens (e.g., WBTC) should be paid out for one governance token. Dividend * eligibility is only updated in state in two cases: * 1) When a dividend is being withdrawn (in which it is set to zero). * 2) When the governance token is transferred (balances are checked before the transfer, on both sender and recipient). */ function createDividend(uint256 multiplier, string calldata reason) external { // Reentrancy guard. require(_status == RE_NOT_ENTERED); _status = RE_ENTERED; require(msg.sender == _owner, "Not owner"); require(_governanceStage >= STAGE_DAO_INITIATED, "DAO not initiated"); require(multiplier > 0, "Multiplier must be > 0"); // Make sure we can actually create a dividend with that amount. uint256 currentBalance = IERC20(_dividendContract).balanceOf(address(this)) - _reservedBalance; uint256 holders = _dividendHolders; uint256 reserveIncrease = totalSupply() * multiplier; require(reserveIncrease > currentBalance, "Multiplier too large"); // Increase the reserve. require(_reservedBalance + reserveIncrease > _reservedBalance, "Reserved overflow error"); _reservedBalance += reserveIncrease; // Keep track of the holders, reserve, and multiplier for this dividend. _dividendHolderCounts.push(holders); _dividendMultipliers.push(multiplier); _dividendReserves.push(reserveIncrease); // Hello world! emit DividendCreated(multiplier, reason); // By storing the original amount once again, a refund is triggered (see https://eips.ethereum.org/EIPS/eip-2200). _status = RE_NOT_ENTERED; } /** Returns the dividend balance for a holder according to the true state, not the hard state. See: `_checkDividend()`. */ function getDividendBalance(address holder) external view returns (uint256) { uint256 count = _dividendMultipliers.length; uint256 balance = balanceOf(holder); uint256 dividendBalance = _dividendBalance[holder]; uint256 currentMinimumIndex = _minimumDividendIndex[holder]; for (; currentMinimumIndex < count; currentMinimumIndex ++) { dividendBalance += _dividendMultipliers[currentMinimumIndex] * balance; } return dividendBalance; } /** * Withdraws the current dividend balance. The sender doesn't need to have any current balance of the governance token to * withdraw, so long as they have a preexisting outstanding balance. This has a provided recipient so that we can drain the * dividend pool as necessary (e.g., for changing the dividend token). */ function withdrawDividend(address recipient) external { // Reentrancy guard. Allow owner to drain the pool even if frozen. require(_status == RE_NOT_ENTERED || (_status == RE_FROZEN && msg.sender == _owner)); _status = RE_ENTERED; // Update their balance. _checkDividend(recipient); // Revert so gas estimators will show a failure. uint256 balance = _dividendBalance[recipient]; require(balance > 0, "No dividend balance"); // Wipe the balance. _dividendBalance[recipient] = 0; require(_reservedBalance - balance > 0, "Reserved balance underflow"); _reservedBalance -= balance; // Give them their balance. IERC20(_dividendContract).transfer(recipient, balance); // By storing the original amount once again, a refund is triggered (see https://eips.ethereum.org/EIPS/eip-2200). _status = RE_NOT_ENTERED; } /// ERC20 Overrides /// /** This is overridden so we can update the dividend balancees prior to the transfer completing. */ function transfer(address recipient, uint256 amount) public override returns (bool) { // Update the dividend balances prior to the transfer for both sender and receiver. _checkDividend(msg.sender); _checkDividend(recipient); // Preserve the original balances so we know if we need to change `_dividendHolders`. uint256 senderBefore = balanceOf(msg.sender); uint256 recipientBefore = balanceOf(recipient); super.transfer(recipient, amount); // See if we need to change `_dividendHolders`. uint256 senderAfter = balanceOf(msg.sender); if (senderAfter >= DIVIDEND_THRESHOLD && senderBefore < DIVIDEND_THRESHOLD) { _dividendHolders ++; } else if (senderAfter < DIVIDEND_THRESHOLD && senderBefore >= DIVIDEND_THRESHOLD) { _dividendHolders --; } uint256 recipientAfter = balanceOf(recipient); if (recipientAfter >= DIVIDEND_THRESHOLD && recipientBefore < DIVIDEND_THRESHOLD) { _dividendHolders ++; } else if (recipientAfter < DIVIDEND_THRESHOLD && recipientBefore >= DIVIDEND_THRESHOLD) { _dividendHolders --; } return true; } /** This is overridden so we can update the dividend balancees prior to the transfer completing. */ function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { // Update the dividend balances prior to the transfer for both sender and receiver. _checkDividend(sender); _checkDividend(recipient); // Preserve the original balances so we know if we need to change `_dividendHolders`. uint256 senderBefore = balanceOf(sender); uint256 recipientBefore = balanceOf(recipient); super.transferFrom(sender, recipient, amount); // See if we need to change `_dividendHolders`. uint256 senderAfter = balanceOf(sender); if (senderAfter >= DIVIDEND_THRESHOLD && senderBefore < DIVIDEND_THRESHOLD) { _dividendHolders ++; } else if (senderAfter < DIVIDEND_THRESHOLD && senderBefore >= DIVIDEND_THRESHOLD) { _dividendHolders --; } uint256 recipientAfter = balanceOf(recipient); if (recipientAfter >= DIVIDEND_THRESHOLD && recipientBefore < DIVIDEND_THRESHOLD) { _dividendHolders ++; } else if (recipientAfter < DIVIDEND_THRESHOLD && recipientBefore >= DIVIDEND_THRESHOLD) { _dividendHolders --; } return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":false,"internalType":"uint256","name":"multiplier","type":"uint256"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"DividendCreated","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":"_dividendContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reservedBalance","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":"address","name":"newContract","type":"address"}],"name":"changeDividendContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDeployer","type":"address"}],"name":"changeLatestDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"changeProxyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"changeUniswapRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimIssuance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"convertToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenAddresses","type":"address[]"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"convertTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"multiplier","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"name":"createDividend","outputs":[],"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":"freeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getDividendBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestDeployerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProxyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUniswapRouterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"initializeDAO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"}],"name":"notifyGoaldCreated","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"},{"inputs":[],"name":"unfreeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawDividend","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260058054610100600160a81b03191633610100021790553480156200002857600080fd5b506040518060400160405280600581526020016411dbd85b1960da1b8152506040518060400160405280600581526020016411d3d0531160da1b81525081600390805190602001906200007d929190620000e2565b50805162000093906004906020840190620000e2565b50506005805460ff1916601217905550620000af6006620000cc565b6001601355600780546001600160a01b031916301790556200017e565b6005805460ff191660ff92909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200012557805160ff191683800117855562000155565b8280016001018555821562000155579182015b828111156200015557825182559160200191906001019062000138565b506200016392915062000167565b5090565b5b8082111562000163576000815560010162000168565b612bef806200018e6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80639c53c0ca1161010f578063c1ad0160116100a2578063e0549f8511610071578063e0549f8514610662578063e19740061461066a578063fcab2a3214610672578063ff2650fc146106e7576101f0565b8063c1ad016014610598578063cb601c5214610606578063d39ac0cb1461062c578063dd62ed3e14610634576101f0565b8063a6f9dae1116100de578063a6f9dae114610518578063a9059cbb1461053e578063b2bdfa7b1461056a578063bd25ee7e14610572576101f0565b80639c53c0ca146104985780639c8140b1146104be578063a2ffdab4146104e4578063a457c2d7146104ec576101f0565b806343a73d9a1161018757806370a082311161015657806370a08231146103d657806387775d29146103fc57806393c0182d1461042257806395d89b4114610490576101f0565b806343a73d9a1461039657806355db55b71461039e57806362a5af3b146103c65780636a28f000146103ce576101f0565b806323b872dd116101c357806323b872dd146102f0578063313ce5671461032657806331cece4214610344578063395093511461036a576101f0565b806306fdde03146101f5578063095ea7b31461027257806311c2f398146102b257806318160ddd146102d6575b600080fd5b6101fd6106ef565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561023757818101518382015260200161021f565b50505050905090810190601f1680156102645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61029e6004803603604081101561028857600080fd5b506001600160a01b038135169060200135610785565b604080519115158252519081900360200190f35b6102ba6107a2565b604080516001600160a01b039092168252519081900360200190f35b6102de6107b1565b60408051918252519081900360200190f35b61029e6004803603606081101561030657600080fd5b506001600160a01b038135811691602081013590911690604001356107b7565b61032e6108b3565b6040805160ff9092168252519081900360200190f35b6102de6004803603602081101561035a57600080fd5b50356001600160a01b03166108bc565b61029e6004803603604081101561038057600080fd5b506001600160a01b03813516906020013561092f565b6102ba610982565b6103c4600480360360208110156103b457600080fd5b50356001600160a01b0316610991565b005b6103c4610b61565b6103c4610bc7565b6102de600480360360208110156103ec57600080fd5b50356001600160a01b0316610c2d565b6103c46004803603602081101561041257600080fd5b50356001600160a01b0316610c48565b6103c46004803603604081101561043857600080fd5b810190602081018135600160201b81111561045257600080fd5b82018360208201111561046457600080fd5b803590602001918460208302840111600160201b8311171561048557600080fd5b919350915035610d29565b6101fd6110bb565b6103c4600480360360208110156104ae57600080fd5b50356001600160a01b031661111c565b6103c4600480360360208110156104d457600080fd5b50356001600160a01b03166112c5565b6103c4611464565b61029e6004803603604081101561050257600080fd5b506001600160a01b038135169060200135611536565b6103c46004803603602081101561052e57600080fd5b50356001600160a01b031661159e565b61029e6004803603604081101561055457600080fd5b506001600160a01b038135169060200135611685565b6102ba61177f565b6103c46004803603602081101561058857600080fd5b50356001600160a01b0316611793565b6103c4600480360360408110156105ae57600080fd5b810190602081018135600160201b8111156105c857600080fd5b8201836020820111156105da57600080fd5b803590602001918460208302840111600160201b831117156105fb57600080fd5b919350915035611874565b6103c46004803603602081101561061c57600080fd5b50356001600160a01b0316611d66565b6102ba611df4565b6102de6004803603604081101561064a57600080fd5b506001600160a01b0381358116916020013516611e03565b6102ba611e2e565b6102de611e3d565b6103c46004803603604081101561068857600080fd5b81359190810190604081016020820135600160201b8111156106a957600080fd5b8201836020820111156106bb57600080fd5b803590602001918460018302840111600160201b831117156106dc57600080fd5b509092509050611e43565b6103c4612184565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561077b5780601f106107505761010080835404028352916020019161077b565b820191906000526020600020905b81548152906001019060200180831161075e57829003601f168201915b5050505050905090565b600061079961079261225e565b8484612262565b50600192915050565b6008546001600160a01b031690565b60025490565b60006107c28461234e565b6107cb8361234e565b60006107d685610c2d565b905060006107e385610c2d565b90506107f086868661255d565b5060006107fc87610c2d565b9050620f424081101580156108135750620f424083105b1561082657600a8054600101905561084b565b620f42408110801561083b5750620f42408310155b1561084b57600a80546000190190555b600061085687610c2d565b9050620f4240811015801561086d5750620f424083105b1561088057600a805460010190556108a5565b620f4240811080156108955750620f42408310155b156108a557600a80546000190190555b506001979650505050505050565b60055460ff1690565b600d54600090816108cc84610c2d565b6001600160a01b038516600090815260106020908152604080832054600f90925290912054919250905b838110156109265782600d828154811061090c57fe5b6000918252602090912001540291909101906001016108f6565b50949350505050565b600061079961093c61225e565b8461097d856001600061094d61225e565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906125df565b612262565b6007546001600160a01b031690565b600160135414806109a457506003601354145b6109ad57600080fd5b60055461010090046001600160a01b031633146109fd576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b038116610a50576040805162461bcd60e51b815260206004820152601560248201527443616e2774206265207a65726f206164647265737360581b604482015290519081900360640190fd5b6001600160a01b038116301415610aa6576040805162461bcd60e51b815260206004820152601560248201527443616e27742062652074686973206164647265737360581b604482015290519081900360640190fd5b60026011541015610af2576040805162461bcd60e51b8152602060048201526011602482015270111053c81b9bdd081a5b9a5d1a585d1959607a1b604482015290519081900360640190fd5b600b5415610b3f576040805162461bcd60e51b8152602060048201526015602482015274486176652072657365727665642062616c616e636560581b604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600160135414610b7057600080fd5b60055461010090046001600160a01b03163314610bc0576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6003601355565b600360135414610bd657600080fd5b60055461010090046001600160a01b03163314610c26576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001601355565b6001600160a01b031660009081526020819052604090205490565b60016013541480610c5b57506003601354145b610c6457600080fd5b60055461010090046001600160a01b03163314610cb4576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b038116610d07576040805162461bcd60e51b815260206004820152601560248201527443616e2774206265207a65726f206164647265737360581b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b600160135414610d3857600080fd5b600260135560055461010090046001600160a01b03163314610d8d576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60026011541015610dd9576040805162461bcd60e51b8152602060048201526011602482015270111053c81b9bdd081a5b9a5d1a585d1959607a1b604482015290519081900360640190fd5b600083836000818110610de857fe5b905060200201356001600160a01b031690506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610e4957600080fd5b505afa158015610e5d573d6000803e3d6000fd5b505050506040513d6020811015610e7357600080fd5b5051905080610ec0576040805162461bcd60e51b81526020600482015260146024820152732737903130b630b731b2903337b9103a37b5b2b760611b604482015290519081900360640190fd5b6006546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519184169163095ea7b3916044808201926020929091908290030181600087803b158015610f1657600080fd5b505af1158015610f2a573d6000803e3d6000fd5b505050506040513d6020811015610f4057600080fd5b50506006546040516338ed173960e01b81526004810183815260016024830181905230606484018190526084840188905260a06044850190815260a485018a90526001600160a01b03909516946338ed17399487948c938c9390928c92919060c401866020870280828437600081840152601f19601f820116905080830192505050975050505050505050600060405180830381600087803b158015610fe557600080fd5b505af1158015610ff9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561102257600080fd5b8101908080516040519392919084600160201b82111561104157600080fd5b90830190602082018581111561105657600080fd5b82518660208202830111600160201b8211171561107257600080fd5b82525081516020918201928201910280838360005b8381101561109f578181015183820152602001611087565b5050505091909101604052505060016013555050505050505050565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561077b5780601f106107505761010080835404028352916020019161077b565b6001601354148061114957506003601354148015611149575060055461010090046001600160a01b031633145b61115257600080fd5b60026013556111608161234e565b6001600160a01b038116600090815260106020526040902054806111c1576040805162461bcd60e51b81526020600482015260136024820152724e6f206469766964656e642062616c616e636560681b604482015290519081900360640190fd5b6001600160a01b038216600090815260106020526040812055600b54819003611231576040805162461bcd60e51b815260206004820152601a60248201527f52657365727665642062616c616e636520756e646572666c6f77000000000000604482015290519081900360640190fd5b600b805482900390556009546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561129057600080fd5b505af11580156112a4573d6000803e3d6000fd5b505050506040513d60208110156112ba57600080fd5b505060016013555050565b6001601354146112d457600080fd5b6008546001600160a01b03163314611329576040805162461bcd60e51b81526020600482015260136024820152722737ba103630ba32b9ba103232b83637bcb2b960691b604482015290519081900360640190fd5b6003601154141561134257601280546001019055611461565b6012546000600a821015611358575060646113ff565b60148210156113695750605a6113ff565b601e82101561137a575060506113ff565b602882101561138b575060466113ff565b603282101561139c5750603c6113ff565b603c8210156113ad575060326113ff565b60468210156113be575060286113ff565b60508210156113cf5750601e6113ff565b605a8210156113e0575060146113ff565b60648210156113f15750600a6113ff565b6111f88210156113ff575060015b801561143a5761140e8361234e565b620f424061141b84610c2d565b101561142b57600a805460010190555b61143a83620f42408302612640565b6111f8821015801561144e57506002601154145b156114595760036011555b506001016012555b50565b60016013541461147357600080fd5b60055461010090046001600160a01b031633146114c3576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60016011541461150f576040805162461bcd60e51b8152602060048201526012602482015271125cdcdd585b98d9481d5b98db185a5b595960721b604482015290519081900360640190fd5b60055461152f9061010090046001600160a01b03166402540be400612730565b6002601155565b600061079961154361225e565b8461097d85604051806060016040528060258152602001612b95602591396001600061156d61225e565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061282c565b600160135414806115b157506003601354145b6115ba57600080fd5b60055461010090046001600160a01b0316331461160a576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b03811661165d576040805162461bcd60e51b815260206004820152601560248201527443616e2774206265207a65726f206164647265737360581b604482015290519081900360640190fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60006116903361234e565b6116998361234e565b60006116a433610c2d565b905060006116b185610c2d565b90506116bd85856128c3565b5060006116c933610c2d565b9050620f424081101580156116e05750620f424083105b156116f357600a80546001019055611718565b620f4240811080156117085750620f42408310155b1561171857600a80546000190190555b600061172387610c2d565b9050620f4240811015801561173a5750620f424083105b1561174d57600a80546001019055611772565b620f4240811080156117625750620f42408310155b1561177257600a80546000190190555b5060019695505050505050565b60055461010090046001600160a01b031681565b600160135414806117a657506003601354145b6117af57600080fd5b60055461010090046001600160a01b031633146117ff576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b038116611852576040805162461bcd60e51b815260206004820152601560248201527443616e2774206265207a65726f206164647265737360581b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60016013541461188357600080fd5b600260135560055461010090046001600160a01b031633146118d8576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60026011541015611924576040805162461bcd60e51b8152602060048201526011602482015270111053c81b9bdd081a5b9a5d1a585d1959607a1b604482015290519081900360640190fd5b6009546060805190916001600160a01b0316908290600190811061194457fe5b6001600160a01b039283166020918202929092010152600654166000808086815b81811015611d555789898281811061197957fe5b905060200201356001600160a01b0316945060006001600160a01b0316856001600160a01b031614156119eb576040805162461bcd60e51b815260206004820152601560248201527443616e2774206265207a65726f206164647265737360581b604482015290519081900360640190fd5b6001600160a01b038516301415611a41576040805162461bcd60e51b815260206004820152601560248201527443616e27742062652074686973206164647265737360581b604482015290519081900360640190fd5b6009546001600160a01b0386811691161415611aa4576040805162461bcd60e51b815260206004820152601760248201527f43616e2774206265207461726765742061646472657373000000000000000000604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290518695506001600160a01b038616916370a08231916024808301926020929190829003018186803b158015611aed57600080fd5b505afa158015611b01573d6000803e3d6000fd5b505050506040513d6020811015611b1757600080fd5b5051925082611b2557611d4d565b6006546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810186905290519186169163095ea7b3916044808201926020929091908290030181600087803b158015611b7b57600080fd5b505af1158015611b8f573d6000803e3d6000fd5b505050506040513d6020811015611ba557600080fd5b5050865185908890600090611bb657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050856001600160a01b03166338ed17398460018a308d6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611c5b578181015183820152602001611c43565b505050509050019650505050505050600060405180830381600087803b158015611c8457600080fd5b505af1158015611c98573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611cc157600080fd5b8101908080516040519392919084600160201b821115611ce057600080fd5b908301906020820185811115611cf557600080fd5b82518660208202830111600160201b82111715611d1157600080fd5b82525081516020918201928201910280838360005b83811015611d3e578181015183820152602001611d26565b50505050905001604052505050505b600101611965565b505060016013555050505050505050565b60016013541480611d7957506003601354145b611d8257600080fd5b60055461010090046001600160a01b03163314611dd2576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031690565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6009546001600160a01b031681565b600b5481565b600160135414611e5257600080fd5b600260135560055461010090046001600160a01b03163314611ea7576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60026011541015611ef3576040805162461bcd60e51b8152602060048201526011602482015270111053c81b9bdd081a5b9a5d1a585d1959607a1b604482015290519081900360640190fd5b60008311611f41576040805162461bcd60e51b815260206004820152601660248201527504d756c7469706c696572206d757374206265203e20360541b604482015290519081900360640190fd5b600b54600954604080516370a0823160e01b81523060048201529051600093926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611f9057600080fd5b505afa158015611fa4573d6000803e3d6000fd5b505050506040513d6020811015611fba57600080fd5b5051600a549190039150600085611fcf6107b1565b02905082811161201d576040805162461bcd60e51b81526020600482015260146024820152734d756c7469706c69657220746f6f206c6172676560601b604482015290519081900360640190fd5b600b5481810111612075576040805162461bcd60e51b815260206004820152601760248201527f5265736572766564206f766572666c6f77206572726f72000000000000000000604482015290519081900360640190fd5b600b805482019055600c805460018181019092557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701839055600d80548083019091557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501879055600e805491820181556000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0181905560408051878152602081018281529181018690527f731d0a847e5f3aea8ad46515657a1c9ad81fa78f34d40b6e4f8d36f930998e13918891889188919060608201848480828437600083820152604051601f909101601f1916909201829003965090945050505050a15050600160135550505050565b6001601354148061219757506003601354145b6121a057600080fd5b60055461010090046001600160a01b031633146121f0576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60115415612237576040805162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6005546122579061010090046001600160a01b031664028fa6ae00612640565b6001601155565b3390565b6001600160a01b0383166122a75760405162461bcd60e51b8152600401808060200182810382526024815260200180612b716024913960400191505060405180910390fd5b6001600160a01b0382166122ec5760405162461bcd60e51b8152600401808060200182810382526022815260200180612abb6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600d546001600160a01b0382166000908152600f602052604090205480821415612379575050611461565b600061238484610c2d565b9050620f42408110156123bd57828210156123b5576001600160a01b0384166000908152600f602052604090208390555b505050611461565b6000805b848410156124b457600d84815481106123d657fe5b906000526020600020015482019150600c84815481106123f257fe5b90600052602060002001546001141561246257828202600e858154811061241557fe5b906000526020600020015403810190506000600c858154811061243457fe5b90600052602060002001819055506000600e858154811061245157fe5b6000918252602090912001556124a9565b600c848154811061246f57fe5b60009182526020909120018054600019019055600e805483850291908690811061249557fe5b600091825260209091200180549190910390555b6001909301926123c1565b6001600160a01b0386166000908152600f60209081526040808320889055601090915290205482840281018110612525576040805162461bcd60e51b815260206004820152601060248201526f42616c616e6365206f766572666c6f7760801b604482015290519081900360640190fd5b6001600160a01b038716600090815260106020526040902083850282019055811561255457600b805483900390555b50505050505050565b600061256a8484846128d3565b6125d58461257661225e565b61097d85604051806060016040528060288152602001612b03602891396001600160a01b038a166000908152600160205260408120906125b461225e565b6001600160a01b03168152602081019190915260400160002054919061282c565b5060019392505050565b600082820183811015612639576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03821661269b576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6126a760008383612a2e565b6002546126b490826125df565b6002556001600160a01b0382166000908152602081905260409020546126da90826125df565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166127755760405162461bcd60e51b8152600401808060200182810382526021815260200180612b2b6021913960400191505060405180910390fd5b61278182600083612a2e565b6127be81604051806060016040528060228152602001612a99602291396001600160a01b038516600090815260208190526040902054919061282c565b6001600160a01b0383166000908152602081905260409020556002546127e49082612a33565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600081848411156128bb5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612880578181015183820152602001612868565b50505050905090810190601f1680156128ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60006107996128d061225e565b84845b6001600160a01b0383166129185760405162461bcd60e51b8152600401808060200182810382526025815260200180612b4c6025913960400191505060405180910390fd5b6001600160a01b03821661295d5760405162461bcd60e51b8152600401808060200182810382526023815260200180612a766023913960400191505060405180910390fd5b612968838383612a2e565b6129a581604051806060016040528060268152602001612add602691396001600160a01b038616600090815260208190526040902054919061282c565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546129d490826125df565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b505050565b600061263983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061282c56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a1525c5aa7217ecc83334004a8098b0e3b2def7ed5f7358f50d3ce871f991a5d64736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80639c53c0ca1161010f578063c1ad0160116100a2578063e0549f8511610071578063e0549f8514610662578063e19740061461066a578063fcab2a3214610672578063ff2650fc146106e7576101f0565b8063c1ad016014610598578063cb601c5214610606578063d39ac0cb1461062c578063dd62ed3e14610634576101f0565b8063a6f9dae1116100de578063a6f9dae114610518578063a9059cbb1461053e578063b2bdfa7b1461056a578063bd25ee7e14610572576101f0565b80639c53c0ca146104985780639c8140b1146104be578063a2ffdab4146104e4578063a457c2d7146104ec576101f0565b806343a73d9a1161018757806370a082311161015657806370a08231146103d657806387775d29146103fc57806393c0182d1461042257806395d89b4114610490576101f0565b806343a73d9a1461039657806355db55b71461039e57806362a5af3b146103c65780636a28f000146103ce576101f0565b806323b872dd116101c357806323b872dd146102f0578063313ce5671461032657806331cece4214610344578063395093511461036a576101f0565b806306fdde03146101f5578063095ea7b31461027257806311c2f398146102b257806318160ddd146102d6575b600080fd5b6101fd6106ef565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561023757818101518382015260200161021f565b50505050905090810190601f1680156102645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61029e6004803603604081101561028857600080fd5b506001600160a01b038135169060200135610785565b604080519115158252519081900360200190f35b6102ba6107a2565b604080516001600160a01b039092168252519081900360200190f35b6102de6107b1565b60408051918252519081900360200190f35b61029e6004803603606081101561030657600080fd5b506001600160a01b038135811691602081013590911690604001356107b7565b61032e6108b3565b6040805160ff9092168252519081900360200190f35b6102de6004803603602081101561035a57600080fd5b50356001600160a01b03166108bc565b61029e6004803603604081101561038057600080fd5b506001600160a01b03813516906020013561092f565b6102ba610982565b6103c4600480360360208110156103b457600080fd5b50356001600160a01b0316610991565b005b6103c4610b61565b6103c4610bc7565b6102de600480360360208110156103ec57600080fd5b50356001600160a01b0316610c2d565b6103c46004803603602081101561041257600080fd5b50356001600160a01b0316610c48565b6103c46004803603604081101561043857600080fd5b810190602081018135600160201b81111561045257600080fd5b82018360208201111561046457600080fd5b803590602001918460208302840111600160201b8311171561048557600080fd5b919350915035610d29565b6101fd6110bb565b6103c4600480360360208110156104ae57600080fd5b50356001600160a01b031661111c565b6103c4600480360360208110156104d457600080fd5b50356001600160a01b03166112c5565b6103c4611464565b61029e6004803603604081101561050257600080fd5b506001600160a01b038135169060200135611536565b6103c46004803603602081101561052e57600080fd5b50356001600160a01b031661159e565b61029e6004803603604081101561055457600080fd5b506001600160a01b038135169060200135611685565b6102ba61177f565b6103c46004803603602081101561058857600080fd5b50356001600160a01b0316611793565b6103c4600480360360408110156105ae57600080fd5b810190602081018135600160201b8111156105c857600080fd5b8201836020820111156105da57600080fd5b803590602001918460208302840111600160201b831117156105fb57600080fd5b919350915035611874565b6103c46004803603602081101561061c57600080fd5b50356001600160a01b0316611d66565b6102ba611df4565b6102de6004803603604081101561064a57600080fd5b506001600160a01b0381358116916020013516611e03565b6102ba611e2e565b6102de611e3d565b6103c46004803603604081101561068857600080fd5b81359190810190604081016020820135600160201b8111156106a957600080fd5b8201836020820111156106bb57600080fd5b803590602001918460018302840111600160201b831117156106dc57600080fd5b509092509050611e43565b6103c4612184565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561077b5780601f106107505761010080835404028352916020019161077b565b820191906000526020600020905b81548152906001019060200180831161075e57829003601f168201915b5050505050905090565b600061079961079261225e565b8484612262565b50600192915050565b6008546001600160a01b031690565b60025490565b60006107c28461234e565b6107cb8361234e565b60006107d685610c2d565b905060006107e385610c2d565b90506107f086868661255d565b5060006107fc87610c2d565b9050620f424081101580156108135750620f424083105b1561082657600a8054600101905561084b565b620f42408110801561083b5750620f42408310155b1561084b57600a80546000190190555b600061085687610c2d565b9050620f4240811015801561086d5750620f424083105b1561088057600a805460010190556108a5565b620f4240811080156108955750620f42408310155b156108a557600a80546000190190555b506001979650505050505050565b60055460ff1690565b600d54600090816108cc84610c2d565b6001600160a01b038516600090815260106020908152604080832054600f90925290912054919250905b838110156109265782600d828154811061090c57fe5b6000918252602090912001540291909101906001016108f6565b50949350505050565b600061079961093c61225e565b8461097d856001600061094d61225e565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906125df565b612262565b6007546001600160a01b031690565b600160135414806109a457506003601354145b6109ad57600080fd5b60055461010090046001600160a01b031633146109fd576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b038116610a50576040805162461bcd60e51b815260206004820152601560248201527443616e2774206265207a65726f206164647265737360581b604482015290519081900360640190fd5b6001600160a01b038116301415610aa6576040805162461bcd60e51b815260206004820152601560248201527443616e27742062652074686973206164647265737360581b604482015290519081900360640190fd5b60026011541015610af2576040805162461bcd60e51b8152602060048201526011602482015270111053c81b9bdd081a5b9a5d1a585d1959607a1b604482015290519081900360640190fd5b600b5415610b3f576040805162461bcd60e51b8152602060048201526015602482015274486176652072657365727665642062616c616e636560581b604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600160135414610b7057600080fd5b60055461010090046001600160a01b03163314610bc0576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6003601355565b600360135414610bd657600080fd5b60055461010090046001600160a01b03163314610c26576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001601355565b6001600160a01b031660009081526020819052604090205490565b60016013541480610c5b57506003601354145b610c6457600080fd5b60055461010090046001600160a01b03163314610cb4576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b038116610d07576040805162461bcd60e51b815260206004820152601560248201527443616e2774206265207a65726f206164647265737360581b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b600160135414610d3857600080fd5b600260135560055461010090046001600160a01b03163314610d8d576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60026011541015610dd9576040805162461bcd60e51b8152602060048201526011602482015270111053c81b9bdd081a5b9a5d1a585d1959607a1b604482015290519081900360640190fd5b600083836000818110610de857fe5b905060200201356001600160a01b031690506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610e4957600080fd5b505afa158015610e5d573d6000803e3d6000fd5b505050506040513d6020811015610e7357600080fd5b5051905080610ec0576040805162461bcd60e51b81526020600482015260146024820152732737903130b630b731b2903337b9103a37b5b2b760611b604482015290519081900360640190fd5b6006546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519184169163095ea7b3916044808201926020929091908290030181600087803b158015610f1657600080fd5b505af1158015610f2a573d6000803e3d6000fd5b505050506040513d6020811015610f4057600080fd5b50506006546040516338ed173960e01b81526004810183815260016024830181905230606484018190526084840188905260a06044850190815260a485018a90526001600160a01b03909516946338ed17399487948c938c9390928c92919060c401866020870280828437600081840152601f19601f820116905080830192505050975050505050505050600060405180830381600087803b158015610fe557600080fd5b505af1158015610ff9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561102257600080fd5b8101908080516040519392919084600160201b82111561104157600080fd5b90830190602082018581111561105657600080fd5b82518660208202830111600160201b8211171561107257600080fd5b82525081516020918201928201910280838360005b8381101561109f578181015183820152602001611087565b5050505091909101604052505060016013555050505050505050565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561077b5780601f106107505761010080835404028352916020019161077b565b6001601354148061114957506003601354148015611149575060055461010090046001600160a01b031633145b61115257600080fd5b60026013556111608161234e565b6001600160a01b038116600090815260106020526040902054806111c1576040805162461bcd60e51b81526020600482015260136024820152724e6f206469766964656e642062616c616e636560681b604482015290519081900360640190fd5b6001600160a01b038216600090815260106020526040812055600b54819003611231576040805162461bcd60e51b815260206004820152601a60248201527f52657365727665642062616c616e636520756e646572666c6f77000000000000604482015290519081900360640190fd5b600b805482900390556009546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561129057600080fd5b505af11580156112a4573d6000803e3d6000fd5b505050506040513d60208110156112ba57600080fd5b505060016013555050565b6001601354146112d457600080fd5b6008546001600160a01b03163314611329576040805162461bcd60e51b81526020600482015260136024820152722737ba103630ba32b9ba103232b83637bcb2b960691b604482015290519081900360640190fd5b6003601154141561134257601280546001019055611461565b6012546000600a821015611358575060646113ff565b60148210156113695750605a6113ff565b601e82101561137a575060506113ff565b602882101561138b575060466113ff565b603282101561139c5750603c6113ff565b603c8210156113ad575060326113ff565b60468210156113be575060286113ff565b60508210156113cf5750601e6113ff565b605a8210156113e0575060146113ff565b60648210156113f15750600a6113ff565b6111f88210156113ff575060015b801561143a5761140e8361234e565b620f424061141b84610c2d565b101561142b57600a805460010190555b61143a83620f42408302612640565b6111f8821015801561144e57506002601154145b156114595760036011555b506001016012555b50565b60016013541461147357600080fd5b60055461010090046001600160a01b031633146114c3576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60016011541461150f576040805162461bcd60e51b8152602060048201526012602482015271125cdcdd585b98d9481d5b98db185a5b595960721b604482015290519081900360640190fd5b60055461152f9061010090046001600160a01b03166402540be400612730565b6002601155565b600061079961154361225e565b8461097d85604051806060016040528060258152602001612b95602591396001600061156d61225e565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061282c565b600160135414806115b157506003601354145b6115ba57600080fd5b60055461010090046001600160a01b0316331461160a576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b03811661165d576040805162461bcd60e51b815260206004820152601560248201527443616e2774206265207a65726f206164647265737360581b604482015290519081900360640190fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60006116903361234e565b6116998361234e565b60006116a433610c2d565b905060006116b185610c2d565b90506116bd85856128c3565b5060006116c933610c2d565b9050620f424081101580156116e05750620f424083105b156116f357600a80546001019055611718565b620f4240811080156117085750620f42408310155b1561171857600a80546000190190555b600061172387610c2d565b9050620f4240811015801561173a5750620f424083105b1561174d57600a80546001019055611772565b620f4240811080156117625750620f42408310155b1561177257600a80546000190190555b5060019695505050505050565b60055461010090046001600160a01b031681565b600160135414806117a657506003601354145b6117af57600080fd5b60055461010090046001600160a01b031633146117ff576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b038116611852576040805162461bcd60e51b815260206004820152601560248201527443616e2774206265207a65726f206164647265737360581b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60016013541461188357600080fd5b600260135560055461010090046001600160a01b031633146118d8576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60026011541015611924576040805162461bcd60e51b8152602060048201526011602482015270111053c81b9bdd081a5b9a5d1a585d1959607a1b604482015290519081900360640190fd5b6009546060805190916001600160a01b0316908290600190811061194457fe5b6001600160a01b039283166020918202929092010152600654166000808086815b81811015611d555789898281811061197957fe5b905060200201356001600160a01b0316945060006001600160a01b0316856001600160a01b031614156119eb576040805162461bcd60e51b815260206004820152601560248201527443616e2774206265207a65726f206164647265737360581b604482015290519081900360640190fd5b6001600160a01b038516301415611a41576040805162461bcd60e51b815260206004820152601560248201527443616e27742062652074686973206164647265737360581b604482015290519081900360640190fd5b6009546001600160a01b0386811691161415611aa4576040805162461bcd60e51b815260206004820152601760248201527f43616e2774206265207461726765742061646472657373000000000000000000604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290518695506001600160a01b038616916370a08231916024808301926020929190829003018186803b158015611aed57600080fd5b505afa158015611b01573d6000803e3d6000fd5b505050506040513d6020811015611b1757600080fd5b5051925082611b2557611d4d565b6006546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810186905290519186169163095ea7b3916044808201926020929091908290030181600087803b158015611b7b57600080fd5b505af1158015611b8f573d6000803e3d6000fd5b505050506040513d6020811015611ba557600080fd5b5050865185908890600090611bb657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050856001600160a01b03166338ed17398460018a308d6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611c5b578181015183820152602001611c43565b505050509050019650505050505050600060405180830381600087803b158015611c8457600080fd5b505af1158015611c98573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611cc157600080fd5b8101908080516040519392919084600160201b821115611ce057600080fd5b908301906020820185811115611cf557600080fd5b82518660208202830111600160201b82111715611d1157600080fd5b82525081516020918201928201910280838360005b83811015611d3e578181015183820152602001611d26565b50505050905001604052505050505b600101611965565b505060016013555050505050505050565b60016013541480611d7957506003601354145b611d8257600080fd5b60055461010090046001600160a01b03163314611dd2576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b031690565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6009546001600160a01b031681565b600b5481565b600160135414611e5257600080fd5b600260135560055461010090046001600160a01b03163314611ea7576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60026011541015611ef3576040805162461bcd60e51b8152602060048201526011602482015270111053c81b9bdd081a5b9a5d1a585d1959607a1b604482015290519081900360640190fd5b60008311611f41576040805162461bcd60e51b815260206004820152601660248201527504d756c7469706c696572206d757374206265203e20360541b604482015290519081900360640190fd5b600b54600954604080516370a0823160e01b81523060048201529051600093926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611f9057600080fd5b505afa158015611fa4573d6000803e3d6000fd5b505050506040513d6020811015611fba57600080fd5b5051600a549190039150600085611fcf6107b1565b02905082811161201d576040805162461bcd60e51b81526020600482015260146024820152734d756c7469706c69657220746f6f206c6172676560601b604482015290519081900360640190fd5b600b5481810111612075576040805162461bcd60e51b815260206004820152601760248201527f5265736572766564206f766572666c6f77206572726f72000000000000000000604482015290519081900360640190fd5b600b805482019055600c805460018181019092557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701839055600d80548083019091557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501879055600e805491820181556000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0181905560408051878152602081018281529181018690527f731d0a847e5f3aea8ad46515657a1c9ad81fa78f34d40b6e4f8d36f930998e13918891889188919060608201848480828437600083820152604051601f909101601f1916909201829003965090945050505050a15050600160135550505050565b6001601354148061219757506003601354145b6121a057600080fd5b60055461010090046001600160a01b031633146121f0576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60115415612237576040805162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6005546122579061010090046001600160a01b031664028fa6ae00612640565b6001601155565b3390565b6001600160a01b0383166122a75760405162461bcd60e51b8152600401808060200182810382526024815260200180612b716024913960400191505060405180910390fd5b6001600160a01b0382166122ec5760405162461bcd60e51b8152600401808060200182810382526022815260200180612abb6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600d546001600160a01b0382166000908152600f602052604090205480821415612379575050611461565b600061238484610c2d565b9050620f42408110156123bd57828210156123b5576001600160a01b0384166000908152600f602052604090208390555b505050611461565b6000805b848410156124b457600d84815481106123d657fe5b906000526020600020015482019150600c84815481106123f257fe5b90600052602060002001546001141561246257828202600e858154811061241557fe5b906000526020600020015403810190506000600c858154811061243457fe5b90600052602060002001819055506000600e858154811061245157fe5b6000918252602090912001556124a9565b600c848154811061246f57fe5b60009182526020909120018054600019019055600e805483850291908690811061249557fe5b600091825260209091200180549190910390555b6001909301926123c1565b6001600160a01b0386166000908152600f60209081526040808320889055601090915290205482840281018110612525576040805162461bcd60e51b815260206004820152601060248201526f42616c616e6365206f766572666c6f7760801b604482015290519081900360640190fd5b6001600160a01b038716600090815260106020526040902083850282019055811561255457600b805483900390555b50505050505050565b600061256a8484846128d3565b6125d58461257661225e565b61097d85604051806060016040528060288152602001612b03602891396001600160a01b038a166000908152600160205260408120906125b461225e565b6001600160a01b03168152602081019190915260400160002054919061282c565b5060019392505050565b600082820183811015612639576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03821661269b576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6126a760008383612a2e565b6002546126b490826125df565b6002556001600160a01b0382166000908152602081905260409020546126da90826125df565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166127755760405162461bcd60e51b8152600401808060200182810382526021815260200180612b2b6021913960400191505060405180910390fd5b61278182600083612a2e565b6127be81604051806060016040528060228152602001612a99602291396001600160a01b038516600090815260208190526040902054919061282c565b6001600160a01b0383166000908152602081905260409020556002546127e49082612a33565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600081848411156128bb5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612880578181015183820152602001612868565b50505050905090810190601f1680156128ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60006107996128d061225e565b84845b6001600160a01b0383166129185760405162461bcd60e51b8152600401808060200182810382526025815260200180612b4c6025913960400191505060405180910390fd5b6001600160a01b03821661295d5760405162461bcd60e51b8152600401808060200182810382526023815260200180612a766023913960400191505060405180910390fd5b612968838383612a2e565b6129a581604051806060016040528060268152602001612add602691396001600160a01b038616600090815260208190526040902054919061282c565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546129d490826125df565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b505050565b600061263983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061282c56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a1525c5aa7217ecc83334004a8098b0e3b2def7ed5f7358f50d3ce871f991a5d64736f6c634300060c0033
Deployed Bytecode Sourcemap
36337:23954:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17108:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19214:169;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19214:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42436:109;;;:::i;:::-;;;;-1:-1:-1;;;;;42436:109:0;;;;;;;;;;;;;;18183:100;;;:::i;:::-;;;;;;;;;;;;;;;;59030:1258;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;59030:1258:0;;;;;;;;;;;;;;;;;:::i;18035:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55697:517;;;;;;;;;;;;;;;;-1:-1:-1;55697:517:0;-1:-1:-1;;;;;55697:517:0;;:::i;20587:218::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20587:218:0;;;;;;;;:::i;42245:98::-;;;:::i;45884:617::-;;;;;;;;;;;;;;;;-1:-1:-1;45884:617:0;-1:-1:-1;;;;;45884:617:0;;:::i;:::-;;41656:195;;;:::i;41942:197::-;;;:::i;18346:119::-;;;;;;;;;;;;;;;;-1:-1:-1;18346:119:0;-1:-1:-1;;;;;18346:119:0;;:::i;41231:341::-;;;;;;;;;;;;;;;;-1:-1:-1;41231:341:0;-1:-1:-1;;;;;41231:341:0;;:::i;47026:957::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47026:957:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47026:957:0;;;;;;;;;;;;-1:-1:-1;47026:957:0;-1:-1:-1;47026:957:0;;:::i;17310:87::-;;;:::i;56572:963::-;;;;;;;;;;;;;;;;-1:-1:-1;56572:963:0;-1:-1:-1;;;;;56572:963:0;;:::i;43720:1995::-;;;;;;;;;;;;;;;;-1:-1:-1;43720:1995:0;-1:-1:-1;;;;;43720:1995:0;;:::i;49885:381::-;;;:::i;21308:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21308:269:0;;;;;;;;:::i;39937:305::-;;;;;;;;;;;;;;;;-1:-1:-1;39937:305:0;-1:-1:-1;;;;;39937:305:0;;:::i;57679:1238::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;57679:1238:0;;;;;;;;:::i;36881:34::-;;;:::i;40825:325::-;;;;;;;;;;;;;;;;-1:-1:-1;40825:325:0;-1:-1:-1;;;;;40825:325:0;;:::i;48123:1754::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48123:1754:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48123:1754:0;;;;;;;;;;;;-1:-1:-1;48123:1754:0;-1:-1:-1;48123:1754:0;;:::i;40477:262::-;;;;;;;;;;;;;;;;-1:-1:-1;40477:262:0;-1:-1:-1;;;;;40477:262:0;;:::i;42608:114::-;;;:::i;18916:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18916:151:0;;;;;;;;;;:::i;37458:32::-;;;:::i;37733:31::-;;;:::i;54119:1442::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54119:1442:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54119:1442:0;;;;;;;;;;-1:-1:-1;54119:1442:0;;-1:-1:-1;54119:1442:0;-1:-1:-1;54119:1442:0;:::i;46509:387::-;;;:::i;17108:83::-;17178:5;17171:12;;;;;;;;-1:-1:-1;;17171:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17145:13;;17171:12;;17178:5;;17171:12;;17178:5;17171:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17108:83;:::o;19214:169::-;19297:4;19314:39;19323:12;:10;:12::i;:::-;19337:7;19346:6;19314:8;:39::i;:::-;-1:-1:-1;19371:4:0;19214:169;;;;:::o;42436:109::-;42522:15;;-1:-1:-1;;;;;42522:15:0;42436:109;:::o;18183:100::-;18263:12;;18183:100;:::o;59030:1258::-;59128:4;59238:22;59253:6;59238:14;:22::i;:::-;59271:25;59286:9;59271:14;:25::i;:::-;59404:20;59427:17;59437:6;59427:9;:17::i;:::-;59404:40;;59455:23;59481:20;59491:9;59481;:20::i;:::-;59455:46;;59514:45;59533:6;59541:9;59552:6;59514:18;:45::i;:::-;;59629:19;59651:17;59661:6;59651:9;:17::i;:::-;59629:39;;36818:5;59683:11;:33;;:70;;;;;36818:5;59720:12;:33;59683:70;59679:250;;;59770:16;:19;;;;;;59679:250;;;36818:5;59811:11;:32;:70;;;;;36818:5;59847:12;:34;;59811:70;59807:122;;;59898:16;:19;;-1:-1:-1;;59898:19:0;;;59807:122;59939:22;59964:20;59974:9;59964;:20::i;:::-;59939:45;;36818:5;59999:14;:36;;:76;;;;;36818:5;60039:15;:36;59999:76;59995:262;;;60092:16;:19;;;;;;59995:262;;;36818:5;60133:14;:35;:76;;;;;36818:5;60172:15;:37;;60133:76;60129:128;;;60226:16;:19;;-1:-1:-1;;60226:19:0;;;60129:128;-1:-1:-1;60276:4:0;;59030:1258;-1:-1:-1;;;;;;;59030:1258:0:o;18035:83::-;18101:9;;;;18035:83;:::o;55697:517::-;55800:20;:27;55764:7;;;55856:17;55866:6;55856:9;:17::i;:::-;-1:-1:-1;;;;;55910:24:0;;55884:23;55910:24;;;:16;:24;;;;;;;;;55975:21;:29;;;;;;;55838:35;;-1:-1:-1;55910:24:0;56015:157;56044:5;56022:19;:27;56015:157;;;56153:7;56109:20;56130:19;56109:41;;;;;;;;;;;;;;;;;;:51;56090:70;;;;;56051:22;;56015:157;;;-1:-1:-1;56191:15:0;55697:517;-1:-1:-1;;;;55697:517:0:o;20587:218::-;20675:4;20692:83;20701:12;:10;:12::i;:::-;20715:7;20724:50;20763:10;20724:11;:25;20736:12;:10;:12::i;:::-;-1:-1:-1;;;;;20724:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;20724:25:0;;;:34;;;;;;;;;;;:38;:50::i;:::-;20692:8;:83::i;42245:98::-;42322:13;;-1:-1:-1;;;;;42322:13:0;42245:98;:::o;45884:617::-;39451:1;45995:7;;:25;:49;;;;39551:1;46024:7;;:20;45995:49;45987:58;;;;;;46078:6;;;;;-1:-1:-1;;;;;46078:6:0;46064:10;:20;46056:61;;;;;-1:-1:-1;;;46056:61:0;;;;;;;;;;;;-1:-1:-1;;;46056:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46136:25:0;;46128:73;;;;;-1:-1:-1;;;46128:73:0;;;;;;;;;;;;-1:-1:-1;;;46128:73:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46220:28:0;;46243:4;46220:28;;46212:73;;;;;-1:-1:-1;;;46212:73:0;;;;;;;;;;;;-1:-1:-1;;;46212:73:0;;;;;;;;;;;;;;;39010:1;46304:16;;:39;;46296:69;;;;;-1:-1:-1;;;46296:69:0;;;;;;;;;;;;-1:-1:-1;;;46296:69:0;;;;;;;;;;;;;;;46384:16;;:21;46376:73;;;;;-1:-1:-1;;;46376:73:0;;;;;;;;;;;;-1:-1:-1;;;46376:73:0;;;;;;;;;;;;;;;46462:17;:31;;-1:-1:-1;;;;;;46462:31:0;-1:-1:-1;;;;;46462:31:0;;;;;;;;;;45884:617::o;41656:195::-;39451:1;41732:7;;:25;41724:34;;;;;;41791:6;;;;;-1:-1:-1;;;;;41791:6:0;41777:10;:20;41769:42;;;;;-1:-1:-1;;;41769:42:0;;;;;;;;;;;;-1:-1:-1;;;41769:42:0;;;;;;;;;;;;;;;39551:1;41824:7;:19;41656:195::o;41942:197::-;39551:1;42020:7;;:20;42012:29;;;;;;42074:6;;;;;-1:-1:-1;;;;;42074:6:0;42060:10;:20;42052:42;;;;;-1:-1:-1;;;42052:42:0;;;;;;;;;;;;-1:-1:-1;;;42052:42:0;;;;;;;;;;;;;;;39451:1;42107:7;:24;41942:197::o;18346:119::-;-1:-1:-1;;;;;18439:18:0;18412:7;18439:18;;;;;;;;;;;;18346:119::o;41231:341::-;39451:1;41345:7;;:25;:49;;;;39551:1;41374:7;;:20;41345:49;41337:58;;;;;;41428:6;;;;;-1:-1:-1;;;;;41428:6:0;41414:10;:20;41406:42;;;;;-1:-1:-1;;;41406:42:0;;;;;;;;;;;;-1:-1:-1;;;41406:42:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41467:24:0;;41459:58;;;;;-1:-1:-1;;;41459:58:0;;;;;;;;;;;;-1:-1:-1;;;41459:58:0;;;;;;;;;;;;;;;41530:21;:34;;-1:-1:-1;;;;;;41530:34:0;-1:-1:-1;;;;;41530:34:0;;;;;;;;;;41231:341::o;47026:957::-;39451:1;47149:7;;:25;47141:34;;;;;;39501:1;47186:7;:20;47239:6;;;;;-1:-1:-1;;;;;47239:6:0;47225:10;:20;47217:61;;;;;-1:-1:-1;;;47217:61:0;;;;;;;;;;;;-1:-1:-1;;;47217:61:0;;;;;;;;;;;;;;;39010:1;47297:16;;:39;;47289:69;;;;;-1:-1:-1;;;47289:69:0;;;;;;;;;;;;-1:-1:-1;;;47289:69:0;;;;;;;;;;;;;;;47443:20;47473:4;;47478:1;47473:7;;;;;;;;;;;;;-1:-1:-1;;;;;47473:7:0;47443:38;;47492:14;47509:13;-1:-1:-1;;;;;47509:23:0;;47541:4;47509:38;;;;;;;;;;;;;-1:-1:-1;;;;;47509:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47509:38:0;;-1:-1:-1;47566:10:0;47558:43;;;;;-1:-1:-1;;;47558:43:0;;;;;;;;;;;;-1:-1:-1;;;47558:43:0;;;;;;;;;;;;;;;47665:21;;47643:52;;;-1:-1:-1;;;47643:52:0;;-1:-1:-1;;;;;47665:21:0;;;47643:52;;;;;;;;;;;;:21;;;;;;:52;;;;;;;;;;;;;;;47665:21;47643;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47725:21:0;;47706:108;;-1:-1:-1;;;47706:108:0;;;;;;;;47725:21;47706:108;;;;;;47798:4;47706:108;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47725:21:0;;;;47706:66;;47773:6;;47784:4;;;;47798;;47805:8;;47706:108;;;;47784:4;47643:52;47706:108;;;47784:4;47706:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47706:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47706:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47706:108:0;;;;;;;;;;;;-1:-1:-1;47706:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;47706:108:0;;;;;;-1:-1:-1;;39451:1:0;47951:7;:24;-1:-1:-1;;;;;;;;47026:957:0:o;17310:87::-;17382:7;17375:14;;;;;;;;-1:-1:-1;;17375:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17349:13;;17375:14;;17382:7;;17375:14;;17382:7;17375:14;;;;;;;;;;;;;;;;;;;;;;;;56572:963;39451:1;56721:7;;:25;:75;;;;39551:1;56751:7;;:20;:44;;;;-1:-1:-1;56789:6:0;;;;;-1:-1:-1;;;;;56789:6:0;56775:10;:20;56751:44;56713:84;;;;;;39501:1;56808:7;:20;56875:25;56890:9;56875:14;:25::i;:::-;-1:-1:-1;;;;;56989:27:0;;56971:15;56989:27;;;:16;:27;;;;;;57035:11;57027:43;;;;;-1:-1:-1;;;57027:43:0;;;;;;;;;;;;-1:-1:-1;;;57027:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;57113:27:0;;57143:1;57113:27;;;:16;:27;;;;;:31;57163:16;;:26;;;57155:69;;;;;-1:-1:-1;;;57155:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57235:16;:27;;;;;;;57319:17;;57312:54;;;-1:-1:-1;;;57312:54:0;;-1:-1:-1;;;;;57312:54:0;;;;;;;;;;;;;;;57319:17;;;;;57312:34;;:54;;;;;;;;;;;;;;57235:16;57319:17;57312:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39451:1:0;57503:7;:24;-1:-1:-1;;56572:963:0:o;43720:1995::-;39451:1;43823:7;;:25;43815:34;;;;;;43882:15;;-1:-1:-1;;;;;43882:15:0;43868:10;:29;43860:61;;;;;-1:-1:-1;;;43860:61:0;;;;;;;;;;;;-1:-1:-1;;;43860:61:0;;;;;;;;;;;;;;;39073:1;43990:16;;:47;43986:118;;;44054:15;:17;;;;;;44086:7;;43986:118;44214:15;;44189:22;44295:2;44276:21;;44265:793;;;-1:-1:-1;44323:3:0;44265:793;;;44367:2;44348:14;:21;44344:714;;;-1:-1:-1;44396:2:0;44344:714;;;44439:2;44420:14;:21;44416:642;;;-1:-1:-1;44468:2:0;44416:642;;;44511:2;44492:14;:21;44488:570;;;-1:-1:-1;44540:2:0;44488:570;;;44583:2;44564:14;:21;44560:498;;;-1:-1:-1;44612:2:0;44560:498;;;44655:2;44636:14;:21;44632:426;;;-1:-1:-1;44684:2:0;44632:426;;;44727:2;44708:14;:21;44704:354;;;-1:-1:-1;44756:2:0;44704:354;;;44799:2;44780:14;:21;44776:282;;;-1:-1:-1;44828:2:0;44776:282;;;44871:2;44852:14;:21;44848:210;;;-1:-1:-1;44900:2:0;44848:210;;;44942:3;44924:14;:21;44920:138;;;-1:-1:-1;44972:2:0;44920:138;;;45013:4;44996:14;:21;44992:66;;;-1:-1:-1;45045:1:0;44992:66;45074:10;;45070:372;;45148:23;45163:7;45148:14;:23::i;:::-;36818:5;45238:18;45248:7;45238:9;:18::i;:::-;:39;45234:99;;;45298:16;:19;;;;;;45234:99;45387:43;45393:7;36818:5;45402:6;:27;45387:5;:43::i;:::-;45507:4;45489:14;:22;;:65;;;;;39010:1;45515:16;;:39;45489:65;45485:144;;;39073:1;45571:16;:46;45485:144;-1:-1:-1;45706:1:0;45689:18;45671:15;:36;43720:1995;;:::o;49885:381::-;39451:1;49968:7;;:25;49960:34;;;;;;50027:6;;;;;-1:-1:-1;;;;;50027:6:0;50013:10;:20;50005:64;;;;;-1:-1:-1;;;50005:64:0;;;;;;;;;;;;-1:-1:-1;;;50005:64:0;;;;;;;;;;;;;;;38947:1;50088:16;;:42;50080:73;;;;;-1:-1:-1;;;50080:73:0;;;;;;;;;;;;-1:-1:-1;;;50080:73:0;;;;;;;;;;;;;;;50172:6;;50166:41;;50172:6;;;-1:-1:-1;;;;;50172:6:0;50180:26;50166:5;:41::i;:::-;39010:1;50220:16;:38;49885:381::o;21308:269::-;21401:4;21418:129;21427:12;:10;:12::i;:::-;21441:7;21450:96;21489:15;21450:96;;;;;;;;;;;;;;;;;:11;:25;21462:12;:10;:12::i;:::-;-1:-1:-1;;;;;21450:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21450:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;39937:305::-;39451:1;40034:7;;:25;:49;;;;39551:1;40063:7;;:20;40034:49;40026:58;;;;;;40117:6;;;;;-1:-1:-1;;;;;40117:6:0;40103:10;:20;40095:42;;;;;-1:-1:-1;;;40095:42:0;;;;;;;;;;;;-1:-1:-1;;;40095:42:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40156:22:0;;40148:56;;;;;-1:-1:-1;;;40148:56:0;;;;;;;;;;;;-1:-1:-1;;;40148:56:0;;;;;;;;;;;;;;;40217:6;:17;;-1:-1:-1;;;;;40217:17:0;;;;;-1:-1:-1;;;;;;40217:17:0;;;;;;;;;39937:305::o;57679:1238::-;57757:4;57867:26;57882:10;57867:14;:26::i;:::-;57904:25;57919:9;57904:14;:25::i;:::-;58037:20;58060:21;58070:10;58060:9;:21::i;:::-;58037:44;;58092:23;58118:20;58128:9;58118;:20::i;:::-;58092:46;;58151:33;58166:9;58177:6;58151:14;:33::i;:::-;;58254:19;58276:21;58286:10;58276:9;:21::i;:::-;58254:43;;36818:5;58312:11;:33;;:70;;;;;36818:5;58349:12;:33;58312:70;58308:250;;;58399:16;:19;;;;;;58308:250;;;36818:5;58440:11;:32;:70;;;;;36818:5;58476:12;:34;;58440:70;58436:122;;;58527:16;:19;;-1:-1:-1;;58527:19:0;;;58436:122;58568:22;58593:20;58603:9;58593;:20::i;:::-;58568:45;;36818:5;58628:14;:36;;:76;;;;;36818:5;58668:15;:36;58628:76;58624:262;;;58721:16;:19;;;;;;58624:262;;;36818:5;58762:14;:35;:76;;;;;36818:5;58801:15;:37;;58762:76;58758:128;;;58855:16;:19;;-1:-1:-1;;58855:19:0;;;58758:128;-1:-1:-1;58905:4:0;;57679:1238;-1:-1:-1;;;;;;57679:1238:0:o;36881:34::-;;;;;;-1:-1:-1;;;;;36881:34:0;;:::o;40825:325::-;39451:1;40931:7;;:25;:49;;;;39551:1;40960:7;;:20;40931:49;40923:58;;;;;;41014:6;;;;;-1:-1:-1;;;;;41014:6:0;41000:10;:20;40992:42;;;;;-1:-1:-1;;;40992:42:0;;;;;;;;;;;;-1:-1:-1;;;40992:42:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41053:24:0;;41045:58;;;;;-1:-1:-1;;;41045:58:0;;;;;;;;;;;;-1:-1:-1;;;41045:58:0;;;;;;;;;;;;;;;41116:13;:26;;-1:-1:-1;;;;;;41116:26:0;-1:-1:-1;;;;;41116:26:0;;;;;;;;;;40825:325::o;48123:1754::-;39451:1;48257:7;;:25;48249:34;;;;;;39501:1;48294:7;:20;48347:6;;;;;-1:-1:-1;;;;;48347:6:0;48333:10;:20;48325:42;;;;;-1:-1:-1;;;48325:42:0;;;;;;;;;;;;-1:-1:-1;;;48325:42:0;;;;;;;;;;;;;;;39010:1;48386:16;;:39;;48378:69;;;;;-1:-1:-1;;;48378:69:0;;;;;;;;;;;;-1:-1:-1;;;48378:69:0;;;;;;;;;;;;;;;48584:17;;48542:21;48574:7;;48542:21;;-1:-1:-1;;;;;48584:17:0;;48542:21;;48584:17;;48574:7;;;;;;-1:-1:-1;;;;;48574:27:0;;;:7;;;;;;;;;:27;48660:21;;;48612:26;;;48808:14;48612:26;48840:869;48860:5;48856:1;:9;48840:869;;;48939:14;;48954:1;48939:17;;;;;;;;;;;;;-1:-1:-1;;;;;48939:17:0;48924:32;;49003:1;-1:-1:-1;;;;;48979:26:0;:12;-1:-1:-1;;;;;48979:26:0;;;48971:67;;;;;-1:-1:-1;;;48971:67:0;;;;;;;;;;;;-1:-1:-1;;;48971:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;49061:29:0;;49085:4;49061:29;;49053:67;;;;;-1:-1:-1;;;49053:67:0;;;;;;;;;;;;-1:-1:-1;;;49053:67:0;;;;;;;;;;;;;;;49159:17;;-1:-1:-1;;;;;49143:33:0;;;49159:17;;49143:33;;49135:69;;;;;-1:-1:-1;;;49135:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49357:38;;;-1:-1:-1;;;49357:38:0;;49389:4;49357:38;;;;;;49320:12;;-1:-1:-1;;;;;;49357:23:0;;;;;:38;;;;;;;;;;;;;;:23;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49357:38:0;;-1:-1:-1;49414:11:0;49410:60;;49446:8;;49410:60;49541:21;;49519:52;;;-1:-1:-1;;;49519:52:0;;-1:-1:-1;;;;;49541:21:0;;;49519:52;;;;;;;;;;;;:21;;;;;;:52;;;;;;;;;;;;;;;49541:21;49519;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49586:7:0;;49596:12;;49586:4;;49591:1;;49586:7;;;;;;;;;:22;-1:-1:-1;;;;;49586:22:0;;;-1:-1:-1;;;;;49586:22:0;;;;;49623:7;-1:-1:-1;;;;;49623:32:0;;49656:6;49664:1;49667:4;49681;49688:8;49623:74;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49623:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49623:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49623:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49623:74:0;;;;;;;;;;;;-1:-1:-1;49623:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48840:869;48867:4;;48840:869;;;-1:-1:-1;;39451:1:0;49845:7;:24;-1:-1:-1;;;;;;;;48123:1754:0:o;40477:262::-;39451:1;40586:7;;:25;:49;;;;39551:1;40615:7;;:20;40586:49;40578:58;;;;;;40669:6;;;;;-1:-1:-1;;;;;40669:6:0;40655:10;:20;40647:42;;;;;-1:-1:-1;;;40647:42:0;;;;;;;;;;;;-1:-1:-1;;;40647:42:0;;;;;;;;;;;;;;;40702:15;:29;;-1:-1:-1;;;;;;40702:29:0;-1:-1:-1;;;;;40702:29:0;;;;;;;;;;40477:262::o;42608:114::-;42693:21;;-1:-1:-1;;;;;42693:21:0;42608:114;:::o;18916:151::-;-1:-1:-1;;;;;19032:18:0;;;19005:7;19032:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18916:151::o;37458:32::-;;;-1:-1:-1;;;;;37458:32:0;;:::o;37733:31::-;;;;:::o;54119:1442::-;39451:1;54245:7;;:25;54237:34;;;;;;39501:1;54282:7;:20;54335:6;;;;;-1:-1:-1;;;;;54335:6:0;54321:10;:20;54313:61;;;;;-1:-1:-1;;;54313:61:0;;;;;;;;;;;;-1:-1:-1;;;54313:61:0;;;;;;;;;;;;;;;39010:1;54393:16;;:39;;54385:69;;;;;-1:-1:-1;;;54385:69:0;;;;;;;;;;;;-1:-1:-1;;;54385:69:0;;;;;;;;;;;;;;;54486:1;54473:10;:14;54465:74;;;;;-1:-1:-1;;;54465:74:0;;;;;;;;;;;;-1:-1:-1;;;54465:74:0;;;;;;;;;;;;;;;54704:16;;54658:17;;54651:50;;;-1:-1:-1;;;54651:50:0;;54695:4;54651:50;;;;;;54626:22;;54704:16;-1:-1:-1;;;;;54658:17:0;;54651:35;;:50;;;;;;;;;;;;;;54658:17;54651:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54651:50:0;54749:16;;54651:69;;;;-1:-1:-1;54731:15:0;54818:10;54802:13;:11;:13::i;:::-;:26;54776:52;;54865:14;54847:15;:32;54839:65;;;;;-1:-1:-1;;;54839:65:0;;;;;;;;;;;;-1:-1:-1;;;54839:65:0;;;;;;;;;;;;;;;54996:16;;54959:34;;;:53;54951:89;;;;;-1:-1:-1;;;54951:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55051:16;:35;;;;;;55181:21;:35;;-1:-1:-1;55181:35:0;;;;;;;;;;;55227:20;:37;;;;;;;;;;;;;55275:17;:39;;;;;;;55051:16;55275:39;;;;;;55357:35;;;;;;55181;55357;;;;;;;;;;;;;55253:10;;55385:6;;;;55357:35;;;;55385:6;;;;55357:35;;;;;;;;;;;;;-1:-1:-1;;55357:35:0;;;;;;;;-1:-1:-1;55357:35:0;;-1:-1:-1;;;;;55357:35:0;-1:-1:-1;;39451:1:0;55529:7;:24;-1:-1:-1;;;;54119:1442:0:o;46509:387::-;39451:1;46592:7;;:25;:49;;;;39551:1;46621:7;;:20;46592:49;46584:58;;;;;;46675:6;;;;;-1:-1:-1;;;;;46675:6:0;46661:10;:20;46653:55;;;;;-1:-1:-1;;;46653:55:0;;;;;;;;;;;;-1:-1:-1;;;46653:55:0;;;;;;;;;;;;;;;46727:16;;:33;46719:61;;;;;-1:-1:-1;;;46719:61:0;;;;;;;;;;;;-1:-1:-1;;;46719:61:0;;;;;;;;;;;;;;;46799:6;;46793:41;;46799:6;;;-1:-1:-1;;;;;46799:6:0;46807:26;46793:5;:41::i;:::-;38947:1;46847:16;:41;46509:387::o;570:106::-;658:10;570:106;:::o;24453:346::-;-1:-1:-1;;;;;24555:19:0;;24547:68;;;;-1:-1:-1;;;24547:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24634:21:0;;24626:68;;;;-1:-1:-1;;;24626:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24707:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24759:32;;;;;;;;;;;;;;;;;24453:346;;;:::o;50431:3126::-;50891:20;:27;-1:-1:-1;;;;;51019:29:0;;50875:13;51019:29;;;:21;:29;;;;;;51063:28;;;51059:67;;;51108:7;;;;51059:67;51228:15;51246:17;51256:6;51246:9;:17::i;:::-;51228:35;;36818:5;51278:7;:28;51274:256;;;51417:5;51395:19;:27;51391:105;;;-1:-1:-1;;;;;51443:29:0;;;;;;:21;:29;;;;;:37;;;51391:105;51512:7;;;;;51274:256;51776:18;51805:23;51839:1254;51868:5;51846:19;:27;51839:1254;;;52170:20;52191:19;52170:41;;;;;;;;;;;;;;;;52156:55;;;;52624:21;52646:19;52624:42;;;;;;;;;;;;;;;;52670:1;52624:47;52620:462;;;52766:7;52753:10;:20;52711:17;52729:19;52711:38;;;;;;;;;;;;;;;;:63;52692:82;;;;52838:1;52793:21;52815:19;52793:42;;;;;;;;;;;;;;;:46;;;;52899:1;52858:17;52876:19;52858:38;;;;;;;;;;;;;;;;;:42;52620:462;;;52941:21;52963:19;52941:42;;;;;;;;;;;;;;;;;:44;;-1:-1:-1;;52941:44:0;;;53004:17;:38;;53046:20;;;;53004:17;53022:19;;53004:38;;;;;;;;;;;;;;;:62;;;;;;;;52620:462;51875:22;;;;;51839:1254;;;-1:-1:-1;;;;;53103:29:0;;;;;;:21;:29;;;;;;;;:37;;;53210:16;:24;;;;;;53271:20;;;53253:39;;:56;-1:-1:-1;53245:85:0;;;;;-1:-1:-1;;;53245:85:0;;;;;;;;;;;;-1:-1:-1;;;53245:85:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;53341:24:0;;;;;;:16;:24;;;;;53386:20;;;53368:39;;53341:66;;53467:19;;53463:87;;53503:16;:35;;;;;;;53463:87;50431:3126;;;;;;;:::o;19857:321::-;19963:4;19980:36;19990:6;19998:9;20009:6;19980:9;:36::i;:::-;20027:121;20036:6;20044:12;:10;:12::i;:::-;20058:89;20096:6;20058:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20058:19:0;;;;;;:11;:19;;;;;;20078:12;:10;:12::i;:::-;-1:-1:-1;;;;;20058:33:0;;;;;;;;;;;;-1:-1:-1;20058:33:0;;;:89;:37;:89::i;20027:121::-;-1:-1:-1;20166:4:0;19857:321;;;;;:::o;4531:181::-;4589:7;4621:5;;;4645:6;;;;4637:46;;;;;-1:-1:-1;;;4637:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4703:1;4531:181;-1:-1:-1;;;4531:181:0:o;22887:378::-;-1:-1:-1;;;;;22971:21:0;;22963:65;;;;;-1:-1:-1;;;22963:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23041:49;23070:1;23074:7;23083:6;23041:20;:49::i;:::-;23118:12;;:24;;23135:6;23118:16;:24::i;:::-;23103:12;:39;-1:-1:-1;;;;;23174:18:0;;:9;:18;;;;;;;;;;;:30;;23197:6;23174:22;:30::i;:::-;-1:-1:-1;;;;;23153:18:0;;:9;:18;;;;;;;;;;;:51;;;;23220:37;;;;;;;23153:18;;:9;;23220:37;;;;;;;;;;22887:378;;:::o;23597:418::-;-1:-1:-1;;;;;23681:21:0;;23673:67;;;;-1:-1:-1;;;23673:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23753:49;23774:7;23791:1;23795:6;23753:20;:49::i;:::-;23836:68;23859:6;23836:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23836:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;23815:18:0;;:9;:18;;;;;;;;;;:89;23930:12;;:24;;23947:6;23930:16;:24::i;:::-;23915:12;:39;23970:37;;;;;;;;23996:1;;-1:-1:-1;;;;;23970:37:0;;;;;;;;;;;;23597:418;;:::o;5434:192::-;5520:7;5556:12;5548:6;;;;5540:29;;;;-1:-1:-1;;;5540:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5592:5:0;;;5434:192::o;18678:175::-;18764:4;18781:42;18791:12;:10;:12::i;:::-;18805:9;18816:6;22067:539;-1:-1:-1;;;;;22173:20:0;;22165:70;;;;-1:-1:-1;;;22165:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22254:23:0;;22246:71;;;;-1:-1:-1;;;22246:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22330:47;22351:6;22359:9;22370:6;22330:20;:47::i;:::-;22410:71;22432:6;22410:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22410:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;22390:17:0;;;:9;:17;;;;;;;;;;;:91;;;;22515:20;;;;;;;:32;;22540:6;22515:24;:32::i;:::-;-1:-1:-1;;;;;22492:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;22563:35;;;;;;;22492:20;;22563:35;;;;;;;;;;;;;22067:539;;;:::o;25824:92::-;;;;:::o;4995:136::-;5053:7;5080:43;5084:1;5087;5080:43;;;;;;;;;;;;;;;;;:3;:43::i
Swarm Source
ipfs://a1525c5aa7217ecc83334004a8098b0e3b2def7ed5f7358f50d3ce871f991a5d
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.