Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 941 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Result Auction | 11935701 | 1222 days ago | IN | 0 ETH | 0.01694756 | ||||
Result Auction | 11935701 | 1222 days ago | IN | 0 ETH | 0.01605632 | ||||
Result Auction | 11935701 | 1222 days ago | IN | 0 ETH | 0.01605632 | ||||
Result Auction | 11935701 | 1222 days ago | IN | 0 ETH | 0.01764782 | ||||
Result Auction | 11935701 | 1222 days ago | IN | 0 ETH | 0.01605632 | ||||
Result Auction | 11935701 | 1222 days ago | IN | 0 ETH | 0.01604875 | ||||
Result Auction | 11935701 | 1222 days ago | IN | 0 ETH | 0.01853032 | ||||
Result Auction | 11935474 | 1222 days ago | IN | 0 ETH | 0.01889726 | ||||
Result Auction | 11935473 | 1222 days ago | IN | 0 ETH | 0.01889726 | ||||
Result Auction | 11935473 | 1222 days ago | IN | 0 ETH | 0.01889726 | ||||
Place Bid | 11934873 | 1223 days ago | IN | 1.4 ETH | 0.0073005 | ||||
Place Bid | 11934837 | 1223 days ago | IN | 1.1 ETH | 0.00759252 | ||||
Place Bid | 11934593 | 1223 days ago | IN | 2.1 ETH | 0.0058404 | ||||
Place Bid | 11934589 | 1223 days ago | IN | 1.4 ETH | 0.0058404 | ||||
Place Bid | 11934461 | 1223 days ago | IN | 1 ETH | 0.00712528 | ||||
Place Bid | 11932192 | 1223 days ago | IN | 0.2 ETH | 0.00759252 | ||||
Place Bid | 11929786 | 1223 days ago | IN | 0.98 ETH | 0.01518504 | ||||
Place Bid | 11929784 | 1223 days ago | IN | 2 ETH | 0.01518504 | ||||
Place Bid | 11929782 | 1223 days ago | IN | 1.1 ETH | 0.01518504 | ||||
Place Bid | 11929750 | 1223 days ago | IN | 0.15 ETH | 0.0117392 | ||||
Result Auction | 11927916 | 1224 days ago | IN | 0 ETH | 0.02523765 | ||||
Result Auction | 11927916 | 1224 days ago | IN | 0 ETH | 0.02760765 | ||||
Result Auction | 11927916 | 1224 days ago | IN | 0 ETH | 0.02760765 | ||||
Result Auction | 11927914 | 1224 days ago | IN | 0 ETH | 0.02760765 | ||||
Place Bid | 11927747 | 1224 days ago | IN | 0.2 ETH | 0.00841017 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
11935701 | 1222 days ago | 1.05 ETH | ||||
11935701 | 1222 days ago | 1.05 ETH | ||||
11935701 | 1222 days ago | 0.49 ETH | ||||
11935701 | 1222 days ago | 0.49 ETH | ||||
11935701 | 1222 days ago | 0.6 ETH | ||||
11935701 | 1222 days ago | 0.6 ETH | ||||
11935701 | 1222 days ago | 0.55 ETH | ||||
11935701 | 1222 days ago | 0.55 ETH | ||||
11935701 | 1222 days ago | 1 ETH | ||||
11935701 | 1222 days ago | 1 ETH | ||||
11935701 | 1222 days ago | 1 ETH | ||||
11935701 | 1222 days ago | 1 ETH | ||||
11935701 | 1222 days ago | 0.5525 ETH | ||||
11935701 | 1222 days ago | 0.5525 ETH | ||||
11935474 | 1222 days ago | 0.7 ETH | ||||
11935474 | 1222 days ago | 0.7 ETH | ||||
11935473 | 1222 days ago | 0.55 ETH | ||||
11935473 | 1222 days ago | 0.55 ETH | ||||
11935473 | 1222 days ago | 0.7 ETH | ||||
11935473 | 1222 days ago | 0.7 ETH | ||||
11934873 | 1223 days ago | 1 ETH | ||||
11934837 | 1223 days ago | 1 ETH | ||||
11934593 | 1223 days ago | 0.21 ETH | ||||
11934589 | 1223 days ago | 0.2 ETH | ||||
11934461 | 1223 days ago | 0.16 ETH |
Loading...
Loading
Contract Name:
DigitalaxAuction
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-24 */ // File: @openzeppelin/contracts/GSN/Context.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.12; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/math/SafeMath.sol /** * @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; } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // 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); } } } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/access/AccessControl.sol /** * @dev Contract module that allows children to implement role-based access * control mechanisms. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context { using EnumerableSet for EnumerableSet.AddressSet; using Address for address; struct RoleData { EnumerableSet.AddressSet members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view returns (bool) { return _roles[role].members.contains(account); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view returns (uint256) { return _roles[role].members.length(); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view returns (address) { return _roles[role].members.at(index); } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, _roles[role].adminRole, adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (_roles[role].members.add(account)) { emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (_roles[role].members.remove(account)) { emit RoleRevoked(role, account, _msgSender()); } } } // File: contracts/DigitalaxAccessControls.sol pragma solidity 0.6.12; /** * @notice Access Controls contract for the Digitalax Platform * @author BlockRocket.tech */ contract DigitalaxAccessControls is AccessControl { /// @notice Role definitions bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant SMART_CONTRACT_ROLE = keccak256("SMART_CONTRACT_ROLE"); /// @notice Events for adding and removing various roles event AdminRoleGranted( address indexed beneficiary, address indexed caller ); event AdminRoleRemoved( address indexed beneficiary, address indexed caller ); event MinterRoleGranted( address indexed beneficiary, address indexed caller ); event MinterRoleRemoved( address indexed beneficiary, address indexed caller ); event SmartContractRoleGranted( address indexed beneficiary, address indexed caller ); event SmartContractRoleRemoved( address indexed beneficiary, address indexed caller ); /** * @notice The deployer is automatically given the admin role which will allow them to then grant roles to other addresses */ constructor() public { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); } ///////////// // Lookups // ///////////// /** * @notice Used to check whether an address has the admin role * @param _address EOA or contract being checked * @return bool True if the account has the role or false if it does not */ function hasAdminRole(address _address) external view returns (bool) { return hasRole(DEFAULT_ADMIN_ROLE, _address); } /** * @notice Used to check whether an address has the minter role * @param _address EOA or contract being checked * @return bool True if the account has the role or false if it does not */ function hasMinterRole(address _address) external view returns (bool) { return hasRole(MINTER_ROLE, _address); } /** * @notice Used to check whether an address has the smart contract role * @param _address EOA or contract being checked * @return bool True if the account has the role or false if it does not */ function hasSmartContractRole(address _address) external view returns (bool) { return hasRole(SMART_CONTRACT_ROLE, _address); } /////////////// // Modifiers // /////////////// /** * @notice Grants the admin role to an address * @dev The sender must have the admin role * @param _address EOA or contract receiving the new role */ function addAdminRole(address _address) external { grantRole(DEFAULT_ADMIN_ROLE, _address); emit AdminRoleGranted(_address, _msgSender()); } /** * @notice Removes the admin role from an address * @dev The sender must have the admin role * @param _address EOA or contract affected */ function removeAdminRole(address _address) external { revokeRole(DEFAULT_ADMIN_ROLE, _address); emit AdminRoleRemoved(_address, _msgSender()); } /** * @notice Grants the minter role to an address * @dev The sender must have the admin role * @param _address EOA or contract receiving the new role */ function addMinterRole(address _address) external { grantRole(MINTER_ROLE, _address); emit MinterRoleGranted(_address, _msgSender()); } /** * @notice Removes the minter role from an address * @dev The sender must have the admin role * @param _address EOA or contract affected */ function removeMinterRole(address _address) external { revokeRole(MINTER_ROLE, _address); emit MinterRoleRemoved(_address, _msgSender()); } /** * @notice Grants the smart contract role to an address * @dev The sender must have the admin role * @param _address EOA or contract receiving the new role */ function addSmartContractRole(address _address) external { grantRole(SMART_CONTRACT_ROLE, _address); emit SmartContractRoleGranted(_address, _msgSender()); } /** * @notice Removes the smart contract role from an address * @dev The sender must have the admin role * @param _address EOA or contract affected */ function removeSmartContractRole(address _address) external { revokeRole(SMART_CONTRACT_ROLE, _address); emit SmartContractRoleRemoved(_address, _msgSender()); } } // File: @openzeppelin/contracts/introspection/IERC165.sol /** * @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); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.6.2; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: contracts/garment/IDigitalaxGarmentNFT.sol pragma solidity 0.6.12; interface IDigitalaxGarmentNFT is IERC721 { function isApproved(uint256 _tokenId, address _operator) external view returns (bool); function setPrimarySalePrice(uint256 _tokenId, uint256 _salePrice) external; function garmentDesigners(uint256 _tokenId) external view returns (address); } // File: contracts/DigitalaxAuction.sol pragma solidity 0.6.12; /** * @notice Primary sale auction contract for Digitalax NFTs */ contract DigitalaxAuction is Context, ReentrancyGuard { using SafeMath for uint256; using Address for address payable; /// @notice Event emitted only on construction. To be used by indexers event DigitalaxAuctionContractDeployed(); event PauseToggled( bool isPaused ); event AuctionCreated( uint256 indexed garmentTokenId ); event UpdateAuctionEndTime( uint256 indexed garmentTokenId, uint256 endTime ); event UpdateAuctionStartTime( uint256 indexed garmentTokenId, uint256 startTime ); event UpdateAuctionReservePrice( uint256 indexed garmentTokenId, uint256 reservePrice ); event UpdateAccessControls( address indexed accessControls ); event UpdatePlatformFee( uint256 platformFee ); event UpdatePlatformFeeRecipient( address payable platformFeeRecipient ); event UpdateMinBidIncrement( uint256 minBidIncrement ); event UpdateBidWithdrawalLockTime( uint256 bidWithdrawalLockTime ); event BidPlaced( uint256 indexed garmentTokenId, address indexed bidder, uint256 bid ); event BidWithdrawn( uint256 indexed garmentTokenId, address indexed bidder, uint256 bid ); event BidRefunded( address indexed bidder, uint256 bid ); event AuctionResulted( uint256 indexed garmentTokenId, address indexed winner, uint256 winningBid ); event AuctionCancelled( uint256 indexed garmentTokenId ); /// @notice Parameters of an auction struct Auction { uint256 reservePrice; uint256 startTime; uint256 endTime; bool resulted; } /// @notice Information about the sender that placed a bit on an auction struct HighestBid { address payable bidder; uint256 bid; uint256 lastBidTime; } /// @notice Garment ERC721 Token ID -> Auction Parameters mapping(uint256 => Auction) public auctions; /// @notice Garment ERC721 Token ID -> highest bidder info (if a bid has been received) mapping(uint256 => HighestBid) public highestBids; /// @notice Garment ERC721 NFT - the only NFT that can be auctioned in this contract IDigitalaxGarmentNFT public garmentNft; // @notice responsible for enforcing admin access DigitalaxAccessControls public accessControls; /// @notice globally and across all auctions, the amount by which a bid has to increase uint256 public minBidIncrement = 0.1 ether; /// @notice global bid withdrawal lock time uint256 public bidWithdrawalLockTime = 20 minutes; /// @notice global platform fee, assumed to always be to 1 decimal place i.e. 120 = 12.0% uint256 public platformFee = 120; /// @notice where to send platform fee funds to address payable public platformFeeRecipient; /// @notice for switching off auction creations, bids and withdrawals bool public isPaused; modifier whenNotPaused() { require(!isPaused, "Function is currently paused"); _; } constructor( DigitalaxAccessControls _accessControls, IDigitalaxGarmentNFT _garmentNft, address payable _platformFeeRecipient ) public { require(address(_accessControls) != address(0), "DigitalaxAuction: Invalid Access Controls"); require(address(_garmentNft) != address(0), "DigitalaxAuction: Invalid NFT"); require(_platformFeeRecipient != address(0), "DigitalaxAuction: Invalid Platform Fee Recipient"); accessControls = _accessControls; garmentNft = _garmentNft; platformFeeRecipient = _platformFeeRecipient; emit DigitalaxAuctionContractDeployed(); } /** @notice Creates a new auction for a given garment @dev Only the owner of a garment can create an auction and must have approved the contract @dev In addition to owning the garment, the sender also has to have the MINTER role. @dev End time for the auction must be in the future. @param _garmentTokenId Token ID of the garment being auctioned @param _reservePrice Garment cannot be sold for less than this or minBidIncrement, whichever is higher @param _startTimestamp Unix epoch in seconds for the auction start time @param _endTimestamp Unix epoch in seconds for the auction end time. */ function createAuction( uint256 _garmentTokenId, uint256 _reservePrice, uint256 _startTimestamp, uint256 _endTimestamp ) external whenNotPaused { // Ensure caller has privileges require( accessControls.hasMinterRole(_msgSender()), "DigitalaxAuction.createAuction: Sender must have the minter role" ); // Check owner of the token is the creator and approved require( garmentNft.ownerOf(_garmentTokenId) == _msgSender() && garmentNft.isApproved(_garmentTokenId, address(this)), "DigitalaxAuction.createAuction: Not owner and or contract not approved" ); _createAuction( _garmentTokenId, _reservePrice, _startTimestamp, _endTimestamp ); } /** @notice Admin or smart contract can list approved Garments @dev Sender must have admin or smart contract role @dev Owner must have approved this contract for the garment or all garments they own @dev End time for the auction must be in the future. @param _garmentTokenId Token ID of the garment being auctioned @param _reservePrice Garment cannot be sold for less than this or minBidIncrement, whichever is higher @param _startTimestamp Unix epoch in seconds for the auction start time @param _endTimestamp Unix epoch in seconds for the auction end time. */ function createAuctionOnBehalfOfOwner( uint256 _garmentTokenId, uint256 _reservePrice, uint256 _startTimestamp, uint256 _endTimestamp ) external { // Ensure caller has privileges require( accessControls.hasAdminRole(_msgSender()) || accessControls.hasSmartContractRole(_msgSender()), "DigitalaxAuction.createAuctionOnBehalfOfOwner: Sender must have admin or smart contract role" ); require( garmentNft.isApproved(_garmentTokenId, address(this)), "DigitalaxAuction.createAuctionOnBehalfOfOwner: Cannot create an auction if you do not have approval" ); _createAuction( _garmentTokenId, _reservePrice, _startTimestamp, _endTimestamp ); } /** @notice Places a new bid, out bidding the existing bidder if found and criteria is reached @dev Only callable when the auction is open @dev Bids from smart contracts are prohibited to prevent griefing with always reverting receiver @param _garmentTokenId Token ID of the garment being auctioned */ function placeBid(uint256 _garmentTokenId) external payable nonReentrant whenNotPaused { require(_msgSender().isContract() == false, "DigitalaxAuction.placeBid: No contracts permitted"); // Check the auction to see if this is a valid bid Auction storage auction = auctions[_garmentTokenId]; // Ensure auction is in flight require( _getNow() >= auction.startTime && _getNow() <= auction.endTime, "DigitalaxAuction.placeBid: Bidding outside of the auction window" ); uint256 bidAmount = msg.value; // Ensure bid adheres to outbid increment and threshold HighestBid storage highestBid = highestBids[_garmentTokenId]; uint256 minBidRequired = highestBid.bid.add(minBidIncrement); require(bidAmount >= minBidRequired, "DigitalaxAuction.placeBid: Failed to outbid highest bidder"); // Refund existing top bidder if found if (highestBid.bidder != address(0)) { _refundHighestBidder(highestBid.bidder, highestBid.bid); } // assign top bidder and bid time highestBid.bidder = _msgSender(); highestBid.bid = bidAmount; highestBid.lastBidTime = _getNow(); emit BidPlaced(_garmentTokenId, _msgSender(), bidAmount); } /** @notice Given a sender who has the highest bid on a garment, allows them to withdraw their bid @dev Only callable by the existing top bidder @param _garmentTokenId Token ID of the garment being auctioned */ function withdrawBid(uint256 _garmentTokenId) external nonReentrant whenNotPaused { HighestBid storage highestBid = highestBids[_garmentTokenId]; // Ensure highest bidder is the caller require(highestBid.bidder == _msgSender(), "DigitalaxAuction.withdrawBid: You are not the highest bidder"); // Check withdrawal after delay time require( _getNow() >= highestBid.lastBidTime.add(bidWithdrawalLockTime), "DigitalaxAuction.withdrawBid: Cannot withdraw until lock time has passed" ); require(_getNow() < auctions[_garmentTokenId].endTime, "DigitalaxAuction.withdrawBid: Past auction end"); uint256 previousBid = highestBid.bid; // Clean up the existing top bid delete highestBids[_garmentTokenId]; // Refund the top bidder _refundHighestBidder(_msgSender(), previousBid); emit BidWithdrawn(_garmentTokenId, _msgSender(), previousBid); } ////////// // Admin / ////////// /** @notice Results a finished auction @dev Only admin or smart contract @dev Auction can only be resulted if there has been a bidder and reserve met. @dev If there have been no bids, the auction needs to be cancelled instead using `cancelAuction()` @param _garmentTokenId Token ID of the garment being auctioned */ function resultAuction(uint256 _garmentTokenId) external nonReentrant { require( accessControls.hasAdminRole(_msgSender()) || accessControls.hasSmartContractRole(_msgSender()), "DigitalaxAuction.resultAuction: Sender must be admin or smart contract" ); // Check the auction to see if it can be resulted Auction storage auction = auctions[_garmentTokenId]; // Check the auction real require(auction.endTime > 0, "DigitalaxAuction.resultAuction: Auction does not exist"); // Check the auction has ended require(_getNow() > auction.endTime, "DigitalaxAuction.resultAuction: The auction has not ended"); // Ensure auction not already resulted require(!auction.resulted, "DigitalaxAuction.resultAuction: auction already resulted"); // Ensure this contract is approved to move the token require(garmentNft.isApproved(_garmentTokenId, address(this)), "DigitalaxAuction.resultAuction: auction not approved"); // Get info on who the highest bidder is HighestBid storage highestBid = highestBids[_garmentTokenId]; address winner = highestBid.bidder; uint256 winningBid = highestBid.bid; // Ensure auction not already resulted require(winningBid >= auction.reservePrice, "DigitalaxAuction.resultAuction: reserve not reached"); // Ensure there is a winner require(winner != address(0), "DigitalaxAuction.resultAuction: no open bids"); // Result the auction auctions[_garmentTokenId].resulted = true; // Clean up the highest bid delete highestBids[_garmentTokenId]; // Record the primary sale price for the garment garmentNft.setPrimarySalePrice(_garmentTokenId, winningBid); if (winningBid > auction.reservePrice) { // Work out total above the reserve uint256 aboveReservePrice = winningBid.sub(auction.reservePrice); // Work out platform fee from above reserve amount uint256 platformFeeAboveReserve = aboveReservePrice.mul(platformFee).div(1000); // Send platform fee (bool platformTransferSuccess,) = platformFeeRecipient.call{value : platformFeeAboveReserve}(""); require(platformTransferSuccess, "DigitalaxAuction.resultAuction: Failed to send platform fee"); // Send remaining to designer (bool designerTransferSuccess,) = garmentNft.garmentDesigners(_garmentTokenId).call{value : winningBid.sub(platformFeeAboveReserve)}(""); require(designerTransferSuccess, "DigitalaxAuction.resultAuction: Failed to send the designer their royalties"); } else { // Send all to the designer (bool designerTransferSuccess,) = garmentNft.garmentDesigners(_garmentTokenId).call{value : winningBid}(""); require(designerTransferSuccess, "DigitalaxAuction.resultAuction: Failed to send the designer their royalties"); } // Transfer the token to the winner garmentNft.safeTransferFrom(garmentNft.ownerOf(_garmentTokenId), winner, _garmentTokenId); emit AuctionResulted(_garmentTokenId, winner, winningBid); } /** @notice Cancels and inflight and un-resulted auctions, returning the funds to the top bidder if found @dev Only admin @param _garmentTokenId Token ID of the garment being auctioned */ function cancelAuction(uint256 _garmentTokenId) external nonReentrant { // Admin only resulting function require( accessControls.hasAdminRole(_msgSender()) || accessControls.hasSmartContractRole(_msgSender()), "DigitalaxAuction.cancelAuction: Sender must be admin or smart contract" ); // Check valid and not resulted Auction storage auction = auctions[_garmentTokenId]; // Check auction is real require(auction.endTime > 0, "DigitalaxAuction.cancelAuction: Auction does not exist"); // Check auction not already resulted require(!auction.resulted, "DigitalaxAuction.cancelAuction: auction already resulted"); // refund existing top bidder if found HighestBid storage highestBid = highestBids[_garmentTokenId]; if (highestBid.bidder != address(0)) { _refundHighestBidder(highestBid.bidder, highestBid.bid); // Clear up highest bid delete highestBids[_garmentTokenId]; } // Remove auction and top bidder delete auctions[_garmentTokenId]; emit AuctionCancelled(_garmentTokenId); } /** @notice Toggling the pause flag @dev Only admin */ function toggleIsPaused() external { require(accessControls.hasAdminRole(_msgSender()), "DigitalaxAuction.toggleIsPaused: Sender must be admin"); isPaused = !isPaused; emit PauseToggled(isPaused); } /** @notice Update the amount by which bids have to increase, across all auctions @dev Only admin @param _minBidIncrement New bid step in WEI */ function updateMinBidIncrement(uint256 _minBidIncrement) external { require(accessControls.hasAdminRole(_msgSender()), "DigitalaxAuction.updateMinBidIncrement: Sender must be admin"); minBidIncrement = _minBidIncrement; emit UpdateMinBidIncrement(_minBidIncrement); } /** @notice Update the global bid withdrawal lockout time @dev Only admin @param _bidWithdrawalLockTime New bid withdrawal lock time */ function updateBidWithdrawalLockTime(uint256 _bidWithdrawalLockTime) external { require(accessControls.hasAdminRole(_msgSender()), "DigitalaxAuction.updateBidWithdrawalLockTime: Sender must be admin"); bidWithdrawalLockTime = _bidWithdrawalLockTime; emit UpdateBidWithdrawalLockTime(_bidWithdrawalLockTime); } /** @notice Update the current reserve price for an auction @dev Only admin @dev Auction must exist @param _garmentTokenId Token ID of the garment being auctioned @param _reservePrice New Ether reserve price (WEI value) */ function updateAuctionReservePrice(uint256 _garmentTokenId, uint256 _reservePrice) external { require( accessControls.hasAdminRole(_msgSender()), "DigitalaxAuction.updateAuctionReservePrice: Sender must be admin" ); require( auctions[_garmentTokenId].endTime > 0, "DigitalaxAuction.updateAuctionReservePrice: No Auction exists" ); auctions[_garmentTokenId].reservePrice = _reservePrice; emit UpdateAuctionReservePrice(_garmentTokenId, _reservePrice); } /** @notice Update the current start time for an auction @dev Only admin @dev Auction must exist @param _garmentTokenId Token ID of the garment being auctioned @param _startTime New start time (unix epoch in seconds) */ function updateAuctionStartTime(uint256 _garmentTokenId, uint256 _startTime) external { require( accessControls.hasAdminRole(_msgSender()), "DigitalaxAuction.updateAuctionStartTime: Sender must be admin" ); require( auctions[_garmentTokenId].endTime > 0, "DigitalaxAuction.updateAuctionStartTime: No Auction exists" ); auctions[_garmentTokenId].startTime = _startTime; emit UpdateAuctionStartTime(_garmentTokenId, _startTime); } /** @notice Update the current end time for an auction @dev Only admin @dev Auction must exist @param _garmentTokenId Token ID of the garment being auctioned @param _endTimestamp New end time (unix epoch in seconds) */ function updateAuctionEndTime(uint256 _garmentTokenId, uint256 _endTimestamp) external { require( accessControls.hasAdminRole(_msgSender()), "DigitalaxAuction.updateAuctionEndTime: Sender must be admin" ); require( auctions[_garmentTokenId].endTime > 0, "DigitalaxAuction.updateAuctionEndTime: No Auction exists" ); require( auctions[_garmentTokenId].startTime < _endTimestamp, "DigitalaxAuction.updateAuctionEndTime: End time must be greater than start" ); require( _endTimestamp > _getNow(), "DigitalaxAuction.updateAuctionEndTime: End time passed. Nobody can bid" ); auctions[_garmentTokenId].endTime = _endTimestamp; emit UpdateAuctionEndTime(_garmentTokenId, _endTimestamp); } /** @notice Method for updating the access controls contract used by the NFT @dev Only admin @param _accessControls Address of the new access controls contract (Cannot be zero address) */ function updateAccessControls(DigitalaxAccessControls _accessControls) external { require( accessControls.hasAdminRole(_msgSender()), "DigitalaxAuction.updateAccessControls: Sender must be admin" ); require(address(_accessControls) != address(0), "DigitalaxAuction.updateAccessControls: Zero Address"); accessControls = _accessControls; emit UpdateAccessControls(address(_accessControls)); } /** @notice Method for updating platform fee @dev Only admin @param _platformFee uint256 the platform fee to set */ function updatePlatformFee(uint256 _platformFee) external { require( accessControls.hasAdminRole(_msgSender()), "DigitalaxAuction.updatePlatformFee: Sender must be admin" ); platformFee = _platformFee; emit UpdatePlatformFee(_platformFee); } /** @notice Method for updating platform fee address @dev Only admin @param _platformFeeRecipient payable address the address to sends the funds to */ function updatePlatformFeeRecipient(address payable _platformFeeRecipient) external { require( accessControls.hasAdminRole(_msgSender()), "DigitalaxAuction.updatePlatformFeeRecipient: Sender must be admin" ); require(_platformFeeRecipient != address(0), "DigitalaxAuction.updatePlatformFeeRecipient: Zero address"); platformFeeRecipient = _platformFeeRecipient; emit UpdatePlatformFeeRecipient(_platformFeeRecipient); } /////////////// // Accessors // /////////////// /** @notice Method for getting all info about the auction @param _garmentTokenId Token ID of the garment being auctioned */ function getAuction(uint256 _garmentTokenId) external view returns (uint256 _reservePrice, uint256 _startTime, uint256 _endTime, bool _resulted) { Auction storage auction = auctions[_garmentTokenId]; return ( auction.reservePrice, auction.startTime, auction.endTime, auction.resulted ); } /** @notice Method for getting all info about the highest bidder @param _garmentTokenId Token ID of the garment being auctioned */ function getHighestBidder(uint256 _garmentTokenId) external view returns ( address payable _bidder, uint256 _bid, uint256 _lastBidTime ) { HighestBid storage highestBid = highestBids[_garmentTokenId]; return ( highestBid.bidder, highestBid.bid, highestBid.lastBidTime ); } ///////////////////////// // Internal and Private / ///////////////////////// function _getNow() internal virtual view returns (uint256) { return block.timestamp; } /** @notice Private method doing the heavy lifting of creating an auction @param _garmentTokenId Token ID of the garment being auctioned @param _reservePrice Garment cannot be sold for less than this or minBidIncrement, whichever is higher @param _startTimestamp Unix epoch in seconds for the auction start time @param _endTimestamp Unix epoch in seconds for the auction end time. */ function _createAuction( uint256 _garmentTokenId, uint256 _reservePrice, uint256 _startTimestamp, uint256 _endTimestamp ) private { // Ensure a token cannot be re-listed if previously successfully sold require(auctions[_garmentTokenId].endTime == 0, "DigitalaxAuction.createAuction: Cannot relist"); // Check end time not before start time and that end is in the future require(_endTimestamp > _startTimestamp, "DigitalaxAuction.createAuction: End time must be greater than start"); require(_endTimestamp > _getNow(), "DigitalaxAuction.createAuction: End time passed. Nobody can bid."); // Setup the auction auctions[_garmentTokenId] = Auction({ reservePrice : _reservePrice, startTime : _startTimestamp, endTime : _endTimestamp, resulted : false }); emit AuctionCreated(_garmentTokenId); } /** @notice Used for sending back escrowed funds from a previous bid @param _currentHighestBidder Address of the last highest bidder @param _currentHighestBid Ether amount in WEI that the bidder sent when placing their bid */ function _refundHighestBidder(address payable _currentHighestBidder, uint256 _currentHighestBid) private { // refund previous best (if bid exists) (bool successRefund,) = _currentHighestBidder.call{value : _currentHighestBid}(""); require(successRefund, "DigitalaxAuction._refundHighestBidder: failed to refund previous bidder"); emit BidRefunded(_currentHighestBidder, _currentHighestBid); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract DigitalaxAccessControls","name":"_accessControls","type":"address"},{"internalType":"contract IDigitalaxGarmentNFT","name":"_garmentNft","type":"address"},{"internalType":"address payable","name":"_platformFeeRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"garmentTokenId","type":"uint256"}],"name":"AuctionCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"garmentTokenId","type":"uint256"}],"name":"AuctionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"garmentTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"winningBid","type":"uint256"}],"name":"AuctionResulted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"garmentTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"bid","type":"uint256"}],"name":"BidPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"bid","type":"uint256"}],"name":"BidRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"garmentTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"bid","type":"uint256"}],"name":"BidWithdrawn","type":"event"},{"anonymous":false,"inputs":[],"name":"DigitalaxAuctionContractDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isPaused","type":"bool"}],"name":"PauseToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"accessControls","type":"address"}],"name":"UpdateAccessControls","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"garmentTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"UpdateAuctionEndTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"garmentTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservePrice","type":"uint256"}],"name":"UpdateAuctionReservePrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"garmentTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"}],"name":"UpdateAuctionStartTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bidWithdrawalLockTime","type":"uint256"}],"name":"UpdateBidWithdrawalLockTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minBidIncrement","type":"uint256"}],"name":"UpdateMinBidIncrement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"platformFee","type":"uint256"}],"name":"UpdatePlatformFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable","name":"platformFeeRecipient","type":"address"}],"name":"UpdatePlatformFeeRecipient","type":"event"},{"inputs":[],"name":"accessControls","outputs":[{"internalType":"contract DigitalaxAccessControls","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctions","outputs":[{"internalType":"uint256","name":"reservePrice","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bool","name":"resulted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bidWithdrawalLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_garmentTokenId","type":"uint256"}],"name":"cancelAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_garmentTokenId","type":"uint256"},{"internalType":"uint256","name":"_reservePrice","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"}],"name":"createAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_garmentTokenId","type":"uint256"},{"internalType":"uint256","name":"_reservePrice","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"}],"name":"createAuctionOnBehalfOfOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"garmentNft","outputs":[{"internalType":"contract IDigitalaxGarmentNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_garmentTokenId","type":"uint256"}],"name":"getAuction","outputs":[{"internalType":"uint256","name":"_reservePrice","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"},{"internalType":"bool","name":"_resulted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_garmentTokenId","type":"uint256"}],"name":"getHighestBidder","outputs":[{"internalType":"address payable","name":"_bidder","type":"address"},{"internalType":"uint256","name":"_bid","type":"uint256"},{"internalType":"uint256","name":"_lastBidTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"highestBids","outputs":[{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"uint256","name":"bid","type":"uint256"},{"internalType":"uint256","name":"lastBidTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBidIncrement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_garmentTokenId","type":"uint256"}],"name":"placeBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFeeRecipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_garmentTokenId","type":"uint256"}],"name":"resultAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleIsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract DigitalaxAccessControls","name":"_accessControls","type":"address"}],"name":"updateAccessControls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_garmentTokenId","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"}],"name":"updateAuctionEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_garmentTokenId","type":"uint256"},{"internalType":"uint256","name":"_reservePrice","type":"uint256"}],"name":"updateAuctionReservePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_garmentTokenId","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"updateAuctionStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bidWithdrawalLockTime","type":"uint256"}],"name":"updateBidWithdrawalLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBidIncrement","type":"uint256"}],"name":"updateMinBidIncrement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_platformFee","type":"uint256"}],"name":"updatePlatformFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_platformFeeRecipient","type":"address"}],"name":"updatePlatformFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_garmentTokenId","type":"uint256"}],"name":"withdrawBid","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405267016345785d8a00006005556104b060065560786007553480156200002857600080fd5b506040516200383038038062003830833981810160405260608110156200004e57600080fd5b508051602082015160409092015160016000559091906001600160a01b038316620000ab5760405162461bcd60e51b8152600401808060200182810382526029815260200180620038076029913960400191505060405180910390fd5b6001600160a01b03821662000107576040805162461bcd60e51b815260206004820152601d60248201527f4469676974616c617841756374696f6e3a20496e76616c6964204e4654000000604482015290519081900360640190fd5b6001600160a01b0381166200014e5760405162461bcd60e51b8152600401808060200182810382526030815260200180620037d76030913960400191505060405180910390fd5b600480546001600160a01b038086166001600160a01b0319928316179092556003805485841690831617905560088054928416929091169190911790556040517f2d5a201f67533748a6a2a874c1b8b439b3ac8ef0121ebd2019f9618acd7716bb90600090a150505061361080620001c76000396000f3fe6080604052600436106101815760003560e01c806396b5a755116100d1578063bd9610701161008a578063eb13554f11610064578063eb13554f14610558578063ef2a8ce61461056d578063f5fe7f71146105a9578063f9613d7f146105dc57610181565b8063bd961070146104ce578063c750cb79146104fe578063d9f303a21461052857610181565b806396b5a755146103da5780639979ef45146104045780639ae001ff14610421578063aa0b598814610451578063af3718b81461047b578063b187bd26146104a557610181565b8063431f21da1161013e5780636a5362f6116101185780636a5362f6146103535780636ef3da9414610368578063748365ef1461039b57806378bd7935146103b057610181565b8063431f21da1461029b578063571a26a0146102d7578063623de5ad1461032957610181565b8063083759e0146101865780630eaaf4c8146101b2578063111cb258146101dc5780631f159d2a1461022e57806326232a2e1461025f578063335b115e14610286575b600080fd5b34801561019257600080fd5b506101b0600480360360208110156101a957600080fd5b50356105f1565b005b3480156101be57600080fd5b506101b0600480360360208110156101d557600080fd5b50356106e9565b3480156101e857600080fd5b50610206600480360360208110156101ff57600080fd5b5035610936565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b34801561023a57600080fd5b50610243610962565b604080516001600160a01b039092168252519081900360200190f35b34801561026b57600080fd5b50610274610971565b60408051918252519081900360200190f35b34801561029257600080fd5b50610274610977565b3480156102a757600080fd5b506101b0600480360360808110156102be57600080fd5b508035906020810135906040810135906060013561097d565b3480156102e357600080fd5b50610301600480360360208110156102fa57600080fd5b5035610bfa565b6040805194855260208501939093528383019190915215156060830152519081900360800190f35b34801561033557600080fd5b506101b06004803603602081101561034c57600080fd5b5035610c25565b34801561035f57600080fd5b50610274610d1d565b34801561037457600080fd5b506101b06004803603602081101561038b57600080fd5b50356001600160a01b0316610d23565b3480156103a757600080fd5b50610243610e6f565b3480156103bc57600080fd5b50610301600480360360208110156103d357600080fd5b5035610e7e565b3480156103e657600080fd5b506101b0600480360360208110156103fd57600080fd5b5035610eaa565b6101b06004803603602081101561041a57600080fd5b503561118b565b34801561042d57600080fd5b506101b06004803603604081101561044457600080fd5b5080359060200135611415565b34801561045d57600080fd5b506101b06004803603602081101561047457600080fd5b503561156d565b34801561048757600080fd5b506101b06004803603602081101561049e57600080fd5b5035611665565b3480156104b157600080fd5b506104ba611f07565b604080519115158252519081900360200190f35b3480156104da57600080fd5b506101b0600480360360408110156104f157600080fd5b5080359060200135611f17565b34801561050a57600080fd5b506102066004803603602081101561052157600080fd5b503561206c565b34801561053457600080fd5b506101b06004803603604081101561054b57600080fd5b508035906020013561209a565b34801561056457600080fd5b50610243612287565b34801561057957600080fd5b506101b06004803603608081101561059057600080fd5b5080359060208101359060408101359060600135612296565b3480156105b557600080fd5b506101b0600480360360208110156105cc57600080fd5b50356001600160a01b0316612495565b3480156105e857600080fd5b506101b06125eb565b6004546001600160a01b031663c395fcb361060a612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d602081101561067157600080fd5b50516106ae5760405162461bcd60e51b815260040180806020018281038252603c815260200180612edf603c913960400191505060405180910390fd5b60058190556040805182815290517f489b0441344cbdcb036bee4857de51567f580e9747166f76b581be803ca45fcb9181900360200190a150565b6002600054141561072f576040805162461bcd60e51b815260206004820152601f6024820152600080516020612bde833981519152604482015290519081900360640190fd5b6002600055600854600160a01b900460ff1615610793576040805162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2069732063757272656e746c792070617573656400000000604482015290519081900360640190fd5b60008181526002602052604090206107a9612707565b81546001600160a01b039081169116146107f45760405162461bcd60e51b815260040180806020018281038252603c81526020018061332a603c913960400191505060405180910390fd5b60065460028201546108059161270b565b61080d61276e565b101561084a5760405162461bcd60e51b8152600401808060200182810382526048815260200180612c3b6048913960600191505060405180910390fd5b60008281526001602052604090206002015461086461276e565b106108a05760405162461bcd60e51b815260040180806020018281038252602e815260200180612bb0602e913960400191505060405180910390fd5b6001808201546000848152600260208190526040822080546001600160a01b031916815593840182905592909201919091556108e36108dd612707565b82612772565b6108eb612707565b6001600160a01b0316837f8f8619524e8d462cead34604bd2247ede24175801481e4d0b8059ac8aa41c301836040518082815260200191505060405180910390a35050600160005550565b60026020819052600091825260409091208054600182015491909201546001600160a01b039092169183565b6003546001600160a01b031681565b60075481565b60055481565b600854600160a01b900460ff16156109dc576040805162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2069732063757272656e746c792070617573656400000000604482015290519081900360640190fd5b6004546001600160a01b031663099db0176109f5612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610a3257600080fd5b505afa158015610a46573d6000803e3d6000fd5b505050506040513d6020811015610a5c57600080fd5b5051610a995760405162461bcd60e51b8152600401808060200182810382526040815260200180612f5b6040913960400191505060405180910390fd5b610aa1612707565b600354604080516331a9108f60e11b81526004810188905290516001600160a01b039384169390921691636352211e91602480820192602092909190829003018186803b158015610af157600080fd5b505afa158015610b05573d6000803e3d6000fd5b505050506040513d6020811015610b1b57600080fd5b50516001600160a01b0316148015610bad5750600354604080516356c3163760e01b81526004810187905230602482015290516001600160a01b03909216916356c3163791604480820192602092909190829003018186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6020811015610baa57600080fd5b50515b610be85760405162461bcd60e51b81526004018080602001828103825260468152602001806130166046913960600191505060405180910390fd5b610bf484848484612846565b50505050565b6001602081905260009182526040909120805491810154600282015460039092015490919060ff1684565b6004546001600160a01b031663c395fcb3610c3e612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610c7b57600080fd5b505afa158015610c8f573d6000803e3d6000fd5b505050506040513d6020811015610ca557600080fd5b5051610ce25760405162461bcd60e51b815260040180806020018281038252604281526020018061305c6042913960600191505060405180910390fd5b60068190556040805182815290517ff9e4b69944d3fbdd96aedcda02032e2091346ececc3b55a485b40a6dc09bb9e09181900360200190a150565b60065481565b6004546001600160a01b031663c395fcb3610d3c612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610d7957600080fd5b505afa158015610d8d573d6000803e3d6000fd5b505050506040513d6020811015610da357600080fd5b5051610de05760405162461bcd60e51b815260040180806020018281038252603b8152602001806131c8603b913960400191505060405180910390fd5b6001600160a01b038116610e255760405162461bcd60e51b8152600401808060200182810382526033815260200180612b7d6033913960400191505060405180910390fd5b600480546001600160a01b0319166001600160a01b0383169081179091556040517fb7a140127704195c46749cbcf048725c27a55237114201a7a621eefb759f247490600090a250565b6004546001600160a01b031681565b600090815260016020819052604090912080549181015460028201546003909201549293909260ff1690565b60026000541415610ef0576040805162461bcd60e51b815260206004820152601f6024820152600080516020612bde833981519152604482015290519081900360640190fd5b60026000556004546001600160a01b031663c395fcb3610f0e612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f4b57600080fd5b505afa158015610f5f573d6000803e3d6000fd5b505050506040513d6020811015610f7557600080fd5b50518061100057506004546001600160a01b031663113b0ab2610f96612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fd357600080fd5b505afa158015610fe7573d6000803e3d6000fd5b505050506040513d6020811015610ffd57600080fd5b50515b61103b5760405162461bcd60e51b81526004018080602001828103825260468152602001806134e66046913960600191505060405180910390fd5b600081815260016020526040902060028101546110895760405162461bcd60e51b8152600401808060200182810382526036815260200180612c836036913960400191505060405180910390fd5b600381015460ff16156110cd5760405162461bcd60e51b8152600401808060200182810382526038815260200180612f9b6038913960400191505060405180910390fd5b600082815260026020526040902080546001600160a01b03161561112d5780546001820154611105916001600160a01b031690612772565b6000838152600260208190526040822080546001600160a01b03191681556001810183905501555b6000838152600160208190526040808320838155918201839055600282018390556003909101805460ff191690555184917f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df91a25050600160005550565b600260005414156111d1576040805162461bcd60e51b815260206004820152601f6024820152600080516020612bde833981519152604482015290519081900360640190fd5b6002600055600854600160a01b900460ff1615611235576040805162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2069732063757272656e746c792070617573656400000000604482015290519081900360640190fd5b61124e611240612707565b6001600160a01b031661299d565b1561128a5760405162461bcd60e51b81526004018080602001828103825260318152602001806135aa6031913960400191505060405180910390fd5b6000818152600160208190526040909120908101546112a761276e565b101580156112c0575080600201546112bd61276e565b11155b6112fb5760405162461bcd60e51b8152600401808060200182810382526040815260200180612cb96040913960400191505060405180910390fd5b6000828152600260205260408120600554600182015434939161131e919061270b565b90508083101561135f5760405162461bcd60e51b815260040180806020018281038252603a815260200180613270603a913960400191505060405180910390fd5b81546001600160a01b0316156113895781546001830154611389916001600160a01b031690612772565b611391612707565b82546001600160a01b0319166001600160a01b0391909116178255600182018390556113bb61276e565b60028301556113c8612707565b6001600160a01b0316857f0e54eff26401bf69b81b26f60bd85ef47f5d85275c1d268d84f68d6897431c47856040518082815260200191505060405180910390a350506001600055505050565b6004546001600160a01b031663c395fcb361142e612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561146b57600080fd5b505afa15801561147f573d6000803e3d6000fd5b505050506040513d602081101561149557600080fd5b50516114d25760405162461bcd60e51b815260040180806020018281038252603d815260200180612bfe603d913960400191505060405180910390fd5b60008281526001602052604090206002015461151f5760405162461bcd60e51b815260040180806020018281038252603a8152602001806130fa603a913960400191505060405180910390fd5b6000828152600160208181526040928390209091018390558151838152915184927fc2a98245c0df83b31e855d9b43049b8b352a11b4e93641ad739841dda7ee121d92908290030190a25050565b6004546001600160a01b031663c395fcb3611586612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156115c357600080fd5b505afa1580156115d7573d6000803e3d6000fd5b505050506040513d60208110156115ed57600080fd5b505161162a5760405162461bcd60e51b815260040180806020018281038252603881526020018061352c6038913960400191505060405180910390fd5b60078190556040805182815290517f2644fd26359c107ff7991b6dfc36ce902b334ce4e3891bbecacc5922aa620efa9181900360200190a150565b600260005414156116ab576040805162461bcd60e51b815260206004820152601f6024820152600080516020612bde833981519152604482015290519081900360640190fd5b60026000556004546001600160a01b031663c395fcb36116c9612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561170657600080fd5b505afa15801561171a573d6000803e3d6000fd5b505050506040513d602081101561173057600080fd5b5051806117bb57506004546001600160a01b031663113b0ab2611751612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561178e57600080fd5b505afa1580156117a2573d6000803e3d6000fd5b505050506040513d60208110156117b857600080fd5b50515b6117f65760405162461bcd60e51b81526004018080602001828103825260468152602001806135646046913960600191505060405180910390fd5b600081815260016020526040902060028101546118445760405162461bcd60e51b81526004018080602001828103825260368152602001806134b06036913960400191505060405180910390fd5b806002015461185161276e565b1161188d5760405162461bcd60e51b81526004018080602001828103825260398152602001806132036039913960400191505060405180910390fd5b600381015460ff16156118d15760405162461bcd60e51b8152600401808060200182810382526038815260200180612d696038913960400191505060405180910390fd5b600354604080516356c3163760e01b81526004810185905230602482015290516001600160a01b03909216916356c3163791604480820192602092909190829003018186803b15801561192357600080fd5b505afa158015611937573d6000803e3d6000fd5b505050506040513d602081101561194d57600080fd5b505161198a5760405162461bcd60e51b815260040180806020018281038252603481526020018061323c6034913960400191505060405180910390fd5b60008281526002602052604090208054600182015483546001600160a01b03909216918110156119eb5760405162461bcd60e51b8152600401808060200182810382526033815260200180612cf96033913960400191505060405180910390fd5b6001600160a01b038216611a305760405162461bcd60e51b815260040180806020018281038252602c815260200180613366602c913960400191505060405180910390fd5b60008581526001602081815260408084206003908101805460ff19168517905560029283905281852080546001600160a01b03191681559384018590559290910183905590548151639920fae360e01b8152600481018990526024810185905291516001600160a01b0390911692639920fae3926044808201939182900301818387803b158015611ac057600080fd5b505af1158015611ad4573d6000803e3d6000fd5b505050508360000154811115611cc5578354600090611af49083906129a3565b90506000611b196103e8611b13600754856129e590919063ffffffff16565b90612a3e565b6008546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114611b6b576040519150601f19603f3d011682016040523d82523d6000602084013e611b70565b606091505b5050905080611bb05760405162461bcd60e51b815260040180806020018281038252603b815260200180613134603b913960400191505060405180910390fd5b600354604080516338e1173d60e21b8152600481018b905290516000926001600160a01b03169163e3845cf4916024808301926020929190829003018186803b158015611bfc57600080fd5b505afa158015611c10573d6000803e3d6000fd5b505050506040513d6020811015611c2657600080fd5b50516001600160a01b0316611c3b86856129a3565b604051600081818185875af1925050503d8060008114611c77576040519150601f19603f3d011682016040523d82523d6000602084013e611c7c565b606091505b5050905080611cbc5760405162461bcd60e51b815260040180806020018281038252604b815260200180613430604b913960600191505060405180910390fd5b50505050611dce565b600354604080516338e1173d60e21b81526004810188905290516000926001600160a01b03169163e3845cf4916024808301926020929190829003018186803b158015611d1157600080fd5b505afa158015611d25573d6000803e3d6000fd5b505050506040513d6020811015611d3b57600080fd5b50516040516001600160a01b03909116908390600081818185875af1925050503d8060008114611d87576040519150601f19603f3d011682016040523d82523d6000602084013e611d8c565b606091505b5050905080611dcc5760405162461bcd60e51b815260040180806020018281038252604b815260200180613430604b913960600191505060405180910390fd5b505b600354604080516331a9108f60e11b81526004810188905290516001600160a01b03909216916342842e0e918391636352211e91602480820192602092909190829003018186803b158015611e2257600080fd5b505afa158015611e36573d6000803e3d6000fd5b505050506040513d6020811015611e4c57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b03928316600482015291861660248301526044820189905251606480830192600092919082900301818387803b158015611ea357600080fd5b505af1158015611eb7573d6000803e3d6000fd5b50506040805184815290516001600160a01b03861693508892507fdc3ad5667eda0c259aee8174a35865c76ad9af37c8ecac1e2daaaad3f21183c79181900360200190a350506001600055505050565b600854600160a01b900460ff1681565b6004546001600160a01b031663c395fcb3611f30612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611f6d57600080fd5b505afa158015611f81573d6000803e3d6000fd5b505050506040513d6020811015611f9757600080fd5b5051611fd45760405162461bcd60e51b8152600401808060200182810382526040815260200180612e556040913960400191505060405180910390fd5b6000828152600160205260409020600201546120215760405162461bcd60e51b815260040180806020018281038252603d815260200180612d2c603d913960400191505060405180910390fd5b6000828152600160209081526040918290208390558151838152915184927f9047c56c10a65302488cb36dde4b5e5684eefc80cb990c2f46931ccfe28c466792908290030190a25050565b60008181526002602081905260409091208054600182015491909201546001600160a01b0390921693909250565b6004546001600160a01b031663c395fcb36120b3612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156120f057600080fd5b505afa158015612104573d6000803e3d6000fd5b505050506040513d602081101561211a57600080fd5b50516121575760405162461bcd60e51b815260040180806020018281038252603b8152602001806133f5603b913960400191505060405180910390fd5b6000828152600160205260409020600201546121a45760405162461bcd60e51b815260040180806020018281038252603881526020018061316f6038913960400191505060405180910390fd5b6000828152600160208190526040909120015481116121f45760405162461bcd60e51b815260040180806020018281038252604a815260200180612e95604a913960600191505060405180910390fd5b6121fc61276e565b81116122395760405162461bcd60e51b8152600401808060200182810382526046815260200180612dce6046913960600191505060405180910390fd5b6000828152600160209081526040918290206002018390558151838152915184927fafc200a11431b405b3776f040774ad2ca641885174f70b46ec537e73eb1f1a9892908290030190a25050565b6008546001600160a01b031681565b6004546001600160a01b031663c395fcb36122af612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156122ec57600080fd5b505afa158015612300573d6000803e3d6000fd5b505050506040513d602081101561231657600080fd5b5051806123a157506004546001600160a01b031663113b0ab2612337612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561237457600080fd5b505afa158015612388573d6000803e3d6000fd5b505050506040513d602081101561239e57600080fd5b50515b6123dc5760405162461bcd60e51b815260040180806020018281038252605c81526020018061309e605c913960600191505060405180910390fd5b600354604080516356c3163760e01b81526004810187905230602482015290516001600160a01b03909216916356c3163791604480820192602092909190829003018186803b15801561242e57600080fd5b505afa158015612442573d6000803e3d6000fd5b505050506040513d602081101561245857600080fd5b5051610be85760405162461bcd60e51b81526004018080602001828103825260638152602001806133926063913960800191505060405180910390fd5b6004546001600160a01b031663c395fcb36124ae612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156124eb57600080fd5b505afa1580156124ff573d6000803e3d6000fd5b505050506040513d602081101561251557600080fd5b50516125525760405162461bcd60e51b8152600401808060200182810382526041815260200180612e146041913960600191505060405180910390fd5b6001600160a01b0381166125975760405162461bcd60e51b81526004018080602001828103825260398152602001806132f16039913960400191505060405180910390fd5b600880546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fe57e7c1f36cc83fade34e32351e6eee7eb9da532662b1b5da10c631e8222aca79181900360200190a150565b6004546001600160a01b031663c395fcb3612604612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561264157600080fd5b505afa158015612655573d6000803e3d6000fd5b505050506040513d602081101561266b57600080fd5b50516126a85760405162461bcd60e51b815260040180806020018281038252603581526020018061347b6035913960400191505060405180910390fd5b6008805460ff600160a01b808304821615810260ff60a01b1990931692909217928390556040805192909304161515815290517f9077d36bc00859b5c3f320310707208543dd35092cb0a0fe117d0c6a558b148b9181900360200190a1565b3390565b600082820183811015612765576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b4290565b6040516000906001600160a01b0384169083908381818185875af1925050503d80600081146127bd576040519150601f19603f3d011682016040523d82523d6000602084013e6127c2565b606091505b50509050806128025760405162461bcd60e51b81526004018080602001828103825260478152602001806132aa6047913960600191505060405180910390fd5b6040805183815290516001600160a01b038516917f8377883650d2137d6e6d67bcf2dbb9b1dab287d68240a17ff910b9fb7a0ad5ff919081900360200190a2505050565b600084815260016020526040902060020154156128945760405162461bcd60e51b815260040180806020018281038252602d815260200180612da1602d913960400191505060405180910390fd5b8181116128d25760405162461bcd60e51b8152600401808060200182810382526043815260200180612fd36043913960600191505060405180910390fd5b6128da61276e565b81116129175760405162461bcd60e51b8152600401808060200182810382526040815260200180612f1b6040913960400191505060405180910390fd5b6040805160808101825284815260208082018581528284018581526000606085018181528a825260019485905286822095518655925193850193909355516002840155516003909201805460ff191692151592909217909155905185917f7e0e356457a92dacd3760ddf327a24dd226c6ca01b2cc41a7fd6f28469c7ab9b91a250505050565b3b151590565b600061276583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a80565b6000826129f457506000612768565b82820282848281612a0157fe5b04146127655760405162461bcd60e51b81526004018080602001828103825260218152602001806131a76021913960400191505060405180910390fd5b600061276583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b17565b60008184841115612b0f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ad4578181015183820152602001612abc565b50505050905090810190601f168015612b015780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183612b665760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612ad4578181015183820152602001612abc565b506000838581612b7257fe5b049594505050505056fe4469676974616c617841756374696f6e2e757064617465416363657373436f6e74726f6c733a205a65726f20416464726573734469676974616c617841756374696f6e2e77697468647261774269643a20506173742061756374696f6e20656e645265656e7472616e637947756172643a207265656e7472616e742063616c6c004469676974616c617841756374696f6e2e75706461746541756374696f6e537461727454696d653a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e77697468647261774269643a2043616e6e6f7420776974686472617720756e74696c206c6f636b2074696d6520686173207061737365644469676974616c617841756374696f6e2e63616e63656c41756374696f6e3a2041756374696f6e20646f6573206e6f742065786973744469676974616c617841756374696f6e2e706c6163654269643a2042696464696e67206f757473696465206f66207468652061756374696f6e2077696e646f774469676974616c617841756374696f6e2e726573756c7441756374696f6e3a2072657365727665206e6f7420726561636865644469676974616c617841756374696f6e2e75706461746541756374696f6e5265736572766550726963653a204e6f2041756374696f6e206578697374734469676974616c617841756374696f6e2e726573756c7441756374696f6e3a2061756374696f6e20616c726561647920726573756c7465644469676974616c617841756374696f6e2e63726561746541756374696f6e3a2043616e6e6f742072656c6973744469676974616c617841756374696f6e2e75706461746541756374696f6e456e6454696d653a20456e642074696d65207061737365642e204e6f626f64792063616e206269644469676974616c617841756374696f6e2e757064617465506c6174666f726d466565526563697069656e743a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e75706461746541756374696f6e5265736572766550726963653a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e75706461746541756374696f6e456e6454696d653a20456e642074696d65206d7573742062652067726561746572207468616e2073746172744469676974616c617841756374696f6e2e7570646174654d696e426964496e6372656d656e743a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e63726561746541756374696f6e3a20456e642074696d65207061737365642e204e6f626f64792063616e206269642e4469676974616c617841756374696f6e2e63726561746541756374696f6e3a2053656e646572206d757374206861766520746865206d696e74657220726f6c654469676974616c617841756374696f6e2e63616e63656c41756374696f6e3a2061756374696f6e20616c726561647920726573756c7465644469676974616c617841756374696f6e2e63726561746541756374696f6e3a20456e642074696d65206d7573742062652067726561746572207468616e2073746172744469676974616c617841756374696f6e2e63726561746541756374696f6e3a204e6f74206f776e657220616e64206f7220636f6e7472616374206e6f7420617070726f7665644469676974616c617841756374696f6e2e7570646174654269645769746864726177616c4c6f636b54696d653a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e63726561746541756374696f6e4f6e426568616c664f664f776e65723a2053656e646572206d75737420686176652061646d696e206f7220736d61727420636f6e747261637420726f6c654469676974616c617841756374696f6e2e75706461746541756374696f6e537461727454696d653a204e6f2041756374696f6e206578697374734469676974616c617841756374696f6e2e726573756c7441756374696f6e3a204661696c656420746f2073656e6420706c6174666f726d206665654469676974616c617841756374696f6e2e75706461746541756374696f6e456e6454696d653a204e6f2041756374696f6e20657869737473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774469676974616c617841756374696f6e2e757064617465416363657373436f6e74726f6c733a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e726573756c7441756374696f6e3a205468652061756374696f6e20686173206e6f7420656e6465644469676974616c617841756374696f6e2e726573756c7441756374696f6e3a2061756374696f6e206e6f7420617070726f7665644469676974616c617841756374696f6e2e706c6163654269643a204661696c656420746f206f75746269642068696768657374206269646465724469676974616c617841756374696f6e2e5f726566756e64486967686573744269646465723a206661696c656420746f20726566756e642070726576696f7573206269646465724469676974616c617841756374696f6e2e757064617465506c6174666f726d466565526563697069656e743a205a65726f20616464726573734469676974616c617841756374696f6e2e77697468647261774269643a20596f7520617265206e6f74207468652068696768657374206269646465724469676974616c617841756374696f6e2e726573756c7441756374696f6e3a206e6f206f70656e20626964734469676974616c617841756374696f6e2e63726561746541756374696f6e4f6e426568616c664f664f776e65723a2043616e6e6f742063726561746520616e2061756374696f6e20696620796f7520646f206e6f74206861766520617070726f76616c4469676974616c617841756374696f6e2e75706461746541756374696f6e456e6454696d653a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e726573756c7441756374696f6e3a204661696c656420746f2073656e64207468652064657369676e657220746865697220726f79616c746965734469676974616c617841756374696f6e2e746f67676c6549735061757365643a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e726573756c7441756374696f6e3a2041756374696f6e20646f6573206e6f742065786973744469676974616c617841756374696f6e2e63616e63656c41756374696f6e3a2053656e646572206d7573742062652061646d696e206f7220736d61727420636f6e74726163744469676974616c617841756374696f6e2e757064617465506c6174666f726d4665653a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e726573756c7441756374696f6e3a2053656e646572206d7573742062652061646d696e206f7220736d61727420636f6e74726163744469676974616c617841756374696f6e2e706c6163654269643a204e6f20636f6e747261637473207065726d6974746564a2646970667358221220a63014e7314e81cbdcf071bc9297e522e9c193bf825476ba650504b6655af03164736f6c634300060c00334469676974616c617841756374696f6e3a20496e76616c696420506c6174666f726d2046656520526563697069656e744469676974616c617841756374696f6e3a20496e76616c69642041636365737320436f6e74726f6c73000000000000000000000000165eec91620b7bb96d02890d8a3f8cb79a29195c0000000000000000000000000b509f4b044f713a91bb50535914f7ad160532fe00000000000000000000000010c0b0da2a682c12bd36516a95cb8474c02d83de
Deployed Bytecode
0x6080604052600436106101815760003560e01c806396b5a755116100d1578063bd9610701161008a578063eb13554f11610064578063eb13554f14610558578063ef2a8ce61461056d578063f5fe7f71146105a9578063f9613d7f146105dc57610181565b8063bd961070146104ce578063c750cb79146104fe578063d9f303a21461052857610181565b806396b5a755146103da5780639979ef45146104045780639ae001ff14610421578063aa0b598814610451578063af3718b81461047b578063b187bd26146104a557610181565b8063431f21da1161013e5780636a5362f6116101185780636a5362f6146103535780636ef3da9414610368578063748365ef1461039b57806378bd7935146103b057610181565b8063431f21da1461029b578063571a26a0146102d7578063623de5ad1461032957610181565b8063083759e0146101865780630eaaf4c8146101b2578063111cb258146101dc5780631f159d2a1461022e57806326232a2e1461025f578063335b115e14610286575b600080fd5b34801561019257600080fd5b506101b0600480360360208110156101a957600080fd5b50356105f1565b005b3480156101be57600080fd5b506101b0600480360360208110156101d557600080fd5b50356106e9565b3480156101e857600080fd5b50610206600480360360208110156101ff57600080fd5b5035610936565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b34801561023a57600080fd5b50610243610962565b604080516001600160a01b039092168252519081900360200190f35b34801561026b57600080fd5b50610274610971565b60408051918252519081900360200190f35b34801561029257600080fd5b50610274610977565b3480156102a757600080fd5b506101b0600480360360808110156102be57600080fd5b508035906020810135906040810135906060013561097d565b3480156102e357600080fd5b50610301600480360360208110156102fa57600080fd5b5035610bfa565b6040805194855260208501939093528383019190915215156060830152519081900360800190f35b34801561033557600080fd5b506101b06004803603602081101561034c57600080fd5b5035610c25565b34801561035f57600080fd5b50610274610d1d565b34801561037457600080fd5b506101b06004803603602081101561038b57600080fd5b50356001600160a01b0316610d23565b3480156103a757600080fd5b50610243610e6f565b3480156103bc57600080fd5b50610301600480360360208110156103d357600080fd5b5035610e7e565b3480156103e657600080fd5b506101b0600480360360208110156103fd57600080fd5b5035610eaa565b6101b06004803603602081101561041a57600080fd5b503561118b565b34801561042d57600080fd5b506101b06004803603604081101561044457600080fd5b5080359060200135611415565b34801561045d57600080fd5b506101b06004803603602081101561047457600080fd5b503561156d565b34801561048757600080fd5b506101b06004803603602081101561049e57600080fd5b5035611665565b3480156104b157600080fd5b506104ba611f07565b604080519115158252519081900360200190f35b3480156104da57600080fd5b506101b0600480360360408110156104f157600080fd5b5080359060200135611f17565b34801561050a57600080fd5b506102066004803603602081101561052157600080fd5b503561206c565b34801561053457600080fd5b506101b06004803603604081101561054b57600080fd5b508035906020013561209a565b34801561056457600080fd5b50610243612287565b34801561057957600080fd5b506101b06004803603608081101561059057600080fd5b5080359060208101359060408101359060600135612296565b3480156105b557600080fd5b506101b0600480360360208110156105cc57600080fd5b50356001600160a01b0316612495565b3480156105e857600080fd5b506101b06125eb565b6004546001600160a01b031663c395fcb361060a612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d602081101561067157600080fd5b50516106ae5760405162461bcd60e51b815260040180806020018281038252603c815260200180612edf603c913960400191505060405180910390fd5b60058190556040805182815290517f489b0441344cbdcb036bee4857de51567f580e9747166f76b581be803ca45fcb9181900360200190a150565b6002600054141561072f576040805162461bcd60e51b815260206004820152601f6024820152600080516020612bde833981519152604482015290519081900360640190fd5b6002600055600854600160a01b900460ff1615610793576040805162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2069732063757272656e746c792070617573656400000000604482015290519081900360640190fd5b60008181526002602052604090206107a9612707565b81546001600160a01b039081169116146107f45760405162461bcd60e51b815260040180806020018281038252603c81526020018061332a603c913960400191505060405180910390fd5b60065460028201546108059161270b565b61080d61276e565b101561084a5760405162461bcd60e51b8152600401808060200182810382526048815260200180612c3b6048913960600191505060405180910390fd5b60008281526001602052604090206002015461086461276e565b106108a05760405162461bcd60e51b815260040180806020018281038252602e815260200180612bb0602e913960400191505060405180910390fd5b6001808201546000848152600260208190526040822080546001600160a01b031916815593840182905592909201919091556108e36108dd612707565b82612772565b6108eb612707565b6001600160a01b0316837f8f8619524e8d462cead34604bd2247ede24175801481e4d0b8059ac8aa41c301836040518082815260200191505060405180910390a35050600160005550565b60026020819052600091825260409091208054600182015491909201546001600160a01b039092169183565b6003546001600160a01b031681565b60075481565b60055481565b600854600160a01b900460ff16156109dc576040805162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2069732063757272656e746c792070617573656400000000604482015290519081900360640190fd5b6004546001600160a01b031663099db0176109f5612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610a3257600080fd5b505afa158015610a46573d6000803e3d6000fd5b505050506040513d6020811015610a5c57600080fd5b5051610a995760405162461bcd60e51b8152600401808060200182810382526040815260200180612f5b6040913960400191505060405180910390fd5b610aa1612707565b600354604080516331a9108f60e11b81526004810188905290516001600160a01b039384169390921691636352211e91602480820192602092909190829003018186803b158015610af157600080fd5b505afa158015610b05573d6000803e3d6000fd5b505050506040513d6020811015610b1b57600080fd5b50516001600160a01b0316148015610bad5750600354604080516356c3163760e01b81526004810187905230602482015290516001600160a01b03909216916356c3163791604480820192602092909190829003018186803b158015610b8057600080fd5b505afa158015610b94573d6000803e3d6000fd5b505050506040513d6020811015610baa57600080fd5b50515b610be85760405162461bcd60e51b81526004018080602001828103825260468152602001806130166046913960600191505060405180910390fd5b610bf484848484612846565b50505050565b6001602081905260009182526040909120805491810154600282015460039092015490919060ff1684565b6004546001600160a01b031663c395fcb3610c3e612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610c7b57600080fd5b505afa158015610c8f573d6000803e3d6000fd5b505050506040513d6020811015610ca557600080fd5b5051610ce25760405162461bcd60e51b815260040180806020018281038252604281526020018061305c6042913960600191505060405180910390fd5b60068190556040805182815290517ff9e4b69944d3fbdd96aedcda02032e2091346ececc3b55a485b40a6dc09bb9e09181900360200190a150565b60065481565b6004546001600160a01b031663c395fcb3610d3c612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610d7957600080fd5b505afa158015610d8d573d6000803e3d6000fd5b505050506040513d6020811015610da357600080fd5b5051610de05760405162461bcd60e51b815260040180806020018281038252603b8152602001806131c8603b913960400191505060405180910390fd5b6001600160a01b038116610e255760405162461bcd60e51b8152600401808060200182810382526033815260200180612b7d6033913960400191505060405180910390fd5b600480546001600160a01b0319166001600160a01b0383169081179091556040517fb7a140127704195c46749cbcf048725c27a55237114201a7a621eefb759f247490600090a250565b6004546001600160a01b031681565b600090815260016020819052604090912080549181015460028201546003909201549293909260ff1690565b60026000541415610ef0576040805162461bcd60e51b815260206004820152601f6024820152600080516020612bde833981519152604482015290519081900360640190fd5b60026000556004546001600160a01b031663c395fcb3610f0e612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f4b57600080fd5b505afa158015610f5f573d6000803e3d6000fd5b505050506040513d6020811015610f7557600080fd5b50518061100057506004546001600160a01b031663113b0ab2610f96612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fd357600080fd5b505afa158015610fe7573d6000803e3d6000fd5b505050506040513d6020811015610ffd57600080fd5b50515b61103b5760405162461bcd60e51b81526004018080602001828103825260468152602001806134e66046913960600191505060405180910390fd5b600081815260016020526040902060028101546110895760405162461bcd60e51b8152600401808060200182810382526036815260200180612c836036913960400191505060405180910390fd5b600381015460ff16156110cd5760405162461bcd60e51b8152600401808060200182810382526038815260200180612f9b6038913960400191505060405180910390fd5b600082815260026020526040902080546001600160a01b03161561112d5780546001820154611105916001600160a01b031690612772565b6000838152600260208190526040822080546001600160a01b03191681556001810183905501555b6000838152600160208190526040808320838155918201839055600282018390556003909101805460ff191690555184917f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df91a25050600160005550565b600260005414156111d1576040805162461bcd60e51b815260206004820152601f6024820152600080516020612bde833981519152604482015290519081900360640190fd5b6002600055600854600160a01b900460ff1615611235576040805162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2069732063757272656e746c792070617573656400000000604482015290519081900360640190fd5b61124e611240612707565b6001600160a01b031661299d565b1561128a5760405162461bcd60e51b81526004018080602001828103825260318152602001806135aa6031913960400191505060405180910390fd5b6000818152600160208190526040909120908101546112a761276e565b101580156112c0575080600201546112bd61276e565b11155b6112fb5760405162461bcd60e51b8152600401808060200182810382526040815260200180612cb96040913960400191505060405180910390fd5b6000828152600260205260408120600554600182015434939161131e919061270b565b90508083101561135f5760405162461bcd60e51b815260040180806020018281038252603a815260200180613270603a913960400191505060405180910390fd5b81546001600160a01b0316156113895781546001830154611389916001600160a01b031690612772565b611391612707565b82546001600160a01b0319166001600160a01b0391909116178255600182018390556113bb61276e565b60028301556113c8612707565b6001600160a01b0316857f0e54eff26401bf69b81b26f60bd85ef47f5d85275c1d268d84f68d6897431c47856040518082815260200191505060405180910390a350506001600055505050565b6004546001600160a01b031663c395fcb361142e612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561146b57600080fd5b505afa15801561147f573d6000803e3d6000fd5b505050506040513d602081101561149557600080fd5b50516114d25760405162461bcd60e51b815260040180806020018281038252603d815260200180612bfe603d913960400191505060405180910390fd5b60008281526001602052604090206002015461151f5760405162461bcd60e51b815260040180806020018281038252603a8152602001806130fa603a913960400191505060405180910390fd5b6000828152600160208181526040928390209091018390558151838152915184927fc2a98245c0df83b31e855d9b43049b8b352a11b4e93641ad739841dda7ee121d92908290030190a25050565b6004546001600160a01b031663c395fcb3611586612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156115c357600080fd5b505afa1580156115d7573d6000803e3d6000fd5b505050506040513d60208110156115ed57600080fd5b505161162a5760405162461bcd60e51b815260040180806020018281038252603881526020018061352c6038913960400191505060405180910390fd5b60078190556040805182815290517f2644fd26359c107ff7991b6dfc36ce902b334ce4e3891bbecacc5922aa620efa9181900360200190a150565b600260005414156116ab576040805162461bcd60e51b815260206004820152601f6024820152600080516020612bde833981519152604482015290519081900360640190fd5b60026000556004546001600160a01b031663c395fcb36116c9612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561170657600080fd5b505afa15801561171a573d6000803e3d6000fd5b505050506040513d602081101561173057600080fd5b5051806117bb57506004546001600160a01b031663113b0ab2611751612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561178e57600080fd5b505afa1580156117a2573d6000803e3d6000fd5b505050506040513d60208110156117b857600080fd5b50515b6117f65760405162461bcd60e51b81526004018080602001828103825260468152602001806135646046913960600191505060405180910390fd5b600081815260016020526040902060028101546118445760405162461bcd60e51b81526004018080602001828103825260368152602001806134b06036913960400191505060405180910390fd5b806002015461185161276e565b1161188d5760405162461bcd60e51b81526004018080602001828103825260398152602001806132036039913960400191505060405180910390fd5b600381015460ff16156118d15760405162461bcd60e51b8152600401808060200182810382526038815260200180612d696038913960400191505060405180910390fd5b600354604080516356c3163760e01b81526004810185905230602482015290516001600160a01b03909216916356c3163791604480820192602092909190829003018186803b15801561192357600080fd5b505afa158015611937573d6000803e3d6000fd5b505050506040513d602081101561194d57600080fd5b505161198a5760405162461bcd60e51b815260040180806020018281038252603481526020018061323c6034913960400191505060405180910390fd5b60008281526002602052604090208054600182015483546001600160a01b03909216918110156119eb5760405162461bcd60e51b8152600401808060200182810382526033815260200180612cf96033913960400191505060405180910390fd5b6001600160a01b038216611a305760405162461bcd60e51b815260040180806020018281038252602c815260200180613366602c913960400191505060405180910390fd5b60008581526001602081815260408084206003908101805460ff19168517905560029283905281852080546001600160a01b03191681559384018590559290910183905590548151639920fae360e01b8152600481018990526024810185905291516001600160a01b0390911692639920fae3926044808201939182900301818387803b158015611ac057600080fd5b505af1158015611ad4573d6000803e3d6000fd5b505050508360000154811115611cc5578354600090611af49083906129a3565b90506000611b196103e8611b13600754856129e590919063ffffffff16565b90612a3e565b6008546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114611b6b576040519150601f19603f3d011682016040523d82523d6000602084013e611b70565b606091505b5050905080611bb05760405162461bcd60e51b815260040180806020018281038252603b815260200180613134603b913960400191505060405180910390fd5b600354604080516338e1173d60e21b8152600481018b905290516000926001600160a01b03169163e3845cf4916024808301926020929190829003018186803b158015611bfc57600080fd5b505afa158015611c10573d6000803e3d6000fd5b505050506040513d6020811015611c2657600080fd5b50516001600160a01b0316611c3b86856129a3565b604051600081818185875af1925050503d8060008114611c77576040519150601f19603f3d011682016040523d82523d6000602084013e611c7c565b606091505b5050905080611cbc5760405162461bcd60e51b815260040180806020018281038252604b815260200180613430604b913960600191505060405180910390fd5b50505050611dce565b600354604080516338e1173d60e21b81526004810188905290516000926001600160a01b03169163e3845cf4916024808301926020929190829003018186803b158015611d1157600080fd5b505afa158015611d25573d6000803e3d6000fd5b505050506040513d6020811015611d3b57600080fd5b50516040516001600160a01b03909116908390600081818185875af1925050503d8060008114611d87576040519150601f19603f3d011682016040523d82523d6000602084013e611d8c565b606091505b5050905080611dcc5760405162461bcd60e51b815260040180806020018281038252604b815260200180613430604b913960600191505060405180910390fd5b505b600354604080516331a9108f60e11b81526004810188905290516001600160a01b03909216916342842e0e918391636352211e91602480820192602092909190829003018186803b158015611e2257600080fd5b505afa158015611e36573d6000803e3d6000fd5b505050506040513d6020811015611e4c57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b03928316600482015291861660248301526044820189905251606480830192600092919082900301818387803b158015611ea357600080fd5b505af1158015611eb7573d6000803e3d6000fd5b50506040805184815290516001600160a01b03861693508892507fdc3ad5667eda0c259aee8174a35865c76ad9af37c8ecac1e2daaaad3f21183c79181900360200190a350506001600055505050565b600854600160a01b900460ff1681565b6004546001600160a01b031663c395fcb3611f30612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611f6d57600080fd5b505afa158015611f81573d6000803e3d6000fd5b505050506040513d6020811015611f9757600080fd5b5051611fd45760405162461bcd60e51b8152600401808060200182810382526040815260200180612e556040913960400191505060405180910390fd5b6000828152600160205260409020600201546120215760405162461bcd60e51b815260040180806020018281038252603d815260200180612d2c603d913960400191505060405180910390fd5b6000828152600160209081526040918290208390558151838152915184927f9047c56c10a65302488cb36dde4b5e5684eefc80cb990c2f46931ccfe28c466792908290030190a25050565b60008181526002602081905260409091208054600182015491909201546001600160a01b0390921693909250565b6004546001600160a01b031663c395fcb36120b3612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156120f057600080fd5b505afa158015612104573d6000803e3d6000fd5b505050506040513d602081101561211a57600080fd5b50516121575760405162461bcd60e51b815260040180806020018281038252603b8152602001806133f5603b913960400191505060405180910390fd5b6000828152600160205260409020600201546121a45760405162461bcd60e51b815260040180806020018281038252603881526020018061316f6038913960400191505060405180910390fd5b6000828152600160208190526040909120015481116121f45760405162461bcd60e51b815260040180806020018281038252604a815260200180612e95604a913960600191505060405180910390fd5b6121fc61276e565b81116122395760405162461bcd60e51b8152600401808060200182810382526046815260200180612dce6046913960600191505060405180910390fd5b6000828152600160209081526040918290206002018390558151838152915184927fafc200a11431b405b3776f040774ad2ca641885174f70b46ec537e73eb1f1a9892908290030190a25050565b6008546001600160a01b031681565b6004546001600160a01b031663c395fcb36122af612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156122ec57600080fd5b505afa158015612300573d6000803e3d6000fd5b505050506040513d602081101561231657600080fd5b5051806123a157506004546001600160a01b031663113b0ab2612337612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561237457600080fd5b505afa158015612388573d6000803e3d6000fd5b505050506040513d602081101561239e57600080fd5b50515b6123dc5760405162461bcd60e51b815260040180806020018281038252605c81526020018061309e605c913960600191505060405180910390fd5b600354604080516356c3163760e01b81526004810187905230602482015290516001600160a01b03909216916356c3163791604480820192602092909190829003018186803b15801561242e57600080fd5b505afa158015612442573d6000803e3d6000fd5b505050506040513d602081101561245857600080fd5b5051610be85760405162461bcd60e51b81526004018080602001828103825260638152602001806133926063913960800191505060405180910390fd5b6004546001600160a01b031663c395fcb36124ae612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156124eb57600080fd5b505afa1580156124ff573d6000803e3d6000fd5b505050506040513d602081101561251557600080fd5b50516125525760405162461bcd60e51b8152600401808060200182810382526041815260200180612e146041913960600191505060405180910390fd5b6001600160a01b0381166125975760405162461bcd60e51b81526004018080602001828103825260398152602001806132f16039913960400191505060405180910390fd5b600880546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fe57e7c1f36cc83fade34e32351e6eee7eb9da532662b1b5da10c631e8222aca79181900360200190a150565b6004546001600160a01b031663c395fcb3612604612707565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561264157600080fd5b505afa158015612655573d6000803e3d6000fd5b505050506040513d602081101561266b57600080fd5b50516126a85760405162461bcd60e51b815260040180806020018281038252603581526020018061347b6035913960400191505060405180910390fd5b6008805460ff600160a01b808304821615810260ff60a01b1990931692909217928390556040805192909304161515815290517f9077d36bc00859b5c3f320310707208543dd35092cb0a0fe117d0c6a558b148b9181900360200190a1565b3390565b600082820183811015612765576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b4290565b6040516000906001600160a01b0384169083908381818185875af1925050503d80600081146127bd576040519150601f19603f3d011682016040523d82523d6000602084013e6127c2565b606091505b50509050806128025760405162461bcd60e51b81526004018080602001828103825260478152602001806132aa6047913960600191505060405180910390fd5b6040805183815290516001600160a01b038516917f8377883650d2137d6e6d67bcf2dbb9b1dab287d68240a17ff910b9fb7a0ad5ff919081900360200190a2505050565b600084815260016020526040902060020154156128945760405162461bcd60e51b815260040180806020018281038252602d815260200180612da1602d913960400191505060405180910390fd5b8181116128d25760405162461bcd60e51b8152600401808060200182810382526043815260200180612fd36043913960600191505060405180910390fd5b6128da61276e565b81116129175760405162461bcd60e51b8152600401808060200182810382526040815260200180612f1b6040913960400191505060405180910390fd5b6040805160808101825284815260208082018581528284018581526000606085018181528a825260019485905286822095518655925193850193909355516002840155516003909201805460ff191692151592909217909155905185917f7e0e356457a92dacd3760ddf327a24dd226c6ca01b2cc41a7fd6f28469c7ab9b91a250505050565b3b151590565b600061276583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a80565b6000826129f457506000612768565b82820282848281612a0157fe5b04146127655760405162461bcd60e51b81526004018080602001828103825260218152602001806131a76021913960400191505060405180910390fd5b600061276583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b17565b60008184841115612b0f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ad4578181015183820152602001612abc565b50505050905090810190601f168015612b015780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183612b665760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612ad4578181015183820152602001612abc565b506000838581612b7257fe5b049594505050505056fe4469676974616c617841756374696f6e2e757064617465416363657373436f6e74726f6c733a205a65726f20416464726573734469676974616c617841756374696f6e2e77697468647261774269643a20506173742061756374696f6e20656e645265656e7472616e637947756172643a207265656e7472616e742063616c6c004469676974616c617841756374696f6e2e75706461746541756374696f6e537461727454696d653a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e77697468647261774269643a2043616e6e6f7420776974686472617720756e74696c206c6f636b2074696d6520686173207061737365644469676974616c617841756374696f6e2e63616e63656c41756374696f6e3a2041756374696f6e20646f6573206e6f742065786973744469676974616c617841756374696f6e2e706c6163654269643a2042696464696e67206f757473696465206f66207468652061756374696f6e2077696e646f774469676974616c617841756374696f6e2e726573756c7441756374696f6e3a2072657365727665206e6f7420726561636865644469676974616c617841756374696f6e2e75706461746541756374696f6e5265736572766550726963653a204e6f2041756374696f6e206578697374734469676974616c617841756374696f6e2e726573756c7441756374696f6e3a2061756374696f6e20616c726561647920726573756c7465644469676974616c617841756374696f6e2e63726561746541756374696f6e3a2043616e6e6f742072656c6973744469676974616c617841756374696f6e2e75706461746541756374696f6e456e6454696d653a20456e642074696d65207061737365642e204e6f626f64792063616e206269644469676974616c617841756374696f6e2e757064617465506c6174666f726d466565526563697069656e743a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e75706461746541756374696f6e5265736572766550726963653a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e75706461746541756374696f6e456e6454696d653a20456e642074696d65206d7573742062652067726561746572207468616e2073746172744469676974616c617841756374696f6e2e7570646174654d696e426964496e6372656d656e743a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e63726561746541756374696f6e3a20456e642074696d65207061737365642e204e6f626f64792063616e206269642e4469676974616c617841756374696f6e2e63726561746541756374696f6e3a2053656e646572206d757374206861766520746865206d696e74657220726f6c654469676974616c617841756374696f6e2e63616e63656c41756374696f6e3a2061756374696f6e20616c726561647920726573756c7465644469676974616c617841756374696f6e2e63726561746541756374696f6e3a20456e642074696d65206d7573742062652067726561746572207468616e2073746172744469676974616c617841756374696f6e2e63726561746541756374696f6e3a204e6f74206f776e657220616e64206f7220636f6e7472616374206e6f7420617070726f7665644469676974616c617841756374696f6e2e7570646174654269645769746864726177616c4c6f636b54696d653a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e63726561746541756374696f6e4f6e426568616c664f664f776e65723a2053656e646572206d75737420686176652061646d696e206f7220736d61727420636f6e747261637420726f6c654469676974616c617841756374696f6e2e75706461746541756374696f6e537461727454696d653a204e6f2041756374696f6e206578697374734469676974616c617841756374696f6e2e726573756c7441756374696f6e3a204661696c656420746f2073656e6420706c6174666f726d206665654469676974616c617841756374696f6e2e75706461746541756374696f6e456e6454696d653a204e6f2041756374696f6e20657869737473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774469676974616c617841756374696f6e2e757064617465416363657373436f6e74726f6c733a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e726573756c7441756374696f6e3a205468652061756374696f6e20686173206e6f7420656e6465644469676974616c617841756374696f6e2e726573756c7441756374696f6e3a2061756374696f6e206e6f7420617070726f7665644469676974616c617841756374696f6e2e706c6163654269643a204661696c656420746f206f75746269642068696768657374206269646465724469676974616c617841756374696f6e2e5f726566756e64486967686573744269646465723a206661696c656420746f20726566756e642070726576696f7573206269646465724469676974616c617841756374696f6e2e757064617465506c6174666f726d466565526563697069656e743a205a65726f20616464726573734469676974616c617841756374696f6e2e77697468647261774269643a20596f7520617265206e6f74207468652068696768657374206269646465724469676974616c617841756374696f6e2e726573756c7441756374696f6e3a206e6f206f70656e20626964734469676974616c617841756374696f6e2e63726561746541756374696f6e4f6e426568616c664f664f776e65723a2043616e6e6f742063726561746520616e2061756374696f6e20696620796f7520646f206e6f74206861766520617070726f76616c4469676974616c617841756374696f6e2e75706461746541756374696f6e456e6454696d653a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e726573756c7441756374696f6e3a204661696c656420746f2073656e64207468652064657369676e657220746865697220726f79616c746965734469676974616c617841756374696f6e2e746f67676c6549735061757365643a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e726573756c7441756374696f6e3a2041756374696f6e20646f6573206e6f742065786973744469676974616c617841756374696f6e2e63616e63656c41756374696f6e3a2053656e646572206d7573742062652061646d696e206f7220736d61727420636f6e74726163744469676974616c617841756374696f6e2e757064617465506c6174666f726d4665653a2053656e646572206d7573742062652061646d696e4469676974616c617841756374696f6e2e726573756c7441756374696f6e3a2053656e646572206d7573742062652061646d696e206f7220736d61727420636f6e74726163744469676974616c617841756374696f6e2e706c6163654269643a204e6f20636f6e747261637473207065726d6974746564a2646970667358221220a63014e7314e81cbdcf071bc9297e522e9c193bf825476ba650504b6655af03164736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000165eec91620b7bb96d02890d8a3f8cb79a29195c0000000000000000000000000b509f4b044f713a91bb50535914f7ad160532fe00000000000000000000000010c0b0da2a682c12bd36516a95cb8474c02d83de
-----Decoded View---------------
Arg [0] : _accessControls (address): 0x165Eec91620b7Bb96d02890d8a3F8Cb79a29195c
Arg [1] : _garmentNft (address): 0x0B509F4b044F713A91bB50535914f7ad160532fe
Arg [2] : _platformFeeRecipient (address): 0x10C0B0DA2A682C12bD36516A95CB8474C02d83De
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000165eec91620b7bb96d02890d8a3f8cb79a29195c
Arg [1] : 0000000000000000000000000b509f4b044f713a91bb50535914f7ad160532fe
Arg [2] : 00000000000000000000000010c0b0da2a682c12bd36516a95cb8474c02d83de
Deployed Bytecode Sourcemap
41479:24426:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57023:299;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57023:299:0;;:::i;:::-;;50380:995;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50380:995:0;;:::i;43780:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43780:49:0;;:::i;:::-;;;;-1:-1:-1;;;;;43780:49:0;;;;;;;;;;;;;;;;;;;;;;;;;43928:38;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;43928:38:0;;;;;;;;;;;;;;44430:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;44177:42;;;;;;;;;;;;;:::i;46113:861::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46113:861:0;;;;;;;;;;;;;;;;;:::i;43635:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43635:43:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57495:341;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57495:341:0;;:::i;44277:49::-;;;;;;;;;;;;;:::i;60862:471::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60862:471:0;-1:-1:-1;;;;;60862:471:0;;:::i;44030:45::-;;;;;;;;;;;;;:::i;62703:371::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62703:371:0;;:::i;55319:1206::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55319:1206:0;;:::i;48799:1333::-;;;;;;;;;;;;;;;;-1:-1:-1;48799:1333:0;;:::i;58944:543::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58944:543:0;;;;;;;:::i;61486:310::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61486:310:0;;:::i;51790:3304::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51790:3304:0;;:::i;44651:20::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;58108:567;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58108:567:0;;;;;;;:::i;63236:375::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63236:375:0;;:::i;59755:882::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59755:882:0;;;;;;;:::i;44524:43::-;;;;;;;;;;;;;:::i;47603:851::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47603:851:0;;;;;;;;;;;;;;;;;:::i;61984:499::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61984:499:0;-1:-1:-1;;;;;61984:499:0;;:::i;56611:230::-;;;;;;;;;;;;;:::i;57023:299::-;57108:14;;-1:-1:-1;;;;;57108:14:0;:27;57136:12;:10;:12::i;:::-;57108:41;;;;;;;;;;;;;-1:-1:-1;;;;;57108:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57108:41:0;57100:114;;;;-1:-1:-1;;;57100:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57225:15;:34;;;57275:39;;;;;;;;;;;;;;;;;57023:299;:::o;50380:995::-;8086:1;8692:7;;:19;;8684:63;;;;;-1:-1:-1;;;8684:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8684:63:0;;;;;;;;;;;;;;;8086:1;8825:7;:18;44725:8:::1;::::0;-1:-1:-1;;;44725:8:0;::::1;;;44724:9;44716:50;;;::::0;;-1:-1:-1;;;44716:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;50473:29:::2;50505:28:::0;;;:11:::2;:28;::::0;;;;50623:12:::2;:10;:12::i;:::-;50602:17:::0;;-1:-1:-1;;;;;50602:17:0;;::::2;:33:::0;::::2;;50594:106;;;;-1:-1:-1::0;;;50594:106:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50821:21;::::0;50794:22:::2;::::0;::::2;::::0;:49:::2;::::0;:26:::2;:49::i;:::-;50781:9;:7;:9::i;:::-;:62;;50759:184;;;;-1:-1:-1::0;;;50759:184:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50976:25;::::0;;;:8:::2;:25;::::0;;;;:33:::2;;::::0;50964:9:::2;:7;:9::i;:::-;:45;50956:104;;;;-1:-1:-1::0;;;50956:104:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51095:14;::::0;;::::2;::::0;51073:19:::2;51171:28:::0;;;:11:::2;:28;::::0;;;;;;51164:35;;-1:-1:-1;;;;;;51164:35:0::2;::::0;;;;::::2;::::0;;;;;;::::2;::::0;;;;51246:47:::2;51267:12;:10;:12::i;:::-;51281:11;51246:20;:47::i;:::-;51341:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;51311:56:0::2;51324:15;51311:56;51355:11;51311:56;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;8042:1:0;9004:7;:22;-1:-1:-1;50380:995:0:o;43780:49::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43780:49:0;;;;;:::o;43928:38::-;;;-1:-1:-1;;;;;43928:38:0;;:::o;44430:32::-;;;;:::o;44177:42::-;;;;:::o;46113:861::-;44725:8;;-1:-1:-1;;;44725:8:0;;;;44724:9;44716:50;;;;;-1:-1:-1;;;44716:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46372:14:::1;::::0;-1:-1:-1;;;;;46372:14:0::1;:28;46401:12;:10;:12::i;:::-;46372:42;;;;;;;;;;;;;-1:-1:-1::0;;;;;46372:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46372:42:0;46350:156:::1;;;;-1:-1:-1::0;;;46350:156:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46645:12;:10;:12::i;:::-;46606:10;::::0;:35:::1;::::0;;-1:-1:-1;;;46606:35:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;46606:51:0;;::::1;::::0;:10;;::::1;::::0;:18:::1;::::0;:35;;;;;::::1;::::0;;;;;;;;;:10;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46606:35:0;-1:-1:-1;;;;;46606:51:0::1;;:108:::0;::::1;;;-1:-1:-1::0;46661:10:0::1;::::0;:53:::1;::::0;;-1:-1:-1;;;46661:53:0;;::::1;::::0;::::1;::::0;;;46708:4:::1;46661:53:::0;;;;;;-1:-1:-1;;;;;46661:10:0;;::::1;::::0;:21:::1;::::0;:53;;;;;::::1;::::0;;;;;;;;;:10;:53;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46661:53:0;46606:108:::1;46584:228;;;;-1:-1:-1::0;;;46584:228:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46825:141;46854:15;46884:13;46912:15;46942:13;46825:14;:141::i;:::-;46113:861:::0;;;;:::o;43635:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57495:341::-;57592:14;;-1:-1:-1;;;;;57592:14:0;:27;57620:12;:10;:12::i;:::-;57592:41;;;;;;;;;;;;;-1:-1:-1;;;;;57592:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57592:41:0;57584:120;;;;-1:-1:-1;;;57584:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57715:21;:46;;;57777:51;;;;;;;;;;;;;;;;;57495:341;:::o;44277:49::-;;;;:::o;60862:471::-;60975:14;;-1:-1:-1;;;;;60975:14:0;:27;61003:12;:10;:12::i;:::-;60975:41;;;;;;;;;;;;;-1:-1:-1;;;;;60975:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60975:41:0;60953:150;;;;-1:-1:-1;;;60953:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61124:38:0;;61116:102;;;;-1:-1:-1;;;61116:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61231:14;:32;;-1:-1:-1;;;;;;61231:32:0;-1:-1:-1;;;;;61231:32:0;;;;;;;;61279:46;;;;-1:-1:-1;;61279:46:0;60862:471;:::o;44030:45::-;;;-1:-1:-1;;;;;44030:45:0;;:::o;62703:371::-;62786:21;62900:25;;;:8;:25;;;;;;;;62954:20;;62985:17;;;;63013:15;;;;63039:16;;;;;62954:20;;62985:17;;63039:16;;;62703:371::o;55319:1206::-;8086:1;8692:7;;:19;;8684:63;;;;;-1:-1:-1;;;8684:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8684:63:0;;;;;;;;;;;;;;;8086:1;8825:7;:18;55464:14:::1;::::0;-1:-1:-1;;;;;55464:14:0::1;:27;55492:12;:10;:12::i;:::-;55464:41;;;;;;;;;;;;;-1:-1:-1::0;;;;;55464:41:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;55464:41:0;;:94:::1;;-1:-1:-1::0;55509:14:0::1;::::0;-1:-1:-1;;;;;55509:14:0::1;:35;55545:12;:10;:12::i;:::-;55509:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;55509:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;55509:49:0;55464:94:::1;55442:214;;;;-1:-1:-1::0;;;55442:214:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55710:23;55736:25:::0;;;:8:::1;:25;::::0;;;;55816:15:::1;::::0;::::1;::::0;55808:86:::1;;;;-1:-1:-1::0;;;55808:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55963:16;::::0;::::1;::::0;::::1;;55962:17;55954:86;;;;-1:-1:-1::0;;;55954:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56101:29;56133:28:::0;;;:11:::1;:28;::::0;;;;56176:17;;-1:-1:-1;;;;;56176:17:0::1;:31:::0;56172:208:::1;;56245:17:::0;;;56264:14;::::1;::::0;56224:55:::1;::::0;-1:-1:-1;;;;;56245:17:0::1;::::0;56224:20:::1;:55::i;:::-;56340:28;::::0;;;:11:::1;:28;::::0;;;;;;56333:35;;-1:-1:-1;;;;;;56333:35:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;56172:208:::1;56441:25;::::0;;;:8:::1;:25;::::0;;;;;;;56434:32;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;56434:32:0::1;::::0;;56484:33;56450:15;;56484:33:::1;::::0;::::1;-1:-1:-1::0;;8042:1:0;9004:7;:22;-1:-1:-1;55319:1206:0:o;48799:1333::-;8086:1;8692:7;;:19;;8684:63;;;;;-1:-1:-1;;;8684:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8684:63:0;;;;;;;;;;;;;;;8086:1;8825:7;:18;44725:8:::1;::::0;-1:-1:-1;;;44725:8:0;::::1;;;44724:9;44716:50;;;::::0;;-1:-1:-1;;;44716:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;48905:25:::2;:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;48905:23:0::2;;:25::i;:::-;:34;48897:96;;;;-1:-1:-1::0;;;48897:96:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49066:23;49092:25:::0;;;:8:::2;:25;::::0;;;;;;;49205:17;;::::2;::::0;49192:9:::2;:7;:9::i;:::-;:30;;:62;;;;;49239:7;:15;;;49226:9;:7;:9::i;:::-;:28;;49192:62;49170:176;;;;-1:-1:-1::0;;;49170:176:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49359:17;49498:28:::0;;;:11:::2;:28;::::0;;;;49581:15:::2;::::0;49562:14:::2;::::0;::::2;::::0;49379:9:::2;::::0;49359:17;49562:35:::2;::::0;:14;:18:::2;:35::i;:::-;49537:60;;49629:14;49616:9;:27;;49608:98;;;;-1:-1:-1::0;;;49608:98:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49771:17:::0;;-1:-1:-1;;;;;49771:17:0::2;:31:::0;49767:119:::2;;49840:17:::0;;;49859:14;::::2;::::0;49819:55:::2;::::0;-1:-1:-1;;;;;49840:17:0::2;::::0;49819:20:::2;:55::i;:::-;49961:12;:10;:12::i;:::-;49941:32:::0;;-1:-1:-1;;;;;;49941:32:0::2;-1:-1:-1::0;;;;;49941:32:0;;;::::2;;::::0;;-1:-1:-1;49984:14:0;::::2;:26:::0;;;50046:9:::2;:7;:9::i;:::-;50021:22;::::0;::::2;:34:::0;50100:12:::2;:10;:12::i;:::-;-1:-1:-1::0;;;;;50073:51:0::2;50083:15;50073:51;50114:9;50073:51;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;8042:1:0;9004:7;:22;-1:-1:-1;;;48799:1333:0:o;58944:543::-;59063:14;;-1:-1:-1;;;;;59063:14:0;:27;59091:12;:10;:12::i;:::-;59063:41;;;;;;;;;;;;;-1:-1:-1;;;;;59063:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59063:41:0;59041:152;;;;-1:-1:-1;;;59041:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59264:1;59228:25;;;:8;:25;;;;;:33;;;59206:145;;;;-1:-1:-1;;;59206:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59364:25;;;;:8;:25;;;;;;;;;:35;;;:48;;;59428:51;;;;;;;59373:15;;59428:51;;;;;;;;;58944:543;;:::o;61486:310::-;61577:14;;-1:-1:-1;;;;;61577:14:0;:27;61605:12;:10;:12::i;:::-;61577:41;;;;;;;;;;;;;-1:-1:-1;;;;;61577:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61577:41:0;61555:147;;;;-1:-1:-1;;;61555:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61715:11;:26;;;61757:31;;;;;;;;;;;;;;;;;61486:310;:::o;51790:3304::-;8086:1;8692:7;;:19;;8684:63;;;;;-1:-1:-1;;;8684:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;8684:63:0;;;;;;;;;;;;;;;8086:1;8825:7;:18;51893:14:::1;::::0;-1:-1:-1;;;;;51893:14:0::1;:27;51921:12;:10;:12::i;:::-;51893:41;;;;;;;;;;;;;-1:-1:-1::0;;;;;51893:41:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;51893:41:0;;:94:::1;;-1:-1:-1::0;51938:14:0::1;::::0;-1:-1:-1;;;;;51938:14:0::1;:35;51974:12;:10;:12::i;:::-;51938:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;51938:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;51938:49:0;51893:94:::1;51871:214;;;;-1:-1:-1::0;;;51871:214:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52157:23;52183:25:::0;;;:8:::1;:25;::::0;;;;52264:15:::1;::::0;::::1;::::0;52256:86:::1;;;;-1:-1:-1::0;;;52256:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52415:7;:15;;;52403:9;:7;:9::i;:::-;:27;52395:97;;;;-1:-1:-1::0;;;52395:97:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52562:16;::::0;::::1;::::0;::::1;;52561:17;52553:86;;;;-1:-1:-1::0;;;52553:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52723:10;::::0;:53:::1;::::0;;-1:-1:-1;;;52723:53:0;;::::1;::::0;::::1;::::0;;;52770:4:::1;52723:53:::0;;;;;;-1:-1:-1;;;;;52723:10:0;;::::1;::::0;:21:::1;::::0;:53;;;;;::::1;::::0;;;;;;;;;:10;:53;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52723:53:0;52715:118:::1;;;;-1:-1:-1::0;;;52715:118:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52896:29;52928:28:::0;;;:11:::1;:28;::::0;;;;52984:17;;;53033:14;::::1;::::0;53130:20;;-1:-1:-1;;;;;52984:17:0;;::::1;::::0;53116:34;::::1;;53108:98;;;;-1:-1:-1::0;;;53108:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;53264:20:0;::::1;53256:77;;;;-1:-1:-1::0;;;53256:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53377:25;::::0;;;53414:4:::1;53377:25;::::0;;;;;;;:34:::1;::::0;;::::1;:41:::0;;-1:-1:-1;;53377:41:0::1;::::0;::::1;::::0;;53475:11:::1;:28:::0;;;;;;;53468:35;;-1:-1:-1;;;;;;53468:35:0::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;;;53574:10;;:59;;-1:-1:-1;;;53574:59:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;53574:10:0;;::::1;::::0;:30:::1;::::0;:59;;;;;;;;;;;53377:25;53574:10;:59;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;53663:7;:20;;;53650:10;:33;53646:1224;;;53792:20:::0;;53749:25:::1;::::0;53777:36:::1;::::0;:10;;:14:::1;:36::i;:::-;53749:64;;53894:31;53928:44;53967:4;53928:34;53950:11;;53928:17;:21;;:34;;;;:::i;:::-;:38:::0;::::1;:44::i;:::-;54057:20;::::0;:62:::1;::::0;53894:78;;-1:-1:-1;54024:28:0::1;::::0;-1:-1:-1;;;;;54057:20:0;;::::1;::::0;53894:78;;54024:28;54057:62;54024:28;54057:62;53894:78;54057:20;:62:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54023:96;;;54142:23;54134:95;;;;-1:-1:-1::0;;;54134:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54323:10;::::0;:44:::1;::::0;;-1:-1:-1;;;54323:44:0;;::::1;::::0;::::1;::::0;;;;;54290:28:::1;::::0;-1:-1:-1;;;;;54323:10:0::1;::::0;:27:::1;::::0;:44;;;;;::::1;::::0;;;;;;;;:10;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;54323:44:0;-1:-1:-1;;;;;54323:49:0::1;54381:39;:10:::0;54396:23;54381:14:::1;:39::i;:::-;54323:102;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54289:136;;;54448:23;54440:111;;;;-1:-1:-1::0;;;54440:111:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53646:1224;;;;;;;54659:10;::::0;:44:::1;::::0;;-1:-1:-1;;;54659:44:0;;::::1;::::0;::::1;::::0;;;;;54626:28:::1;::::0;-1:-1:-1;;;;;54659:10:0::1;::::0;:27:::1;::::0;:44;;;;;::::1;::::0;;;;;;;;:10;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;54659:44:0;:73:::1;::::0;-1:-1:-1;;;;;54659:49:0;;::::1;::::0;54717:10;;54659:73:::1;::::0;;;54717:10;54659:49;:73:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54625:107;;;54755:23;54747:111;;;;-1:-1:-1::0;;;54747:111:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53646:1224;;54927:10;::::0;54955:35:::1;::::0;;-1:-1:-1;;;54955:35:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;54927:10:0;;::::1;::::0;:27:::1;::::0;:10;;54955:18:::1;::::0;:35;;;;;::::1;::::0;;;;;;;;;54927:10;54955:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;54955:35:0;54927:89:::1;::::0;;-1:-1:-1;;;;;;54927:89:0::1;::::0;;;;;;-1:-1:-1;;;;;54927:89:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;-1:-1:-1;;54927:89:0;;;;;;;-1:-1:-1;54927:89:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;55034:52:0::1;::::0;;;;;;;-1:-1:-1;;;;;55034:52:0;::::1;::::0;-1:-1:-1;55050:15:0;;-1:-1:-1;55034:52:0::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;8042:1:0;9004:7;:22;-1:-1:-1;;;51790:3304:0:o;44651:20::-;;;-1:-1:-1;;;44651:20:0;;;;;:::o;58108:567::-;58233:14;;-1:-1:-1;;;;;58233:14:0;:27;58261:12;:10;:12::i;:::-;58233:41;;;;;;;;;;;;;-1:-1:-1;;;;;58233:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58233:41:0;58211:155;;;;-1:-1:-1;;;58211:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58437:1;58401:25;;;:8;:25;;;;;:33;;;58379:148;;;;-1:-1:-1;;;58379:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58540:25;;;;:8;:25;;;;;;;;;:54;;;58610:57;;;;;;;58549:15;;58610:57;;;;;;;;;58108:567;;:::o;63236:375::-;63320:23;63448:28;;;:11;:28;;;;;;;;63509:17;;;63541:14;;;63570:22;;;;;-1:-1:-1;;;;;63509:17:0;;;63236:375;;;;:::o;59755:882::-;59875:14;;-1:-1:-1;;;;;59875:14:0;:27;59903:12;:10;:12::i;:::-;59875:41;;;;;;;;;;;;;-1:-1:-1;;;;;59875:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59875:41:0;59853:150;;;;-1:-1:-1;;;59853:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60072:1;60036:25;;;:8;:25;;;;;:33;;;60014:143;;;;-1:-1:-1;;;60014:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60190:25;;;;:8;:25;;;;;;;;:35;;:51;-1:-1:-1;60168:175:0;;;;-1:-1:-1;;;60168:175:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60392:9;:7;:9::i;:::-;60376:13;:25;60354:145;;;;-1:-1:-1;;;60354:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60512:25;;;;:8;:25;;;;;;;;;:33;;:49;;;60577:52;;;;;;;60521:15;;60577:52;;;;;;;;;59755:882;;:::o;44524:43::-;;;-1:-1:-1;;;;;44524:43:0;;:::o;47603:851::-;47863:14;;-1:-1:-1;;;;;47863:14:0;:27;47891:12;:10;:12::i;:::-;47863:41;;;;;;;;;;;;;-1:-1:-1;;;;;47863:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47863:41:0;;:94;;-1:-1:-1;47908:14:0;;-1:-1:-1;;;;;47908:14:0;:35;47944:12;:10;:12::i;:::-;47908:49;;;;;;;;;;;;;-1:-1:-1;;;;;47908:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47908:49:0;47863:94;47841:236;;;;-1:-1:-1;;;47841:236:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48112:10;;:53;;;-1:-1:-1;;;48112:53:0;;;;;;;;48159:4;48112:53;;;;;;-1:-1:-1;;;;;48112:10:0;;;;:21;;:53;;;;;;;;;;;;;;;:10;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48112:53:0;48090:202;;;;-1:-1:-1;;;48090:202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61984:499;62101:14;;-1:-1:-1;;;;;62101:14:0;:27;62129:12;:10;:12::i;:::-;62101:41;;;;;;;;;;;;;-1:-1:-1;;;;;62101:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62101:41:0;62079:156;;;;-1:-1:-1;;;62079:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62256:35:0;;62248:105;;;;-1:-1:-1;;;62248:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62366:20;:44;;-1:-1:-1;;;;;62366:44:0;;-1:-1:-1;;;;;;62366:44:0;;;;;;;;62426:49;;;;;;;;;;;;;;;;61984:499;:::o;56611:230::-;56665:14;;-1:-1:-1;;;;;56665:14:0;:27;56693:12;:10;:12::i;:::-;56665:41;;;;;;;;;;;;;-1:-1:-1;;;;;56665:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56665:41:0;56657:107;;;;-1:-1:-1;;;56657:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56787:8;;;;-1:-1:-1;;;56787:8:0;;;;;56786:9;56775:20;;-1:-1:-1;;;;56775:20:0;;;;;;;;;;;56811:22;;;56824:8;;;;;56811:22;;;;;;;;;;;;;;;56611:230::o;658:106::-;746:10;658:106;:::o;1914:181::-;1972:7;2004:5;;;2028:6;;;;2020:46;;;;;-1:-1:-1;;;2020:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2086:1;-1:-1:-1;1914:181:0;;;;;:::o;63714:100::-;63791:15;63714:100;:::o;65469:433::-;65658:58;;65635:18;;-1:-1:-1;;;;;65658:26:0;;;65693:18;;65635;65658:58;65635:18;65658:58;65693:18;65658:26;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65634:82;;;65735:13;65727:97;;;;-1:-1:-1;;;65727:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65840:54;;;;;;;;-1:-1:-1;;;;;65840:54:0;;;;;;;;;;;;;65469:433;;;:::o;64247:959::-;64516:25;;;;:8;:25;;;;;:33;;;:38;64508:96;;;;-1:-1:-1;;;64508:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64720:15;64704:13;:31;64696:111;;;;-1:-1:-1;;;64696:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64842:9;:7;:9::i;:::-;64826:13;:25;64818:102;;;;-1:-1:-1;;;64818:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64991:158;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64991:158:0;;;;;;64963:25;;;64991:158;64963:25;;;;;;;:186;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64963:186:0;;;;;;;;;;;65167:31;;64963:25;;65167:31;;;64247:959;;;;:::o;9807:422::-;10174:20;10213:8;;;9807:422::o;2378:136::-;2436:7;2463:43;2467:1;2470;2463:43;;;;;;;;;;;;;;;;;:3;:43::i;3268:471::-;3326:7;3571:6;3567:47;;-1:-1:-1;3601:1:0;3594:8;;3567:47;3638:5;;;3642:1;3638;:5;:1;3662:5;;;;;:10;3654:56;;;;-1:-1:-1;;;3654:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4215:132;4273:7;4300:39;4304:1;4307;4300:39;;;;;;;;;;;;;;;;;:3;:39::i;2817:192::-;2903:7;2939:12;2931:6;;;;2923:29;;;;-1:-1:-1;;;2923:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2975:5:0;;;2817:192::o;4843:278::-;4929:7;4964:12;4957:5;4949:28;;;;-1:-1:-1;;;4949:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4988:9;5004:1;5000;:5;;;;;;;4843:278;-1:-1:-1;;;;;4843:278:0:o
Swarm Source
ipfs://a63014e7314e81cbdcf071bc9297e522e9c193bf825476ba650504b6655af031
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.