Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 18 from a total of 18 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Add Merchant | 14598824 | 1424 days ago | IN | 0 ETH | 0.00149048 | ||||
| Remove Merchant | 14598822 | 1424 days ago | IN | 0 ETH | 0.00089801 | ||||
| Add Merchant | 14598814 | 1424 days ago | IN | 0 ETH | 0.0023323 | ||||
| Add Merchant | 14541552 | 1432 days ago | IN | 0 ETH | 0.00251161 | ||||
| Add Merchant | 14417558 | 1452 days ago | IN | 0 ETH | 0.0013949 | ||||
| Premint | 14405157 | 1454 days ago | IN | 0 ETH | 0.01093522 | ||||
| Add Merchant | 14357553 | 1461 days ago | IN | 0 ETH | 0.00106472 | ||||
| Add Points | 14309214 | 1469 days ago | IN | 0 ETH | 0.00211795 | ||||
| Add Merchant | 14309204 | 1469 days ago | IN | 0 ETH | 0.00280572 | ||||
| Add Merchant | 14192411 | 1487 days ago | IN | 0 ETH | 0.00288366 | ||||
| Add Merchant | 14182189 | 1488 days ago | IN | 0 ETH | 0.0016811 | ||||
| Set Listing | 14174201 | 1490 days ago | IN | 0 ETH | 0.01039238 | ||||
| Premint | 14167521 | 1491 days ago | IN | 0 ETH | 0.01004947 | ||||
| Premint | 14167514 | 1491 days ago | IN | 0 ETH | 0.01111267 | ||||
| Premint | 14167514 | 1491 days ago | IN | 0 ETH | 0.01111267 | ||||
| Premint | 14167485 | 1491 days ago | IN | 0 ETH | 0.01393176 | ||||
| Set Base URI | 14167479 | 1491 days ago | IN | 0 ETH | 0.00708532 | ||||
| Set Preview Imag... | 14167479 | 1491 days ago | IN | 0 ETH | 0.00708363 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
AshCC
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @author: manifold.xyz
import "@manifoldxyz/libraries-solidity/contracts/access/AdminControl.sol";
import "./core/IERC721CreatorCore.sol";
import "./extensions/ICreatorExtensionTokenURI.sol";
import "./ILazyDelivery.sol";
import "./ILazyDeliveryMetadata.sol";
import "./IAshCC.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "@ensdomains/ens-contracts/contracts/resolvers/DefaultReverseResolver.sol";
/**
* The collector card, for ASH
*/
contract AshCC is AdminControl, ICreatorExtensionTokenURI, ILazyDelivery, ILazyDeliveryMetadata, IAshCC {
using Strings for uint256;
using Strings for uint16;
address public _creator;
string private _baseURI;
mapping(uint => uint) public cardPoints;
address private _marketplace;
uint private _listingId;
string private _previewImage;
DefaultReverseResolver resolver = DefaultReverseResolver(0xA2C122BE93b0074270ebeE7f6b7292C7deB45047);
ReverseRegistrar reverseReg = ReverseRegistrar(0x084b1c3C81545d370f3634392De611CaaBFf8148);
mapping(address => uint) merchantDiscounts;
constructor(address creator) {
_creator = creator;
}
/**
Used for transferring points from one card to another
Say you buy card on secondary and want to consolidate points
*/
function transferPoints(uint cardFrom, uint cardTo, uint numPoints) public override {
require(IERC721(_creator).ownerOf(cardFrom) == msg.sender, "Can only transfer points from own card.");
require(cardPoints[cardFrom] >= numPoints, "Not enough points to transfer");
cardPoints[cardFrom] = cardPoints[cardFrom] - numPoints;
cardPoints[cardTo] = cardPoints[cardTo] + numPoints;
}
/**
Add a merchant to the ecosystem. Merchants are allowed to add points
*/
function addMerchant(address merchant, uint discountPercent) public override adminRequired {
require(merchantDiscounts[merchant] == 0, "Cannot add merchant again.");
merchantDiscounts[merchant] = discountPercent;
}
/**
Update existing merchant
*/
function updateMerchant(address merchant, uint discountPercent) public override adminRequired {
require(merchantDiscounts[merchant] != 0, "Cannot update non-existent merchant.");
merchantDiscounts[merchant] = discountPercent;
}
function removeMerchant(address merchant) public override adminRequired {
require(merchantDiscounts[merchant] != 0, "Cannot remove non-existent merchant.");
merchantDiscounts[merchant] = 0;
}
function addPoints(uint tokenId, uint numPoints) public override {
require(merchantDiscounts[msg.sender] != 0, "Only approved merchant can add points.");
cardPoints[tokenId] += numPoints;
}
function getDiscount(address merchant) public view override returns (uint) {
return merchantDiscounts[merchant];
}
function getPoints(uint tokenId) public view override returns (uint) {
return cardPoints[tokenId];
}
function supportsInterface(bytes4 interfaceId) public view virtual override(AdminControl, IERC165) returns (bool) {
return interfaceId == type(ICreatorExtensionTokenURI).interfaceId || interfaceId == type(IAshCC).interfaceId || interfaceId == type(ILazyDelivery).interfaceId || AdminControl.supportsInterface(interfaceId) || super.supportsInterface(interfaceId);
}
function premint(address to, uint num, uint points) public adminRequired {
for (uint256 i = 0; i < num; i++) {
uint card = IERC721CreatorCore(_creator).mintExtension(to);
cardPoints[card] = points;
}
}
function setListing(uint listingId, address marketplace) public adminRequired {
_listingId = listingId;
_marketplace = marketplace;
}
function deliver(address, uint256 listingId, uint256 assetId, address to, uint256, uint256 index) external override returns(uint256) {
require(msg.sender == _marketplace &&
listingId == _listingId &&
assetId == 1 && index == 0,
"Invalid call data");
return IERC721CreatorCore(_creator).mintExtension(to);
}
function setBaseURI(string memory baseURI) public adminRequired {
_baseURI = baseURI;
}
function getAnimationURL(uint assetId) private view returns (string memory) {
string memory name = resolver.name(reverseReg.node(
IERC721(_creator).ownerOf(assetId)
));
return string(abi.encodePacked(_baseURI, "?id=", assetId.toString(), "&name=", name, "&points=", cardPoints[assetId].toString()));
}
function setPreviewImageForAll(string memory previewImage) public adminRequired {
_previewImage = previewImage;
}
function assetURI(uint256 assetId) external view override returns(string memory) {
return string(abi.encodePacked('data:application/json;utf8,',
'{"name":"ASH Collector Card #',
assetId.toString(),
'","created_by":"yung wknd","description":"Reward the bold.","animation":"',
getAnimationURL(assetId),
'","animation_url":"',
getAnimationURL(assetId),
'","image":"',
_previewImage,
'","image_url":"',
_previewImage,
'","attributes":[{"trait_type":"Points","value":"',
cardPoints[assetId].toString(),
'"}]}'));
}
function tokenURI(address creator, uint256 tokenId) external view override returns (string memory) {
require(creator == _creator, "Invalid token");
return this.assetURI(tokenId);
}
}pragma solidity >=0.8.4;
import "../registry/ENS.sol";
import "../registry/ReverseRegistrar.sol";
/**
* @dev Provides a default implementation of a resolver for reverse records,
* which permits only the owner to update it.
*/
contract DefaultReverseResolver {
// namehash('addr.reverse')
bytes32 constant ADDR_REVERSE_NODE = 0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2;
ENS public ens;
mapping (bytes32 => string) public name;
/**
* @dev Only permits calls by the reverse registrar.
* @param node The node permission is required for.
*/
modifier onlyOwner(bytes32 node) {
require(msg.sender == ens.owner(node));
_;
}
/**
* @dev Constructor
* @param ensAddr The address of the ENS registry.
*/
constructor(ENS ensAddr) {
ens = ensAddr;
// Assign ownership of the reverse record to our deployer
ReverseRegistrar registrar = ReverseRegistrar(ens.owner(ADDR_REVERSE_NODE));
if (address(registrar) != address(0x0)) {
registrar.claim(msg.sender);
}
}
/**
* @dev Sets the name for a node.
* @param node The node to update.
* @param _name The name to set.
*/
function setName(bytes32 node, string memory _name) public onlyOwner(node) {
name[node] = _name;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/structs/EnumerableSet.sol)
pragma solidity ^0.8.0;
/**
* @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.3.0, sets of type `bytes32` (`Bytes32Set`), `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;
if (lastIndex != toDeleteIndex) {
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] = valueIndex; // Replace lastvalue's index to valueIndex
}
// 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) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
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(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, 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(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set 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(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
return _values(set._inner);
}
// 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(uint160(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(uint160(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(uint160(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(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
// 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));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @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;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @author: manifold.xyz
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
interface IAshCC is IERC165 {
function transferPoints(uint cardFrom, uint cardTo, uint numPoints) external;
function addMerchant(address merchant, uint discountPercent) external;
function updateMerchant(address merchant, uint discountPercent) external;
function removeMerchant(address merchant) external;
function addPoints(uint tokenId, uint numPoints) external;
function getDiscount(address merchant) external view returns (uint);
function getPoints(uint tokenId) external returns (uint);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @author: manifold.xyz
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
/**
* Metadata for lazy delivery tokens
*/
interface ILazyDeliveryMetadata is IERC165 {
function assetURI(uint256 assetId) external view returns(string memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @author: manifold.xyz
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
interface ILazyDelivery is IERC165 {
function deliver(address caller, uint256 listingId, uint256 assetId, address to, uint256 payableAmount, uint256 index) external returns(uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @author: manifold.xyz
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
/**
* @dev Implement this if you want your extension to have overloadable URI's
*/
interface ICreatorExtensionTokenURI is IERC165 {
/**
* Get the uri for a given creator/tokenId
*/
function tokenURI(address creator, uint256 tokenId) external view returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @author: manifold.xyz
import "./ICreatorCore.sol";
/**
* @dev Core ERC721 creator interface
*/
interface IERC721CreatorCore is ICreatorCore {
/**
* @dev mint a token with no extension. Can only be called by an admin.
* Returns tokenId minted
*/
function mintBase(address to) external returns (uint256);
/**
* @dev mint a token with no extension. Can only be called by an admin.
* Returns tokenId minted
*/
function mintBase(address to, string calldata uri) external returns (uint256);
/**
* @dev batch mint a token with no extension. Can only be called by an admin.
* Returns tokenId minted
*/
function mintBaseBatch(address to, uint16 count) external returns (uint256[] memory);
/**
* @dev batch mint a token with no extension. Can only be called by an admin.
* Returns tokenId minted
*/
function mintBaseBatch(address to, string[] calldata uris) external returns (uint256[] memory);
/**
* @dev mint a token. Can only be called by a registered extension.
* Returns tokenId minted
*/
function mintExtension(address to) external returns (uint256);
/**
* @dev mint a token. Can only be called by a registered extension.
* Returns tokenId minted
*/
function mintExtension(address to, string calldata uri) external returns (uint256);
/**
* @dev batch mint a token. Can only be called by a registered extension.
* Returns tokenIds minted
*/
function mintExtensionBatch(address to, uint16 count) external returns (uint256[] memory);
/**
* @dev batch mint a token. Can only be called by a registered extension.
* Returns tokenId minted
*/
function mintExtensionBatch(address to, string[] calldata uris) external returns (uint256[] memory);
/**
* @dev burn a token. Can only be called by token owner or approved address.
* On burn, calls back to the registered extension's onBurn method
*/
function burn(uint256 tokenId) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @author: manifold.xyz
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./IAdminControl.sol";
abstract contract AdminControl is Ownable, IAdminControl, ERC165 {
using EnumerableSet for EnumerableSet.AddressSet;
// Track registered admins
EnumerableSet.AddressSet private _admins;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return interfaceId == type(IAdminControl).interfaceId
|| super.supportsInterface(interfaceId);
}
/**
* @dev Only allows approved admins to call the specified function
*/
modifier adminRequired() {
require(owner() == msg.sender || _admins.contains(msg.sender), "AdminControl: Must be owner or admin");
_;
}
/**
* @dev See {IAdminControl-getAdmins}.
*/
function getAdmins() external view override returns (address[] memory admins) {
admins = new address[](_admins.length());
for (uint i = 0; i < _admins.length(); i++) {
admins[i] = _admins.at(i);
}
return admins;
}
/**
* @dev See {IAdminControl-approveAdmin}.
*/
function approveAdmin(address admin) external override onlyOwner {
if (!_admins.contains(admin)) {
emit AdminApproved(admin, msg.sender);
_admins.add(admin);
}
}
/**
* @dev See {IAdminControl-revokeAdmin}.
*/
function revokeAdmin(address admin) external override onlyOwner {
if (_admins.contains(admin)) {
emit AdminRevoked(admin, msg.sender);
_admins.remove(admin);
}
}
/**
* @dev See {IAdminControl-isAdmin}.
*/
function isAdmin(address admin) public override view returns (bool) {
return (owner() == admin || _admins.contains(admin));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @author: manifold.xyz
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
/**
* @dev Core creator interface
*/
interface ICreatorCore is IERC165 {
event ExtensionRegistered(address indexed extension, address indexed sender);
event ExtensionUnregistered(address indexed extension, address indexed sender);
event ExtensionBlacklisted(address indexed extension, address indexed sender);
event MintPermissionsUpdated(address indexed extension, address indexed permissions, address indexed sender);
event RoyaltiesUpdated(uint256 indexed tokenId, address payable[] receivers, uint256[] basisPoints);
event DefaultRoyaltiesUpdated(address payable[] receivers, uint256[] basisPoints);
event ExtensionRoyaltiesUpdated(address indexed extension, address payable[] receivers, uint256[] basisPoints);
event ExtensionApproveTransferUpdated(address indexed extension, bool enabled);
/**
* @dev gets address of all extensions
*/
function getExtensions() external view returns (address[] memory);
/**
* @dev add an extension. Can only be called by contract owner or admin.
* extension address must point to a contract implementing ICreatorExtension.
* Returns True if newly added, False if already added.
*/
function registerExtension(address extension, string calldata baseURI) external;
/**
* @dev add an extension. Can only be called by contract owner or admin.
* extension address must point to a contract implementing ICreatorExtension.
* Returns True if newly added, False if already added.
*/
function registerExtension(address extension, string calldata baseURI, bool baseURIIdentical) external;
/**
* @dev add an extension. Can only be called by contract owner or admin.
* Returns True if removed, False if already removed.
*/
function unregisterExtension(address extension) external;
/**
* @dev blacklist an extension. Can only be called by contract owner or admin.
* This function will destroy all ability to reference the metadata of any tokens created
* by the specified extension. It will also unregister the extension if needed.
* Returns True if removed, False if already removed.
*/
function blacklistExtension(address extension) external;
/**
* @dev set the baseTokenURI of an extension. Can only be called by extension.
*/
function setBaseTokenURIExtension(string calldata uri) external;
/**
* @dev set the baseTokenURI of an extension. Can only be called by extension.
* For tokens with no uri configured, tokenURI will return "uri+tokenId"
*/
function setBaseTokenURIExtension(string calldata uri, bool identical) external;
/**
* @dev set the common prefix of an extension. Can only be called by extension.
* If configured, and a token has a uri set, tokenURI will return "prefixURI+tokenURI"
* Useful if you want to use ipfs/arweave
*/
function setTokenURIPrefixExtension(string calldata prefix) external;
/**
* @dev set the tokenURI of a token extension. Can only be called by extension that minted token.
*/
function setTokenURIExtension(uint256 tokenId, string calldata uri) external;
/**
* @dev set the tokenURI of a token extension for multiple tokens. Can only be called by extension that minted token.
*/
function setTokenURIExtension(uint256[] memory tokenId, string[] calldata uri) external;
/**
* @dev set the baseTokenURI for tokens with no extension. Can only be called by owner/admin.
* For tokens with no uri configured, tokenURI will return "uri+tokenId"
*/
function setBaseTokenURI(string calldata uri) external;
/**
* @dev set the common prefix for tokens with no extension. Can only be called by owner/admin.
* If configured, and a token has a uri set, tokenURI will return "prefixURI+tokenURI"
* Useful if you want to use ipfs/arweave
*/
function setTokenURIPrefix(string calldata prefix) external;
/**
* @dev set the tokenURI of a token with no extension. Can only be called by owner/admin.
*/
function setTokenURI(uint256 tokenId, string calldata uri) external;
/**
* @dev set the tokenURI of multiple tokens with no extension. Can only be called by owner/admin.
*/
function setTokenURI(uint256[] memory tokenIds, string[] calldata uris) external;
/**
* @dev set a permissions contract for an extension. Used to control minting.
*/
function setMintPermissions(address extension, address permissions) external;
/**
* @dev Configure so transfers of tokens created by the caller (must be extension) gets approval
* from the extension before transferring
*/
function setApproveTransferExtension(bool enabled) external;
/**
* @dev get the extension of a given token
*/
function tokenExtension(uint256 tokenId) external view returns (address);
/**
* @dev Set default royalties
*/
function setRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints) external;
/**
* @dev Set royalties of a token
*/
function setRoyalties(uint256 tokenId, address payable[] calldata receivers, uint256[] calldata basisPoints) external;
/**
* @dev Set royalties of an extension
*/
function setRoyaltiesExtension(address extension, address payable[] calldata receivers, uint256[] calldata basisPoints) external;
/**
* @dev Get royalites of a token. Returns list of receivers and basisPoints
*/
function getRoyalties(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory);
// Royalty support for various other standards
function getFeeRecipients(uint256 tokenId) external view returns (address payable[] memory);
function getFeeBps(uint256 tokenId) external view returns (uint[] memory);
function getFees(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory);
function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address, uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @author: manifold.xyz
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
/**
* @dev Interface for admin control
*/
interface IAdminControl is IERC165 {
event AdminApproved(address indexed account, address indexed sender);
event AdminRevoked(address indexed account, address indexed sender);
/**
* @dev gets address of all admins
*/
function getAdmins() external view returns (address[] memory);
/**
* @dev add an admin. Can only be called by contract owner.
*/
function approveAdmin(address admin) external;
/**
* @dev remove an admin. Can only be called by contract owner.
*/
function revokeAdmin(address admin) external;
/**
* @dev checks whether or not given address is an admin
* Returns True if they are
*/
function isAdmin(address admin) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}pragma solidity >=0.8.4;
import "./ENS.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "../root/Controllable.sol";
abstract contract NameResolver {
function setName(bytes32 node, string memory name) public virtual;
}
bytes32 constant lookup = 0x3031323334353637383961626364656600000000000000000000000000000000;
bytes32 constant ADDR_REVERSE_NODE = 0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2;
// namehash('addr.reverse')
contract ReverseRegistrar is Ownable, Controllable {
ENS public ens;
NameResolver public defaultResolver;
event ReverseClaimed(address indexed addr, bytes32 indexed node);
/**
* @dev Constructor
* @param ensAddr The address of the ENS registry.
* @param resolverAddr The address of the default reverse resolver.
*/
constructor(ENS ensAddr, NameResolver resolverAddr) {
ens = ensAddr;
defaultResolver = resolverAddr;
// Assign ownership of the reverse record to our deployer
ReverseRegistrar oldRegistrar = ReverseRegistrar(
ens.owner(ADDR_REVERSE_NODE)
);
if (address(oldRegistrar) != address(0x0)) {
oldRegistrar.claim(msg.sender);
}
}
modifier authorised(address addr) {
require(
addr == msg.sender ||
controllers[msg.sender] ||
ens.isApprovedForAll(addr, msg.sender) ||
ownsContract(addr),
"Caller is not a controller or authorised by address or the address itself"
);
_;
}
/**
* @dev Transfers ownership of the reverse ENS record associated with the
* calling account.
* @param owner The address to set as the owner of the reverse record in ENS.
* @return The ENS node hash of the reverse record.
*/
function claim(address owner) public returns (bytes32) {
return _claimWithResolver(msg.sender, owner, address(0x0));
}
/**
* @dev Transfers ownership of the reverse ENS record associated with the
* calling account.
* @param addr The reverse record to set
* @param owner The address to set as the owner of the reverse record in ENS.
* @return The ENS node hash of the reverse record.
*/
function claimForAddr(address addr, address owner)
public
authorised(addr)
returns (bytes32)
{
return _claimWithResolver(addr, owner, address(0x0));
}
/**
* @dev Transfers ownership of the reverse ENS record associated with the
* calling account.
* @param owner The address to set as the owner of the reverse record in ENS.
* @param resolver The address of the resolver to set; 0 to leave unchanged.
* @return The ENS node hash of the reverse record.
*/
function claimWithResolver(address owner, address resolver)
public
returns (bytes32)
{
return _claimWithResolver(msg.sender, owner, resolver);
}
/**
* @dev Transfers ownership of the reverse ENS record specified with the
* address provided
* @param addr The reverse record to set
* @param owner The address to set as the owner of the reverse record in ENS.
* @param resolver The address of the resolver to set; 0 to leave unchanged.
* @return The ENS node hash of the reverse record.
*/
function claimWithResolverForAddr(
address addr,
address owner,
address resolver
) public authorised(addr) returns (bytes32) {
return _claimWithResolver(addr, owner, resolver);
}
/**
* @dev Sets the `name()` record for the reverse ENS record associated with
* the calling account. First updates the resolver to the default reverse
* resolver if necessary.
* @param name The name to set for this address.
* @return The ENS node hash of the reverse record.
*/
function setName(string memory name) public returns (bytes32) {
bytes32 node = _claimWithResolver(
msg.sender,
address(this),
address(defaultResolver)
);
defaultResolver.setName(node, name);
return node;
}
/**
* @dev Sets the `name()` record for the reverse ENS record associated with
* the account provided. First updates the resolver to the default reverse
* resolver if necessary.
* Only callable by controllers and authorised users
* @param addr The reverse record to set
* @param owner The owner of the reverse node
* @param name The name to set for this address.
* @return The ENS node hash of the reverse record.
*/
function setNameForAddr(
address addr,
address owner,
string memory name
) public authorised(addr) returns (bytes32) {
bytes32 node = _claimWithResolver(
addr,
address(this),
address(defaultResolver)
);
defaultResolver.setName(node, name);
ens.setSubnodeOwner(ADDR_REVERSE_NODE, sha3HexAddress(addr), owner);
return node;
}
/**
* @dev Returns the node hash for a given account's reverse records.
* @param addr The address to hash
* @return The ENS node hash.
*/
function node(address addr) public pure returns (bytes32) {
return
keccak256(
abi.encodePacked(ADDR_REVERSE_NODE, sha3HexAddress(addr))
);
}
/**
* @dev An optimised function to compute the sha3 of the lower-case
* hexadecimal representation of an Ethereum address.
* @param addr The address to hash
* @return ret The SHA3 hash of the lower-case hexadecimal encoding of the
* input address.
*/
function sha3HexAddress(address addr) private pure returns (bytes32 ret) {
assembly {
for {
let i := 40
} gt(i, 0) {
} {
i := sub(i, 1)
mstore8(i, byte(and(addr, 0xf), lookup))
addr := div(addr, 0x10)
i := sub(i, 1)
mstore8(i, byte(and(addr, 0xf), lookup))
addr := div(addr, 0x10)
}
ret := keccak256(0, 40)
}
}
/* Internal functions */
function _claimWithResolver(
address addr,
address owner,
address resolver
) internal returns (bytes32) {
bytes32 label = sha3HexAddress(addr);
bytes32 node = keccak256(abi.encodePacked(ADDR_REVERSE_NODE, label));
address currentResolver = ens.resolver(node);
bool shouldUpdateResolver = (resolver != address(0x0) &&
resolver != currentResolver);
address newResolver = shouldUpdateResolver ? resolver : currentResolver;
ens.setSubnodeRecord(ADDR_REVERSE_NODE, label, owner, newResolver, 0);
emit ReverseClaimed(addr, node);
return node;
}
function ownsContract(address addr) internal view returns (bool) {
try Ownable(addr).owner() returns (address owner) {
return owner == msg.sender;
} catch {
return false;
}
}
}pragma solidity >=0.8.4;
interface ENS {
// Logged when the owner of a node assigns a new owner to a subnode.
event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);
// Logged when the owner of a node transfers ownership to a new account.
event Transfer(bytes32 indexed node, address owner);
// Logged when the resolver for a node changes.
event NewResolver(bytes32 indexed node, address resolver);
// Logged when the TTL of a node changes
event NewTTL(bytes32 indexed node, uint64 ttl);
// Logged when an operator is added or removed.
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function setRecord(bytes32 node, address owner, address resolver, uint64 ttl) external virtual;
function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external virtual;
function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external virtual returns(bytes32);
function setResolver(bytes32 node, address resolver) external virtual;
function setOwner(bytes32 node, address owner) external virtual;
function setTTL(bytes32 node, uint64 ttl) external virtual;
function setApprovalForAll(address operator, bool approved) external virtual;
function owner(bytes32 node) external virtual view returns (address);
function resolver(bytes32 node) external virtual view returns (address);
function ttl(bytes32 node) external virtual view returns (uint64);
function recordExists(bytes32 node) external virtual view returns (bool);
function isApprovedForAll(address owner, address operator) external virtual view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with 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) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}pragma solidity ^0.8.4;
import "@openzeppelin/contracts/access/Ownable.sol";
contract Controllable is Ownable {
mapping(address => bool) public controllers;
event ControllerChanged(address indexed controller, bool enabled);
modifier onlyController {
require(
controllers[msg.sender],
"Controllable: Caller is not a controller"
);
_;
}
function setController(address controller, bool enabled) public onlyOwner {
controllers[controller] = enabled;
emit ControllerChanged(controller, enabled);
}
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"creator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"_creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"merchant","type":"address"},{"internalType":"uint256","name":"discountPercent","type":"uint256"}],"name":"addMerchant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numPoints","type":"uint256"}],"name":"addPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"approveAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetId","type":"uint256"}],"name":"assetURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cardPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"listingId","type":"uint256"},{"internalType":"uint256","name":"assetId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"deliver","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"admins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"merchant","type":"address"}],"name":"getDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"}],"name":"premint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"merchant","type":"address"}],"name":"removeMerchant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"listingId","type":"uint256"},{"internalType":"address","name":"marketplace","type":"address"}],"name":"setListing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"previewImage","type":"string"}],"name":"setPreviewImageForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cardFrom","type":"uint256"},{"internalType":"uint256","name":"cardTo","type":"uint256"},{"internalType":"uint256","name":"numPoints","type":"uint256"}],"name":"transferPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"merchant","type":"address"},{"internalType":"uint256","name":"discountPercent","type":"uint256"}],"name":"updateMerchant","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405273a2c122be93b0074270ebee7f6b7292c7deb45047600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073084b1c3c81545d370f3634392de611caabff8148600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000bb57600080fd5b5060405162003acf38038062003acf8339818101604052810190620000e191906200022c565b62000101620000f56200014960201b60201c565b6200015160201b60201c565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620002b1565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050620002268162000297565b92915050565b60006020828403121562000245576200024462000292565b5b6000620002558482850162000215565b91505092915050565b60006200026b8262000272565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600080fd5b620002a2816200025e565b8114620002ae57600080fd5b50565b61380e80620002c16000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806379626b5a116100c3578063d9f9ae3e1161007c578063d9f9ae3e146103c1578063e9dc6375146103dd578063f1c689821461040d578063f2fde38b1461043d578063f7bb5c8814610459578063fe4651a01461047557610158565b806379626b5a146102ed5780638da5cb5b14610309578063a967eee414610327578063bc8bde6414610357578063c83afbd014610375578063d4a01b02146103a557610158565b8063516dd48711610115578063516dd4871461024357806355f804b31461025f57806362fd77741461027b5780636d73e66914610297578063715018a6146102b3578063735d6a52146102bd57610158565b806301ffc9a71461015d57806306f2791a1461018d578063133adab6146101bd57806324d7806c146101d95780632d3456701461020957806331ae450b14610225575b600080fd5b61017760048036038101906101729190612487565b610491565b6040516101849190612c6b565b60405180910390f35b6101a760048036038101906101a291906122e0565b6105eb565b6040516101b49190612e23565b60405180910390f35b6101d760048036038101906101d291906122e0565b610634565b005b6101f360048036038101906101ee91906122e0565b61078f565b6040516102009190612c6b565b60405180910390f35b610223600480360381019061021e91906122e0565b6107e9565b005b61022d6108f1565b60405161023a9190612c49565b60405180910390f35b61025d600480360381019061025891906124b4565b6109d3565b005b610279600480360381019061027491906124b4565b610a7d565b005b610295600480360381019061029091906125a0565b610b27565b005b6102b160048036038101906102ac91906122e0565b610c03565b005b6102bb610d0a565b005b6102d760048036038101906102d29190612546565b610d92565b6040516102e49190612e23565b60405180910390f35b6103076004803603810190610302919061233a565b610daa565b005b610311610f04565b60405161031e9190612c2e565b60405180910390f35b610341600480360381019061033c9190612546565b610f2d565b60405161034e9190612e23565b60405180910390f35b61035f610f4a565b60405161036c9190612c2e565b60405180910390f35b61038f600480360381019061038a91906123cd565b610f70565b60405161039c9190612e23565b60405180910390f35b6103bf60048036038101906103ba9190612620565b6110e0565b005b6103db60048036038101906103d6919061233a565b6112bf565b005b6103f760048036038101906103f2919061233a565b61141a565b6040516104049190612ca1565b60405180910390f35b61042760048036038101906104229190612546565b611542565b6040516104349190612ca1565b60405180910390f35b610457600480360381019061045291906122e0565b6115a9565b005b610473600480360381019061046e919061237a565b6116a1565b005b61048f600480360381019061048a91906125e0565b61181f565b005b60007fe9dc6375000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061055c57507f36d2c28e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105c457507fc83afbd0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105d457506105d3826118d0565b5b806105e457506105e3826118d0565b5b9050919050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b3373ffffffffffffffffffffffffffffffffffffffff16610653610f04565b73ffffffffffffffffffffffffffffffffffffffff161480610685575061068433600161194a90919063ffffffff16565b5b6106c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bb90612dc3565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415610747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073e90612d03565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b60008173ffffffffffffffffffffffffffffffffffffffff166107b0610f04565b73ffffffffffffffffffffffffffffffffffffffff1614806107e257506107e182600161194a90919063ffffffff16565b5b9050919050565b6107f161197a565b73ffffffffffffffffffffffffffffffffffffffff1661080f610f04565b73ffffffffffffffffffffffffffffffffffffffff1614610865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085c90612da3565b60405180910390fd5b61087981600161194a90919063ffffffff16565b156108ee573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d560405160405180910390a36108ec81600161198290919063ffffffff16565b505b50565b60606108fd60016119b2565b67ffffffffffffffff8111156109165761091561324c565b5b6040519080825280602002602001820160405280156109445781602001602082028036833780820191505090505b50905060005b61095460016119b2565b8110156109cf5761096f8160016119c790919063ffffffff16565b8282815181106109825761098161321d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806109c7906130e7565b91505061094a565b5090565b3373ffffffffffffffffffffffffffffffffffffffff166109f2610f04565b73ffffffffffffffffffffffffffffffffffffffff161480610a245750610a2333600161194a90919063ffffffff16565b5b610a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5a90612dc3565b60405180910390fd5b8060089080519060200190610a799291906120df565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16610a9c610f04565b73ffffffffffffffffffffffffffffffffffffffff161480610ace5750610acd33600161194a90919063ffffffff16565b5b610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0490612dc3565b60405180910390fd5b8060049080519060200190610b239291906120df565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16610b46610f04565b73ffffffffffffffffffffffffffffffffffffffff161480610b785750610b7733600161194a90919063ffffffff16565b5b610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae90612dc3565b60405180910390fd5b8160078190555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b610c0b61197a565b73ffffffffffffffffffffffffffffffffffffffff16610c29610f04565b73ffffffffffffffffffffffffffffffffffffffff1614610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7690612da3565b60405180910390fd5b610c9381600161194a90919063ffffffff16565b610d07573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb160405160405180910390a3610d058160016119e190919063ffffffff16565b505b50565b610d1261197a565b73ffffffffffffffffffffffffffffffffffffffff16610d30610f04565b73ffffffffffffffffffffffffffffffffffffffff1614610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d90612da3565b60405180910390fd5b610d906000611a11565b565b60056020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff16610dc9610f04565b73ffffffffffffffffffffffffffffffffffffffff161480610dfb5750610dfa33600161194a90919063ffffffff16565b5b610e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3190612dc3565b60405180910390fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb390612d43565b60405180910390fd5b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600060056000838152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148015610fd0575060075486145b8015610fdc5750600185145b8015610fe85750600082145b611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e90612ce3565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632928ca58856040518263ffffffff1660e01b81526004016110829190612c2e565b602060405180830381600087803b15801561109c57600080fd5b505af11580156110b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d49190612573565b90509695505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016111529190612e23565b60206040518083038186803b15801561116a57600080fd5b505afa15801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a2919061230d565b73ffffffffffffffffffffffffffffffffffffffff16146111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90612de3565b60405180910390fd5b806005600085815260200190815260200160002054101561124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124590612d83565b60405180910390fd5b80600560008581526020019081526020016000205461126d9190612f90565b60056000858152602001908152602001600020819055508060056000848152602001908152602001600020546112a39190612f09565b6005600084815260200190815260200160002081905550505050565b3373ffffffffffffffffffffffffffffffffffffffff166112de610f04565b73ffffffffffffffffffffffffffffffffffffffff161480611310575061130f33600161194a90919063ffffffff16565b5b61134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690612dc3565b60405180910390fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990612e03565b60405180910390fd5b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6060600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146114ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a390612d23565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663f1c68982836040518263ffffffff1660e01b81526004016114e59190612e23565b60006040518083038186803b1580156114fd57600080fd5b505afa158015611511573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061153a91906124fd565b905092915050565b606061154d82611ad5565b61155683611c36565b61155f84611c36565b60088061157e6005600089815260200190815260200160002054611ad5565b60405160200161159396959493929190612b7e565b6040516020818303038152906040529050919050565b6115b161197a565b73ffffffffffffffffffffffffffffffffffffffff166115cf610f04565b73ffffffffffffffffffffffffffffffffffffffff1614611625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161c90612da3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168c90612cc3565b60405180910390fd5b61169e81611a11565b50565b3373ffffffffffffffffffffffffffffffffffffffff166116c0610f04565b73ffffffffffffffffffffffffffffffffffffffff1614806116f257506116f133600161194a90919063ffffffff16565b5b611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890612dc3565b60405180910390fd5b60005b82811015611819576000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632928ca58866040518263ffffffff1660e01b81526004016117999190612c2e565b602060405180830381600087803b1580156117b357600080fd5b505af11580156117c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117eb9190612573565b9050826005600083815260200190815260200160002081905550508080611811906130e7565b915050611734565b50505050565b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156118a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189990612d63565b60405180910390fd5b806005600084815260200190815260200160002060008282546118c59190612f09565b925050819055505050565b60007f553e757e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611943575061194282611e92565b5b9050919050565b6000611972836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611efc565b905092915050565b600033905090565b60006119aa836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611f1f565b905092915050565b60006119c082600001612033565b9050919050565b60006119d68360000183612044565b60001c905092915050565b6000611a09836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61206f565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000821415611b1d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c31565b600082905060005b60008214611b4f578080611b38906130e7565b915050600a82611b489190612f5f565b9150611b25565b60008167ffffffffffffffff811115611b6b57611b6a61324c565b5b6040519080825280601f01601f191660200182016040528015611b9d5781602001600182028036833780820191505090505b5090505b60008514611c2a57600182611bb69190612f90565b9150600a85611bc59190613130565b6030611bd19190612f09565b60f81b818381518110611be757611be661321d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611c239190612f5f565b9450611ba1565b8093505050505b919050565b60606000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663691f3431600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bffbe61c600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e886040518263ffffffff1660e01b8152600401611d119190612e23565b60206040518083038186803b158015611d2957600080fd5b505afa158015611d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d61919061230d565b6040518263ffffffff1660e01b8152600401611d7d9190612c2e565b60206040518083038186803b158015611d9557600080fd5b505afa158015611da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcd919061245a565b6040518263ffffffff1660e01b8152600401611de99190612c86565b60006040518083038186803b158015611e0157600080fd5b505afa158015611e15573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611e3e91906124fd565b90506004611e4b84611ad5565b82611e686005600088815260200190815260200160002054611ad5565b604051602001611e7b9493929190612b1f565b604051602081830303815290604052915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114612027576000600182611f519190612f90565b9050600060018660000180549050611f699190612f90565b9050818114611fd8576000866000018281548110611f8a57611f8961321d565b5b9060005260206000200154905080876000018481548110611fae57611fad61321d565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611fec57611feb6131ee565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061202d565b60009150505b92915050565b600081600001805490509050919050565b600082600001828154811061205c5761205b61321d565b5b9060005260206000200154905092915050565b600061207b8383611efc565b6120d45782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506120d9565b600090505b92915050565b8280546120eb90613084565b90600052602060002090601f01602090048101928261210d5760008555612154565b82601f1061212657805160ff1916838001178555612154565b82800160010185558215612154579182015b82811115612153578251825591602001919060010190612138565b5b5090506121619190612165565b5090565b5b8082111561217e576000816000905550600101612166565b5090565b600061219561219084612e63565b612e3e565b9050828152602081018484840111156121b1576121b0613280565b5b6121bc848285613042565b509392505050565b60006121d76121d284612e63565b612e3e565b9050828152602081018484840111156121f3576121f2613280565b5b6121fe848285613051565b509392505050565b6000813590506122158161377c565b92915050565b60008151905061222a8161377c565b92915050565b60008151905061223f81613793565b92915050565b600081359050612254816137aa565b92915050565b600082601f83011261226f5761226e61327b565b5b813561227f848260208601612182565b91505092915050565b600082601f83011261229d5761229c61327b565b5b81516122ad8482602086016121c4565b91505092915050565b6000813590506122c5816137c1565b92915050565b6000815190506122da816137c1565b92915050565b6000602082840312156122f6576122f561328a565b5b600061230484828501612206565b91505092915050565b6000602082840312156123235761232261328a565b5b60006123318482850161221b565b91505092915050565b600080604083850312156123515761235061328a565b5b600061235f85828601612206565b9250506020612370858286016122b6565b9150509250929050565b6000806000606084860312156123935761239261328a565b5b60006123a186828701612206565b93505060206123b2868287016122b6565b92505060406123c3868287016122b6565b9150509250925092565b60008060008060008060c087890312156123ea576123e961328a565b5b60006123f889828a01612206565b965050602061240989828a016122b6565b955050604061241a89828a016122b6565b945050606061242b89828a01612206565b935050608061243c89828a016122b6565b92505060a061244d89828a016122b6565b9150509295509295509295565b6000602082840312156124705761246f61328a565b5b600061247e84828501612230565b91505092915050565b60006020828403121561249d5761249c61328a565b5b60006124ab84828501612245565b91505092915050565b6000602082840312156124ca576124c961328a565b5b600082013567ffffffffffffffff8111156124e8576124e7613285565b5b6124f48482850161225a565b91505092915050565b6000602082840312156125135761251261328a565b5b600082015167ffffffffffffffff81111561253157612530613285565b5b61253d84828501612288565b91505092915050565b60006020828403121561255c5761255b61328a565b5b600061256a848285016122b6565b91505092915050565b6000602082840312156125895761258861328a565b5b6000612597848285016122cb565b91505092915050565b600080604083850312156125b7576125b661328a565b5b60006125c5858286016122b6565b92505060206125d685828601612206565b9150509250929050565b600080604083850312156125f7576125f661328a565b5b6000612605858286016122b6565b9250506020612616858286016122b6565b9150509250929050565b6000806000606084860312156126395761263861328a565b5b6000612647868287016122b6565b9350506020612658868287016122b6565b9250506040612669868287016122b6565b9150509250925092565b600061267f838361268b565b60208301905092915050565b61269481612fc4565b82525050565b6126a381612fc4565b82525050565b60006126b482612eb9565b6126be8185612edc565b93506126c983612e94565b8060005b838110156126fa5781516126e18882612673565b97506126ec83612ecf565b9250506001810190506126cd565b5085935050505092915050565b61271081612fd6565b82525050565b61271f81612fe2565b82525050565b600061273082612ec4565b61273a8185612eed565b935061274a818560208601613051565b6127538161328f565b840191505092915050565b600061276982612ec4565b6127738185612efe565b9350612783818560208601613051565b80840191505092915050565b6000815461279c81613084565b6127a68186612efe565b945060018216600081146127c157600181146127d257612805565b60ff19831686528186019350612805565b6127db85612ea4565b60005b838110156127fd578154818901526001820191506020810190506127de565b838801955050505b50505092915050565b600061281b604983612efe565b9150612826826132a0565b604982019050919050565b600061283e600883612efe565b915061284982613315565b600882019050919050565b6000612861600b83612efe565b915061286c8261333e565b600b82019050919050565b6000612884602683612eed565b915061288f82613367565b604082019050919050565b60006128a7601183612eed565b91506128b2826133b6565b602082019050919050565b60006128ca602483612eed565b91506128d5826133df565b604082019050919050565b60006128ed600d83612eed565b91506128f88261342e565b602082019050919050565b6000612910601a83612eed565b915061291b82613457565b602082019050919050565b6000612933601383612efe565b915061293e82613480565b601382019050919050565b6000612956602683612eed565b9150612961826134a9565b604082019050919050565b6000612979600483612efe565b9150612984826134f8565b600482019050919050565b600061299c603083612efe565b91506129a782613521565b603082019050919050565b60006129bf601d83612eed565b91506129ca82613570565b602082019050919050565b60006129e2601b83612efe565b91506129ed82613599565b601b82019050919050565b6000612a05602083612eed565b9150612a10826135c2565b602082019050919050565b6000612a28600683612efe565b9150612a33826135eb565b600682019050919050565b6000612a4b601d83612efe565b9150612a5682613614565b601d82019050919050565b6000612a6e600f83612efe565b9150612a798261363d565b600f82019050919050565b6000612a91602483612eed565b9150612a9c82613666565b604082019050919050565b6000612ab4602783612eed565b9150612abf826136b5565b604082019050919050565b6000612ad7602483612eed565b9150612ae282613704565b604082019050919050565b6000612afa600483612efe565b9150612b0582613753565b600482019050919050565b612b1981613038565b82525050565b6000612b2b828761278f565b9150612b368261296c565b9150612b42828661275e565b9150612b4d82612a1b565b9150612b59828561275e565b9150612b6482612831565b9150612b70828461275e565b915081905095945050505050565b6000612b89826129d5565b9150612b9482612a3e565b9150612ba0828961275e565b9150612bab8261280e565b9150612bb7828861275e565b9150612bc282612926565b9150612bce828761275e565b9150612bd982612854565b9150612be5828661278f565b9150612bf082612a61565b9150612bfc828561278f565b9150612c078261298f565b9150612c13828461275e565b9150612c1e82612aed565b9150819050979650505050505050565b6000602082019050612c43600083018461269a565b92915050565b60006020820190508181036000830152612c6381846126a9565b905092915050565b6000602082019050612c806000830184612707565b92915050565b6000602082019050612c9b6000830184612716565b92915050565b60006020820190508181036000830152612cbb8184612725565b905092915050565b60006020820190508181036000830152612cdc81612877565b9050919050565b60006020820190508181036000830152612cfc8161289a565b9050919050565b60006020820190508181036000830152612d1c816128bd565b9050919050565b60006020820190508181036000830152612d3c816128e0565b9050919050565b60006020820190508181036000830152612d5c81612903565b9050919050565b60006020820190508181036000830152612d7c81612949565b9050919050565b60006020820190508181036000830152612d9c816129b2565b9050919050565b60006020820190508181036000830152612dbc816129f8565b9050919050565b60006020820190508181036000830152612ddc81612a84565b9050919050565b60006020820190508181036000830152612dfc81612aa7565b9050919050565b60006020820190508181036000830152612e1c81612aca565b9050919050565b6000602082019050612e386000830184612b10565b92915050565b6000612e48612e59565b9050612e5482826130b6565b919050565b6000604051905090565b600067ffffffffffffffff821115612e7e57612e7d61324c565b5b612e878261328f565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612f1482613038565b9150612f1f83613038565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f5457612f53613161565b5b828201905092915050565b6000612f6a82613038565b9150612f7583613038565b925082612f8557612f84613190565b5b828204905092915050565b6000612f9b82613038565b9150612fa683613038565b925082821015612fb957612fb8613161565b5b828203905092915050565b6000612fcf82613018565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561306f578082015181840152602081019050613054565b8381111561307e576000848401525b50505050565b6000600282049050600182168061309c57607f821691505b602082108114156130b0576130af6131bf565b5b50919050565b6130bf8261328f565b810181811067ffffffffffffffff821117156130de576130dd61324c565b5b80604052505050565b60006130f282613038565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561312557613124613161565b5b600182019050919050565b600061313b82613038565b915061314683613038565b92508261315657613155613190565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f222c22637265617465645f6279223a2279756e6720776b6e64222c226465736360008201527f72697074696f6e223a225265776172642074686520626f6c642e222c22616e6960208201527f6d6174696f6e223a220000000000000000000000000000000000000000000000604082015250565b7f26706f696e74733d000000000000000000000000000000000000000000000000600082015250565b7f222c22696d616765223a22000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642063616c6c2064617461000000000000000000000000000000600082015250565b7f43616e6e6f742072656d6f7665206e6f6e2d6578697374656e74206d6572636860008201527f616e742e00000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420746f6b656e00000000000000000000000000000000000000600082015250565b7f43616e6e6f7420616464206d65726368616e7420616761696e2e000000000000600082015250565b7f222c22616e696d6174696f6e5f75726c223a2200000000000000000000000000600082015250565b7f4f6e6c7920617070726f766564206d65726368616e742063616e20616464207060008201527f6f696e74732e0000000000000000000000000000000000000000000000000000602082015250565b7f3f69643d00000000000000000000000000000000000000000000000000000000600082015250565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a225060008201527f6f696e7473222c2276616c7565223a2200000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820706f696e747320746f207472616e73666572000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f266e616d653d0000000000000000000000000000000000000000000000000000600082015250565b7f7b226e616d65223a2241534820436f6c6c6563746f7220436172642023000000600082015250565b7f222c22696d6167655f75726c223a220000000000000000000000000000000000600082015250565b7f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f72206160008201527f646d696e00000000000000000000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79207472616e7366657220706f696e74732066726f6d206f7760008201527f6e20636172642e00000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420757064617465206e6f6e2d6578697374656e74206d6572636860008201527f616e742e00000000000000000000000000000000000000000000000000000000602082015250565b7f227d5d7d00000000000000000000000000000000000000000000000000000000600082015250565b61378581612fc4565b811461379057600080fd5b50565b61379c81612fe2565b81146137a757600080fd5b50565b6137b381612fec565b81146137be57600080fd5b50565b6137ca81613038565b81146137d557600080fd5b5056fea264697066735822122096b90fb8b355b9d6bf1535e24869eda593ef07e027840cb1b2886958f379835364736f6c63430008070033000000000000000000000000a9d58810b0139d734d02c4c7b90c836d90d68ad8
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c806379626b5a116100c3578063d9f9ae3e1161007c578063d9f9ae3e146103c1578063e9dc6375146103dd578063f1c689821461040d578063f2fde38b1461043d578063f7bb5c8814610459578063fe4651a01461047557610158565b806379626b5a146102ed5780638da5cb5b14610309578063a967eee414610327578063bc8bde6414610357578063c83afbd014610375578063d4a01b02146103a557610158565b8063516dd48711610115578063516dd4871461024357806355f804b31461025f57806362fd77741461027b5780636d73e66914610297578063715018a6146102b3578063735d6a52146102bd57610158565b806301ffc9a71461015d57806306f2791a1461018d578063133adab6146101bd57806324d7806c146101d95780632d3456701461020957806331ae450b14610225575b600080fd5b61017760048036038101906101729190612487565b610491565b6040516101849190612c6b565b60405180910390f35b6101a760048036038101906101a291906122e0565b6105eb565b6040516101b49190612e23565b60405180910390f35b6101d760048036038101906101d291906122e0565b610634565b005b6101f360048036038101906101ee91906122e0565b61078f565b6040516102009190612c6b565b60405180910390f35b610223600480360381019061021e91906122e0565b6107e9565b005b61022d6108f1565b60405161023a9190612c49565b60405180910390f35b61025d600480360381019061025891906124b4565b6109d3565b005b610279600480360381019061027491906124b4565b610a7d565b005b610295600480360381019061029091906125a0565b610b27565b005b6102b160048036038101906102ac91906122e0565b610c03565b005b6102bb610d0a565b005b6102d760048036038101906102d29190612546565b610d92565b6040516102e49190612e23565b60405180910390f35b6103076004803603810190610302919061233a565b610daa565b005b610311610f04565b60405161031e9190612c2e565b60405180910390f35b610341600480360381019061033c9190612546565b610f2d565b60405161034e9190612e23565b60405180910390f35b61035f610f4a565b60405161036c9190612c2e565b60405180910390f35b61038f600480360381019061038a91906123cd565b610f70565b60405161039c9190612e23565b60405180910390f35b6103bf60048036038101906103ba9190612620565b6110e0565b005b6103db60048036038101906103d6919061233a565b6112bf565b005b6103f760048036038101906103f2919061233a565b61141a565b6040516104049190612ca1565b60405180910390f35b61042760048036038101906104229190612546565b611542565b6040516104349190612ca1565b60405180910390f35b610457600480360381019061045291906122e0565b6115a9565b005b610473600480360381019061046e919061237a565b6116a1565b005b61048f600480360381019061048a91906125e0565b61181f565b005b60007fe9dc6375000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061055c57507f36d2c28e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105c457507fc83afbd0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105d457506105d3826118d0565b5b806105e457506105e3826118d0565b5b9050919050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b3373ffffffffffffffffffffffffffffffffffffffff16610653610f04565b73ffffffffffffffffffffffffffffffffffffffff161480610685575061068433600161194a90919063ffffffff16565b5b6106c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bb90612dc3565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415610747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073e90612d03565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b60008173ffffffffffffffffffffffffffffffffffffffff166107b0610f04565b73ffffffffffffffffffffffffffffffffffffffff1614806107e257506107e182600161194a90919063ffffffff16565b5b9050919050565b6107f161197a565b73ffffffffffffffffffffffffffffffffffffffff1661080f610f04565b73ffffffffffffffffffffffffffffffffffffffff1614610865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085c90612da3565b60405180910390fd5b61087981600161194a90919063ffffffff16565b156108ee573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d560405160405180910390a36108ec81600161198290919063ffffffff16565b505b50565b60606108fd60016119b2565b67ffffffffffffffff8111156109165761091561324c565b5b6040519080825280602002602001820160405280156109445781602001602082028036833780820191505090505b50905060005b61095460016119b2565b8110156109cf5761096f8160016119c790919063ffffffff16565b8282815181106109825761098161321d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806109c7906130e7565b91505061094a565b5090565b3373ffffffffffffffffffffffffffffffffffffffff166109f2610f04565b73ffffffffffffffffffffffffffffffffffffffff161480610a245750610a2333600161194a90919063ffffffff16565b5b610a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5a90612dc3565b60405180910390fd5b8060089080519060200190610a799291906120df565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16610a9c610f04565b73ffffffffffffffffffffffffffffffffffffffff161480610ace5750610acd33600161194a90919063ffffffff16565b5b610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0490612dc3565b60405180910390fd5b8060049080519060200190610b239291906120df565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16610b46610f04565b73ffffffffffffffffffffffffffffffffffffffff161480610b785750610b7733600161194a90919063ffffffff16565b5b610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae90612dc3565b60405180910390fd5b8160078190555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b610c0b61197a565b73ffffffffffffffffffffffffffffffffffffffff16610c29610f04565b73ffffffffffffffffffffffffffffffffffffffff1614610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7690612da3565b60405180910390fd5b610c9381600161194a90919063ffffffff16565b610d07573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb160405160405180910390a3610d058160016119e190919063ffffffff16565b505b50565b610d1261197a565b73ffffffffffffffffffffffffffffffffffffffff16610d30610f04565b73ffffffffffffffffffffffffffffffffffffffff1614610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d90612da3565b60405180910390fd5b610d906000611a11565b565b60056020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff16610dc9610f04565b73ffffffffffffffffffffffffffffffffffffffff161480610dfb5750610dfa33600161194a90919063ffffffff16565b5b610e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3190612dc3565b60405180910390fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb390612d43565b60405180910390fd5b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600060056000838152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148015610fd0575060075486145b8015610fdc5750600185145b8015610fe85750600082145b611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e90612ce3565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632928ca58856040518263ffffffff1660e01b81526004016110829190612c2e565b602060405180830381600087803b15801561109c57600080fd5b505af11580156110b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d49190612573565b90509695505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016111529190612e23565b60206040518083038186803b15801561116a57600080fd5b505afa15801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a2919061230d565b73ffffffffffffffffffffffffffffffffffffffff16146111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90612de3565b60405180910390fd5b806005600085815260200190815260200160002054101561124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124590612d83565b60405180910390fd5b80600560008581526020019081526020016000205461126d9190612f90565b60056000858152602001908152602001600020819055508060056000848152602001908152602001600020546112a39190612f09565b6005600084815260200190815260200160002081905550505050565b3373ffffffffffffffffffffffffffffffffffffffff166112de610f04565b73ffffffffffffffffffffffffffffffffffffffff161480611310575061130f33600161194a90919063ffffffff16565b5b61134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690612dc3565b60405180910390fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990612e03565b60405180910390fd5b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6060600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146114ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a390612d23565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663f1c68982836040518263ffffffff1660e01b81526004016114e59190612e23565b60006040518083038186803b1580156114fd57600080fd5b505afa158015611511573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061153a91906124fd565b905092915050565b606061154d82611ad5565b61155683611c36565b61155f84611c36565b60088061157e6005600089815260200190815260200160002054611ad5565b60405160200161159396959493929190612b7e565b6040516020818303038152906040529050919050565b6115b161197a565b73ffffffffffffffffffffffffffffffffffffffff166115cf610f04565b73ffffffffffffffffffffffffffffffffffffffff1614611625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161c90612da3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168c90612cc3565b60405180910390fd5b61169e81611a11565b50565b3373ffffffffffffffffffffffffffffffffffffffff166116c0610f04565b73ffffffffffffffffffffffffffffffffffffffff1614806116f257506116f133600161194a90919063ffffffff16565b5b611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890612dc3565b60405180910390fd5b60005b82811015611819576000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632928ca58866040518263ffffffff1660e01b81526004016117999190612c2e565b602060405180830381600087803b1580156117b357600080fd5b505af11580156117c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117eb9190612573565b9050826005600083815260200190815260200160002081905550508080611811906130e7565b915050611734565b50505050565b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156118a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189990612d63565b60405180910390fd5b806005600084815260200190815260200160002060008282546118c59190612f09565b925050819055505050565b60007f553e757e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611943575061194282611e92565b5b9050919050565b6000611972836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611efc565b905092915050565b600033905090565b60006119aa836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611f1f565b905092915050565b60006119c082600001612033565b9050919050565b60006119d68360000183612044565b60001c905092915050565b6000611a09836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61206f565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000821415611b1d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c31565b600082905060005b60008214611b4f578080611b38906130e7565b915050600a82611b489190612f5f565b9150611b25565b60008167ffffffffffffffff811115611b6b57611b6a61324c565b5b6040519080825280601f01601f191660200182016040528015611b9d5781602001600182028036833780820191505090505b5090505b60008514611c2a57600182611bb69190612f90565b9150600a85611bc59190613130565b6030611bd19190612f09565b60f81b818381518110611be757611be661321d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611c239190612f5f565b9450611ba1565b8093505050505b919050565b60606000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663691f3431600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bffbe61c600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e886040518263ffffffff1660e01b8152600401611d119190612e23565b60206040518083038186803b158015611d2957600080fd5b505afa158015611d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d61919061230d565b6040518263ffffffff1660e01b8152600401611d7d9190612c2e565b60206040518083038186803b158015611d9557600080fd5b505afa158015611da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcd919061245a565b6040518263ffffffff1660e01b8152600401611de99190612c86565b60006040518083038186803b158015611e0157600080fd5b505afa158015611e15573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611e3e91906124fd565b90506004611e4b84611ad5565b82611e686005600088815260200190815260200160002054611ad5565b604051602001611e7b9493929190612b1f565b604051602081830303815290604052915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114612027576000600182611f519190612f90565b9050600060018660000180549050611f699190612f90565b9050818114611fd8576000866000018281548110611f8a57611f8961321d565b5b9060005260206000200154905080876000018481548110611fae57611fad61321d565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480611fec57611feb6131ee565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061202d565b60009150505b92915050565b600081600001805490509050919050565b600082600001828154811061205c5761205b61321d565b5b9060005260206000200154905092915050565b600061207b8383611efc565b6120d45782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506120d9565b600090505b92915050565b8280546120eb90613084565b90600052602060002090601f01602090048101928261210d5760008555612154565b82601f1061212657805160ff1916838001178555612154565b82800160010185558215612154579182015b82811115612153578251825591602001919060010190612138565b5b5090506121619190612165565b5090565b5b8082111561217e576000816000905550600101612166565b5090565b600061219561219084612e63565b612e3e565b9050828152602081018484840111156121b1576121b0613280565b5b6121bc848285613042565b509392505050565b60006121d76121d284612e63565b612e3e565b9050828152602081018484840111156121f3576121f2613280565b5b6121fe848285613051565b509392505050565b6000813590506122158161377c565b92915050565b60008151905061222a8161377c565b92915050565b60008151905061223f81613793565b92915050565b600081359050612254816137aa565b92915050565b600082601f83011261226f5761226e61327b565b5b813561227f848260208601612182565b91505092915050565b600082601f83011261229d5761229c61327b565b5b81516122ad8482602086016121c4565b91505092915050565b6000813590506122c5816137c1565b92915050565b6000815190506122da816137c1565b92915050565b6000602082840312156122f6576122f561328a565b5b600061230484828501612206565b91505092915050565b6000602082840312156123235761232261328a565b5b60006123318482850161221b565b91505092915050565b600080604083850312156123515761235061328a565b5b600061235f85828601612206565b9250506020612370858286016122b6565b9150509250929050565b6000806000606084860312156123935761239261328a565b5b60006123a186828701612206565b93505060206123b2868287016122b6565b92505060406123c3868287016122b6565b9150509250925092565b60008060008060008060c087890312156123ea576123e961328a565b5b60006123f889828a01612206565b965050602061240989828a016122b6565b955050604061241a89828a016122b6565b945050606061242b89828a01612206565b935050608061243c89828a016122b6565b92505060a061244d89828a016122b6565b9150509295509295509295565b6000602082840312156124705761246f61328a565b5b600061247e84828501612230565b91505092915050565b60006020828403121561249d5761249c61328a565b5b60006124ab84828501612245565b91505092915050565b6000602082840312156124ca576124c961328a565b5b600082013567ffffffffffffffff8111156124e8576124e7613285565b5b6124f48482850161225a565b91505092915050565b6000602082840312156125135761251261328a565b5b600082015167ffffffffffffffff81111561253157612530613285565b5b61253d84828501612288565b91505092915050565b60006020828403121561255c5761255b61328a565b5b600061256a848285016122b6565b91505092915050565b6000602082840312156125895761258861328a565b5b6000612597848285016122cb565b91505092915050565b600080604083850312156125b7576125b661328a565b5b60006125c5858286016122b6565b92505060206125d685828601612206565b9150509250929050565b600080604083850312156125f7576125f661328a565b5b6000612605858286016122b6565b9250506020612616858286016122b6565b9150509250929050565b6000806000606084860312156126395761263861328a565b5b6000612647868287016122b6565b9350506020612658868287016122b6565b9250506040612669868287016122b6565b9150509250925092565b600061267f838361268b565b60208301905092915050565b61269481612fc4565b82525050565b6126a381612fc4565b82525050565b60006126b482612eb9565b6126be8185612edc565b93506126c983612e94565b8060005b838110156126fa5781516126e18882612673565b97506126ec83612ecf565b9250506001810190506126cd565b5085935050505092915050565b61271081612fd6565b82525050565b61271f81612fe2565b82525050565b600061273082612ec4565b61273a8185612eed565b935061274a818560208601613051565b6127538161328f565b840191505092915050565b600061276982612ec4565b6127738185612efe565b9350612783818560208601613051565b80840191505092915050565b6000815461279c81613084565b6127a68186612efe565b945060018216600081146127c157600181146127d257612805565b60ff19831686528186019350612805565b6127db85612ea4565b60005b838110156127fd578154818901526001820191506020810190506127de565b838801955050505b50505092915050565b600061281b604983612efe565b9150612826826132a0565b604982019050919050565b600061283e600883612efe565b915061284982613315565b600882019050919050565b6000612861600b83612efe565b915061286c8261333e565b600b82019050919050565b6000612884602683612eed565b915061288f82613367565b604082019050919050565b60006128a7601183612eed565b91506128b2826133b6565b602082019050919050565b60006128ca602483612eed565b91506128d5826133df565b604082019050919050565b60006128ed600d83612eed565b91506128f88261342e565b602082019050919050565b6000612910601a83612eed565b915061291b82613457565b602082019050919050565b6000612933601383612efe565b915061293e82613480565b601382019050919050565b6000612956602683612eed565b9150612961826134a9565b604082019050919050565b6000612979600483612efe565b9150612984826134f8565b600482019050919050565b600061299c603083612efe565b91506129a782613521565b603082019050919050565b60006129bf601d83612eed565b91506129ca82613570565b602082019050919050565b60006129e2601b83612efe565b91506129ed82613599565b601b82019050919050565b6000612a05602083612eed565b9150612a10826135c2565b602082019050919050565b6000612a28600683612efe565b9150612a33826135eb565b600682019050919050565b6000612a4b601d83612efe565b9150612a5682613614565b601d82019050919050565b6000612a6e600f83612efe565b9150612a798261363d565b600f82019050919050565b6000612a91602483612eed565b9150612a9c82613666565b604082019050919050565b6000612ab4602783612eed565b9150612abf826136b5565b604082019050919050565b6000612ad7602483612eed565b9150612ae282613704565b604082019050919050565b6000612afa600483612efe565b9150612b0582613753565b600482019050919050565b612b1981613038565b82525050565b6000612b2b828761278f565b9150612b368261296c565b9150612b42828661275e565b9150612b4d82612a1b565b9150612b59828561275e565b9150612b6482612831565b9150612b70828461275e565b915081905095945050505050565b6000612b89826129d5565b9150612b9482612a3e565b9150612ba0828961275e565b9150612bab8261280e565b9150612bb7828861275e565b9150612bc282612926565b9150612bce828761275e565b9150612bd982612854565b9150612be5828661278f565b9150612bf082612a61565b9150612bfc828561278f565b9150612c078261298f565b9150612c13828461275e565b9150612c1e82612aed565b9150819050979650505050505050565b6000602082019050612c43600083018461269a565b92915050565b60006020820190508181036000830152612c6381846126a9565b905092915050565b6000602082019050612c806000830184612707565b92915050565b6000602082019050612c9b6000830184612716565b92915050565b60006020820190508181036000830152612cbb8184612725565b905092915050565b60006020820190508181036000830152612cdc81612877565b9050919050565b60006020820190508181036000830152612cfc8161289a565b9050919050565b60006020820190508181036000830152612d1c816128bd565b9050919050565b60006020820190508181036000830152612d3c816128e0565b9050919050565b60006020820190508181036000830152612d5c81612903565b9050919050565b60006020820190508181036000830152612d7c81612949565b9050919050565b60006020820190508181036000830152612d9c816129b2565b9050919050565b60006020820190508181036000830152612dbc816129f8565b9050919050565b60006020820190508181036000830152612ddc81612a84565b9050919050565b60006020820190508181036000830152612dfc81612aa7565b9050919050565b60006020820190508181036000830152612e1c81612aca565b9050919050565b6000602082019050612e386000830184612b10565b92915050565b6000612e48612e59565b9050612e5482826130b6565b919050565b6000604051905090565b600067ffffffffffffffff821115612e7e57612e7d61324c565b5b612e878261328f565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612f1482613038565b9150612f1f83613038565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f5457612f53613161565b5b828201905092915050565b6000612f6a82613038565b9150612f7583613038565b925082612f8557612f84613190565b5b828204905092915050565b6000612f9b82613038565b9150612fa683613038565b925082821015612fb957612fb8613161565b5b828203905092915050565b6000612fcf82613018565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561306f578082015181840152602081019050613054565b8381111561307e576000848401525b50505050565b6000600282049050600182168061309c57607f821691505b602082108114156130b0576130af6131bf565b5b50919050565b6130bf8261328f565b810181811067ffffffffffffffff821117156130de576130dd61324c565b5b80604052505050565b60006130f282613038565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561312557613124613161565b5b600182019050919050565b600061313b82613038565b915061314683613038565b92508261315657613155613190565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f222c22637265617465645f6279223a2279756e6720776b6e64222c226465736360008201527f72697074696f6e223a225265776172642074686520626f6c642e222c22616e6960208201527f6d6174696f6e223a220000000000000000000000000000000000000000000000604082015250565b7f26706f696e74733d000000000000000000000000000000000000000000000000600082015250565b7f222c22696d616765223a22000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642063616c6c2064617461000000000000000000000000000000600082015250565b7f43616e6e6f742072656d6f7665206e6f6e2d6578697374656e74206d6572636860008201527f616e742e00000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420746f6b656e00000000000000000000000000000000000000600082015250565b7f43616e6e6f7420616464206d65726368616e7420616761696e2e000000000000600082015250565b7f222c22616e696d6174696f6e5f75726c223a2200000000000000000000000000600082015250565b7f4f6e6c7920617070726f766564206d65726368616e742063616e20616464207060008201527f6f696e74732e0000000000000000000000000000000000000000000000000000602082015250565b7f3f69643d00000000000000000000000000000000000000000000000000000000600082015250565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a225060008201527f6f696e7473222c2276616c7565223a2200000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820706f696e747320746f207472616e73666572000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f266e616d653d0000000000000000000000000000000000000000000000000000600082015250565b7f7b226e616d65223a2241534820436f6c6c6563746f7220436172642023000000600082015250565b7f222c22696d6167655f75726c223a220000000000000000000000000000000000600082015250565b7f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f72206160008201527f646d696e00000000000000000000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79207472616e7366657220706f696e74732066726f6d206f7760008201527f6e20636172642e00000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420757064617465206e6f6e2d6578697374656e74206d6572636860008201527f616e742e00000000000000000000000000000000000000000000000000000000602082015250565b7f227d5d7d00000000000000000000000000000000000000000000000000000000600082015250565b61378581612fc4565b811461379057600080fd5b50565b61379c81612fe2565b81146137a757600080fd5b50565b6137b381612fec565b81146137be57600080fd5b50565b6137ca81613038565b81146137d557600080fd5b5056fea264697066735822122096b90fb8b355b9d6bf1535e24869eda593ef07e027840cb1b2886958f379835364736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a9d58810b0139d734d02c4c7b90c836d90d68ad8
-----Decoded View---------------
Arg [0] : creator (address): 0xa9d58810B0139d734D02c4c7B90C836D90d68aD8
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a9d58810b0139d734d02c4c7b90c836d90d68ad8
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.