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] | |||
---|---|---|---|---|---|---|---|---|---|
0xde4101a75bd19fe7f76eb052b8034b9c43340b336f759f1aa2d5785b3bb58224 | 0x60806040 | 34899304 | 152 days 22 hrs ago | 0xa4caa9fefb39807e5ac197827565432fd94f2de6 | IN | Create: EventImplementation | 0 MATIC | 0.4017047 |
[ 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; bool isZeroEndTime = eventData.endTime == 0; return _getBoolean(tokenData[_tokenId].booleanFlags, uint8(TicketFlags.UNLOCKED)) || (isPastEndTime && !isZeroEndTime); } /** * @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
60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b506200010b565b6000620000f630620000fc60201b620019171760201c565b15905090565b6001600160a01b03163b151590565b61474f806200011b6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a85bfd8a11610097578063b88d4fde11610071578063b88d4fde146104e1578063c87b56dd146104f4578063d4d3119214610507578063e985e9c51461051a57600080fd5b8063a85bfd8a1461039d578063abdd97441461045c578063b4b5b48f1461046f57600080fd5b80638da5cb5b116100d35780638da5cb5b1461035557806395d89b411461036f5780639bccd1cd14610377578063a22cb4651461038a57600080fd5b806370a082311461030e57806372abc8b71461032f57806381ddd5081461034257600080fd5b8063298ae216116101665780634977d03b116101405780634977d03b146102c25780635ddda513146102d55780635df67794146102e85780636352211e146102fb57600080fd5b8063298ae216146102895780632d103c951461029c57806342842e0e146102af57600080fd5b8063095ea7b3116101a2578063095ea7b31461023157806323b872dd14610246578063248fd9a714610259578063254641e41461026c57600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063081812fc14610206575b600080fd5b6101dc6101d73660046134d1565b610556565b60405190151581526020015b60405180910390f35b6101f96105a8565b6040516101e89190613546565b610219610214366004613559565b61063a565b6040516001600160a01b0390911681526020016101e8565b61024461023f366004613587565b6106d4565b005b6102446102543660046135b3565b6107ea565b610244610267366004613685565b61085f565b610274610c43565b6040516101e89998979695949392919061374d565b6101dc610297366004613559565b610ed6565b6102446102aa3660046137e6565b610ef9565b6102446102bd3660046135b3565b610fbc565b6102446102d0366004613803565b611031565b6102446102e3366004613881565b61114d565b6101dc6102f6366004613559565b611290565b610219610309366004613559565b6112b4565b61032161031c3660046137e6565b61133f565b6040519081526020016101e8565b6101dc61033d366004613559565b6113e3565b610244610350366004613905565b611468565b733afdff6fcdd01e7da59c615d3958c5fec0e889fd610219565b6101f9611579565b610244610385366004613803565b611588565b61024461039836600461393c565b611699565b609e54609f546104029167ffffffffffffffff8116916001600160a01b03680100000000000000008304169160ff600160e01b8204811692600160e81b8304821692600160f01b8104831692600160f81b909104811691808216916101009091041688565b6040805167ffffffffffffffff90991689526001600160a01b03909716602089015294151595870195909552911515606086015215156080850152151560a084015290151560c0830152151560e0820152610100016101e8565b6101dc61046a366004613559565b61175e565b6104b361047d366004613559565b6067602052600090815260409020546001600160a01b03811690600160a01b810464ffffffffff1690600160c81b900460ff1683565b604080516001600160a01b03909416845264ffffffffff909216602084015260ff16908201526060016101e8565b6102446104ef3660046139e4565b611782565b6101f9610502366004613559565b6117fe565b6101dc610515366004613559565b6118fb565b6101dc610528366004613a93565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b60006001600160e01b031982166380ac58cd60e01b148061058757506001600160e01b03198216635b5e139f60e01b145b806105a257506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060606580546105b790613ac1565b80601f01602080910402602001604051908101604052809291908181526020018280546105e390613ac1565b80156106305780601f1061060557610100808354040283529160200191610630565b820191906000526020600020905b81548152906001019060200180831161061357829003601f168201915b5050505050905090565b6000818152606760205260408120546001600160a01b03166106b85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b60006106df826112b4565b9050806001600160a01b0316836001600160a01b0316141561074d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106af565b336001600160a01b038216148061076957506107698133610528565b6107db5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106af565b6107e58383611926565b505050565b6107f3816113e3565b6108545760405162461bcd60e51b815260206004820152602c60248201527f4576656e74496d706c656d656e746174696f6e3a207469636b6574206d75737460448201526b081899481d5b9b1bd8dad95960a21b60648201526084016106af565b6107e5838383611994565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d69190613af6565b60405163cab6d5af60e01b81523360048201526001600160a01b03919091169063cab6d5af9060240160006040518083038186803b15801561091757600080fd5b505afa15801561092b573d6000803e3d6000fd5b505050506000805b84811015610c3957600086868381811061094f5761094f613b13565b90506020020160208101906109649190613b29565b6109719060ff1684613b62565b9050811580156109a9575086868381811061098e5761098e613b13565b90506020020160208101906109a39190613b29565b60ff1615155b15610a3157609e54600160f01b900460ff1615610a145760405162461bcd60e51b8152602060048201526024808201527f4576656e7446696e616e63696e673a20496e76656e746f72792052657374726960448201526318dd195960e21b60648201526084016106af565b610a2a610a2382858b8d613b7a565b8787611a1b565b9150610c27565b816001148015610a695750868683818110610a4e57610a4e613b13565b9050602002016020810190610a639190613b29565b60ff1615155b15610a8257610a2a610a7d82858b8d613b7a565b611c68565b816002148015610aba5750868683818110610a9f57610a9f613b13565b9050602002016020810190610ab49190613b29565b60ff1615155b15610b3257609f5460ff1615610b1e5760405162461bcd60e51b8152602060048201526024808201527f4576656e7446696e616e63696e673a20496e76656e746f72792052657374726960448201526318dd195960e21b60648201526084016106af565b610a2a610b2d82858b8d613b7a565b611e84565b816003148015610b6a5750868683818110610b4f57610b4f613b13565b9050602002016020810190610b649190613b29565b60ff1615155b15610b8357610a2a610b7e82858b8d613b7a565b61206e565b816004148015610bbb5750868683818110610ba057610ba0613b13565b9050602002016020810190610bb59190613b29565b60ff1615155b15610bd457610a2a610bcf82858b8d613b7a565b612275565b816005148015610c0c5750868683818110610bf157610bf1613b13565b9050602002016020810190610c069190613b29565b60ff1615155b15610c2557610a2a610c2082858b8d613b7a565b612468565b505b80610c3181613ba7565b915050610933565b5050505050505050565b60998054609a805463ffffffff83169367ffffffffffffffff6401000000008504811694600160601b810490911693600160a01b8204600390810b947801000000000000000000000000000000000000000000000000909304900b9291610ca990613ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd590613ac1565b8015610d225780601f10610cf757610100808354040283529160200191610d22565b820191906000526020600020905b815481529060010190602001808311610d0557829003601f168201915b505050505090806002018054610d3790613ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6390613ac1565b8015610db05780601f10610d8557610100808354040283529160200191610db0565b820191906000526020600020905b815481529060010190602001808311610d9357829003601f168201915b505050505090806003018054610dc590613ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054610df190613ac1565b8015610e3e5780601f10610e1357610100808354040283529160200191610e3e565b820191906000526020600020905b815481529060010190602001808311610e2157829003601f168201915b505050505090806004018054610e5390613ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7f90613ac1565b8015610ecc5780601f10610ea157610100808354040283529160200191610ecc565b820191906000526020600020905b815481529060010190602001808311610eaf57829003601f168201915b5050505050905089565b6000818152606760205260408120546105a290600160c81b900460ff1682612582565b600054610100900460ff16610f145760005460ff1615610f18565b303b155b610f7b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106af565b600054610100900460ff16158015610f9d576000805461ffff19166101011790555b610fa6826125a9565b8015610fb8576000805461ff00191690555b5050565b610fc5816113e3565b6110265760405162461bcd60e51b815260206004820152602c60248201527f4576656e74496d706c656d656e746174696f6e3a207469636b6574206d75737460448201526b081899481d5b9b1bd8dad95960a21b60648201526084016106af565b6107e583838361267d565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a89190613af6565b604051630160462d60e51b81523360048201526001600160a01b039190911690632c08c5a09060240160006040518083038186803b1580156110e957600080fd5b505afa1580156110fd573d6000803e3d6000fd5b5050505080609981816111109190613d61565b9050507f958566cf628c92f9351ddd9785bd2156df12a9c4ffb3814098eebe91a69956a6816040516111429190613fca565b60405180910390a150565b600054610100900460ff166111685760005460ff161561116c565b303b155b6111cf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106af565b600054610100900460ff161580156111f1576000805461ffff19166101011790555b61126486868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a01819004810282018101909252888152925088915087908190840183828082843760009201919091525061269892505050565b61126d82610ef9565b6112768261276c565b8015611288576000805461ff00191690555b505050505050565b6000818152606760205260408120546105a290600160c81b900460ff166002612582565b6000818152606760205260408120546001600160a01b0316806105a25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016106af565b60006001600160a01b0382166113bd5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016106af565b506001600160a01b031660009081526068602052604090205467ffffffffffffffff1690565b6099546000908190429061140b90600160601b900467ffffffffffffffff1662015180614107565b60995460008681526067602052604090205467ffffffffffffffff92831693909311159350600160601b900416159061144f90600160c81b900460ff166003612582565b806114605750818015611460575080155b949350505050565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114df9190613af6565b604051630160462d60e51b81523360048201526001600160a01b039190911690632c08c5a09060240160006040518083038186803b15801561152057600080fd5b505afa158015611534573d6000803e3d6000fd5b5050505080609e81816115479190614140565b9050507fe8e0d9c2eed58cd24a8857d101285ac4d4093fef050a79803be2cc64d45658ca816040516111429190614337565b6060606680546105b790613ac1565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ff9190613af6565b60405163cab6d5af60e01b81523360048201526001600160a01b03919091169063cab6d5af9060240160006040518083038186803b15801561164057600080fd5b505afa158015611654573d6000803e3d6000fd5b5050505080609981816116679190613d61565b9050507f11c10cf3cbb6f8fa7801265868e7a4dcf315772778bf51d17b0e18f3128a08f1816040516111429190613fca565b6001600160a01b0382163314156116f25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106af565b336000818152606a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152606760205260408120546105a290600160c81b900460ff166001612582565b61178b826113e3565b6117ec5760405162461bcd60e51b815260206004820152602c60248201527f4576656e74496d706c656d656e746174696f6e3a207469636b6574206d75737460448201526b081899481d5b9b1bd8dad95960a21b60648201526084016106af565b6117f884848484612840565b50505050565b6000818152606760205260409020546060906001600160a01b031661188b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016106af565b60006118956128c8565b905060008151116118b557604051806020016040528060008152506118f4565b60995481906118c99063ffffffff1661293f565b6118d28561293f565b6040516020016118e4939291906143eb565b6040516020818303038152906040525b9392505050565b600030611907836112b4565b6001600160a01b03161492915050565b6001600160a01b03163b151590565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061195b826112b4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61199e3382612a55565b611a105760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016106af565b6107e5838383612b48565b60005b81811015611aea57828282818110611a3857611a38613b13565b9050604002016020016020810190611a50919061443b565b60686000858585818110611a6657611a66613b13565b611a7c92602060409092020190810191506137e6565b6001600160a01b03168152602081019190915260400160009081208054909190611ab190849067ffffffffffffffff16614107565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508080611ae290613ba7565b915050611a1e565b5060005b83811015611b3857611b26858583818110611b0b57611b0b613b13565b905060a00201803603810190611b21919061446d565b612d45565b80611b3081613ba7565b915050611aee565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa158015611b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba79190613af6565b9050600080826001600160a01b0316635a841b493389896040518463ffffffff1660e01b8152600401611bdc93929190614586565b60408051808303816000875af1158015611bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1e91906145b2565b915091507f7536f4f9c79a1cbe41e2a0739df4ded83b7e7890356e19f058443bc0256e4edc87878484604051611c5794939291906145d6565b60405180910390a150505050505050565b60005b81811015611d56576000838383818110611c8757611c87613b13565b905060a00201600001359050611c9c81611290565b158015611caf5750611cad816113e3565b155b611d075760405162461bcd60e51b8152602060048201526024808201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20726560448201526373616c6560e01b60648201526084016106af565b611d43611d13826112b4565b858585818110611d2557611d25613b13565b905060a002016040016020810190611d3d91906137e6565b83612b48565b5080611d4e81613ba7565b915050611c6b565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa158015611da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc59190613af6565b9050600080826001600160a01b031663a6aafae83387876040518463ffffffff1660e01b8152600401611dfa93929190614586565b60408051808303816000875af1158015611e18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3c91906145b2565b915091507fcf4e3ce2f7e364adde047ba97e589f5d59faab035175a615a2902e8f776a3e2085858484604051611e7594939291906145d6565b60405180910390a15050505050565b60005b81811015611f49576000838383818110611ea357611ea3613b13565b905060a00201600001359050611eb881611290565b15611f2b5760405162461bcd60e51b815260206004820152602960248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20746960448201527f636b6574207363616e000000000000000000000000000000000000000000000060648201526084016106af565b611f36816001612ed4565b5080611f4181613ba7565b915050611e87565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa158015611f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb89190613af6565b604051630264fde560e31b815233600482015263ffffffff8416602482015290915060009081906001600160a01b03841690631327ef289060440160408051808303816000875af1158015612011573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203591906145b2565b915091507fdcc6310b14e47270a1b88cb2729e18e38d886e7b10ed8b5b55c2b0b07a7c7ab285858484604051611e7594939291906145d6565b60005b8181101561215057600083838381811061208d5761208d613b13565b905060a002016000013590506120a281611290565b1580156120b557506120b38161175e565b155b6121275760405162461bcd60e51b815260206004820152602660248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20636860448201527f65636b2d696e000000000000000000000000000000000000000000000000000060648201526084016106af565b612132816001612f2a565b61213d816001612f4e565b508061214881613ba7565b915050612071565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa15801561219b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bf9190613af6565b60405163241047cd60e21b815233600482015263ffffffff8416602482015290915060009081906001600160a01b038416906390411f349060440160408051808303816000875af1158015612218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223c91906145b2565b915091507f9647b78aeeea679f1b41a3f725a904aba757a17aa35902423afd9fdcc751b5e685858484604051611e7594939291906145d6565b60005b8181101561234357600083838381811061229457612294613b13565b905060a002016000013590506122a981611290565b1561231c5760405162461bcd60e51b815260206004820152603160248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20746960448201527f636b657420696e76616c69646174696f6e00000000000000000000000000000060648201526084016106af565b612327816001612f72565b61233081612f96565b508061233b81613ba7565b915050612278565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa15801561238e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b29190613af6565b60405163241047cd60e21b815233600482015263ffffffff8416602482015290915060009081906001600160a01b038416906390411f349060440160408051808303816000875af115801561240b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242f91906145b2565b915091507f6e714a965f34ba7ab70054f8de9b53e71c7438577c3bf2df26a916313c4fbfd385858484604051611e7594939291906145d6565b60005b8181101561253f57600083838381811061248757612487613b13565b905060a0020160000135905061249c816118fb565b80156124ae57506124ac81611290565b155b6125205760405162461bcd60e51b815260206004820152602760248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e204e4660448201527f5420636c61696d0000000000000000000000000000000000000000000000000060648201526084016106af565b61252c611d13826112b4565b508061253781613ba7565b91505061246b565b507ffa2ec35ac48e074e7e268ef68564eaef01afe7a44f966495691d5f1bf045ab55828260008060405161257694939291906145d6565b60405180910390a15050565b6000600160ff8481169084161c811690811461259f576000611460565b6001949350505050565b600054610100900460ff166125c45760005460ff16156125c8565b303b155b61262b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106af565b600054610100900460ff1615801561264d576000805461ffff19166101011790555b609780546001600160a01b0319166001600160a01b0384161790558015610fb8576000805461ff00191690555050565b6107e583838360405180602001604052806000815250611782565b600054610100900460ff166126b35760005460ff16156126b7565b303b155b61271a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106af565b600054610100900460ff1615801561273c576000805461ffff19166101011790555b6127446130ba565b61274c6130ba565b6127568383613139565b80156107e5576000805461ff0019169055505050565b600054610100900460ff166127875760005460ff161561278b565b303b155b6127ee5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106af565b600054610100900460ff16158015612810576000805461ffff19166101011790555b609880546001600160a01b0319166001600160a01b0384161790558015610fb8576000805461ff00191690555050565b61284a3383612a55565b6128bc5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016106af565b6117f88484848461321b565b60985460408051636c0360eb60e01b815290516060926001600160a01b031691636c0360eb9160048083019260009291908290030181865afa158015612912573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261293a91908101906145fd565b905090565b6060816129635750506040805180820190915260018152600360fc1b602082015290565b8160005b811561298d578061297781613ba7565b91506129869050600a83614681565b9150612967565b60008167ffffffffffffffff8111156129a8576129a8613975565b6040519080825280601f01601f1916602001820160405280156129d2576020820181803683370190505b5090505b8415611460576129e7600183614695565b91506129f4600a866146ac565b6129ff906030613b62565b60f81b818381518110612a1457612a14613b13565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a4e600a86614681565b94506129d6565b6000818152606760205260408120546001600160a01b0316612ace5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106af565b6000612ad9836112b4565b9050806001600160a01b0316846001600160a01b03161480612b145750836001600160a01b0316612b098461063a565b6001600160a01b0316145b8061146057506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff16611460565b826001600160a01b0316612b5b826112b4565b6001600160a01b031614612bd75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016106af565b6001600160a01b038216612c395760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106af565b612c44600082611926565b6001600160a01b0383166000908152606860205260408120805460019290612c7790849067ffffffffffffffff166146c0565b82546101009290920a67ffffffffffffffff8181021990931691831602179091556001600160a01b03841660009081526068602052604081208054600194509092612cc491859116614107565b825467ffffffffffffffff9182166101009390930a92830291909202199091161790555060008181526067602052604080822080546001600160a01b038087166001600160a01b0319909216821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60408101516001600160a01b0316612d9f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106af565b80516000908152606760205260409020546001600160a01b031615612e065760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106af565b6040805160608101825282820180516001600160a01b039081168352608085015164ffffffffff90811660208086019182526000868801818152895182526067909252878120965187549351925160ff16600160c81b0260ff60c81b1993909516600160a01b027fffffffffffffff000000000000000000000000000000000000000000000000009094169086161792909217169190911790935584519151935191931691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450565b600082815260676020526040812054612efa91600160c81b90910460ff16905b836132a4565b600092835260676020526040909220805460ff93909316600160c81b0260ff60c81b199093169290921790915550565b600082815260676020526040902054612efa90600160c81b900460ff166001612ef4565b600082815260676020526040902054612efa90600160c81b900460ff166003612ef4565b600082815260676020526040902054612efa90600160c81b900460ff166002612ef4565b6000612fa1826112b4565b9050612fae600083611926565b6001600160a01b0381166000908152606860205260408120805460019290612fe190849067ffffffffffffffff166146c0565b82546101009290920a67ffffffffffffffff818102199093169183160217909155600080805260686020527fad6f8124f6081c2622ab3a16acd47af73d52fe87b755c3f897263c58ba3fdbd7805460019450909261304191859116614107565b825467ffffffffffffffff9182166101009390930a92830291909202199091161790555060008281526067602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600054610100900460ff166131375760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106af565b565b600054610100900460ff166131545760005460ff1615613158565b303b155b6131bb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106af565b600054610100900460ff161580156131dd576000805461ffff19166101011790555b82516131f090606590602086019061341f565b50815161320490606690602085019061341f565b5080156107e5576000805461ff0019169055505050565b613226848484612b48565b613232848484846132cb565b6117f85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016106af565b600081156132bb5750600160ff83161b83176118f4565b5050600160ff919091161b191690565b60006001600160a01b0384163b1561341457604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061330f9033908990889088906004016146e9565b6020604051808303816000875af192505050801561334a575060408051601f3d908101601f1916820190925261334791810190614725565b60015b6133fa573d808015613378576040519150601f19603f3d011682016040523d82523d6000602084013e61337d565b606091505b5080516133f25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016106af565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611460565b506001949350505050565b82805461342b90613ac1565b90600052602060002090601f01602090048101928261344d5760008555613493565b82601f1061346657805160ff1916838001178555613493565b82800160010185558215613493579182015b82811115613493578251825591602001919060010190613478565b5061349f9291506134a3565b5090565b5b8082111561349f57600081556001016134a4565b6001600160e01b0319811681146134ce57600080fd5b50565b6000602082840312156134e357600080fd5b81356118f4816134b8565b60005b838110156135095781810151838201526020016134f1565b838111156117f85750506000910152565b600081518084526135328160208601602086016134ee565b601f01601f19169290920160200192915050565b6020815260006118f4602083018461351a565b60006020828403121561356b57600080fd5b5035919050565b6001600160a01b03811681146134ce57600080fd5b6000806040838503121561359a57600080fd5b82356135a581613572565b946020939093013593505050565b6000806000606084860312156135c857600080fd5b83356135d381613572565b925060208401356135e381613572565b929592945050506040919091013590565b60008083601f84011261360657600080fd5b50813567ffffffffffffffff81111561361e57600080fd5b6020830191508360208260051b850101111561363957600080fd5b9250929050565b60008083601f84011261365257600080fd5b50813567ffffffffffffffff81111561366a57600080fd5b6020830191508360208260061b850101111561363957600080fd5b6000806000806000806060878903121561369e57600080fd5b863567ffffffffffffffff808211156136b657600080fd5b818901915089601f8301126136ca57600080fd5b8135818111156136d957600080fd5b8a602060a0830285010111156136ee57600080fd5b60209283019850965090880135908082111561370957600080fd5b6137158a838b016135f4565b9096509450604089013591508082111561372e57600080fd5b5061373b89828a01613640565b979a9699509497509295939492505050565b600061012063ffffffff8c16835267ffffffffffffffff808c166020850152808b166040850152508860030b60608401528760030b60808401528060a08401526137998184018861351a565b905082810360c08401526137ad818761351a565b905082810360e08401526137c1818661351a565b90508281036101008401526137d6818561351a565b9c9b505050505050505050505050565b6000602082840312156137f857600080fd5b81356118f481613572565b60006020828403121561381557600080fd5b813567ffffffffffffffff81111561382c57600080fd5b820161012081850312156118f457600080fd5b60008083601f84011261385157600080fd5b50813567ffffffffffffffff81111561386957600080fd5b60208301915083602082850101111561363957600080fd5b60008060008060006060868803121561389957600080fd5b853567ffffffffffffffff808211156138b157600080fd5b6138bd89838a0161383f565b909750955060208801359150808211156138d657600080fd5b506138e38882890161383f565b90945092505060408601356138f781613572565b809150509295509295909350565b6000610100828403121561391857600080fd5b50919050565b80151581146134ce57600080fd5b80356139378161391e565b919050565b6000806040838503121561394f57600080fd5b823561395a81613572565b9150602083013561396a8161391e565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156139b4576139b4613975565b604052919050565b600067ffffffffffffffff8211156139d6576139d6613975565b50601f01601f191660200190565b600080600080608085870312156139fa57600080fd5b8435613a0581613572565b93506020850135613a1581613572565b925060408501359150606085013567ffffffffffffffff811115613a3857600080fd5b8501601f81018713613a4957600080fd5b8035613a5c613a57826139bc565b61398b565b818152886020838501011115613a7157600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215613aa657600080fd5b8235613ab181613572565b9150602083013561396a81613572565b600181811c90821680613ad557607f821691505b6020821081141561391857634e487b7160e01b600052602260045260246000fd5b600060208284031215613b0857600080fd5b81516118f481613572565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613b3b57600080fd5b813560ff811681146118f457600080fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115613b7557613b75613b4c565b500190565b60008085851115613b8a57600080fd5b83861115613b9757600080fd5b505060a083020193919092039150565b6000600019821415613bbb57613bbb613b4c565b5060010190565b63ffffffff811681146134ce57600080fd5b67ffffffffffffffff811681146134ce57600080fd5b600081356105a281613bd4565b8060030b81146134ce57600080fd5b600081356105a281613bf7565b6000808335601e19843603018112613c2a57600080fd5b83018035915067ffffffffffffffff821115613c4557600080fd5b60200191503681900382131561363957600080fd5b601f8211156107e557600081815260208120601f850160051c81016020861015613c815750805b601f850160051c820191505b8181101561128857828155600101613c8d565b67ffffffffffffffff831115613cb857613cb8613975565b613ccc83613cc68354613ac1565b83613c5a565b6000601f841160018114613d005760008515613ce85750838201355b600019600387901b1c1916600186901b178355613d5a565b600083815260209020601f19861690835b82811015613d315786850135825560209485019460019092019101613d11565b5086821015613d4e5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8135613d6c81613bc2565b63ffffffff811663ffffffff1983541617825550613db9613d8f60208401613bea565b82546bffffffffffffffff00000000191660209190911b6bffffffffffffffff0000000016178255565b613e0d613dc860408401613bea565b82547fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff1660609190911b73ffffffffffffffff00000000000000000000000016178255565b613e68613e1c60608401613c06565b8280548260a01b77ffffffff0000000000000000000000000000000000000000167fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff8216178255505050565b613ec7613e7760808401613c06565b8280548260c01b7bffffffff000000000000000000000000000000000000000000000000167fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff8216178255505050565b613ed460a0830183613c13565b613ee2818360018601613ca0565b5050613ef160c0830183613c13565b613eff818360028601613ca0565b5050613f0e60e0830183613c13565b613f1c818360038601613ca0565b5050613f2c610100830183613c13565b6117f8818360048601613ca0565b803561393781613bc2565b803561393781613bd4565b803561393781613bf7565b6000808335601e19843603018112613f7257600080fd5b830160208101925035905067ffffffffffffffff811115613f9257600080fd5b80360383131561363957600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152613fe860208201613fde84613f3a565b63ffffffff169052565b6000613ff660208401613f45565b67ffffffffffffffff811660408401525061401360408401613f45565b67ffffffffffffffff811660608401525061403060608401613f50565b61403f608084018260030b9052565b5061404c60808401613f50565b61405b60a084018260030b9052565b5061406960a0840184613f5b565b6101208060c086015261408161014086018385613fa1565b925061409060c0870187613f5b565b9250601f19808786030160e08801526140aa858584613fa1565b94506140b960e0890189613f5b565b945091506101008188870301818901526140d4868685613fa1565b95506140e2818a018a613f5b565b9550925050808786030183880152506140fc848483613fa1565b979650505050505050565b600067ffffffffffffffff80831681851680830382111561412a5761412a613b4c565b01949350505050565b600081356105a28161391e565b813561414b81613bd4565b67ffffffffffffffff8116905081548167ffffffffffffffff198216178355602084013561417881613572565b7bffffffffffffffffffffffffffffffffffffffff00000000000000008160401b168363ffffffff60e01b8416171784555050506141f46141bb60408401614133565b8280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560e01b60ff60e01b16919091179055565b61423c61420360608401614133565b8280547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560e81b60ff60e81b16919091179055565b61428461424b60808401614133565b8280547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560f01b60ff60f01b16919091179055565b6142e761429360a08401614133565b8280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560f81b7fff0000000000000000000000000000000000000000000000000000000000000016919091179055565b6001810161430e6142fa60c08501614133565b825490151560ff1660ff1991909116178255565b6107e561431d60e08501614133565b82805461ff00191691151560081b61ff0016919091179055565b6101008101823561434781613bd4565b67ffffffffffffffff168252602083013561436181613572565b6001600160a01b03166020830152604083013561437d8161391e565b151560408301526143906060840161392c565b151560608301526143a36080840161392c565b151560808301526143b660a0840161392c565b151560a08301526143c960c0840161392c565b151560c08301526143dc60e0840161392c565b80151560e08401525092915050565b600084516143fd8184602089016134ee565b8451908301906144118183602089016134ee565b602f60f81b9101908152835161442e8160018401602088016134ee565b0160010195945050505050565b60006020828403121561444d57600080fd5b81356118f481613bd4565b803564ffffffffff8116811461393757600080fd5b600060a0828403121561447f57600080fd5b60405160a0810181811067ffffffffffffffff821117156144a2576144a2613975565b8060405250823581526020830135602082015260408301356144c381613572565b604082015260608301356144d681613bd4565b60608201526144e760808401614458565b60808201529392505050565b8183526000602080850194508260005b8581101561457b5781358752828201358388015260408083013561452681613572565b6001600160a01b03169088015260608281013561454281613bd4565b67ffffffffffffffff1690880152608064ffffffffff614563848301614458565b169088015260a0968701969190910190600101614503565b509495945050505050565b6001600160a01b03841681526040602082015260006145a96040830184866144f3565b95945050505050565b600080604083850312156145c557600080fd5b505080516020909101519092909150565b6060815260006145ea6060830186886144f3565b6020830194909452506040015292915050565b60006020828403121561460f57600080fd5b815167ffffffffffffffff81111561462657600080fd5b8201601f8101841361463757600080fd5b8051614645613a57826139bc565b81815285602083850101111561465a57600080fd5b6145a98260208301602086016134ee565b634e487b7160e01b600052601260045260246000fd5b6000826146905761469061466b565b500490565b6000828210156146a7576146a7613b4c565b500390565b6000826146bb576146bb61466b565b500690565b600067ffffffffffffffff838116908316818110156146e1576146e1613b4c565b039392505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261471b608083018461351a565b9695505050505050565b60006020828403121561473757600080fd5b81516118f4816134b856fea164736f6c634300080c000a
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.