Contract Overview
Balance:
0 MATIC
MATIC Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x413565fc32a2b6166c0f87c5c06f4728697b378e2c0f9f2b530baab81425b6cb | 0x60806040 | 33873276 | 170 days 15 hrs ago | 0xa4caa9fefb39807e5ac197827565432fd94f2de6 | IN | Create: EventImplementation | 0 MATIC | 0.4015883 |
[ Download CSV Export ]
Contract Name:
EventImplementation
Compiler Version
v0.8.12+commit.f00d7308
Optimization Enabled:
Yes with 800 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @title EventImplementation Contract * @author GET Protocol * @notice Contract responsible for NFT mints and transfers * @dev One EventImplementation contract is deployed per real world event. * * @dev This contract Extends the ERC721 specification */ import "./abstract/EventERC721Upgradeable.sol"; import "./abstract/AuthModifiers.sol"; import "./interfaces/IRegistry.sol"; import "./interfaces/IEventImplementation.sol"; contract EventImplementation is IEventImplementation, EventERC721Upgradeable, AuthModifiers { using StringsUpgradeable for uint256; IRegistry private registry; /// @custom:oz-upgrades-unsafe-allow constructor constructor() initializer {} /** * @dev Initialization function for beacon proxy contracts * @param _name ERC721 name field * @param _symbol ERC721 symbol field * @param _registry Registry contract address */ // solhint-disable-next-line func-name-mixedcase function __EventImplementation_init( string calldata _name, string calldata _symbol, address _registry ) external initializer { __ERC721_init(_name, _symbol); __AuthModifiers_init(_registry); __EventImplementation_init_unchained(_registry); } // solhint-disable-next-line func-name-mixedcase function __EventImplementation_init_unchained(address _registry) internal initializer { registry = IRegistry(_registry); } EventData public eventData; EventFinancing public eventFinancing; /** * @notice Performs all ticket interractions via an integrator's relayer * @dev Performs ticket actions based on the array of action counts * * @dev Each value in the actionCounts array corresponds to the number of a specific ticket action to be performed * * @dev Can only be called by an integrator's relayer * @param _ticketActions array of TicketAction structs for which a ticket action is performed * @param _actionCounts integer array corresponding to specific ticket action to be performed on the ticketActions * @param _balanceUpdates array of BalanceUpdates struct used to update an owner's balance upon ticket mint */ function batchActions( TicketAction[] calldata _ticketActions, uint8[] calldata _actionCounts, BalanceUpdates[] calldata _balanceUpdates ) external onlyRelayer { uint256 _start = 0; for (uint256 _actionType = 0; _actionType < _actionCounts.length; _actionType++) { uint256 _end = _start + _actionCounts[_actionType]; if (_actionType == 0 && _actionCounts[_actionType] != 0) { require(!eventFinancing.primaryBlocked, "EventFinancing: Inventory Restricted"); _primarySale(_ticketActions[_start:_end], _balanceUpdates); _start = _end; continue; } if (_actionType == 1 && _actionCounts[_actionType] != 0) { _secondarySale(_ticketActions[_start:_end]); _start = _end; continue; } if (_actionType == 2 && _actionCounts[_actionType] != 0) { require(!eventFinancing.scanBlocked, "EventFinancing: Inventory Restricted"); _scan(_ticketActions[_start:_end]); _start = _end; continue; } if (_actionType == 3 && _actionCounts[_actionType] != 0) { _checkIn(_ticketActions[_start:_end]); _start = _end; continue; } if (_actionType == 4 && _actionCounts[_actionType] != 0) { _invalidate(_ticketActions[_start:_end]); _start = _end; continue; } if (_actionType == 5 && _actionCounts[_actionType] != 0) { _claim(_ticketActions[_start:_end]); _start = _end; continue; } } } /** * @notice Returns a boolean from a bit-field * @param _packedBools integer used as bit field * @param _boolNumber bit position */ function _getBoolean(uint8 _packedBools, uint8 _boolNumber) internal pure returns (bool) { uint8 _flag = (_packedBools >> _boolNumber) & uint8(1); return (_flag == 1 ? true : false); } /** * @notice Sets a bit in a bit-field * @param _packedBools integer used as bit field * @param _boolNumber bit position * @param _value boolean value to set in bit position */ function _setBoolean( uint8 _packedBools, uint8 _boolNumber, bool _value ) internal pure returns (uint8 _flags) { if (_value) return _packedBools | (uint8(1) << _boolNumber); else return _packedBools & ~(uint8(1) << _boolNumber); } /** * @notice Returns a ticket's scanned status * @dev A ticket can be scanned multiple times as long as it's not invalidated * @param _tokenId ticket identifier and ERC721 tokenId * @return _status scan status */ function isScanned(uint256 _tokenId) public view returns (bool _status) { return _getBoolean(tokenData[_tokenId].booleanFlags, uint8(TicketFlags.SCANNED)); } /** * @notice Returns a ticket's checked-in status * @dev A ticket can only be checked in once * @param _tokenId ticket identifier and ERC721 tokenId * @return _status check-in status */ function isCheckedIn(uint256 _tokenId) public view returns (bool _status) { return _getBoolean(tokenData[_tokenId].booleanFlags, uint8(TicketFlags.CHECKED_IN)); } /** * @notice Returns a ticket's invalidation status * @dev After invalidation further ticket interraction becomes impossible * @param _tokenId ticket identifier and ERC721 tokenId * @return _status invalidation status */ function isInvalidated(uint256 _tokenId) public view returns (bool _status) { return _getBoolean(tokenData[_tokenId].booleanFlags, uint8(TicketFlags.INVALIDATED)); } /** * @notice Returns a ticket's status of unlocked * @dev Unlocking happens after check-in, at which point the ticket is available for transfer * @param _tokenId ticket identifier and ERC721 tokenId * @return _status unlock status */ function isUnlocked(uint256 _tokenId) public view returns (bool _status) { bool isPastEndTime = (eventData.endTime + 24 hours) <= block.timestamp; return _getBoolean(tokenData[_tokenId].booleanFlags, uint8(TicketFlags.UNLOCKED)) || isPastEndTime; } /** * @notice Returns status of whether ticket is custodially managed * @dev Custodial tickets are held within the contract for later claiming or transfer * @param _tokenId ticket identifier and ERC721 tokenId * @return _status custodial status */ function isCustodial(uint256 _tokenId) public view returns (bool _status) { return ownerOf(_tokenId) == address(this); } /** * @notice Sets `isScanned` to true or false * @dev This edits the ticket specific bit-field (tokenData.booleanFlags) by calling _setBoolean * @param _tokenId ticket identifier and ERC721 tokenId * @param _status scan status */ function _setScannedFlag(uint256 _tokenId, bool _status) internal { tokenData[_tokenId].booleanFlags = _setBoolean( tokenData[_tokenId].booleanFlags, uint8(TicketFlags.SCANNED), _status ); } /** * @notice Sets `isCheckedIn` to true or false * @dev This edits the ticket specific bit-field (tokenData.booleanFlags) by calling _setBoolean * @param _tokenId ticket identifier and ERC721 tokenId * @param _status check-in status */ function _setCheckedInFlag(uint256 _tokenId, bool _status) internal { tokenData[_tokenId].booleanFlags = _setBoolean( tokenData[_tokenId].booleanFlags, uint8(TicketFlags.CHECKED_IN), _status ); } /** * @notice Sets `isInvalidated` to true or false * @dev This edits the ticket specific bit-field (tokenData.booleanFlags) by calling _setBoolean * @param _tokenId ticket identifier and ERC721 tokenId * @param _status invalidation status */ function _setInvalidatedFlag(uint256 _tokenId, bool _status) internal { tokenData[_tokenId].booleanFlags = _setBoolean( tokenData[_tokenId].booleanFlags, uint8(TicketFlags.INVALIDATED), _status ); } /** * @notice Sets `isUnlocked` to true or false * @dev This edits the ticket specific bit-field (tokenData.booleanFlags) by calling _setBoolean * @param _tokenId ticket identifier and ERC721 tokenId * @param _status unlocked status */ function _setUnlockedFlag(uint256 _tokenId, bool _status) internal { tokenData[_tokenId].booleanFlags = _setBoolean( tokenData[_tokenId].booleanFlags, uint8(TicketFlags.UNLOCKED), _status ); } /// @dev Ticket Lifecycle Methods /** * @notice Performs a primary ticket sale from ticketActions * @dev Internal method called by `batchActions` * @param _ticketActions array of TicketAction structs for which a primary sale occurs * @param _balanceUpdates array of BalanceUpdates struct used to update an owner's balance */ function _primarySale(TicketAction[] calldata _ticketActions, BalanceUpdates[] calldata _balanceUpdates) internal { for (uint256 i = 0; i < _balanceUpdates.length; i++) { _addressData[_balanceUpdates[i].owner].balance += _balanceUpdates[i].quantity; } for (uint256 i = 0; i < _ticketActions.length; i++) { _mint(_ticketActions[i]); } IEconomics _econ = registry.economics(); (uint256 _fuel, uint256 _fuelProtocol) = _econ.reserveFuelPrimarySale(msg.sender, _ticketActions); emit PrimarySale(_ticketActions, _fuel, _fuelProtocol); } /** * @notice Performs a secondary ticket sale from ticketActions * @dev Internal method called by `batchActions` * @param _ticketActions array of TicketAction structs for which a secondary sale occurs */ function _secondarySale(TicketAction[] calldata _ticketActions) internal { for (uint256 i = 0; i < _ticketActions.length; i++) { uint256 _tokenId = _ticketActions[i].tokenId; require(!isInvalidated(_tokenId) && !isUnlocked(_tokenId), "EventImplementation: Error on resale"); _transfer(ownerOf(_tokenId), _ticketActions[i].to, _tokenId); } IEconomics _econ = registry.economics(); (uint256 _fuel, uint256 _fuelProtocol) = _econ.reserveFuelSecondarySale(msg.sender, _ticketActions); emit SecondarySale(_ticketActions, _fuel, _fuelProtocol); } /** * @notice Performs scans on tickets from ticketActions * @dev Internal method called by `batchActions` * @param _ticketActions array of TicketAction structs for which scans occur */ function _scan(TicketAction[] calldata _ticketActions) internal { for (uint256 i = 0; i < _ticketActions.length; i++) { uint256 _tokenId = _ticketActions[i].tokenId; require(!isInvalidated(_tokenId), "EventImplementation: Error on ticket scan"); _setScannedFlag(_tokenId, true); } IEconomics _econ = registry.economics(); (uint256 _fuel, uint256 _fuelProtocol) = _econ.spendBasicAction(msg.sender, uint32(_ticketActions.length)); emit Scanned(_ticketActions, _fuel, _fuelProtocol); } /** * @notice Performs check-ins on tickets from ticketActions * @dev Internal method called by `batchActions` * @param _ticketActions array of TicketAction structs for which check-ins occur */ function _checkIn(TicketAction[] calldata _ticketActions) internal { for (uint256 i = 0; i < _ticketActions.length; i++) { uint256 _tokenId = _ticketActions[i].tokenId; require(!isInvalidated(_tokenId) && !isCheckedIn(_tokenId), "EventImplementation: Error on check-in"); _setCheckedInFlag(_tokenId, true); _setUnlockedFlag(_tokenId, true); } IEconomics _econ = registry.economics(); (uint256 _fuel, uint256 _fuelProtocol) = _econ.spendTicketReserved(msg.sender, uint32(_ticketActions.length)); emit CheckedIn(_ticketActions, _fuel, _fuelProtocol); } /** * @notice Performs invalidations on tickets from ticketActions * @dev Internal method called by `batchActions` * @param _ticketActions array of TicketAction structs for which invalidadtions occur */ function _invalidate(TicketAction[] calldata _ticketActions) internal { for (uint256 i = 0; i < _ticketActions.length; i++) { uint256 _tokenId = _ticketActions[i].tokenId; require(!isInvalidated(_tokenId), "EventImplementation: Error on ticket invalidation"); _setInvalidatedFlag(_tokenId, true); _burn(_tokenId); } IEconomics _econ = registry.economics(); (uint256 _fuel, uint256 _fuelProtocol) = _econ.spendTicketReserved(msg.sender, uint32(_ticketActions.length)); emit Invalidated(_ticketActions, _fuel, _fuelProtocol); } /** * @notice Performs claims on tickets from ticketActions * @dev Internal method called by `batchActions` * @param _ticketActions array of TicketAction structs for whihc claims occur */ function _claim(TicketAction[] calldata _ticketActions) internal { for (uint256 i = 0; i < _ticketActions.length; i++) { uint256 _tokenId = _ticketActions[i].tokenId; require(isCustodial(_tokenId) && !isInvalidated(_tokenId), "EventImplementation: Error on NFT claim"); _transfer(ownerOf(_tokenId), _ticketActions[i].to, _tokenId); } emit Claimed(_ticketActions, 0, 0); } /// @dev Event Lifecycle Methods /** * @notice Sets the event data for an EventImplementation contract * @dev can only be called by the EventFactory contract typically at contract creation * @param _eventData EventData struct */ function setEventData(EventData calldata _eventData) external onlyFactory { eventData = _eventData; emit EventDataSet(_eventData); } /** * @notice Updates the event data for an EventImplementation contract * @dev can only be called by an integrator's relayer * @param _eventData EventData struct */ function updateEventData(EventData calldata _eventData) external onlyRelayer { eventData = _eventData; emit EventDataUpdated(_eventData); } /** * @notice Updates the EventFinancing struct * @dev can only be called by the EventFactory contract * @param _financing EventFinancing struct */ function setFinancing(EventFinancing calldata _financing) external onlyFactory { eventFinancing = _financing; emit UpdateFinancing(_financing); } /// @dev ERC-721 Overrides /** * @notice Returns the token URI * @dev The token URI is resolved from the _baseURI, event index and tokenId * @param _tokenId ticket identifier and ERC721 tokenId * @return _tokenURI token URI */ function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _uri = _baseURI(); return bytes(_uri).length > 0 ? string(abi.encodePacked(_uri, uint256(eventData.index).toString(), "/", _tokenId.toString())) : ""; } /** * @notice Returns base URI * @dev The baseURI at any time is universal across all EventImplementation contracts * @return _baseURI token URI */ function _baseURI() internal view virtual override returns (string memory) { return registry.baseURI(); } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address _from, address _to, uint256 _tokenId ) public virtual override { require(isUnlocked(_tokenId), "EventImplementation: ticket must be unlocked"); return super.transferFrom(_from, _to, _tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId ) public virtual override { require(isUnlocked(_tokenId), "EventImplementation: ticket must be unlocked"); return super.safeTransferFrom(_from, _to, _tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes memory _data ) public virtual override { require(isUnlocked(_tokenId), "EventImplementation: ticket must be unlocked"); return super.safeTransferFrom(_from, _to, _tokenId, _data); } /** * @notice Returns contract owner * @dev Not a full Ownable implementation, used to return a static owner for marketplace config only * @return _owner owner address */ function owner() public view virtual returns (address) { return address(0x3aFdff6fCDD01E7DA59c615D3958C5fEc0e889Fd); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "../interfaces/IEventImplementation.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ abstract contract EventERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; // Token name string internal _name; // Token symbol string internal _symbol; // Token-specific data struct mapping(uint256 => IEventImplementation.TokenData) public tokenData; // Address-specific data struct mapping(address => IEventImplementation.AddressData) internal _addressData; // Mapping from token ID to approved address mapping(uint256 => address) internal _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) internal _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ // solhint-disable-next-line func-name-mixedcase function __ERC721_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721_init_unchained(name_, symbol_); } // solhint-disable-next-line func-name-mixedcase function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _addressData[owner].balance; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = tokenData[tokenId].owner; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = EventERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, * - which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return tokenData[tokenId].owner != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = EventERC721Upgradeable.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, * - which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(IEventImplementation.TicketAction memory ticketAction) internal virtual { _safeMint(ticketAction, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(IEventImplementation.TicketAction memory ticketAction, bytes memory _data) internal virtual { _mint(ticketAction); require( _checkOnERC721Received(address(0), ticketAction.to, ticketAction.tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(IEventImplementation.TicketAction memory ticketAction) internal virtual { require(ticketAction.to != address(0), "ERC721: mint to the zero address"); require(!_exists(ticketAction.tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), ticketAction.to, ticketAction.tokenId); tokenData[ticketAction.tokenId] = IEventImplementation.TokenData(ticketAction.to, ticketAction.basePrice, 0); emit Transfer(address(0), ticketAction.to, ticketAction.tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = EventERC721Upgradeable.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _addressData[owner].balance -= 1; _addressData[address(0)].balance += 1; tokenData[tokenId].owner = address(0); emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(EventERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _addressData[from].balance -= 1; _addressData[to].balance += 1; tokenData[tokenId].owner = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(EventERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) internal returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == IERC721ReceiverUpgradeable.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { //solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} uint256[44] internal __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "../interfaces/IRegistry.sol"; /** * @title AuthModifiers Contract * @author GET Protocol * @notice This contract provides access control modifiers to the Auth contract * @dev It's implemented as an abstract contract */ abstract contract AuthModifiers is Initializable { IRegistry private registry; // solhint-disable-next-line func-name-mixedcase function __AuthModifiers_init_unchained(address _registry) internal initializer { registry = IRegistry(_registry); } /** * @dev initialization function for proxy contract * @param _registry the Registry contract address */ // solhint-disable-next-line func-name-mixedcase function __AuthModifiers_init(address _registry) public initializer { __AuthModifiers_init_unchained(_registry); } /** * @dev Throws if called by any account other than a GET Protocol Relayer admin account. */ modifier onlyIntegratorAdmin() { registry.auth().hasIntegratorAdminRole(msg.sender); _; } /** * @dev Throws if called by any account other than a GET Protocol Relayer account. */ modifier onlyRelayer() { registry.auth().hasRelayerRole(msg.sender); _; } /** * @dev Throws if called by any contract other than a GET Protocol Factory contract. */ modifier onlyFactory() { registry.auth().hasFactoryRole(msg.sender); _; } /** * @dev Throws if called by any contract different from an instance of a GET protocol Event Contract */ modifier onlyEvent() { registry.auth().hasEventRole(msg.sender); _; } /** * @dev Throws if called by any contract other than the GET Protocol FuelDistributor Contract. */ modifier onlyFuelDistributor() { registry.auth().hasFuelDistributorRole(msg.sender); _; } /** * @dev Throws if called by any contract other than the GET Protocol TopUp Contract. */ modifier onlyTopUp() { registry.auth().hasTopUpRole(msg.sender); _; } /** * @dev Throws if called by any account other than the GET Protocol EOA(S) designated for TopUps. */ modifier onlyCustodialTopUp() { registry.auth().hasCustodialTopUpRole(msg.sender); _; } /** * @dev Throws if called by any contract other than the PriceOracle update EOA. */ modifier onlyPriceOracle() { registry.auth().hasPriceOracleRole(msg.sender); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./IAuth.sol"; import "./IEconomics.sol"; import "./IEventFactory.sol"; import "./IPriceOracle.sol"; import "./ITopUp.sol"; interface IRegistry { event UpdateAuth(address old, address updated); event UpdateEconomics(address old, address updated); event UpdateEventFactory(address old, address updated); event UpdatePriceOracle(address old, address updated); event UpdateFuelDistributor(address old, address updated); event UpdateTopUp(address old, address updated); event UpdateBaseURI(string old, string updated); function auth() external view returns (IAuth); function economics() external view returns (IEconomics); function eventFactory() external view returns (IEventFactory); function priceOracle() external view returns (IPriceOracle); function topUp() external view returns (ITopUp); function baseURI() external view returns (string memory); function setAuth(address _auth) external; function setEconomics(address _economics) external; function setEventFactory(address _eventFactory) external; function setPriceOracle(address _priceOracle) external; function setFuelDistributor(address _fuelDistributor) external; function setTopUp(address _topUp) external; function setBaseURI(string memory _baseURI) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface IEventImplementation { enum TicketFlags { SCANNED, // 0 CHECKED_IN, // 1 INVALIDATED, // 2 UNLOCKED // 3 } struct BalanceUpdates { address owner; uint64 quantity; } struct TokenData { address owner; uint40 basePrice; uint8 booleanFlags; } struct AddressData { // uint64 more than enough uint64 balance; } struct EventData { uint32 index; uint64 startTime; uint64 endTime; int32 latitude; int32 longitude; string currency; string name; string shopUrl; string imageUrl; } struct TicketAction { uint256 tokenId; bytes32 externalId; // sha256 hashed, emitted in event only. address to; uint64 orderTime; uint40 basePrice; } struct EventFinancing { uint64 palletIndex; address bondCouncil; bool inventoryRegistered; bool financingActive; bool primaryBlocked; bool secondaryBlocked; bool scanBlocked; bool claimBlocked; } event PrimarySale(TicketAction[] ticketActions, uint256 getUsed, uint256 getUsedProtocol); event SecondarySale(TicketAction[] ticketActions, uint256 getUsed, uint256 getUsedProtocol); event Scanned(TicketAction[] ticketActions, uint256 getUsed, uint256 getUsedProtocol); event CheckedIn(TicketAction[] ticketActions, uint256 getUsed, uint256 getUsedProtocol); event Invalidated(TicketAction[] ticketActions, uint256 getUsed, uint256 getUsedProtocol); event Claimed(TicketAction[] ticketActions, uint256 getUsed, uint256 getUsedProtocol); event EventDataSet(EventData eventData); event EventDataUpdated(EventData eventData); event UpdateFinancing(EventFinancing financing); function batchActions( TicketAction[] calldata _ticketActions, uint8[] memory _actionCounts, BalanceUpdates[] calldata _balanceUpdates ) external; function isScanned(uint256 _tokenId) external returns (bool _status); function isCheckedIn(uint256 _tokenId) external returns (bool _status); function isInvalidated(uint256 _tokenId) external returns (bool _status); function isUnlocked(uint256 _tokenId) external returns (bool _status); function isCustodial(uint256 _tokenId) external returns (bool _status); function setEventData(EventData memory _eventData) external; function updateEventData(EventData memory _eventData) external; function setFinancing(EventFinancing memory _financing) external; function owner() external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @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 // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721Upgradeable.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { 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 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 IERC165Upgradeable { /** * @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.4; import "@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol"; interface IAuth is IAccessControlUpgradeable { function hasIntegratorAdminRole(address) external view; function hasFactoryRole(address) external view; function hasEventRole(address) external view; function hasFuelDistributorRole(address) external view; function hasRelayerRole(address) external view; function hasTopUpRole(address) external view; function hasCustodialTopUpRole(address) external view; function hasPriceOracleRole(address) external view; function grantEventRole(address) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./IEventImplementation.sol"; interface IEconomics { // Data structure containing all the different rates for a particular relayer. // 100% (1) 1_000_000, // 10% (0.1) = 100_000, // 1% (0.01) = 10_000, // 0.1% (0.001) = 1_000, // 0.01% (0.0001) = 100, // 0.001% (0,00001) = 10, // 0.0001% = (0.000001) = 1 // All scaled by 1_000_000. // // USD values (e.g. minFee, maxFee) are scaled by 1_000 (tenth of a cent). struct DynamicRates { uint24 minFeePrimary; uint24 maxFeePrimary; uint24 primaryRate; uint24 minFeeSecondary; uint24 maxFeeSecondary; uint24 secondaryRate; uint24 salesTaxRate; } // Largely unnecesary to define separately but helps avoid stack too deep errors within reserved fuel calculations. struct Rate { uint24 minFee; uint24 maxFee; uint24 rate; } struct IntegratorData { uint32 index; uint32 activeTicketCount; bool isBillingEnabled; bool isConfigured; uint256 price; uint256 availableFuel; uint256 reservedFuel; uint256 reservedFuelProtocol; string name; } struct RelayerData { uint32 integratorIndex; } struct SpentFuel { uint256 total; uint256 protocol; uint32 ticketCount; } event IntegratorToppedUp( uint32 indexed integratorIndex, uint256 indexed total, uint256 price, uint256 indexed newAveragePrice, uint256 salesTax ); event FuelReservedPrimary(uint32 integratorIndex, uint32 ticketCount, uint256 fuel, uint256 fuelProtocol); event FuelReservedSecondary(uint32 integratorIndex, uint32 ticketCount, uint256 fuel, uint256 fuelProtocol); event BasicTaxCharged(uint32 integratorIndex, uint32 actionCount, uint256 fuel, uint256 fuelProtocol); event TicketFuelEmptied(uint32 integratorIndex, uint32 ticketCount, uint256 fuel, uint256 fuelProtocol); event SpentFuelCollected(SpentFuel spentFuel); event SalesTaxFuelCollected(address salesTaxFuelDesintation, uint256 salesTaxFuel); event AccountBalanceCorrected( uint32 integratorIndex, uint256 oldAvailableFuel, uint256 newAvailableFuel, uint256 oldReservedBalance, uint256 newReservedBalance, uint256 oldReservedBalanceProtocol, uint256 newReservedBalanceProtocol ); event UpdateBasicTaxRate(uint24 old, uint24 updated); event UpdateFuelToken(address old, address updated); event UpdateSpentFuel(SpentFuel spentFuel); event UpdateDynamicRates(uint32 integratorIndex, DynamicRates dynamicRates); event UpdateProtocolRates(DynamicRates protocolRates); event UpdateSalesTaxFuelDestination(address salesTaxFuelDestination); event IntegratorConfigured(uint32 integratorIndex, string name, address relayerAddress, DynamicRates dynamicRates); event IntegratorActivated(uint32 integratorIndex); event IntegratorDisabled(uint32 integratorIndex); event RelayerAdded(address relayerAddress, uint32 integratorIndex); event RelayerRemoved(address relayerAddress, uint32 integratorIndex); event BillingStatusUpdated(uint32 integeratorIndex, bool status); event ConfigurationStatusUpdated(uint32 integratorIndex, bool status); event EnableIntegratorBilling(uint32 integratorIndex); event DisableIntegratorBilling(uint32 integratorIndex); event UpdateIntegratorTicketCount(uint32 integratorIndex, uint256 activeTicketCount); event UpdateIntegratorPrice(uint32 integratorIndex, uint256 price); event UpdateIntegratorName(uint32 integratorIndex, string name); function fuelToken() external returns (IERC20); function basicTaxRate() external returns (uint24); function spentFuel() external returns ( uint256, uint256, uint32 ); function integratorCount() external returns (uint32); function topUpIntegrator( uint32 _integratorIndex, address _sender, uint256 _amount, uint256 _price ) external returns (uint256); function reserveFuelPrimarySale(address _relayerAddress, IEventImplementation.TicketAction[] memory _ticketActions) external returns (uint256, uint256); function reserveFuelSecondarySale( address _relayerAddress, IEventImplementation.TicketAction[] memory _ticketActions ) external returns (uint256, uint256); function spendBasicAction(address _relayerAddress, uint32 _actionCount) external returns (uint256, uint256); function spendTicketReserved(address _relayerAddress, uint32 _ticketCount) external returns (uint256, uint256); function collectSpentFuel() external returns (uint256, uint256); function collectSalesTaxFuel() external; function correctAccountBalance( uint32 _integratorIndex, uint256 _newAvailableFuel, uint256 _newReservedFuel ) external; function setupIntegrator( string calldata _name, address _relayerAddress, DynamicRates calldata _dynamicRates, uint256 _price ) external; function activateIntegrator(uint32 _integratorIndex) external; function disableIntegrator(uint32 _integratorIndex) external; function addRelayer(address _relayerAddress, uint32 _integratorIndex) external; function removeRelayer(address _relayerAddress) external; function setDynamicRates(uint32 _integratorIndex, DynamicRates memory dynamicRates) external; function setProtocolRates(DynamicRates memory dynamicRates) external; function setSalesTaxFuelDestination(address _salesTaxFuelDestination) external; function enableIntegratorBilling(uint32 _integratorIndex) external; function disableIntegratorBilling(uint32 _integratorIndex) external; function setBasicTaxRate(uint24 _basicTaxRate) external; function setFuelToken(address _fuelToken) external; function setSpentFuel(SpentFuel calldata _spentFuel) external; function emergencyWithdraw( address _asset, address _to, uint256 _amount ) external; function setBillingStatus(uint32 _integratorIndex, bool status) external; function setConfigurationStatus(uint32 _integratorIndex, bool status) external; function setIntegratorTicketCount(uint32 _integratorIndex, uint32 _activeTicketCount) external; function setIntegratorPrice(uint32 _integratorIndex, uint256 _price) external; function setIntegratorName(uint32 _integratorIndex, string calldata _name) external; function viewIntegratorUSDBalance(uint32 _integratorIndex) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface IEventFactory { event EventCreated(uint256 indexed eventIndex, address indexed eventImplementationProxy); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface IPriceOracle { event UpdatePrice(uint256 old, uint256 updated); function price() external view returns (uint256); function lastUpdateTimestamp() external view returns (uint32); function setPrice(uint256 _price) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol"; interface ITopUp { event ToppedUpCustodial( uint32 indexed integratorIndex, address indexed debitedAccount, uint256 availableFuel, uint256 amountFuel, uint256 price, bytes32 externalId ); event ToppedUpCustodial0x( uint32 indexed integratorIndex, address indexed debitedAccount, uint256 availableFuel, uint256 amountFuel, uint256 price, bytes32 externalId ); event ToppedUpNonCustodial( uint32 indexed integratorIndex, address indexed debitedAccount, uint256 availableFuel, uint256 amountFuel, uint256 price ); event UpdateBaseToken(address old, address updated); event UpdateWeth(address old, address updated); event UpdateRouter(address old, address updated); event UpdateOracle(address old, address updated); function baseToken() external returns (IERC20Metadata); function weth() external returns (IERC20); function router() external returns (IUniswapV2Router02); function topUpCustodial( uint32 _integratorIndex, uint256 _amountIn, uint256 _amountOutMin, bytes32 _externalId ) external; function topUpNonCustodial(uint32 _integratorIndex, uint256 _amountFuel) external; function pause() external; function unpause() external; function setBaseToken(address _baseToken) external; function setWeth(address _weth) external; function setRouter(address _router) external; function setApprovals() external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.4; import './IUniswapV2Router01.sol'; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.4; interface IUniswapV2Router01 { function factory() external view returns (address); function WETH() external view returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); }
{ "metadata": { "bytecodeHash": "none" }, "optimizer": { "enabled": true, "runs": 800 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"externalId","type":"bytes32"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint64","name":"orderTime","type":"uint64"},{"internalType":"uint40","name":"basePrice","type":"uint40"}],"indexed":false,"internalType":"struct IEventImplementation.TicketAction[]","name":"ticketActions","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"getUsed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"getUsedProtocol","type":"uint256"}],"name":"CheckedIn","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"externalId","type":"bytes32"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint64","name":"orderTime","type":"uint64"},{"internalType":"uint40","name":"basePrice","type":"uint40"}],"indexed":false,"internalType":"struct IEventImplementation.TicketAction[]","name":"ticketActions","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"getUsed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"getUsedProtocol","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"index","type":"uint32"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"int32","name":"latitude","type":"int32"},{"internalType":"int32","name":"longitude","type":"int32"},{"internalType":"string","name":"currency","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"shopUrl","type":"string"},{"internalType":"string","name":"imageUrl","type":"string"}],"indexed":false,"internalType":"struct IEventImplementation.EventData","name":"eventData","type":"tuple"}],"name":"EventDataSet","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"index","type":"uint32"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"int32","name":"latitude","type":"int32"},{"internalType":"int32","name":"longitude","type":"int32"},{"internalType":"string","name":"currency","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"shopUrl","type":"string"},{"internalType":"string","name":"imageUrl","type":"string"}],"indexed":false,"internalType":"struct IEventImplementation.EventData","name":"eventData","type":"tuple"}],"name":"EventDataUpdated","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"externalId","type":"bytes32"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint64","name":"orderTime","type":"uint64"},{"internalType":"uint40","name":"basePrice","type":"uint40"}],"indexed":false,"internalType":"struct IEventImplementation.TicketAction[]","name":"ticketActions","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"getUsed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"getUsedProtocol","type":"uint256"}],"name":"Invalidated","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"externalId","type":"bytes32"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint64","name":"orderTime","type":"uint64"},{"internalType":"uint40","name":"basePrice","type":"uint40"}],"indexed":false,"internalType":"struct IEventImplementation.TicketAction[]","name":"ticketActions","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"getUsed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"getUsedProtocol","type":"uint256"}],"name":"PrimarySale","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"externalId","type":"bytes32"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint64","name":"orderTime","type":"uint64"},{"internalType":"uint40","name":"basePrice","type":"uint40"}],"indexed":false,"internalType":"struct IEventImplementation.TicketAction[]","name":"ticketActions","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"getUsed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"getUsedProtocol","type":"uint256"}],"name":"Scanned","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"externalId","type":"bytes32"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint64","name":"orderTime","type":"uint64"},{"internalType":"uint40","name":"basePrice","type":"uint40"}],"indexed":false,"internalType":"struct IEventImplementation.TicketAction[]","name":"ticketActions","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"getUsed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"getUsedProtocol","type":"uint256"}],"name":"SecondarySale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"palletIndex","type":"uint64"},{"internalType":"address","name":"bondCouncil","type":"address"},{"internalType":"bool","name":"inventoryRegistered","type":"bool"},{"internalType":"bool","name":"financingActive","type":"bool"},{"internalType":"bool","name":"primaryBlocked","type":"bool"},{"internalType":"bool","name":"secondaryBlocked","type":"bool"},{"internalType":"bool","name":"scanBlocked","type":"bool"},{"internalType":"bool","name":"claimBlocked","type":"bool"}],"indexed":false,"internalType":"struct IEventImplementation.EventFinancing","name":"financing","type":"tuple"}],"name":"UpdateFinancing","type":"event"},{"inputs":[{"internalType":"address","name":"_registry","type":"address"}],"name":"__AuthModifiers_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_registry","type":"address"}],"name":"__EventImplementation_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"externalId","type":"bytes32"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint64","name":"orderTime","type":"uint64"},{"internalType":"uint40","name":"basePrice","type":"uint40"}],"internalType":"struct IEventImplementation.TicketAction[]","name":"_ticketActions","type":"tuple[]"},{"internalType":"uint8[]","name":"_actionCounts","type":"uint8[]"},{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint64","name":"quantity","type":"uint64"}],"internalType":"struct IEventImplementation.BalanceUpdates[]","name":"_balanceUpdates","type":"tuple[]"}],"name":"batchActions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eventData","outputs":[{"internalType":"uint32","name":"index","type":"uint32"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"int32","name":"latitude","type":"int32"},{"internalType":"int32","name":"longitude","type":"int32"},{"internalType":"string","name":"currency","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"shopUrl","type":"string"},{"internalType":"string","name":"imageUrl","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eventFinancing","outputs":[{"internalType":"uint64","name":"palletIndex","type":"uint64"},{"internalType":"address","name":"bondCouncil","type":"address"},{"internalType":"bool","name":"inventoryRegistered","type":"bool"},{"internalType":"bool","name":"financingActive","type":"bool"},{"internalType":"bool","name":"primaryBlocked","type":"bool"},{"internalType":"bool","name":"secondaryBlocked","type":"bool"},{"internalType":"bool","name":"scanBlocked","type":"bool"},{"internalType":"bool","name":"claimBlocked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isCheckedIn","outputs":[{"internalType":"bool","name":"_status","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isCustodial","outputs":[{"internalType":"bool","name":"_status","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isInvalidated","outputs":[{"internalType":"bool","name":"_status","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isScanned","outputs":[{"internalType":"bool","name":"_status","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isUnlocked","outputs":[{"internalType":"bool","name":"_status","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"index","type":"uint32"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"int32","name":"latitude","type":"int32"},{"internalType":"int32","name":"longitude","type":"int32"},{"internalType":"string","name":"currency","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"shopUrl","type":"string"},{"internalType":"string","name":"imageUrl","type":"string"}],"internalType":"struct IEventImplementation.EventData","name":"_eventData","type":"tuple"}],"name":"setEventData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"palletIndex","type":"uint64"},{"internalType":"address","name":"bondCouncil","type":"address"},{"internalType":"bool","name":"inventoryRegistered","type":"bool"},{"internalType":"bool","name":"financingActive","type":"bool"},{"internalType":"bool","name":"primaryBlocked","type":"bool"},{"internalType":"bool","name":"secondaryBlocked","type":"bool"},{"internalType":"bool","name":"scanBlocked","type":"bool"},{"internalType":"bool","name":"claimBlocked","type":"bool"}],"internalType":"struct IEventImplementation.EventFinancing","name":"_financing","type":"tuple"}],"name":"setFinancing","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenData","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint40","name":"basePrice","type":"uint40"},{"internalType":"uint8","name":"booleanFlags","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"index","type":"uint32"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"int32","name":"latitude","type":"int32"},{"internalType":"int32","name":"longitude","type":"int32"},{"internalType":"string","name":"currency","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"shopUrl","type":"string"},{"internalType":"string","name":"imageUrl","type":"string"}],"internalType":"struct IEventImplementation.EventData","name":"_eventData","type":"tuple"}],"name":"updateEventData","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b506200010b565b6000620000f630620000fc60201b620019121760201c565b15905090565b6001600160a01b03163b151590565b61474b806200011b6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a85bfd8a11610097578063b88d4fde11610071578063b88d4fde146104e1578063c87b56dd146104f4578063d4d3119214610507578063e985e9c51461051a57600080fd5b8063a85bfd8a1461039d578063abdd97441461045c578063b4b5b48f1461046f57600080fd5b80638da5cb5b116100d35780638da5cb5b1461035557806395d89b411461036f5780639bccd1cd14610377578063a22cb4651461038a57600080fd5b806370a082311461030e57806372abc8b71461032f57806381ddd5081461034257600080fd5b8063298ae216116101665780634977d03b116101405780634977d03b146102c25780635ddda513146102d55780635df67794146102e85780636352211e146102fb57600080fd5b8063298ae216146102895780632d103c951461029c57806342842e0e146102af57600080fd5b8063095ea7b3116101a2578063095ea7b31461023157806323b872dd14610246578063248fd9a714610259578063254641e41461026c57600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063081812fc14610206575b600080fd5b6101dc6101d73660046134cd565b610556565b60405190151581526020015b60405180910390f35b6101f96105a8565b6040516101e89190613542565b610219610214366004613555565b61063a565b6040516001600160a01b0390911681526020016101e8565b61024461023f366004613583565b6106d4565b005b6102446102543660046135af565b6107ea565b610244610267366004613681565b61085f565b610274610c43565b6040516101e899989796959493929190613749565b6101dc610297366004613555565b610edf565b6102446102aa3660046137e2565b610f02565b6102446102bd3660046135af565b610fc5565b6102446102d03660046137ff565b61103a565b6102446102e336600461387d565b611156565b6101dc6102f6366004613555565b611299565b610219610309366004613555565b6112bd565b61032161031c3660046137e2565b611348565b6040519081526020016101e8565b6101dc61033d366004613555565b6113ec565b610244610350366004613901565b611464565b733afdff6fcdd01e7da59c615d3958c5fec0e889fd610219565b6101f9611575565b6102446103853660046137ff565b611584565b610244610398366004613938565b611695565b609e54609f546104029167ffffffffffffffff8116916001600160a01b03680100000000000000008304169160ff600160e01b8204811692600160e81b8304821692600160f01b8104831692600160f81b909104811691808216916101009091041688565b6040805167ffffffffffffffff90991689526001600160a01b03909716602089015294151595870195909552911515606086015215156080850152151560a084015290151560c0830152151560e0820152610100016101e8565b6101dc61046a366004613555565b61175a565b6104b361047d366004613555565b6067602052600090815260409020546001600160a01b03811690600160a01b810464ffffffffff1690600160c81b900460ff1683565b604080516001600160a01b03909416845264ffffffffff909216602084015260ff16908201526060016101e8565b6102446104ef3660046139e0565b61177e565b6101f9610502366004613555565b6117fa565b6101dc610515366004613555565b6118f6565b6101dc610528366004613a8f565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b60006001600160e01b031982166380ac58cd60e01b148061058757506001600160e01b03198216635b5e139f60e01b145b806105a257506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060606580546105b790613abd565b80601f01602080910402602001604051908101604052809291908181526020018280546105e390613abd565b80156106305780601f1061060557610100808354040283529160200191610630565b820191906000526020600020905b81548152906001019060200180831161061357829003601f168201915b5050505050905090565b6000818152606760205260408120546001600160a01b03166106b85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b60006106df826112bd565b9050806001600160a01b0316836001600160a01b0316141561074d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106af565b336001600160a01b038216148061076957506107698133610528565b6107db5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106af565b6107e58383611921565b505050565b6107f3816113ec565b6108545760405162461bcd60e51b815260206004820152602c60248201527f4576656e74496d706c656d656e746174696f6e3a207469636b6574206d75737460448201526b081899481d5b9b1bd8dad95960a21b60648201526084016106af565b6107e583838361198f565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d69190613af2565b60405163cab6d5af60e01b81523360048201526001600160a01b03919091169063cab6d5af9060240160006040518083038186803b15801561091757600080fd5b505afa15801561092b573d6000803e3d6000fd5b505050506000805b84811015610c3957600086868381811061094f5761094f613b0f565b90506020020160208101906109649190613b25565b6109719060ff1684613b5e565b9050811580156109a9575086868381811061098e5761098e613b0f565b90506020020160208101906109a39190613b25565b60ff1615155b15610a3157609e54600160f01b900460ff1615610a145760405162461bcd60e51b8152602060048201526024808201527f4576656e7446696e616e63696e673a20496e76656e746f72792052657374726960448201526318dd195960e21b60648201526084016106af565b610a2a610a2382858b8d613b76565b8787611a16565b9150610c27565b816001148015610a695750868683818110610a4e57610a4e613b0f565b9050602002016020810190610a639190613b25565b60ff1615155b15610a8257610a2a610a7d82858b8d613b76565b611c63565b816002148015610aba5750868683818110610a9f57610a9f613b0f565b9050602002016020810190610ab49190613b25565b60ff1615155b15610b3257609f5460ff1615610b1e5760405162461bcd60e51b8152602060048201526024808201527f4576656e7446696e616e63696e673a20496e76656e746f72792052657374726960448201526318dd195960e21b60648201526084016106af565b610a2a610b2d82858b8d613b76565b611e7f565b816003148015610b6a5750868683818110610b4f57610b4f613b0f565b9050602002016020810190610b649190613b25565b60ff1615155b15610b8357610a2a610b7e82858b8d613b76565b612069565b816004148015610bbb5750868683818110610ba057610ba0613b0f565b9050602002016020810190610bb59190613b25565b60ff1615155b15610bd457610a2a610bcf82858b8d613b76565b612270565b816005148015610c0c5750868683818110610bf157610bf1613b0f565b9050602002016020810190610c069190613b25565b60ff1615155b15610c2557610a2a610c2082858b8d613b76565b612463565b505b80610c3181613ba3565b915050610933565b5050505050505050565b60998054609a805463ffffffff83169367ffffffffffffffff64010000000085048116946c01000000000000000000000000810490911693600160a01b8204600390810b947801000000000000000000000000000000000000000000000000909304900b9291610cb290613abd565b80601f0160208091040260200160405190810160405280929190818152602001828054610cde90613abd565b8015610d2b5780601f10610d0057610100808354040283529160200191610d2b565b820191906000526020600020905b815481529060010190602001808311610d0e57829003601f168201915b505050505090806002018054610d4090613abd565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6c90613abd565b8015610db95780601f10610d8e57610100808354040283529160200191610db9565b820191906000526020600020905b815481529060010190602001808311610d9c57829003601f168201915b505050505090806003018054610dce90613abd565b80601f0160208091040260200160405190810160405280929190818152602001828054610dfa90613abd565b8015610e475780601f10610e1c57610100808354040283529160200191610e47565b820191906000526020600020905b815481529060010190602001808311610e2a57829003601f168201915b505050505090806004018054610e5c90613abd565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8890613abd565b8015610ed55780601f10610eaa57610100808354040283529160200191610ed5565b820191906000526020600020905b815481529060010190602001808311610eb857829003601f168201915b5050505050905089565b6000818152606760205260408120546105a290600160c81b900460ff168261257d565b600054610100900460ff16610f1d5760005460ff1615610f21565b303b155b610f845760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106af565b600054610100900460ff16158015610fa6576000805461ffff19166101011790555b610faf826125a5565b8015610fc1576000805461ff00191690555b5050565b610fce816113ec565b61102f5760405162461bcd60e51b815260206004820152602c60248201527f4576656e74496d706c656d656e746174696f6e3a207469636b6574206d75737460448201526b081899481d5b9b1bd8dad95960a21b60648201526084016106af565b6107e5838383612679565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561108d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b19190613af2565b604051630160462d60e51b81523360048201526001600160a01b039190911690632c08c5a09060240160006040518083038186803b1580156110f257600080fd5b505afa158015611106573d6000803e3d6000fd5b5050505080609981816111199190613d5d565b9050507f958566cf628c92f9351ddd9785bd2156df12a9c4ffb3814098eebe91a69956a68160405161114b9190613fc6565b60405180910390a150565b600054610100900460ff166111715760005460ff1615611175565b303b155b6111d85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106af565b600054610100900460ff161580156111fa576000805461ffff19166101011790555b61126d86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a01819004810282018101909252888152925088915087908190840183828082843760009201919091525061269492505050565b61127682610f02565b61127f82612768565b8015611291576000805461ff00191690555b505050505050565b6000818152606760205260408120546105a290600160c81b900460ff16600261257d565b6000818152606760205260408120546001600160a01b0316806105a25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016106af565b60006001600160a01b0382166113c65760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016106af565b506001600160a01b031660009081526068602052604090205467ffffffffffffffff1690565b6099546000908190429061141d906c01000000000000000000000000900467ffffffffffffffff1662015180614103565b60008581526067602052604090205467ffffffffffffffff919091169190911115915061145590600160c81b900460ff16600361257d565b8061145d5750805b9392505050565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114db9190613af2565b604051630160462d60e51b81523360048201526001600160a01b039190911690632c08c5a09060240160006040518083038186803b15801561151c57600080fd5b505afa158015611530573d6000803e3d6000fd5b5050505080609e8181611543919061413c565b9050507fe8e0d9c2eed58cd24a8857d101285ac4d4093fef050a79803be2cc64d45658ca8160405161114b9190614333565b6060606680546105b790613abd565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fb9190613af2565b60405163cab6d5af60e01b81523360048201526001600160a01b03919091169063cab6d5af9060240160006040518083038186803b15801561163c57600080fd5b505afa158015611650573d6000803e3d6000fd5b5050505080609981816116639190613d5d565b9050507f11c10cf3cbb6f8fa7801265868e7a4dcf315772778bf51d17b0e18f3128a08f18160405161114b9190613fc6565b6001600160a01b0382163314156116ee5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106af565b336000818152606a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152606760205260408120546105a290600160c81b900460ff16600161257d565b611787826113ec565b6117e85760405162461bcd60e51b815260206004820152602c60248201527f4576656e74496d706c656d656e746174696f6e3a207469636b6574206d75737460448201526b081899481d5b9b1bd8dad95960a21b60648201526084016106af565b6117f48484848461283c565b50505050565b6000818152606760205260409020546060906001600160a01b03166118875760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016106af565b60006118916128c4565b905060008151116118b1576040518060200160405280600081525061145d565b60995481906118c59063ffffffff1661293b565b6118ce8561293b565b6040516020016118e0939291906143e7565b6040516020818303038152906040529392505050565b600030611902836112bd565b6001600160a01b03161492915050565b6001600160a01b03163b151590565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611956826112bd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6119993382612a51565b611a0b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016106af565b6107e5838383612b44565b60005b81811015611ae557828282818110611a3357611a33613b0f565b9050604002016020016020810190611a4b9190614437565b60686000858585818110611a6157611a61613b0f565b611a7792602060409092020190810191506137e2565b6001600160a01b03168152602081019190915260400160009081208054909190611aac90849067ffffffffffffffff16614103565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508080611add90613ba3565b915050611a19565b5060005b83811015611b3357611b21858583818110611b0657611b06613b0f565b905060a00201803603810190611b1c9190614469565b612d41565b80611b2b81613ba3565b915050611ae9565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa158015611b7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba29190613af2565b9050600080826001600160a01b0316635a841b493389896040518463ffffffff1660e01b8152600401611bd793929190614582565b60408051808303816000875af1158015611bf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1991906145ae565b915091507f7536f4f9c79a1cbe41e2a0739df4ded83b7e7890356e19f058443bc0256e4edc87878484604051611c5294939291906145d2565b60405180910390a150505050505050565b60005b81811015611d51576000838383818110611c8257611c82613b0f565b905060a00201600001359050611c9781611299565b158015611caa5750611ca8816113ec565b155b611d025760405162461bcd60e51b8152602060048201526024808201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20726560448201526373616c6560e01b60648201526084016106af565b611d3e611d0e826112bd565b858585818110611d2057611d20613b0f565b905060a002016040016020810190611d3891906137e2565b83612b44565b5080611d4981613ba3565b915050611c66565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa158015611d9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc09190613af2565b9050600080826001600160a01b031663a6aafae83387876040518463ffffffff1660e01b8152600401611df593929190614582565b60408051808303816000875af1158015611e13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3791906145ae565b915091507fcf4e3ce2f7e364adde047ba97e589f5d59faab035175a615a2902e8f776a3e2085858484604051611e7094939291906145d2565b60405180910390a15050505050565b60005b81811015611f44576000838383818110611e9e57611e9e613b0f565b905060a00201600001359050611eb381611299565b15611f265760405162461bcd60e51b815260206004820152602960248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20746960448201527f636b6574207363616e000000000000000000000000000000000000000000000060648201526084016106af565b611f31816001612ed0565b5080611f3c81613ba3565b915050611e82565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa158015611f8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb39190613af2565b604051630264fde560e31b815233600482015263ffffffff8416602482015290915060009081906001600160a01b03841690631327ef289060440160408051808303816000875af115801561200c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203091906145ae565b915091507fdcc6310b14e47270a1b88cb2729e18e38d886e7b10ed8b5b55c2b0b07a7c7ab285858484604051611e7094939291906145d2565b60005b8181101561214b57600083838381811061208857612088613b0f565b905060a0020160000135905061209d81611299565b1580156120b057506120ae8161175a565b155b6121225760405162461bcd60e51b815260206004820152602660248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20636860448201527f65636b2d696e000000000000000000000000000000000000000000000000000060648201526084016106af565b61212d816001612f26565b612138816001612f4a565b508061214381613ba3565b91505061206c565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa158015612196573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ba9190613af2565b60405163241047cd60e21b815233600482015263ffffffff8416602482015290915060009081906001600160a01b038416906390411f349060440160408051808303816000875af1158015612213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223791906145ae565b915091507f9647b78aeeea679f1b41a3f725a904aba757a17aa35902423afd9fdcc751b5e685858484604051611e7094939291906145d2565b60005b8181101561233e57600083838381811061228f5761228f613b0f565b905060a002016000013590506122a481611299565b156123175760405162461bcd60e51b815260206004820152603160248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20746960448201527f636b657420696e76616c69646174696f6e00000000000000000000000000000060648201526084016106af565b612322816001612f6e565b61232b81612f92565b508061233681613ba3565b915050612273565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa158015612389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ad9190613af2565b60405163241047cd60e21b815233600482015263ffffffff8416602482015290915060009081906001600160a01b038416906390411f349060440160408051808303816000875af1158015612406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242a91906145ae565b915091507f6e714a965f34ba7ab70054f8de9b53e71c7438577c3bf2df26a916313c4fbfd385858484604051611e7094939291906145d2565b60005b8181101561253a57600083838381811061248257612482613b0f565b905060a00201600001359050612497816118f6565b80156124a957506124a781611299565b155b61251b5760405162461bcd60e51b815260206004820152602760248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e204e4660448201527f5420636c61696d0000000000000000000000000000000000000000000000000060648201526084016106af565b612527611d0e826112bd565b508061253281613ba3565b915050612466565b507ffa2ec35ac48e074e7e268ef68564eaef01afe7a44f966495691d5f1bf045ab55828260008060405161257194939291906145d2565b60405180910390a15050565b6000600160ff8481169084161c811690811461259a57600061259d565b60015b949350505050565b600054610100900460ff166125c05760005460ff16156125c4565b303b155b6126275760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106af565b600054610100900460ff16158015612649576000805461ffff19166101011790555b609780546001600160a01b0319166001600160a01b0384161790558015610fc1576000805461ff00191690555050565b6107e58383836040518060200160405280600081525061177e565b600054610100900460ff166126af5760005460ff16156126b3565b303b155b6127165760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106af565b600054610100900460ff16158015612738576000805461ffff19166101011790555b6127406130b6565b6127486130b6565b6127528383613135565b80156107e5576000805461ff0019169055505050565b600054610100900460ff166127835760005460ff1615612787565b303b155b6127ea5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106af565b600054610100900460ff1615801561280c576000805461ffff19166101011790555b609880546001600160a01b0319166001600160a01b0384161790558015610fc1576000805461ff00191690555050565b6128463383612a51565b6128b85760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016106af565b6117f484848484613217565b60985460408051636c0360eb60e01b815290516060926001600160a01b031691636c0360eb9160048083019260009291908290030181865afa15801561290e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261293691908101906145f9565b905090565b60608161295f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612989578061297381613ba3565b91506129829050600a8361467d565b9150612963565b60008167ffffffffffffffff8111156129a4576129a4613971565b6040519080825280601f01601f1916602001820160405280156129ce576020820181803683370190505b5090505b841561259d576129e3600183614691565b91506129f0600a866146a8565b6129fb906030613b5e565b60f81b818381518110612a1057612a10613b0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a4a600a8661467d565b94506129d2565b6000818152606760205260408120546001600160a01b0316612aca5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106af565b6000612ad5836112bd565b9050806001600160a01b0316846001600160a01b03161480612b105750836001600160a01b0316612b058461063a565b6001600160a01b0316145b8061259d57506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff1661259d565b826001600160a01b0316612b57826112bd565b6001600160a01b031614612bd35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016106af565b6001600160a01b038216612c355760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106af565b612c40600082611921565b6001600160a01b0383166000908152606860205260408120805460019290612c7390849067ffffffffffffffff166146bc565b82546101009290920a67ffffffffffffffff8181021990931691831602179091556001600160a01b03841660009081526068602052604081208054600194509092612cc091859116614103565b825467ffffffffffffffff9182166101009390930a92830291909202199091161790555060008181526067602052604080822080546001600160a01b038087166001600160a01b0319909216821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60408101516001600160a01b0316612d9b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106af565b80516000908152606760205260409020546001600160a01b031615612e025760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106af565b6040805160608101825282820180516001600160a01b039081168352608085015164ffffffffff90811660208086019182526000868801818152895182526067909252878120965187549351925160ff16600160c81b0260ff60c81b1993909516600160a01b027fffffffffffffff000000000000000000000000000000000000000000000000009094169086161792909217169190911790935584519151935191931691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450565b600082815260676020526040812054612ef691600160c81b90910460ff16905b836132a0565b600092835260676020526040909220805460ff93909316600160c81b0260ff60c81b199093169290921790915550565b600082815260676020526040902054612ef690600160c81b900460ff166001612ef0565b600082815260676020526040902054612ef690600160c81b900460ff166003612ef0565b600082815260676020526040902054612ef690600160c81b900460ff166002612ef0565b6000612f9d826112bd565b9050612faa600083611921565b6001600160a01b0381166000908152606860205260408120805460019290612fdd90849067ffffffffffffffff166146bc565b82546101009290920a67ffffffffffffffff818102199093169183160217909155600080805260686020527fad6f8124f6081c2622ab3a16acd47af73d52fe87b755c3f897263c58ba3fdbd7805460019450909261303d91859116614103565b825467ffffffffffffffff9182166101009390930a92830291909202199091161790555060008281526067602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600054610100900460ff166131335760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106af565b565b600054610100900460ff166131505760005460ff1615613154565b303b155b6131b75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106af565b600054610100900460ff161580156131d9576000805461ffff19166101011790555b82516131ec90606590602086019061341b565b50815161320090606690602085019061341b565b5080156107e5576000805461ff0019169055505050565b613222848484612b44565b61322e848484846132c7565b6117f45760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016106af565b600081156132b75750600160ff83161b831761145d565b5050600160ff919091161b191690565b60006001600160a01b0384163b1561341057604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061330b9033908990889088906004016146e5565b6020604051808303816000875af1925050508015613346575060408051601f3d908101601f1916820190925261334391810190614721565b60015b6133f6573d808015613374576040519150601f19603f3d011682016040523d82523d6000602084013e613379565b606091505b5080516133ee5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016106af565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061259d565b506001949350505050565b82805461342790613abd565b90600052602060002090601f016020900481019282613449576000855561348f565b82601f1061346257805160ff191683800117855561348f565b8280016001018555821561348f579182015b8281111561348f578251825591602001919060010190613474565b5061349b92915061349f565b5090565b5b8082111561349b57600081556001016134a0565b6001600160e01b0319811681146134ca57600080fd5b50565b6000602082840312156134df57600080fd5b813561145d816134b4565b60005b838110156135055781810151838201526020016134ed565b838111156117f45750506000910152565b6000815180845261352e8160208601602086016134ea565b601f01601f19169290920160200192915050565b60208152600061145d6020830184613516565b60006020828403121561356757600080fd5b5035919050565b6001600160a01b03811681146134ca57600080fd5b6000806040838503121561359657600080fd5b82356135a18161356e565b946020939093013593505050565b6000806000606084860312156135c457600080fd5b83356135cf8161356e565b925060208401356135df8161356e565b929592945050506040919091013590565b60008083601f84011261360257600080fd5b50813567ffffffffffffffff81111561361a57600080fd5b6020830191508360208260051b850101111561363557600080fd5b9250929050565b60008083601f84011261364e57600080fd5b50813567ffffffffffffffff81111561366657600080fd5b6020830191508360208260061b850101111561363557600080fd5b6000806000806000806060878903121561369a57600080fd5b863567ffffffffffffffff808211156136b257600080fd5b818901915089601f8301126136c657600080fd5b8135818111156136d557600080fd5b8a602060a0830285010111156136ea57600080fd5b60209283019850965090880135908082111561370557600080fd5b6137118a838b016135f0565b9096509450604089013591508082111561372a57600080fd5b5061373789828a0161363c565b979a9699509497509295939492505050565b600061012063ffffffff8c16835267ffffffffffffffff808c166020850152808b166040850152508860030b60608401528760030b60808401528060a084015261379581840188613516565b905082810360c08401526137a98187613516565b905082810360e08401526137bd8186613516565b90508281036101008401526137d28185613516565b9c9b505050505050505050505050565b6000602082840312156137f457600080fd5b813561145d8161356e565b60006020828403121561381157600080fd5b813567ffffffffffffffff81111561382857600080fd5b8201610120818503121561145d57600080fd5b60008083601f84011261384d57600080fd5b50813567ffffffffffffffff81111561386557600080fd5b60208301915083602082850101111561363557600080fd5b60008060008060006060868803121561389557600080fd5b853567ffffffffffffffff808211156138ad57600080fd5b6138b989838a0161383b565b909750955060208801359150808211156138d257600080fd5b506138df8882890161383b565b90945092505060408601356138f38161356e565b809150509295509295909350565b6000610100828403121561391457600080fd5b50919050565b80151581146134ca57600080fd5b80356139338161391a565b919050565b6000806040838503121561394b57600080fd5b82356139568161356e565b915060208301356139668161391a565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156139b0576139b0613971565b604052919050565b600067ffffffffffffffff8211156139d2576139d2613971565b50601f01601f191660200190565b600080600080608085870312156139f657600080fd5b8435613a018161356e565b93506020850135613a118161356e565b925060408501359150606085013567ffffffffffffffff811115613a3457600080fd5b8501601f81018713613a4557600080fd5b8035613a58613a53826139b8565b613987565b818152886020838501011115613a6d57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215613aa257600080fd5b8235613aad8161356e565b915060208301356139668161356e565b600181811c90821680613ad157607f821691505b6020821081141561391457634e487b7160e01b600052602260045260246000fd5b600060208284031215613b0457600080fd5b815161145d8161356e565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613b3757600080fd5b813560ff8116811461145d57600080fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115613b7157613b71613b48565b500190565b60008085851115613b8657600080fd5b83861115613b9357600080fd5b505060a083020193919092039150565b6000600019821415613bb757613bb7613b48565b5060010190565b63ffffffff811681146134ca57600080fd5b67ffffffffffffffff811681146134ca57600080fd5b600081356105a281613bd0565b8060030b81146134ca57600080fd5b600081356105a281613bf3565b6000808335601e19843603018112613c2657600080fd5b83018035915067ffffffffffffffff821115613c4157600080fd5b60200191503681900382131561363557600080fd5b601f8211156107e557600081815260208120601f850160051c81016020861015613c7d5750805b601f850160051c820191505b8181101561129157828155600101613c89565b67ffffffffffffffff831115613cb457613cb4613971565b613cc883613cc28354613abd565b83613c56565b6000601f841160018114613cfc5760008515613ce45750838201355b600019600387901b1c1916600186901b178355613d56565b600083815260209020601f19861690835b82811015613d2d5786850135825560209485019460019092019101613d0d565b5086821015613d4a5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8135613d6881613bbe565b63ffffffff811663ffffffff1983541617825550613db5613d8b60208401613be6565b82546bffffffffffffffff00000000191660209190911b6bffffffffffffffff0000000016178255565b613e09613dc460408401613be6565b82547fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff1660609190911b73ffffffffffffffff00000000000000000000000016178255565b613e64613e1860608401613c02565b8280548260a01b77ffffffff0000000000000000000000000000000000000000167fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff8216178255505050565b613ec3613e7360808401613c02565b8280548260c01b7bffffffff000000000000000000000000000000000000000000000000167fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff8216178255505050565b613ed060a0830183613c0f565b613ede818360018601613c9c565b5050613eed60c0830183613c0f565b613efb818360028601613c9c565b5050613f0a60e0830183613c0f565b613f18818360038601613c9c565b5050613f28610100830183613c0f565b6117f4818360048601613c9c565b803561393381613bbe565b803561393381613bd0565b803561393381613bf3565b6000808335601e19843603018112613f6e57600080fd5b830160208101925035905067ffffffffffffffff811115613f8e57600080fd5b80360383131561363557600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152613fe460208201613fda84613f36565b63ffffffff169052565b6000613ff260208401613f41565b67ffffffffffffffff811660408401525061400f60408401613f41565b67ffffffffffffffff811660608401525061402c60608401613f4c565b61403b608084018260030b9052565b5061404860808401613f4c565b61405760a084018260030b9052565b5061406560a0840184613f57565b6101208060c086015261407d61014086018385613f9d565b925061408c60c0870187613f57565b9250601f19808786030160e08801526140a6858584613f9d565b94506140b560e0890189613f57565b945091506101008188870301818901526140d0868685613f9d565b95506140de818a018a613f57565b9550925050808786030183880152506140f8848483613f9d565b979650505050505050565b600067ffffffffffffffff80831681851680830382111561412657614126613b48565b01949350505050565b600081356105a28161391a565b813561414781613bd0565b67ffffffffffffffff8116905081548167ffffffffffffffff19821617835560208401356141748161356e565b7bffffffffffffffffffffffffffffffffffffffff00000000000000008160401b168363ffffffff60e01b8416171784555050506141f06141b76040840161412f565b8280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560e01b60ff60e01b16919091179055565b6142386141ff6060840161412f565b8280547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560e81b60ff60e81b16919091179055565b6142806142476080840161412f565b8280547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560f01b60ff60f01b16919091179055565b6142e361428f60a0840161412f565b8280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560f81b7fff0000000000000000000000000000000000000000000000000000000000000016919091179055565b6001810161430a6142f660c0850161412f565b825490151560ff1660ff1991909116178255565b6107e561431960e0850161412f565b82805461ff00191691151560081b61ff0016919091179055565b6101008101823561434381613bd0565b67ffffffffffffffff168252602083013561435d8161356e565b6001600160a01b0316602083015260408301356143798161391a565b1515604083015261438c60608401613928565b1515606083015261439f60808401613928565b151560808301526143b260a08401613928565b151560a08301526143c560c08401613928565b151560c08301526143d860e08401613928565b80151560e08401525092915050565b600084516143f98184602089016134ea565b84519083019061440d8183602089016134ea565b602f60f81b9101908152835161442a8160018401602088016134ea565b0160010195945050505050565b60006020828403121561444957600080fd5b813561145d81613bd0565b803564ffffffffff8116811461393357600080fd5b600060a0828403121561447b57600080fd5b60405160a0810181811067ffffffffffffffff8211171561449e5761449e613971565b8060405250823581526020830135602082015260408301356144bf8161356e565b604082015260608301356144d281613bd0565b60608201526144e360808401614454565b60808201529392505050565b8183526000602080850194508260005b85811015614577578135875282820135838801526040808301356145228161356e565b6001600160a01b03169088015260608281013561453e81613bd0565b67ffffffffffffffff1690880152608064ffffffffff61455f848301614454565b169088015260a09687019691909101906001016144ff565b509495945050505050565b6001600160a01b03841681526040602082015260006145a56040830184866144ef565b95945050505050565b600080604083850312156145c157600080fd5b505080516020909101519092909150565b6060815260006145e66060830186886144ef565b6020830194909452506040015292915050565b60006020828403121561460b57600080fd5b815167ffffffffffffffff81111561462257600080fd5b8201601f8101841361463357600080fd5b8051614641613a53826139b8565b81815285602083850101111561465657600080fd5b6145a58260208301602086016134ea565b634e487b7160e01b600052601260045260246000fd5b60008261468c5761468c614667565b500490565b6000828210156146a3576146a3613b48565b500390565b6000826146b7576146b7614667565b500690565b600067ffffffffffffffff838116908316818110156146dd576146dd613b48565b039392505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526147176080830184613516565b9695505050505050565b60006020828403121561473357600080fd5b815161145d816134b456fea164736f6c634300080c000a
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.