Source Code
Overview
POL Balance
POL Value
$0.00Cross-Chain Transactions
Loading...
Loading
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;
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 {}
// 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;
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;
}
}
}
function _getBoolean(uint8 _packedBools, uint8 _boolNumber) internal pure returns (bool) {
uint8 flag = (_packedBools >> _boolNumber) & uint8(1);
return (flag == 1 ? true : false);
}
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);
}
function isScanned(uint256 _tokenId) public view returns (bool _status) {
return _getBoolean(tokenData[_tokenId].booleanFlags, uint8(TicketFlags.SCANNED));
}
function isCheckedIn(uint256 _tokenId) public view returns (bool _status) {
return _getBoolean(tokenData[_tokenId].booleanFlags, uint8(TicketFlags.CHECKED_IN));
}
function isInvalidated(uint256 _tokenId) public view returns (bool _status) {
return _getBoolean(tokenData[_tokenId].booleanFlags, uint8(TicketFlags.INVALIDATED));
}
function isClaimed(uint256 _tokenId) public view returns (bool _status) {
return _getBoolean(tokenData[_tokenId].booleanFlags, uint8(TicketFlags.CLAIMED));
}
function _setScannedFlag(uint256 _tokenId, bool _status) internal {
tokenData[_tokenId].booleanFlags = _setBoolean(
tokenData[_tokenId].booleanFlags,
uint8(TicketFlags.SCANNED),
_status
);
}
function _setCheckedInFlag(uint256 _tokenId, bool _status) internal {
tokenData[_tokenId].booleanFlags = _setBoolean(
tokenData[_tokenId].booleanFlags,
uint8(TicketFlags.CHECKED_IN),
_status
);
}
function _setInvalidatedFlag(uint256 _tokenId, bool _status) internal {
tokenData[_tokenId].booleanFlags = _setBoolean(
tokenData[_tokenId].booleanFlags,
uint8(TicketFlags.INVALIDATED),
_status
);
}
function _setClaimedFlag(uint256 _tokenId, bool _status) internal {
tokenData[_tokenId].booleanFlags = _setBoolean(
tokenData[_tokenId].booleanFlags,
uint8(TicketFlags.CLAIMED),
_status
);
}
/**
* @dev Batch Functions
*/
function _mintBatch(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]);
}
}
function _transferFromBatch(TicketAction[] calldata ticketActions) internal {
for (uint256 i = 0; i < ticketActions.length; i++) {
_transfer(ownerOf(ticketActions[i].tokenId), ticketActions[i].to, ticketActions[i].tokenId);
}
}
/**
* @dev Ticket Lifecycle Methods
*/
function _primarySale(TicketAction[] calldata ticketActions, BalanceUpdates[] calldata balanceUpdates) internal {
_mintBatch(ticketActions, balanceUpdates);
IEconomics econ = registry.economics();
(uint256 _fuel, uint256 _fuelProtocol) = econ.reserveFuelPrimarySale(msg.sender, ticketActions);
emit PrimarySale(ticketActions, _fuel, _fuelProtocol);
}
function _secondarySale(TicketAction[] calldata ticketActions) internal {
for (uint256 i = 0; i < ticketActions.length; i++) {
uint256 _tokenId = ticketActions[i].tokenId;
require(!isInvalidated(_tokenId) && !isClaimed(_tokenId), "EventImplementation: Error on resale");
}
IEconomics econ = registry.economics();
(uint256 _fuel, uint256 _fuelProtocol) = econ.reserveFuelSecondarySale(msg.sender, ticketActions);
emit SecondarySale(ticketActions, _fuel, _fuelProtocol);
}
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);
}
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);
}
IEconomics econ = registry.economics();
(uint256 _fuel, uint256 _fuelProtocol) = econ.spendTicketReserved(msg.sender, uint32(ticketActions.length));
emit CheckedIn(ticketActions, _fuel, _fuelProtocol);
}
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);
}
IEconomics econ = registry.economics();
(uint256 _fuel, uint256 _fuelProtocol) = econ.spendTicketReserved(msg.sender, uint32(ticketActions.length));
emit Invalidated(ticketActions, _fuel, _fuelProtocol);
}
function _claim(TicketAction[] calldata ticketActions) internal {
for (uint256 i = 0; i < ticketActions.length; i++) {
uint256 _tokenId = ticketActions[i].tokenId;
require(!isInvalidated(_tokenId) && !isClaimed(_tokenId), "EventImplementation: Error on NFT claim");
_setClaimedFlag(_tokenId, true);
}
_transferFromBatch(ticketActions);
emit Claimed(ticketActions, 0, 0);
}
/**
* @dev Event Lifecycle Methods
*/
function setEventData(EventData calldata _eventData) external onlyFactory {
eventData = _eventData;
emit EventDataSet(_eventData);
}
function updateEventData(EventData calldata _eventData) external onlyRelayer {
eventData = _eventData;
emit EventDataUpdated(_eventData);
}
function setFinancing(EventFinancing calldata _financing) external onlyFactory {
eventFinancing = _financing;
emit UpdateFinancing(_financing);
}
/**
* @dev View functions
*/
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, uint256(eventData.index).toString(), "/", tokenId.toString()))
: "";
}
function _baseURI() internal view virtual override returns (string memory) {
return registry.baseURI();
}
}// 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;
delete tokenData[tokenId];
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";
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);
}
// 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
CLAIMED // 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 setEventData(EventData memory _eventData) external;
function updateEventData(EventData memory _eventData) external;
function setFinancing(EventFinancing memory _financing) external;
}// 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
) 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 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
Contract ABI
API[{"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":"isClaimed","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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
60806040523480156200001157600080fd5b50600054610100900460ff166200002f5760005460ff161562000039565b62000039620000de565b620000a15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b600054610100900460ff16158015620000c4576000805461ffff19166101011790555b8015620000d7576000805461ff00191690555b506200010b565b6000620000f630620000fc60201b6200182a1760201c565b15905090565b6001600160a01b03163b151590565b614472806200011b6000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80636352211e116100ee578063a22cb46511610097578063b4b5b48f11610071578063b4b5b48f1461043f578063b88d4fde146104b1578063c87b56dd146104c4578063e985e9c5146104d757600080fd5b8063a22cb4651461035a578063a85bfd8a1461036d578063abdd97441461042c57600080fd5b806395d89b41116100c857806395d89b411461032c5780639bccd1cd146103345780639e34070f1461034757600080fd5b80636352211e146102e557806370a08231146102f857806381ddd5081461031957600080fd5b8063254641e41161015b57806342842e0e1161013557806342842e0e146102995780634977d03b146102ac5780635ddda513146102bf5780635df67794146102d257600080fd5b8063254641e414610256578063298ae216146102735780632d103c951461028657600080fd5b8063095ea7b31161018c578063095ea7b31461021b57806323b872dd14610230578063248fd9a71461024357600080fd5b806301ffc9a7146101b357806306fdde03146101db578063081812fc146101f0575b600080fd5b6101c66101c13660046131f5565b610513565b60405190151581526020015b60405180910390f35b6101e3610565565b6040516101d2919061326a565b6102036101fe36600461327d565b6105f7565b6040516001600160a01b0390911681526020016101d2565b61022e6102293660046132ab565b610691565b005b61022e61023e3660046132d7565b6107a7565b61022e6102513660046133a9565b61082e565b61025e610c12565b6040516101d299989796959493929190613471565b6101c661028136600461327d565b610eae565b61022e61029436600461350a565b610ed1565b61022e6102a73660046132d7565b610f94565b61022e6102ba366004613527565b610faf565b61022e6102cd3660046135a5565b6110cb565b6101c66102e036600461327d565b61120e565b6102036102f336600461327d565b611232565b61030b61030636600461350a565b6112bd565b6040519081526020016101d2565b61022e610327366004613629565b611361565b6101e3611472565b61022e610342366004613527565b611481565b6101c661035536600461327d565b611592565b61022e610368366004613660565b6115b6565b609e54609f546103d29167ffffffffffffffff8116916001600160a01b03680100000000000000008304169160ff600160e01b8204811692600160e81b8304821692600160f01b8104831692600160f81b909104811691808216916101009091041688565b6040805167ffffffffffffffff90991689526001600160a01b03909716602089015294151595870195909552911515606086015215156080850152151560a084015290151560c0830152151560e0820152610100016101d2565b6101c661043a36600461327d565b61167b565b61048361044d36600461327d565b6067602052600090815260409020546001600160a01b03811690600160a01b810464ffffffffff1690600160c81b900460ff1683565b604080516001600160a01b03909416845264ffffffffff909216602084015260ff16908201526060016101d2565b61022e6104bf366004613708565b61169f565b6101e36104d236600461327d565b61172d565b6101c66104e53660046137b7565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b60006001600160e01b031982166380ac58cd60e01b148061054457506001600160e01b03198216635b5e139f60e01b145b8061055f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060658054610574906137e5565b80601f01602080910402602001604051908101604052809291908181526020018280546105a0906137e5565b80156105ed5780601f106105c2576101008083540402835291602001916105ed565b820191906000526020600020905b8154815290600101906020018083116105d057829003601f168201915b5050505050905090565b6000818152606760205260408120546001600160a01b03166106755760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b600061069c82611232565b9050806001600160a01b0316836001600160a01b0316141561070a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161066c565b336001600160a01b0382161480610726575061072681336104e5565b6107985760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161066c565b6107a28383611839565b505050565b6107b133826118a7565b6108235760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161066c565b6107a283838361199e565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a5919061381a565b60405163cab6d5af60e01b81523360048201526001600160a01b03919091169063cab6d5af9060240160006040518083038186803b1580156108e657600080fd5b505afa1580156108fa573d6000803e3d6000fd5b505050506000805b84811015610c0857600086868381811061091e5761091e613837565b9050602002016020810190610933919061384d565b6109409060ff1684613886565b905081158015610978575086868381811061095d5761095d613837565b9050602002016020810190610972919061384d565b60ff1615155b15610a0057609e54600160f01b900460ff16156109e35760405162461bcd60e51b8152602060048201526024808201527f4576656e7446696e616e63696e673a20496e76656e746f72792052657374726960448201526318dd195960e21b606482015260840161066c565b6109f96109f282858b8d61389e565b8787611b9b565b9150610bf6565b816001148015610a385750868683818110610a1d57610a1d613837565b9050602002016020810190610a32919061384d565b60ff1615155b15610a51576109f9610a4c82858b8d61389e565b611cd6565b816002148015610a895750868683818110610a6e57610a6e613837565b9050602002016020810190610a83919061384d565b60ff1615155b15610b0157609f5460ff1615610aed5760405162461bcd60e51b8152602060048201526024808201527f4576656e7446696e616e63696e673a20496e76656e746f72792052657374726960448201526318dd195960e21b606482015260840161066c565b6109f9610afc82858b8d61389e565b611eb6565b816003148015610b395750868683818110610b1e57610b1e613837565b9050602002016020810190610b33919061384d565b60ff1615155b15610b52576109f9610b4d82858b8d61389e565b6120a0565b816004148015610b8a5750868683818110610b6f57610b6f613837565b9050602002016020810190610b84919061384d565b60ff1615155b15610ba3576109f9610b9e82858b8d61389e565b61229c565b816005148015610bdb5750868683818110610bc057610bc0613837565b9050602002016020810190610bd5919061384d565b60ff1615155b15610bf4576109f9610bef82858b8d61389e565b612486565b505b80610c00816138cb565b915050610902565b5050505050505050565b60998054609a805463ffffffff83169367ffffffffffffffff64010000000085048116946c01000000000000000000000000810490911693600160a01b8204600390810b947801000000000000000000000000000000000000000000000000909304900b9291610c81906137e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610cad906137e5565b8015610cfa5780601f10610ccf57610100808354040283529160200191610cfa565b820191906000526020600020905b815481529060010190602001808311610cdd57829003601f168201915b505050505090806002018054610d0f906137e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3b906137e5565b8015610d885780601f10610d5d57610100808354040283529160200191610d88565b820191906000526020600020905b815481529060010190602001808311610d6b57829003601f168201915b505050505090806003018054610d9d906137e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc9906137e5565b8015610e165780601f10610deb57610100808354040283529160200191610e16565b820191906000526020600020905b815481529060010190602001808311610df957829003601f168201915b505050505090806004018054610e2b906137e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e57906137e5565b8015610ea45780601f10610e7957610100808354040283529160200191610ea4565b820191906000526020600020905b815481529060010190602001808311610e8757829003601f168201915b5050505050905089565b60008181526067602052604081205461055f90600160c81b900460ff16826125aa565b600054610100900460ff16610eec5760005460ff1615610ef0565b303b155b610f535760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161066c565b600054610100900460ff16158015610f75576000805461ffff19166101011790555b610f7e826125d1565b8015610f90576000805461ff00191690555b5050565b6107a28383836040518060200160405280600081525061169f565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611002573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611026919061381a565b604051630160462d60e51b81523360048201526001600160a01b039190911690632c08c5a09060240160006040518083038186803b15801561106757600080fd5b505afa15801561107b573d6000803e3d6000fd5b50505050806099818161108e9190613a84565b9050507f958566cf628c92f9351ddd9785bd2156df12a9c4ffb3814098eebe91a69956a6816040516110c09190613ced565b60405180910390a150565b600054610100900460ff166110e65760005460ff16156110ea565b303b155b61114d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161066c565b600054610100900460ff1615801561116f576000805461ffff19166101011790555b6111e286868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a0181900481028201810190925288815292508891508790819084018382808284376000920191909152506126a592505050565b6111eb82610ed1565b6111f482612779565b8015611206576000805461ff00191690555b505050505050565b60008181526067602052604081205461055f90600160c81b900460ff1660026125aa565b6000818152606760205260408120546001600160a01b03168061055f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161066c565b60006001600160a01b03821661133b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161066c565b506001600160a01b031660009081526068602052604090205467ffffffffffffffff1690565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d8919061381a565b604051630160462d60e51b81523360048201526001600160a01b039190911690632c08c5a09060240160006040518083038186803b15801561141957600080fd5b505afa15801561142d573d6000803e3d6000fd5b5050505080609e81816114409190613e37565b9050507fe8e0d9c2eed58cd24a8857d101285ac4d4093fef050a79803be2cc64d45658ca816040516110c0919061402e565b606060668054610574906137e5565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f8919061381a565b60405163cab6d5af60e01b81523360048201526001600160a01b03919091169063cab6d5af9060240160006040518083038186803b15801561153957600080fd5b505afa15801561154d573d6000803e3d6000fd5b5050505080609981816115609190613a84565b9050507f11c10cf3cbb6f8fa7801265868e7a4dcf315772778bf51d17b0e18f3128a08f1816040516110c09190613ced565b60008181526067602052604081205461055f90600160c81b900460ff1660036125aa565b6001600160a01b03821633141561160f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161066c565b336000818152606a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008181526067602052604081205461055f90600160c81b900460ff1660016125aa565b6116a933836118a7565b61171b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161066c565b6117278484848461284d565b50505050565b6000818152606760205260409020546060906001600160a01b03166117ba5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161066c565b60006117c46128d6565b905060008151116117e45760405180602001604052806000815250611823565b60995481906117f89063ffffffff1661294d565b6118018561294d565b604051602001611813939291906140e2565b6040516020818303038152906040525b9392505050565b6001600160a01b03163b151590565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061186e82611232565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152606760205260408120546001600160a01b03166119205760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161066c565b600061192b83611232565b9050806001600160a01b0316846001600160a01b031614806119665750836001600160a01b031661195b846105f7565b6001600160a01b0316145b8061199657506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166119b182611232565b6001600160a01b031614611a2d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161066c565b6001600160a01b038216611a8f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161066c565b611a9a600082611839565b6001600160a01b0383166000908152606860205260408120805460019290611acd90849067ffffffffffffffff16614132565b82546101009290920a67ffffffffffffffff8181021990931691831602179091556001600160a01b03841660009081526068602052604081208054600194509092611b1a9185911661415b565b825467ffffffffffffffff9182166101009390930a92830291909202199091161790555060008181526067602052604080822080546001600160a01b038087166001600160a01b0319909216821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611ba784848484612a63565b60985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa158015611bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c15919061381a565b9050600080826001600160a01b0316635a841b493389896040518463ffffffff1660e01b8152600401611c4a9392919061422f565b60408051808303816000875af1158015611c68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8c919061425b565b915091507f7536f4f9c79a1cbe41e2a0739df4ded83b7e7890356e19f058443bc0256e4edc87878484604051611cc5949392919061427f565b60405180910390a150505050505050565b60005b81811015611d88576000838383818110611cf557611cf5613837565b905060a00201600001359050611d0a8161120e565b158015611d1d5750611d1b81611592565b155b611d755760405162461bcd60e51b8152602060048201526024808201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20726560448201526373616c6560e01b606482015260840161066c565b5080611d80816138cb565b915050611cd9565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa158015611dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df7919061381a565b9050600080826001600160a01b031663a6aafae83387876040518463ffffffff1660e01b8152600401611e2c9392919061422f565b60408051808303816000875af1158015611e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6e919061425b565b915091507fcf4e3ce2f7e364adde047ba97e589f5d59faab035175a615a2902e8f776a3e2085858484604051611ea7949392919061427f565b60405180910390a15050505050565b60005b81811015611f7b576000838383818110611ed557611ed5613837565b905060a00201600001359050611eea8161120e565b15611f5d5760405162461bcd60e51b815260206004820152602960248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20746960448201527f636b6574207363616e0000000000000000000000000000000000000000000000606482015260840161066c565b611f68816001612b87565b5080611f73816138cb565b915050611eb9565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa158015611fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fea919061381a565b604051630264fde560e31b815233600482015263ffffffff8416602482015290915060009081906001600160a01b03841690631327ef289060440160408051808303816000875af1158015612043573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612067919061425b565b915091507fdcc6310b14e47270a1b88cb2729e18e38d886e7b10ed8b5b55c2b0b07a7c7ab285858484604051611ea7949392919061427f565b60005b818110156121775760008383838181106120bf576120bf613837565b905060a002016000013590506120d48161120e565b1580156120e757506120e58161167b565b155b6121595760405162461bcd60e51b815260206004820152602660248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20636860448201527f65636b2d696e0000000000000000000000000000000000000000000000000000606482015260840161066c565b612164816001612bdd565b508061216f816138cb565b9150506120a3565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa1580156121c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e6919061381a565b60405163241047cd60e21b815233600482015263ffffffff8416602482015290915060009081906001600160a01b038416906390411f349060440160408051808303816000875af115801561223f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612263919061425b565b915091507f9647b78aeeea679f1b41a3f725a904aba757a17aa35902423afd9fdcc751b5e685858484604051611ea7949392919061427f565b60005b818110156123615760008383838181106122bb576122bb613837565b905060a002016000013590506122d08161120e565b156123435760405162461bcd60e51b815260206004820152603160248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20746960448201527f636b657420696e76616c69646174696f6e000000000000000000000000000000606482015260840161066c565b61234e816001612c01565b5080612359816138cb565b91505061229f565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa1580156123ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d0919061381a565b60405163241047cd60e21b815233600482015263ffffffff8416602482015290915060009081906001600160a01b038416906390411f349060440160408051808303816000875af1158015612429573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244d919061425b565b915091507f6e714a965f34ba7ab70054f8de9b53e71c7438577c3bf2df26a916313c4fbfd385858484604051611ea7949392919061427f565b60005b8181101561255d5760008383838181106124a5576124a5613837565b905060a002016000013590506124ba8161120e565b1580156124cd57506124cb81611592565b155b61253f5760405162461bcd60e51b815260206004820152602760248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e204e4660448201527f5420636c61696d00000000000000000000000000000000000000000000000000606482015260840161066c565b61254a816001612c25565b5080612555816138cb565b915050612489565b506125688282612c49565b7ffa2ec35ac48e074e7e268ef68564eaef01afe7a44f966495691d5f1bf045ab55828260008060405161259e949392919061427f565b60405180910390a15050565b6000600160ff8481169084161c81169081146125c7576000611996565b5060019392505050565b600054610100900460ff166125ec5760005460ff16156125f0565b303b155b6126535760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161066c565b600054610100900460ff16158015612675576000805461ffff19166101011790555b609780546001600160a01b0319166001600160a01b0384161790558015610f90576000805461ff00191690555050565b600054610100900460ff166126c05760005460ff16156126c4565b303b155b6127275760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161066c565b600054610100900460ff16158015612749576000805461ffff19166101011790555b612751612cd8565b612759612cd8565b6127638383612d57565b80156107a2576000805461ff0019169055505050565b600054610100900460ff166127945760005460ff1615612798565b303b155b6127fb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161066c565b600054610100900460ff1615801561281d576000805461ffff19166101011790555b609880546001600160a01b0319166001600160a01b0384161790558015610f90576000805461ff00191690555050565b61285884848461199e565b61286484848484612e39565b6117275760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161066c565b60985460408051636c0360eb60e01b815290516060926001600160a01b031691636c0360eb9160048083019260009291908290030181865afa158015612920573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261294891908101906142a6565b905090565b6060816129715750506040805180820190915260018152600360fc1b602082015290565b8160005b811561299b5780612985816138cb565b91506129949050600a8361432a565b9150612975565b60008167ffffffffffffffff8111156129b6576129b6613699565b6040519080825280601f01601f1916602001820160405280156129e0576020820181803683370190505b5090505b8415611996576129f560018361433e565b9150612a02600a86614355565b612a0d906030613886565b60f81b818381518110612a2257612a22613837565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a5c600a8661432a565b94506129e4565b60005b81811015612b3257828282818110612a8057612a80613837565b9050604002016020016020810190612a989190614369565b60686000858585818110612aae57612aae613837565b612ac4926020604090920201908101915061350a565b6001600160a01b03168152602081019190915260400160009081208054909190612af990849067ffffffffffffffff1661415b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508080612b2a906138cb565b915050612a66565b5060005b83811015612b8057612b6e858583818110612b5357612b53613837565b905060a00201803603810190612b699190614386565b612f8d565b80612b78816138cb565b915050612b36565b5050505050565b600082815260676020526040812054612bad91600160c81b90910460ff16905b8361311c565b600092835260676020526040909220805460ff93909316600160c81b0260ff60c81b199093169290921790915550565b600082815260676020526040902054612bad90600160c81b900460ff166001612ba7565b600082815260676020526040902054612bad90600160c81b900460ff166002612ba7565b600082815260676020526040902054612bad90600160c81b900460ff166003612ba7565b60005b818110156107a257612cc6612c7b848484818110612c6c57612c6c613837565b905060a0020160000135611232565b848484818110612c8d57612c8d613837565b905060a002016040016020810190612ca5919061350a565b858585818110612cb757612cb7613837565b905060a002016000013561199e565b80612cd0816138cb565b915050612c4c565b600054610100900460ff16612d555760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066c565b565b600054610100900460ff16612d725760005460ff1615612d76565b303b155b612dd95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161066c565b600054610100900460ff16158015612dfb576000805461ffff19166101011790555b8251612e0e906065906020860190613143565b508151612e22906066906020850190613143565b5080156107a2576000805461ff0019169055505050565b60006001600160a01b0384163b15612f8257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612e7d90339089908890889060040161440c565b6020604051808303816000875af1925050508015612eb8575060408051601f3d908101601f19168201909252612eb591810190614448565b60015b612f68573d808015612ee6576040519150601f19603f3d011682016040523d82523d6000602084013e612eeb565b606091505b508051612f605760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161066c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611996565b506001949350505050565b60408101516001600160a01b0316612fe75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161066c565b80516000908152606760205260409020546001600160a01b03161561304e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161066c565b6040805160608101825282820180516001600160a01b039081168352608085015164ffffffffff90811660208086019182526000868801818152895182526067909252878120965187549351925160ff16600160c81b0260ff60c81b1993909516600160a01b027fffffffffffffff000000000000000000000000000000000000000000000000009094169086161792909217169190911790935584519151935191931691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450565b600081156131335750600160ff83161b8317611823565b5050600160ff919091161b191690565b82805461314f906137e5565b90600052602060002090601f01602090048101928261317157600085556131b7565b82601f1061318a57805160ff19168380011785556131b7565b828001600101855582156131b7579182015b828111156131b757825182559160200191906001019061319c565b506131c39291506131c7565b5090565b5b808211156131c357600081556001016131c8565b6001600160e01b0319811681146131f257600080fd5b50565b60006020828403121561320757600080fd5b8135611823816131dc565b60005b8381101561322d578181015183820152602001613215565b838111156117275750506000910152565b60008151808452613256816020860160208601613212565b601f01601f19169290920160200192915050565b602081526000611823602083018461323e565b60006020828403121561328f57600080fd5b5035919050565b6001600160a01b03811681146131f257600080fd5b600080604083850312156132be57600080fd5b82356132c981613296565b946020939093013593505050565b6000806000606084860312156132ec57600080fd5b83356132f781613296565b9250602084013561330781613296565b929592945050506040919091013590565b60008083601f84011261332a57600080fd5b50813567ffffffffffffffff81111561334257600080fd5b6020830191508360208260051b850101111561335d57600080fd5b9250929050565b60008083601f84011261337657600080fd5b50813567ffffffffffffffff81111561338e57600080fd5b6020830191508360208260061b850101111561335d57600080fd5b600080600080600080606087890312156133c257600080fd5b863567ffffffffffffffff808211156133da57600080fd5b818901915089601f8301126133ee57600080fd5b8135818111156133fd57600080fd5b8a602060a08302850101111561341257600080fd5b60209283019850965090880135908082111561342d57600080fd5b6134398a838b01613318565b9096509450604089013591508082111561345257600080fd5b5061345f89828a01613364565b979a9699509497509295939492505050565b600061012063ffffffff8c16835267ffffffffffffffff808c166020850152808b166040850152508860030b60608401528760030b60808401528060a08401526134bd8184018861323e565b905082810360c08401526134d1818761323e565b905082810360e08401526134e5818661323e565b90508281036101008401526134fa818561323e565b9c9b505050505050505050505050565b60006020828403121561351c57600080fd5b813561182381613296565b60006020828403121561353957600080fd5b813567ffffffffffffffff81111561355057600080fd5b8201610120818503121561182357600080fd5b60008083601f84011261357557600080fd5b50813567ffffffffffffffff81111561358d57600080fd5b60208301915083602082850101111561335d57600080fd5b6000806000806000606086880312156135bd57600080fd5b853567ffffffffffffffff808211156135d557600080fd5b6135e189838a01613563565b909750955060208801359150808211156135fa57600080fd5b5061360788828901613563565b909450925050604086013561361b81613296565b809150509295509295909350565b6000610100828403121561363c57600080fd5b50919050565b80151581146131f257600080fd5b803561365b81613642565b919050565b6000806040838503121561367357600080fd5b823561367e81613296565b9150602083013561368e81613642565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156136d8576136d8613699565b604052919050565b600067ffffffffffffffff8211156136fa576136fa613699565b50601f01601f191660200190565b6000806000806080858703121561371e57600080fd5b843561372981613296565b9350602085013561373981613296565b925060408501359150606085013567ffffffffffffffff81111561375c57600080fd5b8501601f8101871361376d57600080fd5b803561378061377b826136e0565b6136af565b81815288602083850101111561379557600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156137ca57600080fd5b82356137d581613296565b9150602083013561368e81613296565b600181811c908216806137f957607f821691505b6020821081141561363c57634e487b7160e01b600052602260045260246000fd5b60006020828403121561382c57600080fd5b815161182381613296565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561385f57600080fd5b813560ff8116811461182357600080fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561389957613899613870565b500190565b600080858511156138ae57600080fd5b838611156138bb57600080fd5b505060a083020193919092039150565b60006000198214156138df576138df613870565b5060010190565b63ffffffff811681146131f257600080fd5b67ffffffffffffffff811681146131f257600080fd5b6000813561055f816138f8565b8060030b81146131f257600080fd5b6000813561055f8161391b565b6000808335601e1984360301811261394e57600080fd5b83018035915067ffffffffffffffff82111561396957600080fd5b60200191503681900382131561335d57600080fd5b601f8211156107a257600081815260208120601f850160051c810160208610156139a55750805b601f850160051c820191505b81811015611206578281556001016139b1565b67ffffffffffffffff8311156139dc576139dc613699565b6139f0836139ea83546137e5565b8361397e565b6000601f841160018114613a245760008515613a0c5750838201355b600019600387901b1c1916600186901b178355612b80565b600083815260209020601f19861690835b82811015613a555786850135825560209485019460019092019101613a35565b5086821015613a725760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8135613a8f816138e6565b63ffffffff811663ffffffff1983541617825550613adc613ab26020840161390e565b82546bffffffffffffffff00000000191660209190911b6bffffffffffffffff0000000016178255565b613b30613aeb6040840161390e565b82547fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff1660609190911b73ffffffffffffffff00000000000000000000000016178255565b613b8b613b3f6060840161392a565b8280548260a01b77ffffffff0000000000000000000000000000000000000000167fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff8216178255505050565b613bea613b9a6080840161392a565b8280548260c01b7bffffffff000000000000000000000000000000000000000000000000167fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff8216178255505050565b613bf760a0830183613937565b613c058183600186016139c4565b5050613c1460c0830183613937565b613c228183600286016139c4565b5050613c3160e0830183613937565b613c3f8183600386016139c4565b5050613c4f610100830183613937565b6117278183600486016139c4565b803561365b816138e6565b803561365b816138f8565b803561365b8161391b565b6000808335601e19843603018112613c9557600080fd5b830160208101925035905067ffffffffffffffff811115613cb557600080fd5b80360383131561335d57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152613d0b60208201613d0184613c5d565b63ffffffff169052565b6000613d1960208401613c68565b67ffffffffffffffff8116604084015250613d3660408401613c68565b67ffffffffffffffff8116606084015250613d5360608401613c73565b613d62608084018260030b9052565b50613d6f60808401613c73565b613d7e60a084018260030b9052565b50613d8c60a0840184613c7e565b6101208060c0860152613da461014086018385613cc4565b9250613db360c0870187613c7e565b9250601f19808786030160e0880152613dcd858584613cc4565b9450613ddc60e0890189613c7e565b94509150610100818887030181890152613df7868685613cc4565b9550613e05818a018a613c7e565b955092505080878603018388015250613e1f848483613cc4565b979650505050505050565b6000813561055f81613642565b8135613e42816138f8565b67ffffffffffffffff8116905081548167ffffffffffffffff1982161783556020840135613e6f81613296565b7bffffffffffffffffffffffffffffffffffffffff00000000000000008160401b168363ffffffff60e01b841617178455505050613eeb613eb260408401613e2a565b8280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560e01b60ff60e01b16919091179055565b613f33613efa60608401613e2a565b8280547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560e81b60ff60e81b16919091179055565b613f7b613f4260808401613e2a565b8280547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560f01b60ff60f01b16919091179055565b613fde613f8a60a08401613e2a565b8280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560f81b7fff0000000000000000000000000000000000000000000000000000000000000016919091179055565b60018101614005613ff160c08501613e2a565b825490151560ff1660ff1991909116178255565b6107a261401460e08501613e2a565b82805461ff00191691151560081b61ff0016919091179055565b6101008101823561403e816138f8565b67ffffffffffffffff168252602083013561405881613296565b6001600160a01b03166020830152604083013561407481613642565b1515604083015261408760608401613650565b1515606083015261409a60808401613650565b151560808301526140ad60a08401613650565b151560a08301526140c060c08401613650565b151560c08301526140d360e08401613650565b80151560e08401525092915050565b600084516140f4818460208901613212565b845190830190614108818360208901613212565b602f60f81b91019081528351614125816001840160208801613212565b0160010195945050505050565b600067ffffffffffffffff8381169083168181101561415357614153613870565b039392505050565b600067ffffffffffffffff80831681851680830382111561417e5761417e613870565b01949350505050565b803564ffffffffff8116811461365b57600080fd5b8183526000602080850194508260005b85811015614224578135875282820135838801526040808301356141cf81613296565b6001600160a01b0316908801526060828101356141eb816138f8565b67ffffffffffffffff1690880152608064ffffffffff61420c848301614187565b169088015260a09687019691909101906001016141ac565b509495945050505050565b6001600160a01b038416815260406020820152600061425260408301848661419c565b95945050505050565b6000806040838503121561426e57600080fd5b505080516020909101519092909150565b60608152600061429360608301868861419c565b6020830194909452506040015292915050565b6000602082840312156142b857600080fd5b815167ffffffffffffffff8111156142cf57600080fd5b8201601f810184136142e057600080fd5b80516142ee61377b826136e0565b81815285602083850101111561430357600080fd5b614252826020830160208601613212565b634e487b7160e01b600052601260045260246000fd5b60008261433957614339614314565b500490565b60008282101561435057614350613870565b500390565b60008261436457614364614314565b500690565b60006020828403121561437b57600080fd5b8135611823816138f8565b600060a0828403121561439857600080fd5b60405160a0810181811067ffffffffffffffff821117156143bb576143bb613699565b8060405250823581526020830135602082015260408301356143dc81613296565b604082015260608301356143ef816138f8565b606082015261440060808401614187565b60808201529392505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261443e608083018461323e565b9695505050505050565b60006020828403121561445a57600080fd5b8151611823816131dc56fea164736f6c634300080c000a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ae5760003560e01c80636352211e116100ee578063a22cb46511610097578063b4b5b48f11610071578063b4b5b48f1461043f578063b88d4fde146104b1578063c87b56dd146104c4578063e985e9c5146104d757600080fd5b8063a22cb4651461035a578063a85bfd8a1461036d578063abdd97441461042c57600080fd5b806395d89b41116100c857806395d89b411461032c5780639bccd1cd146103345780639e34070f1461034757600080fd5b80636352211e146102e557806370a08231146102f857806381ddd5081461031957600080fd5b8063254641e41161015b57806342842e0e1161013557806342842e0e146102995780634977d03b146102ac5780635ddda513146102bf5780635df67794146102d257600080fd5b8063254641e414610256578063298ae216146102735780632d103c951461028657600080fd5b8063095ea7b31161018c578063095ea7b31461021b57806323b872dd14610230578063248fd9a71461024357600080fd5b806301ffc9a7146101b357806306fdde03146101db578063081812fc146101f0575b600080fd5b6101c66101c13660046131f5565b610513565b60405190151581526020015b60405180910390f35b6101e3610565565b6040516101d2919061326a565b6102036101fe36600461327d565b6105f7565b6040516001600160a01b0390911681526020016101d2565b61022e6102293660046132ab565b610691565b005b61022e61023e3660046132d7565b6107a7565b61022e6102513660046133a9565b61082e565b61025e610c12565b6040516101d299989796959493929190613471565b6101c661028136600461327d565b610eae565b61022e61029436600461350a565b610ed1565b61022e6102a73660046132d7565b610f94565b61022e6102ba366004613527565b610faf565b61022e6102cd3660046135a5565b6110cb565b6101c66102e036600461327d565b61120e565b6102036102f336600461327d565b611232565b61030b61030636600461350a565b6112bd565b6040519081526020016101d2565b61022e610327366004613629565b611361565b6101e3611472565b61022e610342366004613527565b611481565b6101c661035536600461327d565b611592565b61022e610368366004613660565b6115b6565b609e54609f546103d29167ffffffffffffffff8116916001600160a01b03680100000000000000008304169160ff600160e01b8204811692600160e81b8304821692600160f01b8104831692600160f81b909104811691808216916101009091041688565b6040805167ffffffffffffffff90991689526001600160a01b03909716602089015294151595870195909552911515606086015215156080850152151560a084015290151560c0830152151560e0820152610100016101d2565b6101c661043a36600461327d565b61167b565b61048361044d36600461327d565b6067602052600090815260409020546001600160a01b03811690600160a01b810464ffffffffff1690600160c81b900460ff1683565b604080516001600160a01b03909416845264ffffffffff909216602084015260ff16908201526060016101d2565b61022e6104bf366004613708565b61169f565b6101e36104d236600461327d565b61172d565b6101c66104e53660046137b7565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b60006001600160e01b031982166380ac58cd60e01b148061054457506001600160e01b03198216635b5e139f60e01b145b8061055f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060658054610574906137e5565b80601f01602080910402602001604051908101604052809291908181526020018280546105a0906137e5565b80156105ed5780601f106105c2576101008083540402835291602001916105ed565b820191906000526020600020905b8154815290600101906020018083116105d057829003601f168201915b5050505050905090565b6000818152606760205260408120546001600160a01b03166106755760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b600061069c82611232565b9050806001600160a01b0316836001600160a01b0316141561070a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161066c565b336001600160a01b0382161480610726575061072681336104e5565b6107985760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161066c565b6107a28383611839565b505050565b6107b133826118a7565b6108235760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161066c565b6107a283838361199e565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a5919061381a565b60405163cab6d5af60e01b81523360048201526001600160a01b03919091169063cab6d5af9060240160006040518083038186803b1580156108e657600080fd5b505afa1580156108fa573d6000803e3d6000fd5b505050506000805b84811015610c0857600086868381811061091e5761091e613837565b9050602002016020810190610933919061384d565b6109409060ff1684613886565b905081158015610978575086868381811061095d5761095d613837565b9050602002016020810190610972919061384d565b60ff1615155b15610a0057609e54600160f01b900460ff16156109e35760405162461bcd60e51b8152602060048201526024808201527f4576656e7446696e616e63696e673a20496e76656e746f72792052657374726960448201526318dd195960e21b606482015260840161066c565b6109f96109f282858b8d61389e565b8787611b9b565b9150610bf6565b816001148015610a385750868683818110610a1d57610a1d613837565b9050602002016020810190610a32919061384d565b60ff1615155b15610a51576109f9610a4c82858b8d61389e565b611cd6565b816002148015610a895750868683818110610a6e57610a6e613837565b9050602002016020810190610a83919061384d565b60ff1615155b15610b0157609f5460ff1615610aed5760405162461bcd60e51b8152602060048201526024808201527f4576656e7446696e616e63696e673a20496e76656e746f72792052657374726960448201526318dd195960e21b606482015260840161066c565b6109f9610afc82858b8d61389e565b611eb6565b816003148015610b395750868683818110610b1e57610b1e613837565b9050602002016020810190610b33919061384d565b60ff1615155b15610b52576109f9610b4d82858b8d61389e565b6120a0565b816004148015610b8a5750868683818110610b6f57610b6f613837565b9050602002016020810190610b84919061384d565b60ff1615155b15610ba3576109f9610b9e82858b8d61389e565b61229c565b816005148015610bdb5750868683818110610bc057610bc0613837565b9050602002016020810190610bd5919061384d565b60ff1615155b15610bf4576109f9610bef82858b8d61389e565b612486565b505b80610c00816138cb565b915050610902565b5050505050505050565b60998054609a805463ffffffff83169367ffffffffffffffff64010000000085048116946c01000000000000000000000000810490911693600160a01b8204600390810b947801000000000000000000000000000000000000000000000000909304900b9291610c81906137e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610cad906137e5565b8015610cfa5780601f10610ccf57610100808354040283529160200191610cfa565b820191906000526020600020905b815481529060010190602001808311610cdd57829003601f168201915b505050505090806002018054610d0f906137e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3b906137e5565b8015610d885780601f10610d5d57610100808354040283529160200191610d88565b820191906000526020600020905b815481529060010190602001808311610d6b57829003601f168201915b505050505090806003018054610d9d906137e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc9906137e5565b8015610e165780601f10610deb57610100808354040283529160200191610e16565b820191906000526020600020905b815481529060010190602001808311610df957829003601f168201915b505050505090806004018054610e2b906137e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e57906137e5565b8015610ea45780601f10610e7957610100808354040283529160200191610ea4565b820191906000526020600020905b815481529060010190602001808311610e8757829003601f168201915b5050505050905089565b60008181526067602052604081205461055f90600160c81b900460ff16826125aa565b600054610100900460ff16610eec5760005460ff1615610ef0565b303b155b610f535760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161066c565b600054610100900460ff16158015610f75576000805461ffff19166101011790555b610f7e826125d1565b8015610f90576000805461ff00191690555b5050565b6107a28383836040518060200160405280600081525061169f565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611002573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611026919061381a565b604051630160462d60e51b81523360048201526001600160a01b039190911690632c08c5a09060240160006040518083038186803b15801561106757600080fd5b505afa15801561107b573d6000803e3d6000fd5b50505050806099818161108e9190613a84565b9050507f958566cf628c92f9351ddd9785bd2156df12a9c4ffb3814098eebe91a69956a6816040516110c09190613ced565b60405180910390a150565b600054610100900460ff166110e65760005460ff16156110ea565b303b155b61114d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161066c565b600054610100900460ff1615801561116f576000805461ffff19166101011790555b6111e286868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a0181900481028201810190925288815292508891508790819084018382808284376000920191909152506126a592505050565b6111eb82610ed1565b6111f482612779565b8015611206576000805461ff00191690555b505050505050565b60008181526067602052604081205461055f90600160c81b900460ff1660026125aa565b6000818152606760205260408120546001600160a01b03168061055f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161066c565b60006001600160a01b03821661133b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161066c565b506001600160a01b031660009081526068602052604090205467ffffffffffffffff1690565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d8919061381a565b604051630160462d60e51b81523360048201526001600160a01b039190911690632c08c5a09060240160006040518083038186803b15801561141957600080fd5b505afa15801561142d573d6000803e3d6000fd5b5050505080609e81816114409190613e37565b9050507fe8e0d9c2eed58cd24a8857d101285ac4d4093fef050a79803be2cc64d45658ca816040516110c0919061402e565b606060668054610574906137e5565b609760009054906101000a90046001600160a01b03166001600160a01b031663de9375f26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f8919061381a565b60405163cab6d5af60e01b81523360048201526001600160a01b03919091169063cab6d5af9060240160006040518083038186803b15801561153957600080fd5b505afa15801561154d573d6000803e3d6000fd5b5050505080609981816115609190613a84565b9050507f11c10cf3cbb6f8fa7801265868e7a4dcf315772778bf51d17b0e18f3128a08f1816040516110c09190613ced565b60008181526067602052604081205461055f90600160c81b900460ff1660036125aa565b6001600160a01b03821633141561160f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161066c565b336000818152606a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008181526067602052604081205461055f90600160c81b900460ff1660016125aa565b6116a933836118a7565b61171b5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161066c565b6117278484848461284d565b50505050565b6000818152606760205260409020546060906001600160a01b03166117ba5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161066c565b60006117c46128d6565b905060008151116117e45760405180602001604052806000815250611823565b60995481906117f89063ffffffff1661294d565b6118018561294d565b604051602001611813939291906140e2565b6040516020818303038152906040525b9392505050565b6001600160a01b03163b151590565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061186e82611232565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152606760205260408120546001600160a01b03166119205760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161066c565b600061192b83611232565b9050806001600160a01b0316846001600160a01b031614806119665750836001600160a01b031661195b846105f7565b6001600160a01b0316145b8061199657506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166119b182611232565b6001600160a01b031614611a2d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161066c565b6001600160a01b038216611a8f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161066c565b611a9a600082611839565b6001600160a01b0383166000908152606860205260408120805460019290611acd90849067ffffffffffffffff16614132565b82546101009290920a67ffffffffffffffff8181021990931691831602179091556001600160a01b03841660009081526068602052604081208054600194509092611b1a9185911661415b565b825467ffffffffffffffff9182166101009390930a92830291909202199091161790555060008181526067602052604080822080546001600160a01b038087166001600160a01b0319909216821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611ba784848484612a63565b60985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa158015611bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c15919061381a565b9050600080826001600160a01b0316635a841b493389896040518463ffffffff1660e01b8152600401611c4a9392919061422f565b60408051808303816000875af1158015611c68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8c919061425b565b915091507f7536f4f9c79a1cbe41e2a0739df4ded83b7e7890356e19f058443bc0256e4edc87878484604051611cc5949392919061427f565b60405180910390a150505050505050565b60005b81811015611d88576000838383818110611cf557611cf5613837565b905060a00201600001359050611d0a8161120e565b158015611d1d5750611d1b81611592565b155b611d755760405162461bcd60e51b8152602060048201526024808201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20726560448201526373616c6560e01b606482015260840161066c565b5080611d80816138cb565b915050611cd9565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa158015611dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df7919061381a565b9050600080826001600160a01b031663a6aafae83387876040518463ffffffff1660e01b8152600401611e2c9392919061422f565b60408051808303816000875af1158015611e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6e919061425b565b915091507fcf4e3ce2f7e364adde047ba97e589f5d59faab035175a615a2902e8f776a3e2085858484604051611ea7949392919061427f565b60405180910390a15050505050565b60005b81811015611f7b576000838383818110611ed557611ed5613837565b905060a00201600001359050611eea8161120e565b15611f5d5760405162461bcd60e51b815260206004820152602960248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20746960448201527f636b6574207363616e0000000000000000000000000000000000000000000000606482015260840161066c565b611f68816001612b87565b5080611f73816138cb565b915050611eb9565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa158015611fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fea919061381a565b604051630264fde560e31b815233600482015263ffffffff8416602482015290915060009081906001600160a01b03841690631327ef289060440160408051808303816000875af1158015612043573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612067919061425b565b915091507fdcc6310b14e47270a1b88cb2729e18e38d886e7b10ed8b5b55c2b0b07a7c7ab285858484604051611ea7949392919061427f565b60005b818110156121775760008383838181106120bf576120bf613837565b905060a002016000013590506120d48161120e565b1580156120e757506120e58161167b565b155b6121595760405162461bcd60e51b815260206004820152602660248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20636860448201527f65636b2d696e0000000000000000000000000000000000000000000000000000606482015260840161066c565b612164816001612bdd565b508061216f816138cb565b9150506120a3565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa1580156121c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e6919061381a565b60405163241047cd60e21b815233600482015263ffffffff8416602482015290915060009081906001600160a01b038416906390411f349060440160408051808303816000875af115801561223f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612263919061425b565b915091507f9647b78aeeea679f1b41a3f725a904aba757a17aa35902423afd9fdcc751b5e685858484604051611ea7949392919061427f565b60005b818110156123615760008383838181106122bb576122bb613837565b905060a002016000013590506122d08161120e565b156123435760405162461bcd60e51b815260206004820152603160248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e20746960448201527f636b657420696e76616c69646174696f6e000000000000000000000000000000606482015260840161066c565b61234e816001612c01565b5080612359816138cb565b91505061229f565b5060985460408051632e239d9760e01b815290516000926001600160a01b031691632e239d979160048083019260209291908290030181865afa1580156123ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d0919061381a565b60405163241047cd60e21b815233600482015263ffffffff8416602482015290915060009081906001600160a01b038416906390411f349060440160408051808303816000875af1158015612429573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244d919061425b565b915091507f6e714a965f34ba7ab70054f8de9b53e71c7438577c3bf2df26a916313c4fbfd385858484604051611ea7949392919061427f565b60005b8181101561255d5760008383838181106124a5576124a5613837565b905060a002016000013590506124ba8161120e565b1580156124cd57506124cb81611592565b155b61253f5760405162461bcd60e51b815260206004820152602760248201527f4576656e74496d706c656d656e746174696f6e3a204572726f72206f6e204e4660448201527f5420636c61696d00000000000000000000000000000000000000000000000000606482015260840161066c565b61254a816001612c25565b5080612555816138cb565b915050612489565b506125688282612c49565b7ffa2ec35ac48e074e7e268ef68564eaef01afe7a44f966495691d5f1bf045ab55828260008060405161259e949392919061427f565b60405180910390a15050565b6000600160ff8481169084161c81169081146125c7576000611996565b5060019392505050565b600054610100900460ff166125ec5760005460ff16156125f0565b303b155b6126535760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161066c565b600054610100900460ff16158015612675576000805461ffff19166101011790555b609780546001600160a01b0319166001600160a01b0384161790558015610f90576000805461ff00191690555050565b600054610100900460ff166126c05760005460ff16156126c4565b303b155b6127275760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161066c565b600054610100900460ff16158015612749576000805461ffff19166101011790555b612751612cd8565b612759612cd8565b6127638383612d57565b80156107a2576000805461ff0019169055505050565b600054610100900460ff166127945760005460ff1615612798565b303b155b6127fb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161066c565b600054610100900460ff1615801561281d576000805461ffff19166101011790555b609880546001600160a01b0319166001600160a01b0384161790558015610f90576000805461ff00191690555050565b61285884848461199e565b61286484848484612e39565b6117275760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161066c565b60985460408051636c0360eb60e01b815290516060926001600160a01b031691636c0360eb9160048083019260009291908290030181865afa158015612920573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261294891908101906142a6565b905090565b6060816129715750506040805180820190915260018152600360fc1b602082015290565b8160005b811561299b5780612985816138cb565b91506129949050600a8361432a565b9150612975565b60008167ffffffffffffffff8111156129b6576129b6613699565b6040519080825280601f01601f1916602001820160405280156129e0576020820181803683370190505b5090505b8415611996576129f560018361433e565b9150612a02600a86614355565b612a0d906030613886565b60f81b818381518110612a2257612a22613837565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a5c600a8661432a565b94506129e4565b60005b81811015612b3257828282818110612a8057612a80613837565b9050604002016020016020810190612a989190614369565b60686000858585818110612aae57612aae613837565b612ac4926020604090920201908101915061350a565b6001600160a01b03168152602081019190915260400160009081208054909190612af990849067ffffffffffffffff1661415b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508080612b2a906138cb565b915050612a66565b5060005b83811015612b8057612b6e858583818110612b5357612b53613837565b905060a00201803603810190612b699190614386565b612f8d565b80612b78816138cb565b915050612b36565b5050505050565b600082815260676020526040812054612bad91600160c81b90910460ff16905b8361311c565b600092835260676020526040909220805460ff93909316600160c81b0260ff60c81b199093169290921790915550565b600082815260676020526040902054612bad90600160c81b900460ff166001612ba7565b600082815260676020526040902054612bad90600160c81b900460ff166002612ba7565b600082815260676020526040902054612bad90600160c81b900460ff166003612ba7565b60005b818110156107a257612cc6612c7b848484818110612c6c57612c6c613837565b905060a0020160000135611232565b848484818110612c8d57612c8d613837565b905060a002016040016020810190612ca5919061350a565b858585818110612cb757612cb7613837565b905060a002016000013561199e565b80612cd0816138cb565b915050612c4c565b600054610100900460ff16612d555760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066c565b565b600054610100900460ff16612d725760005460ff1615612d76565b303b155b612dd95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161066c565b600054610100900460ff16158015612dfb576000805461ffff19166101011790555b8251612e0e906065906020860190613143565b508151612e22906066906020850190613143565b5080156107a2576000805461ff0019169055505050565b60006001600160a01b0384163b15612f8257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612e7d90339089908890889060040161440c565b6020604051808303816000875af1925050508015612eb8575060408051601f3d908101601f19168201909252612eb591810190614448565b60015b612f68573d808015612ee6576040519150601f19603f3d011682016040523d82523d6000602084013e612eeb565b606091505b508051612f605760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161066c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611996565b506001949350505050565b60408101516001600160a01b0316612fe75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161066c565b80516000908152606760205260409020546001600160a01b03161561304e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161066c565b6040805160608101825282820180516001600160a01b039081168352608085015164ffffffffff90811660208086019182526000868801818152895182526067909252878120965187549351925160ff16600160c81b0260ff60c81b1993909516600160a01b027fffffffffffffff000000000000000000000000000000000000000000000000009094169086161792909217169190911790935584519151935191931691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450565b600081156131335750600160ff83161b8317611823565b5050600160ff919091161b191690565b82805461314f906137e5565b90600052602060002090601f01602090048101928261317157600085556131b7565b82601f1061318a57805160ff19168380011785556131b7565b828001600101855582156131b7579182015b828111156131b757825182559160200191906001019061319c565b506131c39291506131c7565b5090565b5b808211156131c357600081556001016131c8565b6001600160e01b0319811681146131f257600080fd5b50565b60006020828403121561320757600080fd5b8135611823816131dc565b60005b8381101561322d578181015183820152602001613215565b838111156117275750506000910152565b60008151808452613256816020860160208601613212565b601f01601f19169290920160200192915050565b602081526000611823602083018461323e565b60006020828403121561328f57600080fd5b5035919050565b6001600160a01b03811681146131f257600080fd5b600080604083850312156132be57600080fd5b82356132c981613296565b946020939093013593505050565b6000806000606084860312156132ec57600080fd5b83356132f781613296565b9250602084013561330781613296565b929592945050506040919091013590565b60008083601f84011261332a57600080fd5b50813567ffffffffffffffff81111561334257600080fd5b6020830191508360208260051b850101111561335d57600080fd5b9250929050565b60008083601f84011261337657600080fd5b50813567ffffffffffffffff81111561338e57600080fd5b6020830191508360208260061b850101111561335d57600080fd5b600080600080600080606087890312156133c257600080fd5b863567ffffffffffffffff808211156133da57600080fd5b818901915089601f8301126133ee57600080fd5b8135818111156133fd57600080fd5b8a602060a08302850101111561341257600080fd5b60209283019850965090880135908082111561342d57600080fd5b6134398a838b01613318565b9096509450604089013591508082111561345257600080fd5b5061345f89828a01613364565b979a9699509497509295939492505050565b600061012063ffffffff8c16835267ffffffffffffffff808c166020850152808b166040850152508860030b60608401528760030b60808401528060a08401526134bd8184018861323e565b905082810360c08401526134d1818761323e565b905082810360e08401526134e5818661323e565b90508281036101008401526134fa818561323e565b9c9b505050505050505050505050565b60006020828403121561351c57600080fd5b813561182381613296565b60006020828403121561353957600080fd5b813567ffffffffffffffff81111561355057600080fd5b8201610120818503121561182357600080fd5b60008083601f84011261357557600080fd5b50813567ffffffffffffffff81111561358d57600080fd5b60208301915083602082850101111561335d57600080fd5b6000806000806000606086880312156135bd57600080fd5b853567ffffffffffffffff808211156135d557600080fd5b6135e189838a01613563565b909750955060208801359150808211156135fa57600080fd5b5061360788828901613563565b909450925050604086013561361b81613296565b809150509295509295909350565b6000610100828403121561363c57600080fd5b50919050565b80151581146131f257600080fd5b803561365b81613642565b919050565b6000806040838503121561367357600080fd5b823561367e81613296565b9150602083013561368e81613642565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156136d8576136d8613699565b604052919050565b600067ffffffffffffffff8211156136fa576136fa613699565b50601f01601f191660200190565b6000806000806080858703121561371e57600080fd5b843561372981613296565b9350602085013561373981613296565b925060408501359150606085013567ffffffffffffffff81111561375c57600080fd5b8501601f8101871361376d57600080fd5b803561378061377b826136e0565b6136af565b81815288602083850101111561379557600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080604083850312156137ca57600080fd5b82356137d581613296565b9150602083013561368e81613296565b600181811c908216806137f957607f821691505b6020821081141561363c57634e487b7160e01b600052602260045260246000fd5b60006020828403121561382c57600080fd5b815161182381613296565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561385f57600080fd5b813560ff8116811461182357600080fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561389957613899613870565b500190565b600080858511156138ae57600080fd5b838611156138bb57600080fd5b505060a083020193919092039150565b60006000198214156138df576138df613870565b5060010190565b63ffffffff811681146131f257600080fd5b67ffffffffffffffff811681146131f257600080fd5b6000813561055f816138f8565b8060030b81146131f257600080fd5b6000813561055f8161391b565b6000808335601e1984360301811261394e57600080fd5b83018035915067ffffffffffffffff82111561396957600080fd5b60200191503681900382131561335d57600080fd5b601f8211156107a257600081815260208120601f850160051c810160208610156139a55750805b601f850160051c820191505b81811015611206578281556001016139b1565b67ffffffffffffffff8311156139dc576139dc613699565b6139f0836139ea83546137e5565b8361397e565b6000601f841160018114613a245760008515613a0c5750838201355b600019600387901b1c1916600186901b178355612b80565b600083815260209020601f19861690835b82811015613a555786850135825560209485019460019092019101613a35565b5086821015613a725760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8135613a8f816138e6565b63ffffffff811663ffffffff1983541617825550613adc613ab26020840161390e565b82546bffffffffffffffff00000000191660209190911b6bffffffffffffffff0000000016178255565b613b30613aeb6040840161390e565b82547fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff1660609190911b73ffffffffffffffff00000000000000000000000016178255565b613b8b613b3f6060840161392a565b8280548260a01b77ffffffff0000000000000000000000000000000000000000167fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff8216178255505050565b613bea613b9a6080840161392a565b8280548260c01b7bffffffff000000000000000000000000000000000000000000000000167fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff8216178255505050565b613bf760a0830183613937565b613c058183600186016139c4565b5050613c1460c0830183613937565b613c228183600286016139c4565b5050613c3160e0830183613937565b613c3f8183600386016139c4565b5050613c4f610100830183613937565b6117278183600486016139c4565b803561365b816138e6565b803561365b816138f8565b803561365b8161391b565b6000808335601e19843603018112613c9557600080fd5b830160208101925035905067ffffffffffffffff811115613cb557600080fd5b80360383131561335d57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152613d0b60208201613d0184613c5d565b63ffffffff169052565b6000613d1960208401613c68565b67ffffffffffffffff8116604084015250613d3660408401613c68565b67ffffffffffffffff8116606084015250613d5360608401613c73565b613d62608084018260030b9052565b50613d6f60808401613c73565b613d7e60a084018260030b9052565b50613d8c60a0840184613c7e565b6101208060c0860152613da461014086018385613cc4565b9250613db360c0870187613c7e565b9250601f19808786030160e0880152613dcd858584613cc4565b9450613ddc60e0890189613c7e565b94509150610100818887030181890152613df7868685613cc4565b9550613e05818a018a613c7e565b955092505080878603018388015250613e1f848483613cc4565b979650505050505050565b6000813561055f81613642565b8135613e42816138f8565b67ffffffffffffffff8116905081548167ffffffffffffffff1982161783556020840135613e6f81613296565b7bffffffffffffffffffffffffffffffffffffffff00000000000000008160401b168363ffffffff60e01b841617178455505050613eeb613eb260408401613e2a565b8280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560e01b60ff60e01b16919091179055565b613f33613efa60608401613e2a565b8280547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560e81b60ff60e81b16919091179055565b613f7b613f4260808401613e2a565b8280547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560f01b60ff60f01b16919091179055565b613fde613f8a60a08401613e2a565b8280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1691151560f81b7fff0000000000000000000000000000000000000000000000000000000000000016919091179055565b60018101614005613ff160c08501613e2a565b825490151560ff1660ff1991909116178255565b6107a261401460e08501613e2a565b82805461ff00191691151560081b61ff0016919091179055565b6101008101823561403e816138f8565b67ffffffffffffffff168252602083013561405881613296565b6001600160a01b03166020830152604083013561407481613642565b1515604083015261408760608401613650565b1515606083015261409a60808401613650565b151560808301526140ad60a08401613650565b151560a08301526140c060c08401613650565b151560c08301526140d360e08401613650565b80151560e08401525092915050565b600084516140f4818460208901613212565b845190830190614108818360208901613212565b602f60f81b91019081528351614125816001840160208801613212565b0160010195945050505050565b600067ffffffffffffffff8381169083168181101561415357614153613870565b039392505050565b600067ffffffffffffffff80831681851680830382111561417e5761417e613870565b01949350505050565b803564ffffffffff8116811461365b57600080fd5b8183526000602080850194508260005b85811015614224578135875282820135838801526040808301356141cf81613296565b6001600160a01b0316908801526060828101356141eb816138f8565b67ffffffffffffffff1690880152608064ffffffffff61420c848301614187565b169088015260a09687019691909101906001016141ac565b509495945050505050565b6001600160a01b038416815260406020820152600061425260408301848661419c565b95945050505050565b6000806040838503121561426e57600080fd5b505080516020909101519092909150565b60608152600061429360608301868861419c565b6020830194909452506040015292915050565b6000602082840312156142b857600080fd5b815167ffffffffffffffff8111156142cf57600080fd5b8201601f810184136142e057600080fd5b80516142ee61377b826136e0565b81815285602083850101111561430357600080fd5b614252826020830160208601613212565b634e487b7160e01b600052601260045260246000fd5b60008261433957614339614314565b500490565b60008282101561435057614350613870565b500390565b60008261436457614364614314565b500690565b60006020828403121561437b57600080fd5b8135611823816138f8565b600060a0828403121561439857600080fd5b60405160a0810181811067ffffffffffffffff821117156143bb576143bb613699565b8060405250823581526020830135602082015260408301356143dc81613296565b604082015260608301356143ef816138f8565b606082015261440060808401614187565b60808201529392505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261443e608083018461323e565b9695505050505050565b60006020828403121561445a57600080fd5b8151611823816131dc56fea164736f6c634300080c000a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.