More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 121 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer From | 16234880 | 782 days ago | IN | 0 ETH | 0.00041849 | ||||
Withdraw Tokens | 16234863 | 782 days ago | IN | 0 ETH | 0.00067454 | ||||
Withdraw Tokens | 16234857 | 782 days ago | IN | 0 ETH | 0.00062141 | ||||
Withdraw Tokens | 16234837 | 782 days ago | IN | 0 ETH | 0.00067882 | ||||
Increase Allowan... | 16234815 | 782 days ago | IN | 0 ETH | 0.0006715 | ||||
Withdraw Tokens | 14289455 | 1079 days ago | IN | 0 ETH | 0.0020417 | ||||
Withdraw Tokens | 14289455 | 1079 days ago | IN | 0 ETH | 0.01314299 | ||||
Withdraw Tokens | 14289454 | 1079 days ago | IN | 0 ETH | 0.00186751 | ||||
Withdraw Tokens | 14289454 | 1079 days ago | IN | 0 ETH | 0.00186751 | ||||
Withdraw Any | 14289437 | 1079 days ago | IN | 0 ETH | 0.00774242 | ||||
Withdraw Tokens | 13765066 | 1161 days ago | IN | 0 ETH | 0.00218214 | ||||
Withdraw Tokens | 13765066 | 1161 days ago | IN | 0 ETH | 0.00218214 | ||||
Withdraw Any | 13765030 | 1161 days ago | IN | 0 ETH | 0.01097828 | ||||
Withdraw Tokens | 13320769 | 1231 days ago | IN | 0 ETH | 0.01165945 | ||||
Withdraw Tokens | 13320769 | 1231 days ago | IN | 0 ETH | 0.00542886 | ||||
Withdraw Tokens | 13320769 | 1231 days ago | IN | 0 ETH | 0.00470679 | ||||
Withdraw Tokens | 13320769 | 1231 days ago | IN | 0 ETH | 0.00175554 | ||||
Withdraw Tokens | 13320769 | 1231 days ago | IN | 0 ETH | 0.00175554 | ||||
Withdraw Tokens | 13320749 | 1231 days ago | IN | 0 ETH | 0.02749026 | ||||
Withdraw Tokens | 13320662 | 1231 days ago | IN | 0 ETH | 0.01708555 | ||||
Withdraw Tokens | 13320662 | 1231 days ago | IN | 0 ETH | 0.00205733 | ||||
Withdraw Tokens | 13320662 | 1231 days ago | IN | 0 ETH | 0.00622727 | ||||
Withdraw Tokens | 13320607 | 1231 days ago | IN | 0 ETH | 0.00728255 | ||||
Withdraw Tokens | 13320607 | 1231 days ago | IN | 0 ETH | 0.00208508 | ||||
Withdraw Tokens | 13320476 | 1231 days ago | IN | 0 ETH | 0.0140222 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
VaultOUU
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-06 */ /* * @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; } } /** * @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); } /** * @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; } } /** * @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); } } } } /** * @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 { } } /** * @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); } /** * @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; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.6.0; /** A homogeneous, unrestricted, unmanaged vault that targets ERC-721 conforming contracts. */ contract VaultOUU is ERC20, IERC721Receiver { // The address of the user that is wrapping / unwrapping tokens. This will not be persisted, to reduce gas usage. address _depositor; // The contract we are wrapping around. address public _coreAddress; IERC721 private _coreContract; // The amount of mintable / burnable ERC-20 tokens for each action. uint256 private _baseWrappedAmount; // The tokens stored in the vault. uint256[] private _tokenIds; // The mapping of token ids to their index, 1-based. mapping(uint256 => uint256) private _indices; // We include this here instead of the `nonReentrant` modifier to reduce gas costs. See OpenZeppelin - ReentrancyGuard for more. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () ERC20("NFTWrapper Vault - Avastar", "WAVASTAR") public { // Set the token ratio, defaulting to 10^18. _baseWrappedAmount = uint256(10) ** decimals(); // These cannot be changed once the vault is created. _coreAddress = 0xF3E778F839934fC819cFA1040AabaCeCBA01e049; _coreContract = IERC721(_coreAddress); // Set us up for reentrancy guarding. _status = _NOT_ENTERED; } /// Events /// /** Fired when a token is deposited. */ event TokenDeposited(uint256 tokenId); /** Fired when a token is withdrawn. */ event TokenWithdrawn(uint256 tokenId); /// Status /// /** Check if a token can be withdrawn by its id. */ function canWithdrawToken(uint256 tokenId) external view returns (bool) { return _indices[tokenId] != 0; } function size() external view returns (uint256) { return _tokenIds.length; } /// ERC-721 /// /** * Called when an ERC-721 compliant contract is targeting this contract as the receiver in a `safeTransferFrom()` call. This * checks to make sure we are expecting a token to be transferred. This should only be called as a result of `deposit()` or * `swapParityToken()`. * * @param operator Who (from the perspective of the ERC-721 contract) called `safeTransferFrom()`. This must always be this Vault. * @param from Who is the owner of the ERC-721 token. * @dev Unused parameter: tokenId - The id of the token being transferred. * @dev Unused parameter: data - Optional data sent from the ERC-721 contract. */ function onERC721Received(address operator, address from, uint256, bytes calldata) override external returns (bytes4) { // We must be in the middle of a deposit. If this function is called as a side-effect of a withdrawal / parity swap, this will // have a false-negative. However, that is only the case if the underlying contract is not valid / malicious. require(_status == _ENTERED, "Reentrancy: non-reentrant call"); require(operator == address(this), "Cannot call directly"); require(from != address(0), "Zero address not allowed"); require(from == _depositor, "Depositor mismatch"); require(msg.sender == _coreAddress, "Token not allowed in vault"); // Accept this transfer. return IERC721Receiver.onERC721Received.selector; } /// Vault Parity /// /** This is called by `swapParityToken()` to ensure the targeted vault can accept specific ERC-721 tokens. */ function acceptsTokenContract(address contractAddress) external view returns (bool) { return _coreAddress == contractAddress; } function getBaseWrappedAmount() external view returns (uint256) { return _baseWrappedAmount; } /** * This allows users to trade the parity tokens of two vaults that target the same contract. This gives all tokens parity with * each other, so long as they're targeting the same vault. There are two vaults: the originator and the destination. Restricted * vaults cannot be the destination unless this vault is whitelisted as an allowed depositor. * * There is a potential issue if the destination contract is malicious. If that contract allows deposits and does not allow * withdrawals, then the user's parity token is now worthless. As with all transactions, care must be taken that the target * contract is what you think it is. * * @param destination The address of the Vault contract that will receive any swapped ERC-721 tokens, while issuing its own ERC-20 * tokens as appropriate. * @param count The number of ERC-721 tokens to swap. This can't be larger than the vault size, but the call will not revert if * that's the case. */ function swapParityToken(address destination, uint256 count) external { // Reentrancy guard. require(_status != _ENTERED, "Reentrancy: reentrant call"); _status = _ENTERED; // Validate the destination address. require(destination != address(0), "Zero address not allowed"); require(destination != address(this), "Vault contract not allowed"); require(destination != _coreAddress, "Token contract not allowed"); require(destination != msg.sender, "Target cannot be you"); // Make sure it's a fully constructed contract. See OpenZeppelin.utils.Address for complete list of caveats. uint256 codeSize; assembly { codeSize := extcodesize(destination) } require(codeSize > 0, "Target not a contract"); // Make sure the vault contract matches. There is already a certain amount of trust required when choosing the targeted vault, // so indirect comparison isn't a dealbreaker. It also allows for swaps with vaults of dissimilar heterogeneity. VaultOUU destinationContract = VaultOUU(destination); require(destinationContract.acceptsTokenContract(_coreAddress), "Target refuses tokens"); // We don't want to keep reading the length from storage. uint256 _length = _tokenIds.length; // Make sure we have at least one to swap. if (count > _length) { count = _length; } require(count > 0, "No tokens to swap"); // We burn here so the user doesn't spend gas unnecessarily if they can't afford the swap. _burn(msg.sender, count * _baseWrappedAmount); // Remove the last X tokens from the vault. uint256 tokenId; uint256[] memory tokens = new uint256[](count); uint256 i; for (i; i < count; i ++) { tokenId = _tokenIds[--_length]; tokens[i] = tokenId; _tokenIds.pop(); _indices[tokenId] = 0; // Approve the target contract so it can withdraw the token. We do not blindly send. _coreContract.approve(destination, tokenId); } // We will be checking to make sure that the new tokens are minted (as far as we can), so get the starting value. uint256 startingBalance = destinationContract.balanceOf(msg.sender); // Deposit all the tokens in the target contract. destinationContract.deposit(msg.sender, tokens); // Verify that the target contract now owns all the tokens. for (i = 0; i < count; i ++) { require(_coreContract.ownerOf(tokens[i]) == destination, "Token not transferred"); } // Verify the ending token count. If the destination vault is faulty / malicious then this will fail. Even if this passes, // this isn't a guarantee that the exchanged tokens can be used to withdraw from the target vault. That is up to the user to // check before initiating a parity swap. A valid implementation of `getBaseWrappedAmount()` is required as well. uint256 endingBalance = destinationContract.balanceOf(msg.sender); require(endingBalance > startingBalance, "Parity token did not increase"); require(startingBalance + (count * destinationContract.getBaseWrappedAmount()) == endingBalance, "Parity token mismatch"); // At this point we've guaranteed that: // - The destination contract is a vault for the same core contract (or is pretending to be). // - The tokens are no longer stored in this vault. // - The destination contract is the owner of the transferred tokens. // - The user has the correct amount of parity tokens, both of this vault's and the target vault's. // // So long as the destination contract is able to receive tokens in this way, then it doesn't matter who created the vault, // or how its features differ from this vault's. // By storing the original value once again, a refund is triggered (see https://eips.ethereum.org/EIPS/eip-2200). _status = _NOT_ENTERED; } /// Vault /// /** * Deposit any number of tokens into the vault, receiving ERC-20 wrapped tokens in response. Users can deposit tokens on behalf * of a third party (the one who would receive the parity tokens), so long as they are the owners of the token. * * @param depositor Who will be receiving the ERC-20 parity tokens. * @param tokenIds The ids of the tokens that will be deposited. All tokens must be approved for transfer first. */ function deposit(address depositor, uint256[] calldata tokenIds) external { // Reentrancy guard. require(_status != _ENTERED, "Reentrancy: reentrant call"); _status = _ENTERED; // We need to know who will be receiving the parity tokens. require(depositor != address(0), "Zero address not allowed"); require(depositor != address(this), "This address not allowed"); require(depositor != _coreAddress, "Token contract not allowed"); // We don't want to keep reading the length from storage. uint256 _length = _tokenIds.length; // We can't allow overflows, but we're not going to get fancier than this. Not like anyone has that much memory anyway. uint256 count = tokenIds.length; require(count > 0, "No tokens to deposit"); require(_length + count > _length, "Vault full"); // Preserve the user so we know who to receive tokens from. _depositor = msg.sender; // Try and deposit everything. uint256 tokenId; for (uint256 i; i < count; i ++) { // Store it in the vault. tokenId = tokenIds[i]; _tokenIds.push(tokenId); _indices[tokenId] = ++_length; // Attempt to transfer the token. If the sender hasn't approved this contract for this specific token then it will fail. // We have to check for ownership here to prevent a third party from forcing a deposit. If this vault already owns the // token then this will also fail. This way we can avoid a self-check on existence (since it's not a guaranteed O(1)). require(_coreContract.ownerOf(tokenId) == msg.sender, "You are not the owner"); _coreContract.safeTransferFrom(msg.sender, address(this), tokenId); // Hello world! emit TokenDeposited(tokenId); } // Give them the wrapped ERC-20 token. _mint(depositor, count * _baseWrappedAmount); // By storing the original value once again, a refund is triggered (see https://eips.ethereum.org/EIPS/eip-2200). _depositor = address(0); _status = _NOT_ENTERED; } /** * Withdraw any number of tokens from the vault. * * @param destination Who will receive the ERC-721 tokens. * @param count How many tokens to withdraw. */ function withdrawAny(address destination, uint256 count) external { // Reentrancy guard. require(_status != _ENTERED, "Reentrancy: reentrant call"); _status = _ENTERED; // Validate the destination address. require(destination != address(0), "Zero address not allowed"); require(destination != address(this), "Vault address not allowed"); require(destination != _coreAddress, "Token contract not allowed"); // We don't want to keep reading the length from storage. uint256 _length = _tokenIds.length; // They can only withdraw as many tokens as there are stored. if (count > _length) { count = _length; } require(count > 0, "No tokens to withdraw"); // We burn here so the user doesn't spend gas unnecessarily if they can't afford the withdrawal. _burn(msg.sender, count * _baseWrappedAmount); // We remove from the tail so we don't need to shift anything. uint256 tokenId; for (uint256 i; i < count; i ++) { // Remove it from the vault. tokenId = _tokenIds[--_length]; _tokenIds.pop(); _indices[tokenId] = 0; // Attempt to transfer the token. _coreContract.safeTransferFrom(address(this), destination, tokenId); // Hello world! emit TokenWithdrawn(tokenId); } // By storing the original value once again, a refund is triggered (see https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * Attempts to withdraw the tokens with the specified ids. * * @param destination Who will receive the ERC-721 tokens. * @param tokenIds The ids of the tokens that will be withdrawn. Only the stored tokens will be withdrawn. */ function withdrawTokens(address destination, uint256[] calldata tokenIds) external { // Reentrancy guard. require(_status != _ENTERED, "Reentrancy: reentrant call"); _status = _ENTERED; // Validate the destination address. require(destination != address(0), "Zero address not allowed"); require(destination != address(this), "Vault address not allowed"); require(destination != _coreAddress, "Token contract not allowed"); // We don't want to keep reading the length from storage. uint256 _length = _tokenIds.length; require(_length > 0, "No tokens to withdraw"); // We don't want to revert if this vault doesn't contain some of the tokens, so we are checking for existence and only // transferring those that this vault owns. Because of this, we can't burn the parity token up front since there's no way to // know how many will actually be transferred. uint256 count = tokenIds.length; uint256 index; uint256 tokenId; uint256 tailTokenId; uint256 withdrawnCount; for (uint256 i; i < count; i ++) { // If we can't find it, we'll skip it. Index is off by 1 so that 0 = nonexistent. tokenId = tokenIds[i]; index = _indices[tokenId]; if (index != 0 && _tokenIds[index - 1] == tokenId) { // Swap and pop. tailTokenId = _tokenIds[--_length]; _tokenIds[index - 1] == tailTokenId; _tokenIds.pop(); _indices[tailTokenId] = index; _indices[tokenId] = 0; // Attempt to transfer the token. _coreContract.safeTransferFrom(address(this), destination, tokenId); withdrawnCount++; // Hello world! emit TokenWithdrawn(tokenId); } } // Take the wrapped ERC-20 tokens. _burn(msg.sender, withdrawnCount * _baseWrappedAmount); // By storing the original value once again, a refund is triggered (see https://eips.ethereum.org/EIPS/eip-2200). _status = _NOT_ENTERED; } }
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":"tokenId","type":"uint256"}],"name":"TokenDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenWithdrawn","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":"_coreAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"acceptsTokenContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"canWithdrawToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"address","name":"depositor","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBaseWrappedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"size","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"swapParityToken","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":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"withdrawAny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252601a81527f4e465457726170706572205661756c74202d20417661737461720000000000006020808301918252835180850190945260088452672ba0ab20a9aa20a960c11b908401528151919291620000779160039162000107565b5080516200008d90600490602084019062000107565b50506005805460ff1916601217905550620000a7620000fe565b60ff16600a0a600855600680546001600160a01b031990811673f3e778f839934fc819cfa1040aabacecba01e0491791829055600780549091166001600160a01b03929092169190911790556001600b55620001a3565b60055460ff1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200014a57805160ff19168380011785556200017a565b828001600101855582156200017a579182015b828111156200017a5782518255916020019190600101906200015d565b50620001889291506200018c565b5090565b5b808211156200018857600081556001016200018d565b6123f280620001b36000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806371a43135116100b8578063a457c2d71161007c578063a457c2d714610413578063a71604e81461043f578063a9059cbb146104bf578063bbb6ed22146104eb578063d731fff014610517578063dd62ed3e1461059757610137565b806371a43135146103945780637694eaf8146103b1578063949d225d146103d55780639523c0c4146103dd57806395d89b411461040b57610137565b8063280777d6116100ff578063280777d6146102f6578063313ce567146102fe578063395093511461031c57806354675d0a1461034857806370a082311461036e57610137565b806306fdde031461013c578063095ea7b3146101b9578063150b7a02146101f957806318160ddd146102a657806323b872dd146102c0575b600080fd5b6101446105c5565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561017e578181015183820152602001610166565b50505050905090810190601f1680156101ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101e5600480360360408110156101cf57600080fd5b506001600160a01b03813516906020013561065b565b604080519115158252519081900360200190f35b6102896004803603608081101561020f57600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561024a57600080fd5b82018360208201111561025c57600080fd5b8035906020019184600183028401116401000000008311171561027e57600080fd5b509092509050610678565b604080516001600160e01b03199092168252519081900360200190f35b6102ae61083b565b60408051918252519081900360200190f35b6101e5600480360360608110156102d657600080fd5b506001600160a01b03813581169160208101359091169060400135610841565b6102ae6108c8565b6103066108ce565b6040805160ff9092168252519081900360200190f35b6101e56004803603604081101561033257600080fd5b506001600160a01b0381351690602001356108d7565b6101e56004803603602081101561035e57600080fd5b50356001600160a01b0316610925565b6102ae6004803603602081101561038457600080fd5b50356001600160a01b0316610939565b6101e5600480360360208110156103aa57600080fd5b5035610954565b6103b9610968565b604080516001600160a01b039092168252519081900360200190f35b6102ae610977565b610409600480360360408110156103f357600080fd5b506001600160a01b03813516906020013561097d565b005b610144610c5a565b6101e56004803603604081101561042957600080fd5b506001600160a01b038135169060200135610cbb565b6104096004803603604081101561045557600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561048057600080fd5b82018360208201111561049257600080fd5b803590602001918460208302840111640100000000831117156104b457600080fd5b509092509050610d23565b6101e5600480360360408110156104d557600080fd5b506001600160a01b03813516906020013561113d565b6104096004803603604081101561050157600080fd5b506001600160a01b038135169060200135611151565b6104096004803603604081101561052d57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561055857600080fd5b82018360208201111561056a57600080fd5b8035906020019184602083028401116401000000008311171561058c57600080fd5b509092509050611960565b6102ae600480360360408110156105ad57600080fd5b506001600160a01b0381358116916020013516611cb7565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106515780601f1061062657610100808354040283529160200191610651565b820191906000526020600020905b81548152906001019060200180831161063457829003601f168201915b5050505050905090565b600061066f610668611ce2565b8484611ce6565b50600192915050565b60006002600b54146106d1576040805162461bcd60e51b815260206004820152601e60248201527f5265656e7472616e63793a206e6f6e2d7265656e7472616e742063616c6c0000604482015290519081900360640190fd5b6001600160a01b0386163014610725576040805162461bcd60e51b815260206004820152601460248201527343616e6e6f742063616c6c206469726563746c7960601b604482015290519081900360640190fd5b6001600160a01b03851661076e576040805162461bcd60e51b81526020600482015260186024820152600080516020612378833981519152604482015290519081900360640190fd5b6005546001600160a01b0386811661010090920416146107ca576040805162461bcd60e51b8152602060048201526012602482015271088cae0dee6d2e8dee440dad2e6dac2e8c6d60731b604482015290519081900360640190fd5b6006546001600160a01b03163314610829576040805162461bcd60e51b815260206004820152601a60248201527f546f6b656e206e6f7420616c6c6f77656420696e207661756c74000000000000604482015290519081900360640190fd5b50630a85bd0160e11b95945050505050565b60025490565b600061084e848484611dd2565b6108be8461085a611ce2565b6108b9856040518060600160405280602881526020016122e6602891396001600160a01b038a16600090815260016020526040812090610898611ce2565b6001600160a01b031681526020810191909152604001600020549190611f2d565b611ce6565b5060019392505050565b60085490565b60055460ff1690565b600061066f6108e4611ce2565b846108b985600160006108f5611ce2565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611fc4565b6006546001600160a01b0391821691161490565b6001600160a01b031660009081526020819052604090205490565b6000908152600a6020526040902054151590565b6006546001600160a01b031681565b60095490565b6002600b5414156109d2576040805162461bcd60e51b815260206004820152601a6024820152791499595b9d1c985b98de4e881c99595b9d1c985b9d0818d85b1b60321b604482015290519081900360640190fd5b6002600b556001600160a01b038216610a20576040805162461bcd60e51b81526020600482015260186024820152600080516020612378833981519152604482015290519081900360640190fd5b6001600160a01b038216301415610a7a576040805162461bcd60e51b815260206004820152601960248201527815985d5b1d081859191c995cdcc81b9bdd08185b1b1bddd959603a1b604482015290519081900360640190fd5b6006546001600160a01b0383811691161415610ada576040805162461bcd60e51b815260206004820152601a602482015279151bdad95b8818dbdb9d1c9858dd081b9bdd08185b1b1bddd95960321b604482015290519081900360640190fd5b60095480821115610ae9578091505b60008211610b36576040805162461bcd60e51b81526020600482015260156024820152744e6f20746f6b656e7320746f20776974686472617760581b604482015290519081900360640190fd5b610b44336008548402612025565b6000805b83811015610c4e576009836001900393508381548110610b6457fe5b906000526020600020015491506009805480610b7c57fe5b600082815260208082208301600019908101839055909201909255838252600a905260408082208290556007548151632142170760e11b81523060048201526001600160a01b03898116602483015260448201879052925192909116926342842e0e9260648084019382900301818387803b158015610bfa57600080fd5b505af1158015610c0e573d6000803e3d6000fd5b50506040805185815290517fc172f6497c150fc242267f743e8e4034b31b16ee123408d6d5f75a81128de1149350908190036020019150a1600101610b48565b50506001600b55505050565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106515780601f1061062657610100808354040283529160200191610651565b600061066f610cc8611ce2565b846108b9856040518060600160405280602581526020016123986025913960016000610cf2611ce2565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611f2d565b6002600b541415610d78576040805162461bcd60e51b815260206004820152601a6024820152791499595b9d1c985b98de4e881c99595b9d1c985b9d0818d85b1b60321b604482015290519081900360640190fd5b6002600b556001600160a01b038316610dc6576040805162461bcd60e51b81526020600482015260186024820152600080516020612378833981519152604482015290519081900360640190fd5b6001600160a01b038316301415610e24576040805162461bcd60e51b815260206004820152601860248201527f546869732061646472657373206e6f7420616c6c6f7765640000000000000000604482015290519081900360640190fd5b6006546001600160a01b0384811691161415610e84576040805162461bcd60e51b815260206004820152601a602482015279151bdad95b8818dbdb9d1c9858dd081b9bdd08185b1b1bddd95960321b604482015290519081900360640190fd5b6009548180610ed1576040805162461bcd60e51b8152602060048201526014602482015273139bc81d1bdad95b9cc81d1bc819195c1bdcda5d60621b604482015290519081900360640190fd5b8181830111610f14576040805162461bcd60e51b815260206004820152600a60248201526915985d5b1d08199d5b1b60b21b604482015290519081900360640190fd5b60058054610100600160a81b03191633610100021790556000805b8281101561111057858582818110610f4357fe5b600980546001808201909255602092830294909401357f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af9094018490556000848152600a8352604090819020989091019788905560075481516331a9108f60e11b815260048101869052915194965033946001600160a01b039091169350636352211e92602480840193919291829003018186803b158015610fe457600080fd5b505afa158015610ff8573d6000803e3d6000fd5b505050506040513d602081101561100e57600080fd5b50516001600160a01b031614611063576040805162461bcd60e51b81526020600482015260156024820152742cb7ba9030b932903737ba103a34329037bbb732b960591b604482015290519081900360640190fd5b60075460408051632142170760e11b81523360048201523060248201526044810185905290516001600160a01b03909216916342842e0e9160648082019260009290919082900301818387803b1580156110bc57600080fd5b505af11580156110d0573d6000803e3d6000fd5b50506040805185815290517f26a49ee784523ce049bcbe276a63c7c9dbd9f428b1aa53633e679c9c046e88589350908190036020019150a1600101610f2f565b5061111f866008548402612121565b505060058054610100600160a81b031916905550506001600b555050565b600061066f61114a611ce2565b8484611dd2565b6002600b5414156111a6576040805162461bcd60e51b815260206004820152601a6024820152791499595b9d1c985b98de4e881c99595b9d1c985b9d0818d85b1b60321b604482015290519081900360640190fd5b6002600b556001600160a01b0382166111f4576040805162461bcd60e51b81526020600482015260186024820152600080516020612378833981519152604482015290519081900360640190fd5b6001600160a01b038216301415611252576040805162461bcd60e51b815260206004820152601a60248201527f5661756c7420636f6e7472616374206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b6006546001600160a01b03838116911614156112b2576040805162461bcd60e51b815260206004820152601a602482015279151bdad95b8818dbdb9d1c9858dd081b9bdd08185b1b1bddd95960321b604482015290519081900360640190fd5b6001600160a01b038216331415611307576040805162461bcd60e51b81526020600482015260146024820152735461726765742063616e6e6f7420626520796f7560601b604482015290519081900360640190fd5b813b80611353576040805162461bcd60e51b815260206004820152601560248201527415185c99d95d081b9bdd08184818dbdb9d1c9858dd605a1b604482015290519081900360640190fd5b60065460408051632a33ae8560e11b81526001600160a01b039283166004820152905185928316916354675d0a916024808301926020929190829003018186803b1580156113a057600080fd5b505afa1580156113b4573d6000803e3d6000fd5b505050506040513d60208110156113ca57600080fd5b5051611415576040805162461bcd60e51b8152602060048201526015602482015274546172676574207265667573657320746f6b656e7360581b604482015290519081900360640190fd5b60095480841115611424578093505b6000841161146d576040805162461bcd60e51b815260206004820152601160248201527004e6f20746f6b656e7320746f207377617607c1b604482015290519081900360640190fd5b61147b336008548602612025565b600060608567ffffffffffffffff8111801561149657600080fd5b506040519080825280602002602001820160405280156114c0578160200160208202803683370190505b50905060005b868110156115af5760098460019003945084815481106114e257fe5b90600052602060002001549250828282815181106114fc57fe5b602002602001018181525050600980548061151357fe5b600082815260208082208301600019908101839055909201909255848252600a90526040808220829055600754815163095ea7b360e01b81526001600160a01b038c81166004830152602482018890529251929091169263095ea7b39260448084019382900301818387803b15801561158b57600080fd5b505af115801561159f573d6000803e3d6000fd5b5050600190920191506114c69050565b6000856001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156115fe57600080fd5b505afa158015611612573d6000803e3d6000fd5b505050506040513d602081101561162857600080fd5b5051604080516314e2c09d60e31b81523360048201818152602483019384528751604484015287519495506001600160a01b038b169463a71604e89492938993916064909101906020858101910280838360005b8381101561169457818101518382015260200161167c565b505050509050019350505050600060405180830381600087803b1580156116ba57600080fd5b505af11580156116ce573d6000803e3d6000fd5b50505050600091505b878210156117ca5760075483516001600160a01b03808c16921690636352211e9086908690811061170457fe5b60200260200101516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561174057600080fd5b505afa158015611754573d6000803e3d6000fd5b505050506040513d602081101561176a57600080fd5b50516001600160a01b0316146117bf576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081d1c985b9cd9995c9c9959605a1b604482015290519081900360640190fd5b6001909101906116d7565b6000866001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561181957600080fd5b505afa15801561182d573d6000803e3d6000fd5b505050506040513d602081101561184357600080fd5b5051905081811161189b576040805162461bcd60e51b815260206004820152601d60248201527f50617269747920746f6b656e20646964206e6f7420696e637265617365000000604482015290519081900360640190fd5b80876001600160a01b031663280777d66040518163ffffffff1660e01b815260040160206040518083038186803b1580156118d557600080fd5b505afa1580156118e9573d6000803e3d6000fd5b505050506040513d60208110156118ff57600080fd5b50518a0283011461194f576040805162461bcd60e51b81526020600482015260156024820152740a0c2e4d2e8f240e8ded6cadc40dad2e6dac2e8c6d605b1b604482015290519081900360640190fd5b50506001600b555050505050505050565b6002600b5414156119b5576040805162461bcd60e51b815260206004820152601a6024820152791499595b9d1c985b98de4e881c99595b9d1c985b9d0818d85b1b60321b604482015290519081900360640190fd5b6002600b556001600160a01b038316611a03576040805162461bcd60e51b81526020600482015260186024820152600080516020612378833981519152604482015290519081900360640190fd5b6001600160a01b038316301415611a5d576040805162461bcd60e51b815260206004820152601960248201527815985d5b1d081859191c995cdcc81b9bdd08185b1b1bddd959603a1b604482015290519081900360640190fd5b6006546001600160a01b0384811691161415611abd576040805162461bcd60e51b815260206004820152601a602482015279151bdad95b8818dbdb9d1c9858dd081b9bdd08185b1b1bddd95960321b604482015290519081900360640190fd5b60095480611b0a576040805162461bcd60e51b81526020600482015260156024820152744e6f20746f6b656e7320746f20776974686472617760581b604482015290519081900360640190fd5b816000808080805b85811015611c9857888882818110611b2657fe5b905060200201359350600a600085815260200190815260200160002054945084600014158015611b6f57508360096001870381548110611b6257fe5b9060005260206000200154145b15611c90576009876001900397508781548110611b8857fe5b906000526020600020015492508260096001870381548110611ba657fe5b50600052506009805480611bb657fe5b600082815260208082208301600019908101839055909201909255848252600a905260408082208790558582528082208290556007548151632142170760e11b81523060048201526001600160a01b038e8116602483015260448201899052925192909116926342842e0e9260648084019382900301818387803b158015611c3d57600080fd5b505af1158015611c51573d6000803e3d6000fd5b50506040805187815290516001909501947fc172f6497c150fc242267f743e8e4034b31b16ee123408d6d5f75a81128de1149350908190036020019150a15b600101611b12565b50611ca7336008548302612025565b50506001600b5550505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b038316611d2b5760405162461bcd60e51b81526004018080602001828103825260248152602001806123546024913960400191505060405180910390fd5b6001600160a01b038216611d705760405162461bcd60e51b815260040180806020018281038252602281526020018061229e6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316611e175760405162461bcd60e51b815260040180806020018281038252602581526020018061232f6025913960400191505060405180910390fd5b6001600160a01b038216611e5c5760405162461bcd60e51b81526004018080602001828103825260238152602001806122596023913960400191505060405180910390fd5b611e67838383612211565b611ea4816040518060600160405280602681526020016122c0602691396001600160a01b0386166000908152602081905260409020549190611f2d565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611ed39082611fc4565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611fbc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f81578181015183820152602001611f69565b50505050905090810190601f168015611fae5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282018381101561201e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03821661206a5760405162461bcd60e51b815260040180806020018281038252602181526020018061230e6021913960400191505060405180910390fd5b61207682600083612211565b6120b38160405180606001604052806022815260200161227c602291396001600160a01b0385166000908152602081905260409020549190611f2d565b6001600160a01b0383166000908152602081905260409020556002546120d99082612216565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b03821661217c576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61218860008383612211565b6002546121959082611fc4565b6002556001600160a01b0382166000908152602081905260409020546121bb9082611fc4565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b505050565b600061201e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f2d56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735a65726f2061646472657373206e6f7420616c6c6f776564000000000000000045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b277777692856814b3f2996ab8b6a24657d0bf4a2c0ea06433ab80dbeb6e3c0564736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c806371a43135116100b8578063a457c2d71161007c578063a457c2d714610413578063a71604e81461043f578063a9059cbb146104bf578063bbb6ed22146104eb578063d731fff014610517578063dd62ed3e1461059757610137565b806371a43135146103945780637694eaf8146103b1578063949d225d146103d55780639523c0c4146103dd57806395d89b411461040b57610137565b8063280777d6116100ff578063280777d6146102f6578063313ce567146102fe578063395093511461031c57806354675d0a1461034857806370a082311461036e57610137565b806306fdde031461013c578063095ea7b3146101b9578063150b7a02146101f957806318160ddd146102a657806323b872dd146102c0575b600080fd5b6101446105c5565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561017e578181015183820152602001610166565b50505050905090810190601f1680156101ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101e5600480360360408110156101cf57600080fd5b506001600160a01b03813516906020013561065b565b604080519115158252519081900360200190f35b6102896004803603608081101561020f57600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561024a57600080fd5b82018360208201111561025c57600080fd5b8035906020019184600183028401116401000000008311171561027e57600080fd5b509092509050610678565b604080516001600160e01b03199092168252519081900360200190f35b6102ae61083b565b60408051918252519081900360200190f35b6101e5600480360360608110156102d657600080fd5b506001600160a01b03813581169160208101359091169060400135610841565b6102ae6108c8565b6103066108ce565b6040805160ff9092168252519081900360200190f35b6101e56004803603604081101561033257600080fd5b506001600160a01b0381351690602001356108d7565b6101e56004803603602081101561035e57600080fd5b50356001600160a01b0316610925565b6102ae6004803603602081101561038457600080fd5b50356001600160a01b0316610939565b6101e5600480360360208110156103aa57600080fd5b5035610954565b6103b9610968565b604080516001600160a01b039092168252519081900360200190f35b6102ae610977565b610409600480360360408110156103f357600080fd5b506001600160a01b03813516906020013561097d565b005b610144610c5a565b6101e56004803603604081101561042957600080fd5b506001600160a01b038135169060200135610cbb565b6104096004803603604081101561045557600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561048057600080fd5b82018360208201111561049257600080fd5b803590602001918460208302840111640100000000831117156104b457600080fd5b509092509050610d23565b6101e5600480360360408110156104d557600080fd5b506001600160a01b03813516906020013561113d565b6104096004803603604081101561050157600080fd5b506001600160a01b038135169060200135611151565b6104096004803603604081101561052d57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561055857600080fd5b82018360208201111561056a57600080fd5b8035906020019184602083028401116401000000008311171561058c57600080fd5b509092509050611960565b6102ae600480360360408110156105ad57600080fd5b506001600160a01b0381358116916020013516611cb7565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106515780601f1061062657610100808354040283529160200191610651565b820191906000526020600020905b81548152906001019060200180831161063457829003601f168201915b5050505050905090565b600061066f610668611ce2565b8484611ce6565b50600192915050565b60006002600b54146106d1576040805162461bcd60e51b815260206004820152601e60248201527f5265656e7472616e63793a206e6f6e2d7265656e7472616e742063616c6c0000604482015290519081900360640190fd5b6001600160a01b0386163014610725576040805162461bcd60e51b815260206004820152601460248201527343616e6e6f742063616c6c206469726563746c7960601b604482015290519081900360640190fd5b6001600160a01b03851661076e576040805162461bcd60e51b81526020600482015260186024820152600080516020612378833981519152604482015290519081900360640190fd5b6005546001600160a01b0386811661010090920416146107ca576040805162461bcd60e51b8152602060048201526012602482015271088cae0dee6d2e8dee440dad2e6dac2e8c6d60731b604482015290519081900360640190fd5b6006546001600160a01b03163314610829576040805162461bcd60e51b815260206004820152601a60248201527f546f6b656e206e6f7420616c6c6f77656420696e207661756c74000000000000604482015290519081900360640190fd5b50630a85bd0160e11b95945050505050565b60025490565b600061084e848484611dd2565b6108be8461085a611ce2565b6108b9856040518060600160405280602881526020016122e6602891396001600160a01b038a16600090815260016020526040812090610898611ce2565b6001600160a01b031681526020810191909152604001600020549190611f2d565b611ce6565b5060019392505050565b60085490565b60055460ff1690565b600061066f6108e4611ce2565b846108b985600160006108f5611ce2565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611fc4565b6006546001600160a01b0391821691161490565b6001600160a01b031660009081526020819052604090205490565b6000908152600a6020526040902054151590565b6006546001600160a01b031681565b60095490565b6002600b5414156109d2576040805162461bcd60e51b815260206004820152601a6024820152791499595b9d1c985b98de4e881c99595b9d1c985b9d0818d85b1b60321b604482015290519081900360640190fd5b6002600b556001600160a01b038216610a20576040805162461bcd60e51b81526020600482015260186024820152600080516020612378833981519152604482015290519081900360640190fd5b6001600160a01b038216301415610a7a576040805162461bcd60e51b815260206004820152601960248201527815985d5b1d081859191c995cdcc81b9bdd08185b1b1bddd959603a1b604482015290519081900360640190fd5b6006546001600160a01b0383811691161415610ada576040805162461bcd60e51b815260206004820152601a602482015279151bdad95b8818dbdb9d1c9858dd081b9bdd08185b1b1bddd95960321b604482015290519081900360640190fd5b60095480821115610ae9578091505b60008211610b36576040805162461bcd60e51b81526020600482015260156024820152744e6f20746f6b656e7320746f20776974686472617760581b604482015290519081900360640190fd5b610b44336008548402612025565b6000805b83811015610c4e576009836001900393508381548110610b6457fe5b906000526020600020015491506009805480610b7c57fe5b600082815260208082208301600019908101839055909201909255838252600a905260408082208290556007548151632142170760e11b81523060048201526001600160a01b03898116602483015260448201879052925192909116926342842e0e9260648084019382900301818387803b158015610bfa57600080fd5b505af1158015610c0e573d6000803e3d6000fd5b50506040805185815290517fc172f6497c150fc242267f743e8e4034b31b16ee123408d6d5f75a81128de1149350908190036020019150a1600101610b48565b50506001600b55505050565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106515780601f1061062657610100808354040283529160200191610651565b600061066f610cc8611ce2565b846108b9856040518060600160405280602581526020016123986025913960016000610cf2611ce2565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611f2d565b6002600b541415610d78576040805162461bcd60e51b815260206004820152601a6024820152791499595b9d1c985b98de4e881c99595b9d1c985b9d0818d85b1b60321b604482015290519081900360640190fd5b6002600b556001600160a01b038316610dc6576040805162461bcd60e51b81526020600482015260186024820152600080516020612378833981519152604482015290519081900360640190fd5b6001600160a01b038316301415610e24576040805162461bcd60e51b815260206004820152601860248201527f546869732061646472657373206e6f7420616c6c6f7765640000000000000000604482015290519081900360640190fd5b6006546001600160a01b0384811691161415610e84576040805162461bcd60e51b815260206004820152601a602482015279151bdad95b8818dbdb9d1c9858dd081b9bdd08185b1b1bddd95960321b604482015290519081900360640190fd5b6009548180610ed1576040805162461bcd60e51b8152602060048201526014602482015273139bc81d1bdad95b9cc81d1bc819195c1bdcda5d60621b604482015290519081900360640190fd5b8181830111610f14576040805162461bcd60e51b815260206004820152600a60248201526915985d5b1d08199d5b1b60b21b604482015290519081900360640190fd5b60058054610100600160a81b03191633610100021790556000805b8281101561111057858582818110610f4357fe5b600980546001808201909255602092830294909401357f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af9094018490556000848152600a8352604090819020989091019788905560075481516331a9108f60e11b815260048101869052915194965033946001600160a01b039091169350636352211e92602480840193919291829003018186803b158015610fe457600080fd5b505afa158015610ff8573d6000803e3d6000fd5b505050506040513d602081101561100e57600080fd5b50516001600160a01b031614611063576040805162461bcd60e51b81526020600482015260156024820152742cb7ba9030b932903737ba103a34329037bbb732b960591b604482015290519081900360640190fd5b60075460408051632142170760e11b81523360048201523060248201526044810185905290516001600160a01b03909216916342842e0e9160648082019260009290919082900301818387803b1580156110bc57600080fd5b505af11580156110d0573d6000803e3d6000fd5b50506040805185815290517f26a49ee784523ce049bcbe276a63c7c9dbd9f428b1aa53633e679c9c046e88589350908190036020019150a1600101610f2f565b5061111f866008548402612121565b505060058054610100600160a81b031916905550506001600b555050565b600061066f61114a611ce2565b8484611dd2565b6002600b5414156111a6576040805162461bcd60e51b815260206004820152601a6024820152791499595b9d1c985b98de4e881c99595b9d1c985b9d0818d85b1b60321b604482015290519081900360640190fd5b6002600b556001600160a01b0382166111f4576040805162461bcd60e51b81526020600482015260186024820152600080516020612378833981519152604482015290519081900360640190fd5b6001600160a01b038216301415611252576040805162461bcd60e51b815260206004820152601a60248201527f5661756c7420636f6e7472616374206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b6006546001600160a01b03838116911614156112b2576040805162461bcd60e51b815260206004820152601a602482015279151bdad95b8818dbdb9d1c9858dd081b9bdd08185b1b1bddd95960321b604482015290519081900360640190fd5b6001600160a01b038216331415611307576040805162461bcd60e51b81526020600482015260146024820152735461726765742063616e6e6f7420626520796f7560601b604482015290519081900360640190fd5b813b80611353576040805162461bcd60e51b815260206004820152601560248201527415185c99d95d081b9bdd08184818dbdb9d1c9858dd605a1b604482015290519081900360640190fd5b60065460408051632a33ae8560e11b81526001600160a01b039283166004820152905185928316916354675d0a916024808301926020929190829003018186803b1580156113a057600080fd5b505afa1580156113b4573d6000803e3d6000fd5b505050506040513d60208110156113ca57600080fd5b5051611415576040805162461bcd60e51b8152602060048201526015602482015274546172676574207265667573657320746f6b656e7360581b604482015290519081900360640190fd5b60095480841115611424578093505b6000841161146d576040805162461bcd60e51b815260206004820152601160248201527004e6f20746f6b656e7320746f207377617607c1b604482015290519081900360640190fd5b61147b336008548602612025565b600060608567ffffffffffffffff8111801561149657600080fd5b506040519080825280602002602001820160405280156114c0578160200160208202803683370190505b50905060005b868110156115af5760098460019003945084815481106114e257fe5b90600052602060002001549250828282815181106114fc57fe5b602002602001018181525050600980548061151357fe5b600082815260208082208301600019908101839055909201909255848252600a90526040808220829055600754815163095ea7b360e01b81526001600160a01b038c81166004830152602482018890529251929091169263095ea7b39260448084019382900301818387803b15801561158b57600080fd5b505af115801561159f573d6000803e3d6000fd5b5050600190920191506114c69050565b6000856001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156115fe57600080fd5b505afa158015611612573d6000803e3d6000fd5b505050506040513d602081101561162857600080fd5b5051604080516314e2c09d60e31b81523360048201818152602483019384528751604484015287519495506001600160a01b038b169463a71604e89492938993916064909101906020858101910280838360005b8381101561169457818101518382015260200161167c565b505050509050019350505050600060405180830381600087803b1580156116ba57600080fd5b505af11580156116ce573d6000803e3d6000fd5b50505050600091505b878210156117ca5760075483516001600160a01b03808c16921690636352211e9086908690811061170457fe5b60200260200101516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561174057600080fd5b505afa158015611754573d6000803e3d6000fd5b505050506040513d602081101561176a57600080fd5b50516001600160a01b0316146117bf576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081d1c985b9cd9995c9c9959605a1b604482015290519081900360640190fd5b6001909101906116d7565b6000866001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561181957600080fd5b505afa15801561182d573d6000803e3d6000fd5b505050506040513d602081101561184357600080fd5b5051905081811161189b576040805162461bcd60e51b815260206004820152601d60248201527f50617269747920746f6b656e20646964206e6f7420696e637265617365000000604482015290519081900360640190fd5b80876001600160a01b031663280777d66040518163ffffffff1660e01b815260040160206040518083038186803b1580156118d557600080fd5b505afa1580156118e9573d6000803e3d6000fd5b505050506040513d60208110156118ff57600080fd5b50518a0283011461194f576040805162461bcd60e51b81526020600482015260156024820152740a0c2e4d2e8f240e8ded6cadc40dad2e6dac2e8c6d605b1b604482015290519081900360640190fd5b50506001600b555050505050505050565b6002600b5414156119b5576040805162461bcd60e51b815260206004820152601a6024820152791499595b9d1c985b98de4e881c99595b9d1c985b9d0818d85b1b60321b604482015290519081900360640190fd5b6002600b556001600160a01b038316611a03576040805162461bcd60e51b81526020600482015260186024820152600080516020612378833981519152604482015290519081900360640190fd5b6001600160a01b038316301415611a5d576040805162461bcd60e51b815260206004820152601960248201527815985d5b1d081859191c995cdcc81b9bdd08185b1b1bddd959603a1b604482015290519081900360640190fd5b6006546001600160a01b0384811691161415611abd576040805162461bcd60e51b815260206004820152601a602482015279151bdad95b8818dbdb9d1c9858dd081b9bdd08185b1b1bddd95960321b604482015290519081900360640190fd5b60095480611b0a576040805162461bcd60e51b81526020600482015260156024820152744e6f20746f6b656e7320746f20776974686472617760581b604482015290519081900360640190fd5b816000808080805b85811015611c9857888882818110611b2657fe5b905060200201359350600a600085815260200190815260200160002054945084600014158015611b6f57508360096001870381548110611b6257fe5b9060005260206000200154145b15611c90576009876001900397508781548110611b8857fe5b906000526020600020015492508260096001870381548110611ba657fe5b50600052506009805480611bb657fe5b600082815260208082208301600019908101839055909201909255848252600a905260408082208790558582528082208290556007548151632142170760e11b81523060048201526001600160a01b038e8116602483015260448201899052925192909116926342842e0e9260648084019382900301818387803b158015611c3d57600080fd5b505af1158015611c51573d6000803e3d6000fd5b50506040805187815290516001909501947fc172f6497c150fc242267f743e8e4034b31b16ee123408d6d5f75a81128de1149350908190036020019150a15b600101611b12565b50611ca7336008548302612025565b50506001600b5550505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b038316611d2b5760405162461bcd60e51b81526004018080602001828103825260248152602001806123546024913960400191505060405180910390fd5b6001600160a01b038216611d705760405162461bcd60e51b815260040180806020018281038252602281526020018061229e6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316611e175760405162461bcd60e51b815260040180806020018281038252602581526020018061232f6025913960400191505060405180910390fd5b6001600160a01b038216611e5c5760405162461bcd60e51b81526004018080602001828103825260238152602001806122596023913960400191505060405180910390fd5b611e67838383612211565b611ea4816040518060600160405280602681526020016122c0602691396001600160a01b0386166000908152602081905260409020549190611f2d565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611ed39082611fc4565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611fbc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f81578181015183820152602001611f69565b50505050905090810190601f168015611fae5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282018381101561201e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03821661206a5760405162461bcd60e51b815260040180806020018281038252602181526020018061230e6021913960400191505060405180910390fd5b61207682600083612211565b6120b38160405180606001604052806022815260200161227c602291396001600160a01b0385166000908152602081905260409020549190611f2d565b6001600160a01b0383166000908152602081905260409020556002546120d99082612216565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b03821661217c576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61218860008383612211565b6002546121959082611fc4565b6002556001600160a01b0382166000908152602081905260409020546121bb9082611fc4565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b505050565b600061201e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f2d56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735a65726f2061646472657373206e6f7420616c6c6f776564000000000000000045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b277777692856814b3f2996ab8b6a24657d0bf4a2c0ea06433ab80dbeb6e3c0564736f6c634300060c0033
Deployed Bytecode Sourcemap
32141:16094:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16973:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19079:169;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19079:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34678:822;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34678:822:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34678:822:0;;-1:-1:-1;34678:822:0;-1:-1:-1;34678:822:0;:::i;:::-;;;;-1:-1:-1;;;;;;34678:822:0;;;;;;;;;;;;;;18048:100;;;:::i;:::-;;;;;;;;;;;;;;;;19722:321;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19722:321:0;;;;;;;;;;;;;;;;;:::i;35800:108::-;;;:::i;17900:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20452:218;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20452:218:0;;;;;;;;:::i;35651:141::-;;;;;;;;;;;;;;;;-1:-1:-1;35651:141:0;-1:-1:-1;;;;;35651:141:0;;:::i;18211:119::-;;;;;;;;;;;;;;;;-1:-1:-1;18211:119:0;-1:-1:-1;;;;;18211:119:0;;:::i;33756:120::-;;;;;;;;;;;;;;;;-1:-1:-1;33756:120:0;;:::i;32383:27::-;;;:::i;:::-;;;;-1:-1:-1;;;;;32383:27:0;;;;;;;;;;;;;;33884:90;;;:::i;44077:1633::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44077:1633:0;;;;;;;;:::i;:::-;;17175:87;;;:::i;21173:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21173:269:0;;;;;;;;:::i;41637:2238::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41637:2238:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41637:2238:0;;-1:-1:-1;41637:2238:0;-1:-1:-1;41637:2238:0;:::i;18543:175::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18543:175:0;;;;;;;;:::i;36949:4192::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36949:4192:0;;;;;;;;:::i;45984:2248::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45984:2248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45984:2248:0;;-1:-1:-1;45984:2248:0;-1:-1:-1;45984:2248:0;:::i;18781:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18781:151:0;;;;;;;;;;:::i;16973:83::-;17043:5;17036:12;;;;;;;;-1:-1:-1;;17036:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17010:13;;17036:12;;17043:5;;17036:12;;17043:5;17036:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16973:83;:::o;19079:169::-;19162:4;19179:39;19188:12;:10;:12::i;:::-;19202:7;19211:6;19179:8;:39::i;:::-;-1:-1:-1;19236:4:0;19079:169;;;;:::o;34678:822::-;34788:6;32976:1;35070:7;;:19;35062:62;;;;;-1:-1:-1;;;35062:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35145:25:0;;35165:4;35145:25;35137:58;;;;;-1:-1:-1;;;35137:58:0;;;;;;;;;;;;-1:-1:-1;;;35137:58:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35214:18:0;;35206:55;;;;;-1:-1:-1;;;35206:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35206:55:0;;;;;;;;;;;;;;;35288:10;;-1:-1:-1;;;;;35280:18:0;;;35288:10;;;;;35280:18;35272:49;;;;;-1:-1:-1;;;35272:49:0;;;;;;;;;;;;-1:-1:-1;;;35272:49:0;;;;;;;;;;;;;;;35354:12;;-1:-1:-1;;;;;35354:12:0;35340:10;:26;35332:65;;;;;-1:-1:-1;;;35332:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;34678:822:0;;;;;;;:::o;18048:100::-;18128:12;;18048:100;:::o;19722:321::-;19828:4;19845:36;19855:6;19863:9;19874:6;19845:9;:36::i;:::-;19892:121;19901:6;19909:12;:10;:12::i;:::-;19923:89;19961:6;19923:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19923:19:0;;;;;;:11;:19;;;;;;19943:12;:10;:12::i;:::-;-1:-1:-1;;;;;19923:33:0;;;;;;;;;;;;-1:-1:-1;19923:33:0;;;:89;:37;:89::i;:::-;19892:8;:121::i;:::-;-1:-1:-1;20031:4:0;19722:321;;;;;:::o;35800:108::-;35882:18;;35800:108;:::o;17900:83::-;17966:9;;;;17900:83;:::o;20452:218::-;20540:4;20557:83;20566:12;:10;:12::i;:::-;20580:7;20589:50;20628:10;20589:11;:25;20601:12;:10;:12::i;:::-;-1:-1:-1;;;;;20589:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;20589:25:0;;;:34;;;;;;;;;;;:38;:50::i;35651:141::-;35753:12;;-1:-1:-1;;;;;35753:31:0;;;:12;;:31;;35651:141::o;18211:119::-;-1:-1:-1;;;;;18304:18:0;18277:7;18304:18;;;;;;;;;;;;18211:119::o;33756:120::-;33822:4;33846:17;;;:8;:17;;;;;;:22;;;33756:120::o;32383:27::-;;;-1:-1:-1;;;;;32383:27:0;;:::o;33884:90::-;33950:9;:16;33884:90;:::o;44077:1633::-;32976:1;44192:7;;:19;;44184:58;;;;;-1:-1:-1;;;44184:58:0;;;;;;;;;;;;-1:-1:-1;;;44184:58:0;;;;;;;;;;;;;;;32976:1;44253:7;:18;-1:-1:-1;;;;;44338:25:0;;44330:62;;;;;-1:-1:-1;;;44330:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44330:62:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44411:28:0;;44434:4;44411:28;;44403:66;;;;;-1:-1:-1;;;44403:66:0;;;;;;;;;;;;-1:-1:-1;;;44403:66:0;;;;;;;;;;;;;;;44503:12;;-1:-1:-1;;;;;44488:27:0;;;44503:12;;44488:27;;44480:66;;;;;-1:-1:-1;;;44480:66:0;;;;;;;;;;;;-1:-1:-1;;;44480:66:0;;;;;;;;;;;;;;;44644:9;:16;44748:15;;;44744:63;;;44788:7;44780:15;;44744:63;44833:1;44825:5;:9;44817:43;;;;;-1:-1:-1;;;44817:43:0;;;;;;;;;;;;-1:-1:-1;;;44817:43:0;;;;;;;;;;;;;;;44979:45;44985:10;45005:18;;44997:5;:26;44979:5;:45::i;:::-;45109:15;45140:9;45135:411;45155:5;45151:1;:9;45135:411;;;45235:9;45245;;;;;;;45235:20;;;;;;;;;;;;;;;;45225:30;;45270:9;:15;;;;;;;;;;;;;;;;;-1:-1:-1;;45270:15:0;;;;;;;;;;;;45300:17;;;:8;:17;;;;;;:21;;;45385:13;;:67;;-1:-1:-1;;;45385:67:0;;45424:4;45385:67;;;;-1:-1:-1;;;;;45385:67:0;;;;;;;;;;;;;;;:13;;;;;:30;;:67;;;;;;;;;;45270:15;45385:13;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45511:23:0;;;;;;;;;;-1:-1:-1;45511:23:0;;;;;;;-1:-1:-1;45511:23:0;45162:4;;45135:411;;;-1:-1:-1;;32932:1:0;45680:7;:22;-1:-1:-1;;;44077:1633:0:o;17175:87::-;17247:7;17240:14;;;;;;;;-1:-1:-1;;17240:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17214:13;;17240:14;;17247:7;;17240:14;;17247:7;17240:14;;;;;;;;;;;;;;;;;;;;;;;;21173:269;21266:4;21283:129;21292:12;:10;:12::i;:::-;21306:7;21315:96;21354:15;21315:96;;;;;;;;;;;;;;;;;:11;:25;21327:12;:10;:12::i;:::-;-1:-1:-1;;;;;21315:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21315:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;41637:2238::-;32976:1;41760:7;;:19;;41752:58;;;;;-1:-1:-1;;;41752:58:0;;;;;;;;;;;;-1:-1:-1;;;41752:58:0;;;;;;;;;;;;;;;32976:1;41821:7;:18;-1:-1:-1;;;;;41929:23:0;;41921:60;;;;;-1:-1:-1;;;41921:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;41921:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42000:26:0;;42021:4;42000:26;;41992:63;;;;;-1:-1:-1;;;41992:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42087:12;;-1:-1:-1;;;;;42074:25:0;;;42087:12;;42074:25;;42066:64;;;;;-1:-1:-1;;;42066:64:0;;;;;;;;;;;;-1:-1:-1;;;42066:64:0;;;;;;;;;;;;;;;42228:9;:16;42402:8;42436:9;42428:42;;;;;-1:-1:-1;;;42428:42:0;;;;;;;;;;;;-1:-1:-1;;;42428:42:0;;;;;;;;;;;;;;;42507:7;42499:5;42489:7;:15;:25;42481:48;;;;;-1:-1:-1;;;42481:48:0;;;;;;;;;;;;-1:-1:-1;;;42481:48:0;;;;;;;;;;;;;;;42611:10;:23;;-1:-1:-1;;;;;;42611:23:0;42624:10;42611:23;;;;;-1:-1:-1;;42713:858:0;42733:5;42729:1;:9;42713:858;;;42810:8;;42819:1;42810:11;;;;;;;42836:9;:23;;;;;;;;;42810:11;;;;;;;;;42836:23;;;;;;;-1:-1:-1;42874:17:0;;;:8;:17;;;;;;;42894:9;;;;42874:29;;;;43326:13;;:30;;-1:-1:-1;;;43326:30:0;;;;;;;;;;42810:11;;-1:-1:-1;43360:10:0;;-1:-1:-1;;;;;43326:13:0;;;;-1:-1:-1;43326:21:0;;:30;;;;;42810:11;;43326:30;;;;;;:13;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43326:30:0;-1:-1:-1;;;;;43326:44:0;;43318:78;;;;;-1:-1:-1;;;43318:78:0;;;;;;;;;;;;-1:-1:-1;;;43318:78:0;;;;;;;;;;;;;;;43411:13;;:66;;;-1:-1:-1;;;43411:66:0;;43442:10;43411:66;;;;43462:4;43411:66;;;;;;;;;;;;-1:-1:-1;;;;;43411:13:0;;;;:30;;:66;;;;;:13;;:66;;;;;;;;:13;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43536:23:0;;;;;;;;;;-1:-1:-1;43536:23:0;;;;;;;-1:-1:-1;43536:23:0;42740:4;;42713:858;;;;43631:44;43637:9;43656:18;;43648:5;:26;43631:5;:44::i;:::-;-1:-1:-1;;43811:10:0;:23;;-1:-1:-1;;;;;;43811:23:0;;;-1:-1:-1;;43811:10:0;43845:7;:22;-1:-1:-1;;41637:2238:0:o;18543:175::-;18629:4;18646:42;18656:12;:10;:12::i;:::-;18670:9;18681:6;18646:9;:42::i;36949:4192::-;32976:1;37068:7;;:19;;37060:58;;;;;-1:-1:-1;;;37060:58:0;;;;;;;;;;;;-1:-1:-1;;;37060:58:0;;;;;;;;;;;;;;;32976:1;37129:7;:18;-1:-1:-1;;;;;37214:25:0;;37206:62;;;;;-1:-1:-1;;;37206:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37206:62:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37287:28:0;;37310:4;37287:28;;37279:67;;;;;-1:-1:-1;;;37279:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37380:12;;-1:-1:-1;;;;;37365:27:0;;;37380:12;;37365:27;;37357:66;;;;;-1:-1:-1;;;37357:66:0;;;;;;;;;;;;-1:-1:-1;;;37357:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37442:25:0;;37457:10;37442:25;;37434:58;;;;;-1:-1:-1;;;37434:58:0;;;;;;;;;;;;-1:-1:-1;;;37434:58:0;;;;;;;;;;;;;;;37673:24;;37717:12;37709:46;;;;;-1:-1:-1;;;37709:46:0;;;;;;;;;;;;-1:-1:-1;;;37709:46:0;;;;;;;;;;;;;;;38146:12;;38105:54;;;-1:-1:-1;;;38105:54:0;;-1:-1:-1;;;;;38146:12:0;;;38105:54;;;;;;38074:11;;38105:40;;;;;:54;;;;;;;;;;;;;;:40;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38105:54:0;38097:88;;;;;-1:-1:-1;;;38097:88:0;;;;;;;;;;;;-1:-1:-1;;;38097:88:0;;;;;;;;;;;;;;;38283:9;:16;38368:15;;;38364:63;;;38408:7;38400:15;;38364:63;38453:1;38445:5;:9;38437:39;;;;;-1:-1:-1;;;38437:39:0;;;;;;;;;;;;-1:-1:-1;;;38437:39:0;;;;;;;;;;;;;;;38589:45;38595:10;38615:18;;38607:5;:26;38589:5;:45::i;:::-;38700:15;38726:23;38766:5;38752:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38752:20:0;;38726:46;;38783:9;38803:340;38815:5;38811:1;:9;38803:340;;;38853:9;38863;;;;;;;38853:20;;;;;;;;;;;;;;;;38843:30;;38900:7;38888:6;38895:1;38888:9;;;;;;;;;;;;;:19;;;;;38922:9;:15;;;;;;;;;;;;;;;;;-1:-1:-1;;38922:15:0;;;;;;;;;;;;38952:17;;;:8;:17;;;;;;:21;;;39088:13;;:43;;-1:-1:-1;;;39088:43:0;;-1:-1:-1;;;;;39088:43:0;;;;;;;;;;;;;;;:13;;;;;:21;;:43;;;;;;;;;;38922:15;39088:13;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38822:4:0;;;;;-1:-1:-1;38803:340:0;;-1:-1:-1;38803:340:0;;39278:23;39304:19;-1:-1:-1;;;;;39304:29:0;;39334:10;39304:41;;;;;;;;;;;;;-1:-1:-1;;;;;39304:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39304:41:0;39417:47;;;-1:-1:-1;;;39417:47:0;;39445:10;39417:47;;;;;;;;;;;;;;;;;;;;39304:41;;-1:-1:-1;;;;;;39417:27:0;;;;;39445:10;;39457:6;;39417:47;;;;;;39304:41;39417:47;;;;;;;;-1:-1:-1;39417:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39555:1;39551:5;;39546:137;39562:5;39558:1;:9;39546:137;;;39598:13;;39620:9;;-1:-1:-1;;;;;39598:47:0;;;;:13;;:21;;39620:6;;39627:1;;39620:9;;;;;;;;;;;;39598:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39598:32:0;-1:-1:-1;;;;;39598:47:0;;39590:81;;;;;-1:-1:-1;;;39590:81:0;;;;;;;;;;;;-1:-1:-1;;;39590:81:0;;;;;;;;;;;;;;;39569:4;;;;;39546:137;;;40084:21;40108:19;-1:-1:-1;;;;;40108:29:0;;40138:10;40108:41;;;;;;;;;;;;;-1:-1:-1;;;;;40108:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40108:41:0;;-1:-1:-1;40168:31:0;;;40160:73;;;;;-1:-1:-1;;;40160:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40326:13;40279:19;-1:-1:-1;;;;;40279:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40279:42:0;40271:50;;40252:70;;:87;40244:121;;;;;-1:-1:-1;;;40244:121:0;;;;;;;;;;;;-1:-1:-1;;;40244:121:0;;;;;;;;;;;;;;;-1:-1:-1;;32932:1:0;41111:7;:22;-1:-1:-1;;;;;;;;36949:4192:0:o;45984:2248::-;32976:1;46116:7;;:19;;46108:58;;;;;-1:-1:-1;;;46108:58:0;;;;;;;;;;;;-1:-1:-1;;;46108:58:0;;;;;;;;;;;;;;;32976:1;46177:7;:18;-1:-1:-1;;;;;46262:25:0;;46254:62;;;;;-1:-1:-1;;;46254:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;46254:62:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46335:28:0;;46358:4;46335:28;;46327:66;;;;;-1:-1:-1;;;46327:66:0;;;;;;;;;;;;-1:-1:-1;;;46327:66:0;;;;;;;;;;;;;;;46427:12;;-1:-1:-1;;;;;46412:27:0;;;46427:12;;46412:27;;46404:66;;;;;-1:-1:-1;;;46404:66:0;;;;;;;;;;;;-1:-1:-1;;;46404:66:0;;;;;;;;;;;;;;;46568:9;:16;46603:11;46595:45;;;;;-1:-1:-1;;;46595:45:0;;;;;;;;;;;;-1:-1:-1;;;46595:45:0;;;;;;;;;;;;;;;46987:8;46971:13;;;;;47126:830;47146:5;47142:1;:9;47126:830;;;47279:8;;47288:1;47279:11;;;;;;;;;;;;;47269:21;;47313:8;:17;47322:7;47313:17;;;;;;;;;;;;47305:25;;47349:5;47358:1;47349:10;;:45;;;;;47387:7;47363:9;47381:1;47373:5;:9;47363:20;;;;;;;;;;;;;;;;:31;47349:45;47345:600;;;47463:9;47473;;;;;;;47463:20;;;;;;;;;;;;;;;;47449:34;;47526:11;47502:9;47520:1;47512:5;:9;47502:20;;;;;;;;-1:-1:-1;47502:20:0;;-1:-1:-1;47556:9:0;:15;;;;;;;;;;;;;;;;;-1:-1:-1;;47556:15:0;;;;;;;;;;;;47590:21;;;:8;:21;;;;;;:29;;;47638:17;;;;;;:21;;;47731:13;;:67;;-1:-1:-1;;;47731:67:0;;47770:4;47731:67;;;;-1:-1:-1;;;;;47731:67:0;;;;;;;;;;;;;;;:13;;;;;:30;;:67;;;;;;;;;;47556:15;47731:13;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47906:23:0;;;;;;;;47819:16;;;;;47906:23;;-1:-1:-1;47906:23:0;;;;;;;-1:-1:-1;47906:23:0;47345:600;47153:4;;47126:830;;;;48012:54;48018:10;48047:18;;48030:14;:35;48012:5;:54::i;:::-;-1:-1:-1;;32932:1:0;48202:7;:22;-1:-1:-1;;;;;;;45984:2248:0:o;18781:151::-;-1:-1:-1;;;;;18897:18:0;;;18870:7;18897:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18781:151::o;543:106::-;631:10;543:106;:::o;24318:346::-;-1:-1:-1;;;;;24420:19:0;;24412:68;;;;-1:-1:-1;;;24412:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24499:21:0;;24491:68;;;;-1:-1:-1;;;24491:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24572:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24624:32;;;;;;;;;;;;;;;;;24318:346;;;:::o;21932:539::-;-1:-1:-1;;;;;22038:20:0;;22030:70;;;;-1:-1:-1;;;22030:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22119:23:0;;22111:71;;;;-1:-1:-1;;;22111:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22195:47;22216:6;22224:9;22235:6;22195:20;:47::i;:::-;22275:71;22297:6;22275:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22275:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;22255:17:0;;;:9;:17;;;;;;;;;;;:91;;;;22380:20;;;;;;;:32;;22405:6;22380:24;:32::i;:::-;-1:-1:-1;;;;;22357:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;22428:35;;;;;;;22357:20;;22428:35;;;;;;;;;;;;;21932:539;;;:::o;5353:192::-;5439:7;5475:12;5467:6;;;;5459:29;;;;-1:-1:-1;;;5459:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5511:5:0;;;5353:192::o;4450:181::-;4508:7;4540:5;;;4564:6;;;;4556:46;;;;;-1:-1:-1;;;4556:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4622:1;4450:181;-1:-1:-1;;;4450:181:0:o;23462:418::-;-1:-1:-1;;;;;23546:21:0;;23538:67;;;;-1:-1:-1;;;23538:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23618:49;23639:7;23656:1;23660:6;23618:20;:49::i;:::-;23701:68;23724:6;23701:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23701:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;23680:18:0;;:9;:18;;;;;;;;;;:89;23795:12;;:24;;23812:6;23795:16;:24::i;:::-;23780:12;:39;23835:37;;;;;;;;23861:1;;-1:-1:-1;;;;;23835:37:0;;;;;;;;;;;;23462:418;;:::o;22752:378::-;-1:-1:-1;;;;;22836:21:0;;22828:65;;;;;-1:-1:-1;;;22828:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22906:49;22935:1;22939:7;22948:6;22906:20;:49::i;:::-;22983:12;;:24;;23000:6;22983:16;:24::i;:::-;22968:12;:39;-1:-1:-1;;;;;23039:18:0;;:9;:18;;;;;;;;;;;:30;;23062:6;23039:22;:30::i;:::-;-1:-1:-1;;;;;23018:18:0;;:9;:18;;;;;;;;;;;:51;;;;23085:37;;;;;;;23018:18;;:9;;23085:37;;;;;;;;;;22752:378;;:::o;25689:92::-;;;;:::o;4914:136::-;4972:7;4999:43;5003:1;5006;4999:43;;;;;;;;;;;;;;;;;:3;:43::i
Swarm Source
ipfs://b277777692856814b3f2996ab8b6a24657d0bf4a2c0ea06433ab80dbeb6e3c05
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.