Token Web3 INSID3RS Pass
Overview ERC-1155
Total Supply:
0 INSD3R
Holders:
29 addresses
Transfers:
-
Profile Summary
Contract:
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
InsidersPass
Compiler Version
v0.8.15+commit.e14f2714
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./extensions/IERC1155MetadataURI.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "../IERC1155.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-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; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.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 IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.15; pragma experimental ABIEncoderV2; import "./InsidersPassAuctions.sol"; contract InsidersPass is InsidersPassAuction { uint16 eventsCount; uint16 ticketsCount; event EventRegistered(Event); event TicketCreated(TicketType, uint256); // //Total Copies minted wrt a ticket mapping(uint256 => uint256) totalCopiesMinted; mapping(uint256 => string) tokenURI; event URI(string value, bytes indexed id); //To check all tickets of an event // mapping(uint => uint[]) eventticketTypeDetails; function setURI(uint256 _id, string memory _uri) private { tokenURI[_id] = _uri; emit URI(_uri, _id); } constructor() ERC1155("") { pause(); eventsCount = 0; ticketsCount = 0; packagesCount = 0; } //Only Admin can register events // tickets will be created on time of event registration function registerEvent( uint32 _eventStartDate, uint32 _eventEndDate, TicketType[] memory _TicketTypes, // uint32[] memory _auctionStartTimes, // uint32[] memory _auctionEndTimes, uint8 _royaltyPercentage, uint8 _servicePercentage ) external whenNotPaused onlyOwner { eventsCount++; uint64 newEventID = eventsCount; eventDetails[newEventID].eventStartDate = _eventStartDate; eventDetails[newEventID].eventEndDate = _eventEndDate + 24 hours; eventExists[newEventID] = true; eventIsPaused[newEventID] = false; eventDetails[newEventID].royaltyPercentage = _royaltyPercentage; eventDetails[newEventID].servicePercentage = _servicePercentage; addTicketType( newEventID, _TicketTypes ); emit EventRegistered(eventDetails[eventsCount]); } //Only Admin can Update events function updateEvent( uint16 _eventID, uint32 _eventStartDate, uint32 _eventEndDate, uint8 _royaltyPercentage, uint8 _servicePercentage ) external whenNotPaused onlyOwner eventIsRegistered(_eventID) { eventDetails[_eventID].eventStartDate = _eventStartDate; eventDetails[_eventID].eventEndDate = _eventEndDate; eventDetails[_eventID].royaltyPercentage = _royaltyPercentage; eventDetails[_eventID].servicePercentage = _servicePercentage; } function scanTickets(uint256 ticketID) public view TicketExists(ticketID) returns (bool) { require( balanceOf(_msgSender(), ticketID) > 0, "You dont have this ticket" ); bool response; for ( uint8 i = 0; i < ticketTypeDetails[ticketID].validDates.length; i++ ) { if ( block.timestamp >= ticketTypeDetails[ticketID].validDates[i] && block.timestamp <= (ticketTypeDetails[ticketID].validDates[i] + 86399) ) response = true; else response = false; } return response; } //Add new ticket type for an event function addTicketType(uint64 eventID, TicketType[] memory _ticketTypes) public whenNotPaused onlyOwner eventIsRegistered(eventID) { for (uint8 i = 0; i < _ticketTypes.length; i++) { ticketsCount++; for (uint256 j = 0; j < _ticketTypes[i].validDates.length; j++) { require( (eventDetails[eventID].eventStartDate <= _ticketTypes[i].validDates[j]) && (eventDetails[eventID].eventEndDate >= _ticketTypes[i].validDates[j]), "Validity dates must be within Event Dates" ); } ticketTypeDetails[ticketsCount] = _ticketTypes[i]; //Updating Event ID to total events count ticketTypeDetails[ticketsCount].eventIDforTicket = eventID; placeTicketForFixedPrice( ticketsCount, _ticketTypes[i].ticketFixPrice ); setURI(ticketsCount, _ticketTypes[i].ticketURI); ticketExists[ticketsCount] = true; emit TicketCreated(ticketTypeDetails[ticketsCount], ticketsCount); } } //To update ticket type details of an event function updateTicket( uint64 _eventID, uint256 _ticketID, TicketType memory _ticket ) external whenNotPaused onlyOwner TicketExists(_ticketID) eventIsRegistered(_eventID) { require( _ticket.totalCopies > ticketTypeDetails[_ticketID].copiesSold, "These no of copies have already been sold" ); require(_ticket.eventIDforTicket == ticketTypeDetails[_ticketID].eventIDforTicket, "Invalid Event ID!"); ticketTypeDetails[_ticketID] = _ticket; setURI(_ticketID,_ticket.ticketURI ); emit TicketCreated(ticketTypeDetails[_ticketID], _ticketID); } function mintTicketsWithFixPrice( address account, uint256 ticketID, uint32 noOfCopies ) public payable eventIsNotPaused(ticketTypeDetails[ticketID].eventIDforTicket) { require(eventDetails[ticketTypeDetails[ticketID].eventIDforTicket].eventEndDate > block.timestamp, "This event has passed... Cannot purchase Tickets"); require((ticketTypeDetails[ticketID].copiesSold + noOfCopies) <= ticketTypeDetails[ticketID].totalCopies, "Not enough Copies available"); //Admin will mint Tickets freely in case of fiat payments if(_msgSender() != owner()) require(msg.value == (ticketTypeDetails[ticketID].ticketFixPrice)*noOfCopies, "Not enough amount provided"); user_Balance[owner()] += msg.value; mint(account, ticketID, noOfCopies, ""); totalCopiesMinted[ticketID]+=noOfCopies; Ticket[account][ticketID].Exists = true; setApprovalForAll(address(this),true); } function forceMintTickets(address[] memory addresses, uint[] memory ticketIDs, uint[] memory noOfCopies) external onlyOwner{ for(uint i=0; i<addresses.length;i++){ mint(addresses[i], ticketIDs[i], noOfCopies[i], ""); } } //Only admin can place tickets for fix price while creating tickets function placeTicketForFixedPrice( uint256 ticketID, uint256 _ticketFixPrice ) internal onlyOwner { CurrentStatus = saleTypeChoice(2); ticketTypeDetails[ticketID].ticketSaleType = CurrentStatus; ticketTypeDetails[ticketID].ticketFixPrice = _ticketFixPrice; } function withdrawAmount(uint256 amount) external payable { require( user_Balance[_msgSender()] >= amount, "Your Balance must be Greater Than or Equal to withdraw Amount" ); user_Balance[_msgSender()] -= amount; payable(_msgSender()).transfer(amount); } function name() public pure returns (string memory) { return "Web3 INSID3RS Pass"; } function symbol() public pure returns (string memory) { return "INSD3R"; } function setBaseURI(string memory newuri) public onlyOwner { _setURI(newuri); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function mint( address account, uint256 id, uint256 amount, bytes memory data ) internal whenNotPaused { _mint(account, id, amount, data); } function mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public whenNotPaused { _mintBatch(to, ids, amounts, data); } function uri(uint256 _id) public view override returns (string memory) { return tokenURI[_id]; } function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal override whenNotPaused { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "./InsidersPass.sol"; import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./InsidersPassRoyalties.sol"; abstract contract InsidersPassAuction is Ownable, ERC1155, Pausable, InsidersPassRoyalties //is SpaceERC20 { event availableForAuction(uint256, string); event removeFormSale(uint256, string); event packageCreated(uint256 packageID, ticketPackage); event bidAccepted(uint bidAmount, address receiver); enum saleTypeChoice { onAuction, onRent, OnfixedPrice, NotOnSale } saleTypeChoice public CurrentStatus; uint16 public packagesCount; //User Balances in Contract struct TicketDetails { uint256[] numOfCopies; bool Exists; uint256 eventIDforTicket; // saleTypeChoice salestatus; } constructor() { contractOwner = msg.sender; } struct TicketType { uint64 eventIDforTicket; uint256 ticketFixPrice; uint32[] validDates; uint256 totalCopies; string ticketURI; uint32 copiesSold; saleTypeChoice ticketSaleType; } struct Event { uint32 eventStartDate; uint32 eventEndDate; uint8 royaltyPercentage; uint8 servicePercentage; } struct ticketPackage { uint256[] ticketIDs; uint256[] bidAmount; uint256[] numOfCopies; address packageOwner; address[] bidderAddress; uint32 auctionStartTime; uint32 auctionEndTime; bool Exists; // Using minimumPrice == minimumBid uint256 minimumPrice; uint8 bidIncrementPercentage; uint256 index; saleTypeChoice salestatus; } // PackageId to PackageDetails (Struct) mapping(uint256 => ticketPackage) ticketsPackage; // TicketOwnerAddress to ticketID to TicketDetails (Struct) mapping(address => mapping(uint256 => TicketDetails)) Ticket; //TicketIDs to their no of copies on bid w.r.t each address mapping(address => mapping(uint256 => uint256)) public CopiesOnBidOrSale; //to check if event exists or not mapping(uint256 => bool) eventExists; //to check if a ticket exists mapping(uint256 => TicketType) ticketTypeDetails; //to check if a ticket already exists or not mapping(uint256 => bool) ticketExists; //to check event details from ID mapping(uint256 => Event) eventDetails; //event is paused or not mapping(uint64 => bool) public eventIsPaused; //mapping to store bids amount of each address mapping(address => uint256) BidsAmount; modifier NftExist(address _owner, uint256 ticketID) { require( Ticket[_owner][ticketID].Exists == true, "Not Owner of Ticket or NFT Does't Exist " ); _; } modifier eventIsNotPaused(uint64 _eventID) { require(eventIsPaused[_eventID] == false, "Event is Paused"); _; } //To check if even already exists or not modifier eventIsRegistered(uint64 _eventID) { require(eventExists[_eventID] == true, "Event Does not exist"); _; } //To check if even already exists or not modifier TicketExists(uint256 ticketID) { require(ticketExists[ticketID] == true, "Ticket Does not exist"); _; } modifier PackageExists(uint256 packageID) { require( ticketsPackage[packageID].Exists == true, "Not Owner of Package or Package Does't Exist " ); _; } modifier onFixedPrice(address owner, uint256 packageID) { require( ticketsPackage[packageID].salestatus == saleTypeChoice.OnfixedPrice, "Ticket is Not Available for Fixed Price" ); _; } modifier onAuction(uint256 packageID) { require( ticketsPackage[packageID].salestatus == saleTypeChoice.onAuction, "Ticket is Not Available for Auctions" ); _; } function changeEventState(uint16 _eventID, bool state) external onlyOwner { eventIsPaused[_eventID] = state; } function _placePackageForFixedPrice( uint256 packageID, uint16[] memory _ticketIDs, uint32[] memory ticketCopiesCount, uint256 packageFixPrice ) internal { CurrentStatus = saleTypeChoice(2); ticketsPackage[packageID].ticketIDs = _ticketIDs; ticketsPackage[packageID].salestatus = CurrentStatus; ticketsPackage[packageID].numOfCopies = ticketCopiesCount; ticketsPackage[packageID].minimumPrice = packageFixPrice; ticketsPackage[packageID].packageOwner = _msgSender(); ticketsPackage[packageID].Exists = true; emit packageCreated(packageID, ticketsPackage[packageID]); } function deletePackage(uint256 packageID) external PackageExists(packageID) { require( ticketsPackage[packageID].packageOwner == _msgSender(), "Cannot delete Package as you are not owner of this Ticket" ); for (uint16 k = 0; k < ticketsPackage[packageID].ticketIDs.length;k++) { CopiesOnBidOrSale[ ticketsPackage[packageID].packageOwner][ticketsPackage[packageID].ticketIDs[k]] -= ticketsPackage[packageID].numOfCopies[k]; } ticketsPackage[packageID].Exists = false; } function buyPackageForFixedPrice( address to, uint256 packageID, uint256 _eventID ) external payable PackageExists(packageID) { require(eventDetails[_eventID].eventEndDate > block.timestamp, "This event has passed... Cannot purchase Package"); require(msg.value == ticketsPackage[packageID].minimumPrice,"Not Enough amount Provided"); CurrentStatus = saleTypeChoice(3); uint256 percentage = 0; for (uint256 i = 0;i < ticketsPackage[packageID].ticketIDs.length;i++) { require((balanceOf(ticketsPackage[packageID].packageOwner,ticketsPackage[packageID].ticketIDs[i])) >= CopiesOnBidOrSale[ticketsPackage[packageID].packageOwner][ticketsPackage[packageID].ticketIDs[i]] && (_eventID ==ticketTypeDetails[ticketsPackage[packageID].ticketIDs[i]].eventIDforTicket),"Error: Package has been modified"); CopiesOnBidOrSale[ticketsPackage[packageID].packageOwner][ticketsPackage[packageID].ticketIDs[i]] -= ticketsPackage[packageID].numOfCopies[i]; ticketsPackage[packageID].Exists = false; Ticket[to][ticketsPackage[packageID].ticketIDs[i]].Exists = true; //Have some sense calculating percentage //For God's Sake percentage += eventDetails[_eventID].royaltyPercentage + eventDetails[_eventID].servicePercentage; // Ticket[to][ticketsPackage[packageID].ticketIDs[i]] // .salestatus = CurrentStatus; this.safeTransferFrom( ticketsPackage[packageID].packageOwner, to, ticketsPackage[packageID].ticketIDs[i], ticketsPackage[packageID].numOfCopies[i], "" ); } _royaltyAndInsidersPassFee( ticketsPackage[packageID].minimumPrice, eventDetails[_eventID].royaltyPercentage, payable(contractOwner), payable(ticketsPackage[packageID].packageOwner), eventDetails[_eventID].servicePercentage ); setApprovalForAll(address(this), true); } // Secondary Sales for Auction & Fix Price function placePackageForTimedAuction( uint256 _eventID, uint16[] memory _ticketIDs, uint32[] memory ticketCopiesCount, uint32 _auctionStartTime, uint32 _auctionEndTime, uint256 packageMinPrice, uint8 _incrementPercentage ) external { require(eventDetails[_eventID].eventEndDate > block.timestamp && eventDetails[_eventID].eventEndDate > _auctionEndTime, "Event Passed or Auction time Error"); for (uint16 i = 0; i < _ticketIDs.length; i++) { // require(Ticket[owner][_ticketIDs[i]].Exists && (balanceOf(msg.sender, _ticketIDs[i]) - CopiesOnBidOrSale[msg.sender][_ticketIDs[i]]) <= ticketCopiesCount[i] && _eventID == ticketTypeDetails[_ticketIDs[i]].eventIDforTicket, "Error: Cannot Place package for Fixed Price"); require( (super.balanceOf(msg.sender, _ticketIDs[i]) - CopiesOnBidOrSale[msg.sender][_ticketIDs[i]]) >= ticketCopiesCount[i] && (_eventID == ticketTypeDetails[_ticketIDs[i]].eventIDforTicket), "Copies not Available" ); CopiesOnBidOrSale[_msgSender()][_ticketIDs[i]] += ticketCopiesCount[ i ]; } packagesCount++; uint16 newPackageID = packagesCount; _placePackageForTimedAuction( newPackageID, _ticketIDs, ticketCopiesCount, _auctionStartTime, _auctionEndTime, packageMinPrice, _incrementPercentage ); } function placePackageForFixedPrice( uint256 _eventID, uint16[] memory _ticketIDs, uint32[] memory ticketCopiesCount, uint256 packageFixPrice ) external { require(eventDetails[_eventID].eventEndDate > block.timestamp, "Event Passed"); for (uint16 i = 0; i < _ticketIDs.length; i++) { // require(Ticket[owner][_ticketIDs[i]].Exists && (balanceOf(msg.sender, _ticketIDs[i]) - CopiesOnBidOrSale[msg.sender][_ticketIDs[i]]) <= ticketCopiesCount[i] && _eventID == ticketTypeDetails[_ticketIDs[i]].eventIDforTicket, "Error: Cannot Place package for Fixed Price"); require( (super.balanceOf(msg.sender, _ticketIDs[i]) - CopiesOnBidOrSale[msg.sender][_ticketIDs[i]]) >= ticketCopiesCount[i] && (_eventID == ticketTypeDetails[_ticketIDs[i]].eventIDforTicket), "Copies not Available" ); CopiesOnBidOrSale[_msgSender()][_ticketIDs[i]] += ticketCopiesCount[i]; } packagesCount++; uint256 newPackageID = packagesCount; _placePackageForFixedPrice( newPackageID, _ticketIDs, ticketCopiesCount, packageFixPrice ); } function _placePackageForTimedAuction( uint256 packageID, uint16[] memory _ticketIDs, uint32[] memory ticketCopiesCount, uint32 _auctionStartTime, uint32 _auctionEndTime, uint256 packageMinPrice, uint8 _incrementPercentage ) internal { // start time should be near to Block.timestamp require( _auctionStartTime != _auctionEndTime && block.timestamp < _auctionEndTime, "Error! Time Error" ); CurrentStatus = saleTypeChoice(0); ticketsPackage[packageID].ticketIDs = _ticketIDs; ticketsPackage[packageID].salestatus = CurrentStatus; ticketsPackage[packageID].auctionStartTime = _auctionStartTime; ticketsPackage[packageID].numOfCopies = ticketCopiesCount; ticketsPackage[packageID].auctionEndTime = _auctionEndTime; ticketsPackage[packageID].minimumPrice = packageMinPrice; ticketsPackage[packageID].bidIncrementPercentage = _incrementPercentage; ticketsPackage[packageID].packageOwner = _msgSender(); ticketsPackage[packageID].Exists = true; emit packageCreated(packageID, ticketsPackage[packageID]); emit availableForAuction(packageID, " Accepting Bids"); } function AcceptYourHighestBid(uint256 packageID, uint256 _eventID) external PackageExists(packageID) returns (bool accepted) { address owner = _msgSender(); require( ticketsPackage[packageID].packageOwner == _msgSender(), "Cannot accept Bid as you are not owner of this Ticket" ); uint highestBidAmount = ticketsPackage[packageID].bidAmount[ticketsPackage[packageID].bidAmount.length - 1]; CurrentStatus = saleTypeChoice(3); bool result = true; for (uint16 i = 0; i < ticketsPackage[packageID].ticketIDs.length;i++) { if((balanceOf(ticketsPackage[packageID].packageOwner,ticketsPackage[packageID].ticketIDs[i])) < CopiesOnBidOrSale[ticketsPackage[packageID].packageOwner][ticketsPackage[packageID].ticketIDs[i]] && (_eventID ==ticketTypeDetails[ticketsPackage[packageID].ticketIDs[i]].eventIDforTicket)) { result = false; } } if(result == false) { for (uint16 j = 0;j < ticketsPackage[packageID].bidderAddress.length;j++) { payable(ticketsPackage[packageID].bidderAddress[j]).transfer(ticketsPackage[packageID].bidAmount[j]); } for (uint16 k = 0; k < ticketsPackage[packageID].ticketIDs.length;k++) { CopiesOnBidOrSale[owner][ticketsPackage[packageID].ticketIDs[k]] -= ticketsPackage[packageID].numOfCopies[k]; } ticketsPackage[packageID].Exists = false; return result; } else{ for (uint16 m = 0; m < ticketsPackage[packageID].ticketIDs.length;m++) { CopiesOnBidOrSale[owner][ ticketsPackage[packageID].ticketIDs[m] ] -= ticketsPackage[packageID].numOfCopies[m]; Ticket[ ticketsPackage[packageID].bidderAddress[ ticketsPackage[packageID].bidderAddress.length - 1 ]][ticketsPackage[packageID].ticketIDs[m]].Exists = true; this.safeTransferFrom( owner, ticketsPackage[packageID].bidderAddress[ ticketsPackage[packageID].bidderAddress.length - 1 ], ticketsPackage[packageID].ticketIDs[m], ticketsPackage[packageID].numOfCopies[m], "" ); } ticketsPackage[packageID].Exists = false; for ( uint16 l = 0;l < ticketsPackage[packageID].bidderAddress.length-1;l++) { payable(ticketsPackage[packageID].bidderAddress[l]).transfer(ticketsPackage[packageID].bidAmount[l]); } emit bidAccepted(highestBidAmount, ticketsPackage[packageID].bidderAddress[ticketsPackage[packageID].bidderAddress.length - 1]); delete ticketsPackage[packageID].bidAmount; delete ticketsPackage[packageID].bidderAddress; _royaltyAndInsidersPassFee( highestBidAmount, eventDetails[_eventID].royaltyPercentage, payable(contractOwner), payable(ticketsPackage[packageID].packageOwner), eventDetails[_eventID].servicePercentage ); setApprovalForAll(address(this), true); return result; } } error InsufficientBalance(uint256 available, uint256 required); function addAuctionBid( uint256 packageID, uint256 _bidAmount ) external payable PackageExists(packageID) onAuction( packageID) { require(eventDetails[ticketTypeDetails[ticketsPackage[packageID].ticketIDs[0]].eventIDforTicket].eventEndDate > block.timestamp, "Event Passed"); require( block.timestamp <= ticketsPackage[packageID].auctionEndTime, "Auction Time Over" ); require(msg.value == _bidAmount, "Insufficient Amount"); if(ticketsPackage[packageID].bidAmount.length == 0) { if(_bidAmount < ticketsPackage[packageID].minimumPrice) revert InsufficientBalance({ available: _bidAmount, required: ticketsPackage[packageID].minimumPrice }); } else if (ticketsPackage[packageID].bidAmount.length != 0) { if ( _bidAmount < (ticketsPackage[packageID].bidAmount[ (ticketsPackage[packageID].bidAmount.length) - 1 ] + (ticketsPackage[packageID].bidAmount[ (ticketsPackage[packageID].bidAmount.length) - 1 ] * (ticketsPackage[packageID].bidIncrementPercentage)) / 100) ) { revert InsufficientBalance({ available: user_Balance[msg.sender], required: ticketsPackage[packageID].bidAmount[ (ticketsPackage[packageID].bidAmount.length) - 1 ] + (ticketsPackage[packageID].bidAmount[ ticketsPackage[packageID].bidderAddress.length - 1 ] * ( ticketsPackage[packageID].bidIncrementPercentage )) / 100 }); } } ticketsPackage[packageID].bidAmount.push(_bidAmount); ticketsPackage[packageID].bidderAddress.push( msg.sender); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; contract InsidersPassRoyalties { mapping(address => uint256) public user_Balance; event RoyaltiesTransfer(uint256, uint256, uint256); address public contractOwner; constructor() { contractOwner = msg.sender; } function _royaltyAndInsidersPassFee (uint _NftPrice, uint percentage, address payable minterAddress, address payable NftSeller, uint8 serviceFee) internal { uint _TotalNftPrice = _NftPrice; //NEW //uint _TotalNftPrice = msg.value; // require(msg.value >= NftPrice[NftId], "Error! Insufficent Balance"); uint _InsidersPassFee = _calculateGlobalPassFee(_NftPrice, serviceFee); uint _minterFee = _calculateAndSendMinterFee(_NftPrice , percentage, minterAddress); _TotalNftPrice = _TotalNftPrice - (_InsidersPassFee + _minterFee); _transferAmountToSeller( _TotalNftPrice, NftSeller); // Send Amount to NFT Seller after Tax deduction emit RoyaltiesTransfer(_InsidersPassFee, _minterFee, _TotalNftPrice); } function _calculateGlobalPassFee(uint Price, uint8 serviceFee) internal returns(uint) { uint InsidersPassFee = (Price*serviceFee)/100; user_Balance[contractOwner] += InsidersPassFee; return InsidersPassFee; } function _transferAmountToSeller(uint256 amount, address payable seller) internal { seller.transfer(amount); } function _calculateAndSendMinterFee( uint256 _NftPrice, uint256 Percentage, address payable minterAddr ) internal returns (uint256) { uint256 AmountToSend = (_NftPrice * Percentage) / 100; //Calculate Minter percentage and Send to his Address from Struct user_Balance[minterAddr] += AmountToSend; return AmountToSend; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "viaIR": true, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"uint32","name":"eventStartDate","type":"uint32"},{"internalType":"uint32","name":"eventEndDate","type":"uint32"},{"internalType":"uint8","name":"royaltyPercentage","type":"uint8"},{"internalType":"uint8","name":"servicePercentage","type":"uint8"}],"indexed":false,"internalType":"struct InsidersPassAuction.Event","name":"","type":"tuple"}],"name":"EventRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"RoyaltiesTransfer","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"eventIDforTicket","type":"uint64"},{"internalType":"uint256","name":"ticketFixPrice","type":"uint256"},{"internalType":"uint32[]","name":"validDates","type":"uint32[]"},{"internalType":"uint256","name":"totalCopies","type":"uint256"},{"internalType":"string","name":"ticketURI","type":"string"},{"internalType":"uint32","name":"copiesSold","type":"uint32"},{"internalType":"enum InsidersPassAuction.saleTypeChoice","name":"ticketSaleType","type":"uint8"}],"indexed":false,"internalType":"struct InsidersPassAuction.TicketType","name":"","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"TicketCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"bytes","name":"id","type":"bytes"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"string","name":"","type":"string"}],"name":"availableForAuction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bidAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"bidAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"packageID","type":"uint256"},{"components":[{"internalType":"uint256[]","name":"ticketIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"bidAmount","type":"uint256[]"},{"internalType":"uint256[]","name":"numOfCopies","type":"uint256[]"},{"internalType":"address","name":"packageOwner","type":"address"},{"internalType":"address[]","name":"bidderAddress","type":"address[]"},{"internalType":"uint32","name":"auctionStartTime","type":"uint32"},{"internalType":"uint32","name":"auctionEndTime","type":"uint32"},{"internalType":"bool","name":"Exists","type":"bool"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint8","name":"bidIncrementPercentage","type":"uint8"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"enum InsidersPassAuction.saleTypeChoice","name":"salestatus","type":"uint8"}],"indexed":false,"internalType":"struct InsidersPassAuction.ticketPackage","name":"","type":"tuple"}],"name":"packageCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"string","name":"","type":"string"}],"name":"removeFormSale","type":"event"},{"inputs":[{"internalType":"uint256","name":"packageID","type":"uint256"},{"internalType":"uint256","name":"_eventID","type":"uint256"}],"name":"AcceptYourHighestBid","outputs":[{"internalType":"bool","name":"accepted","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"CopiesOnBidOrSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CurrentStatus","outputs":[{"internalType":"enum InsidersPassAuction.saleTypeChoice","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"packageID","type":"uint256"},{"internalType":"uint256","name":"_bidAmount","type":"uint256"}],"name":"addAuctionBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"eventID","type":"uint64"},{"components":[{"internalType":"uint64","name":"eventIDforTicket","type":"uint64"},{"internalType":"uint256","name":"ticketFixPrice","type":"uint256"},{"internalType":"uint32[]","name":"validDates","type":"uint32[]"},{"internalType":"uint256","name":"totalCopies","type":"uint256"},{"internalType":"string","name":"ticketURI","type":"string"},{"internalType":"uint32","name":"copiesSold","type":"uint32"},{"internalType":"enum InsidersPassAuction.saleTypeChoice","name":"ticketSaleType","type":"uint8"}],"internalType":"struct InsidersPassAuction.TicketType[]","name":"_ticketTypes","type":"tuple[]"}],"name":"addTicketType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"packageID","type":"uint256"},{"internalType":"uint256","name":"_eventID","type":"uint256"}],"name":"buyPackageForFixedPrice","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_eventID","type":"uint16"},{"internalType":"bool","name":"state","type":"bool"}],"name":"changeEventState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"packageID","type":"uint256"}],"name":"deletePackage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"eventIsPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"ticketIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"noOfCopies","type":"uint256[]"}],"name":"forceMintTickets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"ticketID","type":"uint256"},{"internalType":"uint32","name":"noOfCopies","type":"uint32"}],"name":"mintTicketsWithFixPrice","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"packagesCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eventID","type":"uint256"},{"internalType":"uint16[]","name":"_ticketIDs","type":"uint16[]"},{"internalType":"uint32[]","name":"ticketCopiesCount","type":"uint32[]"},{"internalType":"uint256","name":"packageFixPrice","type":"uint256"}],"name":"placePackageForFixedPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eventID","type":"uint256"},{"internalType":"uint16[]","name":"_ticketIDs","type":"uint16[]"},{"internalType":"uint32[]","name":"ticketCopiesCount","type":"uint32[]"},{"internalType":"uint32","name":"_auctionStartTime","type":"uint32"},{"internalType":"uint32","name":"_auctionEndTime","type":"uint32"},{"internalType":"uint256","name":"packageMinPrice","type":"uint256"},{"internalType":"uint8","name":"_incrementPercentage","type":"uint8"}],"name":"placePackageForTimedAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eventStartDate","type":"uint32"},{"internalType":"uint32","name":"_eventEndDate","type":"uint32"},{"components":[{"internalType":"uint64","name":"eventIDforTicket","type":"uint64"},{"internalType":"uint256","name":"ticketFixPrice","type":"uint256"},{"internalType":"uint32[]","name":"validDates","type":"uint32[]"},{"internalType":"uint256","name":"totalCopies","type":"uint256"},{"internalType":"string","name":"ticketURI","type":"string"},{"internalType":"uint32","name":"copiesSold","type":"uint32"},{"internalType":"enum InsidersPassAuction.saleTypeChoice","name":"ticketSaleType","type":"uint8"}],"internalType":"struct InsidersPassAuction.TicketType[]","name":"_TicketTypes","type":"tuple[]"},{"internalType":"uint8","name":"_royaltyPercentage","type":"uint8"},{"internalType":"uint8","name":"_servicePercentage","type":"uint8"}],"name":"registerEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ticketID","type":"uint256"}],"name":"scanTickets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setBaseURI","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":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_eventID","type":"uint16"},{"internalType":"uint32","name":"_eventStartDate","type":"uint32"},{"internalType":"uint32","name":"_eventEndDate","type":"uint32"},{"internalType":"uint8","name":"_royaltyPercentage","type":"uint8"},{"internalType":"uint8","name":"_servicePercentage","type":"uint8"}],"name":"updateEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_eventID","type":"uint64"},{"internalType":"uint256","name":"_ticketID","type":"uint256"},{"components":[{"internalType":"uint64","name":"eventIDforTicket","type":"uint64"},{"internalType":"uint256","name":"ticketFixPrice","type":"uint256"},{"internalType":"uint32[]","name":"validDates","type":"uint32[]"},{"internalType":"uint256","name":"totalCopies","type":"uint256"},{"internalType":"string","name":"ticketURI","type":"string"},{"internalType":"uint32","name":"copiesSold","type":"uint32"},{"internalType":"enum InsidersPassAuction.saleTypeChoice","name":"ticketSaleType","type":"uint8"}],"internalType":"struct InsidersPassAuction.TicketType","name":"_ticket","type":"tuple"}],"name":"updateTicket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"user_Balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAmount","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608034620001be576020908082016001600160401b03811182821017620001a857604090815260009182905281546001600160a01b031980821633908117855592516001600160a01b039591949193909286167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08385a3600354916001928381811c911680156200019d575b858210146200018957601f81116200015a575b508160035560ff19600454169185600654169633915416036200011a5750176004556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589190a16010805463ffffffff19169055339081169091171761ffff60a81b19166006556040516156ef9081620001c48239f35b6064908462461bcd60e51b825280600483015260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6003835283601f868520920160051c8201915b8281106200017d5750506200009e565b8481550184906200016d565b634e487b7160e01b83526022600452602483fd5b90607f16906200008b565b634e487b7160e01b600052604160045260246000fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8062fdd58e14613b7b57806301ffc9a714613b0d5780630562b9f714613a4457806306fdde03146139f15780630e89341c146139a057806310e88faf146135745780631737988c14612ffc57806318e10bff14612fd75780631de6c24914612e735780631f7fdffa14612cfe5780632b2f7495146128525780632c47fc231461250b5780632eb2c2d61461223b5780633f4ba83a146121a757806340cedb98146121585780634e1273f41461201a57806355f804b314611eaf5780635934513a146119a75780635c975abb1461198457806361db66fe14611888578063715018a6146118295780637a0ede13146115595780638456cb59146114ff5780638985289d1461111e5780638d94cc3314610fac5780638da5cb5b14610f8357806395d89b4114610f385780639d8d721f1461097a578063a22cb46514610890578063ce606ee014610867578063d6c5faba14610828578063d71c1008146106a3578063e3306a6f14610678578063e985e9c514610622578063ef4142be146105e8578063f242432a14610324578063f2fde38b1461025c578063f65e8a3e146102155763f8071479146101c857600080fd5b34610210576040366003190112610210576001600160a01b036101e9613baa565b16600052600960205260406000206024356000526020526020604060002054604051908152f35b600080fd5b346102105760206102526102283661405a565b90806000526007845261024d600160ff60056040600020015460401c16151514614b96565b614e2e565b6040519015158152f35b3461021057602036600319011261021057610275613baa565b61027d61407d565b6001600160a01b039081169081156102d057600080546001600160a01b031981168417825560405191939192167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08484a3f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346102105760a03660031901126102105761033d613baa565b610345613bc0565b906064356044356084356001600160401b0381116102105761036b903690600401613d2d565b6001600160a01b039384169333851480156105bf575b61038a906141e1565b8516610397811515614244565b6103a083614576565b506103aa84614576565b506103b36145ae565b82600052602095600187526040600020866000528752846040600020546103dc8282101561429e565b85600052600189526040600020886000528952036040600020558360005260018752604060002082600052875260406000206104198682546142fd565b90558186604051868152878a8201527fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260403392a43b610456575b005b61049a93600087946040519687958694859363f23a6e6160e01b9b8c865233600487015260248601526044850152606484015260a0608484015260a4830190613bd6565b03925af160009181610590575b506105665750506001906104b96143f7565b6308c379a014610531575b506104cb57005b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608490fd5b0390fd5b610539614415565b908161054557506104c4565b61052d60405192839262461bcd60e51b845260048401526024830190613bd6565b6001600160e01b0319161490506104545760405162461bcd60e51b81528061052d600482016143ae565b6105b1919250843d86116105b8575b6105a98183613c58565b81019061438e565b90846104a7565b503d61059f565b5084600052600260205260406000203360005260205261038a60ff604060002054169050610381565b34610210576020366003190112610210576001600160a01b03610609613baa565b1660005260056020526020604060002054604051908152f35b346102105760403660031901126102105761063b613baa565b610643613bc0565b9060018060a01b03809116600052600260205260406000209116600052602052602060ff604060002054166040519015158152f35b3461021057600036600319011261021057602060ff60065460a01c166106a16040518092614070565bf35b346102105760208060031936011261021057600435908160005260079182825260016106e08160ff60056040600020015460401c16151514614b96565b8160005283835260018060a01b0360038181604060002001541633036107bd576000835b61072b575b5050505060005252600560406000200160ff60401b1981541690556000604051f35b8460005286865260406000205461ffff821610156107b857806107586107b2926002604060002001614bf8565b905490841b1c866000528888528484604060002001541660005260098852604060002087600052898952610790836040600020614bf8565b905490861b1c60005288526107ab6040600020918254614b35565b905561459b565b83610704565b610709565b60405162461bcd60e51b815260048101869052603960248201527f43616e6e6f742064656c657465205061636b61676520617320796f752061726560448201527f206e6f74206f776e6572206f662074686973205469636b6574000000000000006064820152608490fd5b34610210576020366003190112610210576001600160401b03610849613c27565b16600052600e602052602060ff604060002054166040519015158152f35b34610210576000366003190112610210576006546040516001600160a01b039091168152602090f35b34610210576040366003190112610210576108a9613baa565b6108b1613fa9565b6001600160a01b0390911690338214610923573360005260026020526040600020826000526020526108f38160406000209060ff801983541691151516179055565b60405190151581527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b60405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608490fd5b3461021057604036600319011261021057610993613c27565b6024356001600160401b038111610210576109b2903690600401613e31565b906109bb6145ae565b6109c361407d565b6001600160401b038116600052600a6020526109eb600160ff604060002054161515146145f2565b60005b825160ff821610156104545760105463ffff0000610a1261ffff8360101c1661459b565b60101b169063ffff0000191617928360105560005b6040610a3660ff851684614169565b51015151811015610b31576001600160401b038416600052600d8060205263ffffffff806040600020541681610a7d856040610a7560ff8b168a614169565b510151614169565b511610159182610af4575b505015610a9d57610a989061415a565b610a27565b60405162461bcd60e51b815260206004820152602960248201527f56616c6964697479206461746573206d7573742062652077697468696e204576604482015268656e7420446174657360b81b6064820152608490fd5b9091506001600160401b0386166000526020528060406000205460201c1690610b26836040610a7560ff891688614169565b511611158680610a88565b50929061ffff610b4460ff831686614169565b519260101c16600052600b6020526040600020916001600160401b038151166001600160401b03198454161783556020810151600184015560028301604082015190815191600160401b8311610e7e576020908254848455808510610ee8575b500190600052602060002090600080915b848310610e945750505050506060810151600384015560808101518051906001600160401b038211610e7e57610bee60048601546146d7565b90601f91828111610e41575b506020918311600114610dce5760c093929160009183610dc3575b50508160011b916000199060031b1c19161760048501555b63ffffffff60a08201511663ffffffff196005860154161760058501550151916004831015610dad57610da8926005610c669201614711565b61ffff60105460101c16600052600b60205260406000206001600160401b0384166001600160401b031982541617905561ffff60105460101c166020610caf60ff841687614169565b51015190610cbb61407d565b6006805460ff60a01b1916600160a11b17908190556000828152600b60205260409020610cf19160a01c60ff1690600501614711565b600052600b602052600160406000200155610d2761ffff60105460101c166080610d1e60ff851688614169565b510151906149cb565b61ffff60105460101c16600052600c6020526040600020600160ff198254161790557fcb3ac6bc0041b968fb472d167fa1c374afbb340bafff09e0711a3099b21a4574610d9a61ffff60105460101c1680600052600b6020526040600020906040519283926040845260408401906147cc565b9060208301520390a1614679565b6109ee565b634e487b7160e01b600052602160045260246000fd5b015190508880610c15565b906004860160005260206000209160005b601f1985168110610e29575091839160019360c09695601f19811610610e10575b505050811b016004850155610c2d565b015160001960f88460031b161c19169055888080610e00565b81830151845560019093019260209283019201610ddf565b610e6f90600488016000526020600020600585808801821c83019360208910610e75575b01901c01906146c0565b88610bfa565b93508293610e65565b634e487b7160e01b600052604160045260246000fd5b602060049163ffffffff9b989a999b80825116908754908660031b90811b9283911b1691191617865501910191601c8311610ed9575b60010191909896979598610bb5565b60019093019260009250610eca565b610f199084600052836000206007600390808901821c830193601c8a60021b1680610f1f575b5001901c01906146c0565b89610ba4565b60001990818701918254918b03861b1c1690558f610f0e565b3461021057600036600319011261021057610f7f604051610f5881613c3d565b600681526524a729a219a960d11b6020820152604051918291602083526020830190613bd6565b0390f35b34610210576000366003190112610210576000546040516001600160a01b039091168152602090f35b34610210576060366003190112610210576001600160401b0360043581811161021057610fdd903690600401613fb8565b6024803583811161021057610ff6903690600401613ed1565b6044358481116102105761100e903690600401613ed1565b9061101761407d565b60005b8451811015610454576001600160a01b036110358287614169565b51166110418284614169565b5161104c8386614169565b51906040519260208085018581108c8211176111095791806000611104989795936110ff97956040528187526110806145ae565b61108b831515614b40565b61109485614576565b5061109e86614576565b506110a76145ae565b84825260018152604082208383528152604082206110c68782546142fd565b905585604051918683528201527fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260403392a433614483565b61415a565b61101a565b89634e487b7160e01b60005260416004526000fd5b6111273661405a565b81600052600760208181526001936111508560ff60056040600020015460401c16151514614b96565b8060005282825260ff600960406000200154166004811015610dad576114ae57806000528282526040600020805415611498576000528160002054600052600b82526001600160401b0360406000205416600052600d825263ffffffff6111c181604060002054851c164210614c53565b81600052838352600560406000200154831c16421161145f5783340361142457806000528282528460406000200154156000146112c05780600052828252600660406000200154841061129a575b806000528282528460406000200193845494600160401b9586811015610e7e5761123d918882018155614bf8565b819291549060031b600019811b9283911b16911916179055600052526004604060002001805491821015610e7e576112789282018155614bf8565b81546001600160a01b0360039290921b91821b80199091163390921b16179055005b6044846006604060002001546040519163cf47918160e01b835260048301526024820152fd5b84604060002001541561120f576040600020850180549086821061140e576112ee9060001980930190614bf8565b9054600084815286865260409020880180549092919089811061140e5761133e61132061134995876064940190614bf8565b9054886000528a8a5260ff8b60406000200154169160031b1c6146ad565b049160031b1c6142fd565b8510611355575061120f565b908592336000526005815260406000205493826000528582528060406000200181604060002001549082821061140e5785611391920190614bf8565b90549060031b1c92806000528683528160406000200160046040600020015492831061140e57876044986064956113d360ff946113f49a6113ed980190614bf8565b90549060031b1c94600052526040600020015416906146ad565b04906142fd565b6040519163cf47918160e01b835260048301526024820152fd5b634e487b7160e01b600052601160045260246000fd5b60405162461bcd60e51b8152600481018390526013602482015272125b9cdd59999a58da595b9d08105b5bdd5b9d606a1b6044820152606490fd5b60405162461bcd60e51b815260048101839052601160248201527020bab1ba34b7b7102a34b6b29027bb32b960791b6044820152606490fd5b634e487b7160e01b600052603260045260246000fd5b60405162461bcd60e51b8152600481018390526024808201527f5469636b6574206973204e6f7420417661696c61626c6520666f722041756374604482015263696f6e7360e01b6064820152608490fd5b346102105760003660031901126102105761151861407d565b6115206145ae565b600160ff1960045416176004557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b34610210576080366003190112610210576001600160401b036004356024358281116102105761158d903690600401613f40565b90604435838111610210576115a6903690600401613cc7565b91816000526020600d815263ffffffff936115cb85604060002054841c164210614c53565b60005b835161ffff90818316908110156116ae5790816115fb826115f361168496958a614169565b5116336140d5565b913360005261162c600993848952604060002083611619868d614169565b5116600052895260406000205490614b35565b8a6116378489614169565b5116111580611689575b61164a90614c10565b896116558388614169565b51169233600052875261166d60406000209289614169565b511660005285526107ab60406000209182546142fd565b6115ce565b5080611695838a614169565b51166000908152600b885260409020548b168914611641565b6006548590858a8961ffff61ffff60a81b6116ce60a887901c831661459b565b60a81b1694818661ffff60a81b1983161760a81c1695600160a11b9162ffffff60a01b191617176006558460005260078652604060002090868351936117148585614c8e565b01916000528660002090876000935b858510611810575087878761174f60ff60065460a01c1684600052600786526009604060002001614cc4565b82600052600784526002604060002001908483519361176e8585614c8e565b019160005284600020906000925b8484106117f95760008681526007885260409081902060643560068201556003810180546001600160a01b0319163317905560058101805460ff60401b1916600160401b17905590517f9c5124c1ab0b68218e469f679fc86f10845de3efb82abf9ca29d5f29be2115a19181906117f4908a83614d19565b0390a1005b60018782848394511686550193019301929161177c565b6001918184849351168655019301930192918890611723565b346102105760003660031901126102105761184261407d565b600080546001600160a01b0319811682556040519082906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08284a3f35b346102105760a0366003190112610210576104546118a4613f2f565b6119656118af613c90565b6119466118ba613ca3565b6118c2613eb1565b9261ffff6118ce613ec1565b966118d76145ae565b6118df61407d565b1680600052600a6020526118ff600160ff604060002054161515146145f2565b600052600d60205263ffffffff6040600020911663ffffffff1982541617905560406000209067ffffffff0000000082549160201b169067ffffffff000000001916179055565b60406000209060ff60401b82549160401b169060ff60401b1916179055565b60406000209060ff60481b82549160481b169060ff60481b1916179055565b3461021057600036600319011261021057602060ff600454166040519015158152f35b6060366003190112610210576119bb613baa565b602490813560005260076020526119e4600160ff60056040600020015460401c16151514614b96565b604435600052600d60205263ffffffff60406000205460201c16421015611e5257813560005260076020526006604060002001543403611e0e576006805460ff60a01b1916600360a01b179055600090815b83356000526007602052604060002054831015611d9157611a7c60018060a01b0360036040600020015416611a6f856040600020614bf8565b90549060031b1c906140d5565b8435600081815260076020818152604080842060038101546001600160a01b03168552600983529084209490935252611ab6908690614bf8565b90549060031b1c600052602052604060002054111580611d51575b15611d0d5783356000526007602052611af1836002604060002001614bf8565b90549060031b1c8435600052600760205260018060a01b03600360406000200154166000526009602052604060002085356000526007602052611b38856040600020614bf8565b90549060031b1c600052602052611b556040600020918254614b35565b90558335600081815260076020818152604080842060058101805460ff60401b191690556001600160a01b0388168552600883529084209490935252611b9c908590614bf8565b90549060031b1c6000526020526001604060002001600160ff19825416179055604435600052600d60205260ff60406000205460401c169060ff60406000205460481c16918260ff038111611cf857611bf9920160ff16906142fd565b918335600052600760205260018060a01b036003604060002001541690611c24816040600020614bf8565b90549060031b1c9185356000526007602052611c47826002604060002001614bf8565b90549060031b1c303b1561021057604051637921219560e11b81526001600160a01b03928316600482015291851660248301526044820193909352606481019290925260a06084830152600060a483018190528260c48183305af18015611cec57611cbd575b611cb7915061415a565b91611a36565b6001600160401b038211611cd757611cb791604052611cad565b84634e487b7160e01b60005260416004526000fd5b6040513d6000823e3d90fd5b85634e487b7160e01b60005260116004526000fd5b60405162461bcd60e51b8152602060048201819052818601527f4572726f723a205061636b61676520686173206265656e206d6f6469666965646044820152606490fd5b5083356000526007602052611d6a836040600020614bf8565b90549060031b1c600052600b6020526001600160401b036040600020541660443514611ad1565b611e05848035600052600760205260066040600020015490604435600052600d60205260ff60406000205460401c169060018060a01b03600654169035600052600760205260018060a01b036003604060002001541691604435600052600d60205260ff60406000205460481c16936155d8565b6104543061417d565b60405162461bcd60e51b815260206004820152601a818401527f4e6f7420456e6f75676820616d6f756e742050726f76696465640000000000006044820152606490fd5b60405162461bcd60e51b8152602060048201526030818401527f54686973206576656e7420686173207061737365642e2e2e2043616e6e6f742060448201526f7075726368617365205061636b61676560801b6064820152608490fd5b3461021057602080600319360112610210576001600160401b039060043582811161021057611ee2903690600401613d2d565b91611eeb61407d565b8251908111610e7e57600391611f0183546146d7565b601f8111611fc2575b5080601f8311600114611f435750819293600092611f38575b50508160011b9160001990841b1c1916179055005b015190508380611f23565b90601f19831694846000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b926000905b878210611faa575050836001959610611f92575b505050811b019055005b015160001983861b60f8161c19169055838080611f88565b80600185968294968601518155019501930190611f74565b61200a90846000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f850160051c810191848610612010575b601f0160051c01906146c0565b84611f0a565b9091508190611ffd565b34610210576040366003190112610210576001600160401b036004358181116102105761204b903690600401613fb8565b9060243590811161021057612064903690600401613ed1565b9080518251036121015780519161207a83613c79565b926120886040519485613c58565b808452612097601f1991613c79565b0136602085013760005b82518110156120eb576120e6906120d66001600160a01b036120c38387614169565b51166120cf8386614169565b51906140d5565b6120e08287614169565b5261415a565b6120a1565b60405160208082528190610f7f90820187614026565b60405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608490fd5b3461021057604036600319011261021057610454612174613f2f565b61ffff61217f613fa9565b9161218861407d565b16600052600e60205260406000209060ff801983541691151516179055565b34610210576000366003190112610210576121c061407d565b60045460ff8116156121ff5760ff19166004557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b60405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606490fd5b346102105760031960a03682011261021057612255613baa565b9061225e613bc0565b906001600160401b039060443582811161021057612280903690600401613ed1565b60643583811161021057612298903690600401613ed1565b92608435908111610210576122b1903690600401613d2d565b6001600160a01b039586169590929033871480156124e2575b6122d3906141e1565b6122e08351865114614309565b8516926122ee841515614244565b6122f66145ae565b60005b835181101561238e57806123106123899286614169565b5161231b8289614169565b519080600052600160209181835260406000208d6000528352838d604060002054906123498383101561429e565b836000528486526040600020906000528552036040600020556000528152604060002090886000525261238260406000209182546142fd565b905561415a565b6122f9565b5090949392919382876040517f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb3391806123c98a8c83614366565b0390a43b6123d357005b60006020946124346124259761241594604051998a988997889663bc197c8160e01b9e8f89523360048a0152602489015260a0604489015260a4880190614026565b9084878303016064880152614026565b91848303016084850152613bd6565b03925af1600091816124c2575b5061249a57505060016124526143f7565b6308c379a014612463575b6104cb57005b61246b614415565b80612476575061245d565b60405162461bcd60e51b81526020600482015290819061052d906024830190613bd6565b6001600160e01b031916146104545760405162461bcd60e51b81528061052d600482016143ae565b6124db91925060203d81116105b8576105a98183613c58565b9083612441565b508660005260026020526040600020336000526020526122d360ff6040600020541690506122ca565b60603660031901126102105761251f613baa565b602480359161252c613ca3565b83600052602092600b84526001600160401b038060406000205416600052600e855260ff6040600020541661281c5785600052600b85528060406000205416600052600d855263ffffffff9283604060002054871c164210156127bf5786600052600b865283806005604060002001541691169384810382116127aa5787600052600b87528460036040600020015492011611612766576000546001600160a01b039190821633819003612702575b6000526005865260406000206125f23482546142fd565b905560405192868401918211848310176126ee5750866126a7939285926040526000845261261e6145ae565b86169561262c871515614b40565b61263582614576565b5061263f83614576565b506126486145ae565b81600052600188526040600020876000528852604060002061266b8482546142fd565b9055866000604051848152858b8201527fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260403392a433614483565b83600052601183526126bf60406000209182546142fd565b905560005260088152604060002091600052526001604060002001600160ff198254161790556104543061417d565b634e487b7160e01b60009081526041600452fd5b87600052600b875261271c856001604060002001546146ad565b34146125db5760405162461bcd60e51b815260048101889052601a818601527f4e6f7420656e6f75676820616d6f756e742070726f76696465640000000000006044820152606490fd5b60405162461bcd60e51b815260048101869052601b818401527f4e6f7420656e6f75676820436f7069657320617661696c61626c6500000000006044820152606490fd5b83634e487b7160e01b60005260116004526000fd5b60405162461bcd60e51b8152600481018790526030818501527f54686973206576656e7420686173207061737365642e2e2e2043616e6e6f742060448201526f7075726368617365205469636b65747360801b6064820152608490fd5b60405162461bcd60e51b815260048101869052600f818401526e115d995b9d081a5cc814185d5cd959608a1b6044820152606490fd5b346102105760e0366003190112610210576024356001600160401b03811161021057612882903690600401613f40565b6044356001600160401b038111610210576128a1903690600401613cc7565b6064359063ffffffff821682036102105763ffffffff60843516608435036102105760c43560ff8116810361021057600435600052600d60205263ffffffff60406000205460201c16421080612cdf575b15612c8f5760005b845161ffff821610156129fd578061295161292061ffff6115f3816129c196168a614169565b336000526009602052604060002061ffff61293d8186168b614169565b511660005260205260406000205490614b35565b63ffffffff61296461ffff841687614169565b51161115806129c6575b61297790614c10565b63ffffffff61298a61ffff831686614169565b5116336000526009602052604060002061ffff6129a98185168a614169565b51166000526020526107ab60406000209182546142fd565b6128fa565b5061ffff6129d681831688614169565b5116600052600b6020526129776001600160401b036040600020541660043514905061296e565b50916006549361ffff8060a81b612a18828860a81c1661459b565b60a81b16818161ffff60a81b1989161760a81c169663ffffffff6084351663ffffffff8616141580612c7e575b15612c455762ffffff60a01b1916176006558560005260076020526040600020906020835193612a758585614c8e565b01916000526020600020906000925b848410612c2d575050505050612ab260ff60065460a01c168560005260076020526009604060002001614cc4565b83600052600760205263ffffffff6005604060002001911663ffffffff1982541617905560026040600020016020825192612aed8484614c8e565b019060005260206000206000915b838310612c11577f7c1e0aae4c32fe0db38fe1f25ca6186179a1f65567e0f10264ecc4188729812360808787816000526007602052612b6060843560056040600020019067ffffffff0000000082549160201b169067ffffffff000000001916179055565b6040600081902060a435600682015560078101805460ff191660ff94909416939093179092556003820180546001600160a01b0319163317905560058201805460ff60401b1916600160401b179055517f9c5124c1ab0b68218e469f679fc86f10845de3efb82abf9ca29d5f29be2115a1918190612bdf908583614d19565b0390a160405190815260406020820152600f60408201526e20416363657074696e67204269647360881b6060820152a1005b600160208263ffffffff83945116855501920192019190612afb565b60016020828483945116865501930193019291612a84565b60405162461bcd60e51b815260206004820152601160248201527022b93937b910902a34b6b29022b93937b960791b6044820152606490fd5b5063ffffffff608435164210612a45565b60405162461bcd60e51b815260206004820152602260248201527f4576656e7420506173736564206f722041756374696f6e2074696d652045727260448201526137b960f11b6064820152608490fd5b5063ffffffff6084351663ffffffff60406000205460201c16116128f2565b346102105760031960803682011261021057612d18613baa565b6001600160401b039160243583811161021057612d39903690600401613ed1565b9260443581811161021057612d52903690600401613ed1565b9060643590811161021057612d6b903690600401613d2d565b91612d746145ae565b6001600160a01b03841692612d8a841515614b40565b612d978651845114614309565b612d9f6145ae565b60005b8651811015612dee5780612db9612de99286614169565b51612dc4828a614169565b51600052602060018152604060002090886000525261238260406000209182546142fd565b612da2565b50919290938160006040517f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb339180612e288a8d83614366565b0390a43b612e3257005b61242560006020946124346040519788968795869461241563bc197c8160e01b9d8e885233600489015288602489015260a0604489015260a4880190614026565b34610210576020806003193601126102105760043580600052600c825260019060ff91612eaa818460406000205416151514614635565b612eb482336140d5565b15612f925790816000936000935b612ed3575b85856040519015158152f35b82600052600b808752600280604060002001548387161015612f8b5785809750612f058596978360406000200161468a565b91909263ffffffff809454600394851b1c164210159485612f49575b5050505050600014612f3e57612f378295614679565b9392612ec2565b612f37600095614679565b849750612f6493949550896000528b5260406000200161468a565b9054911b1c169163fffeae80831161140e576201517f849301164211158780878180612f21565b5050612ec7565b60405162461bcd60e51b815260048101859052601960248201527f596f7520646f6e7420686176652074686973207469636b6574000000000000006044820152606490fd5b3461021057600036600319011261021057602061ffff60065460a81c16604051908152f35b346102105760a03660031901126102105760043563ffffffff811680910361021057613026613c90565b906044356001600160401b03811161021057613046903690600401613e31565b9161304f613eb1565b90613058613ec1565b906130616145ae565b61306961407d565b6010549361ffff61307b81871661459b565b16809561ffff19161760105584600052600d60205260406000209063ffffffff1982541617905563fffeae7f63ffffffff82161161140e57613144926130f96201518063ffffffff6119659488600052600d602052160160406000209067ffffffff0000000082549160201b169067ffffffff000000001916179055565b600a6020526040600020600160ff19825416179055600e602052604060002060ff198154169055600d60205260406000209060ff60401b82549160401b169060ff60401b1916179055565b61314c6145ae565b61315461407d565b80600052600a602052613173600160ff604060002054161515146145f2565b60005b825160ff821610156135075760105463ffff000061319a61ffff8360101c1661459b565b60101b169063ffff0000191617928360105560005b60406131be60ff851684614169565b5101515181101561324d5783600052600d60205263ffffffff6040600020541663ffffffff6131f6836040610a7560ff891688614169565b5116101580613213575b15610a9d5761320e9061415a565b6131af565b5083600052600d60205263ffffffff60406000205460201c1663ffffffff613244836040610a7560ff891688614169565b51161115613200565b50929061ffff61326060ff831686614169565b519260101c16600052600b6020526040600020916001600160401b038151166001600160401b0319845416178355602081015160018401556040810151805190600160401b8211610e7e5760206002918287015484848901558085106134d0575b5001908501600052602060002090600080915b84831061347b5750505050506060810151600384015560808101518051906001600160401b038211610e7e5761330d60048601546146d7565b90601f91828111613448575b5060209183116001146133d55760c0939291600091836133ca575b50508160011b916000199060031b1c19161760048501555b63ffffffff60a08201511663ffffffff196005860154161760058501550151916004831015610dad576133c59260056133859201614711565b61ffff60105460101c16600052600b6020526040600020836001600160401b031982541617905561ffff60105460101c166020610caf60ff841687614169565b613176565b015190508880613334565b906004860160005260206000209160005b601f1985168110613430575091839160019360c09695601f19811610613417575b505050811b01600485015561334c565b015160001960f88460031b161c19169055888080613407565b818301518455600190930192602092830192016133e6565b61347590600488016000526020600020600585808801821c83019360208910610e755701901c01906146c0565b88613319565b60208163ffffffff6004939c999b9a9c511686548560031b63ffffffff811b9283911b1691191617865501910191601c83116134c1575b600101919098969795986132d4565b600190930192600092506134b2565b61350190848901600052836000206007600390808901821c830193601c8a8a1b1680610f1f575001901c01906146c0565b896132c1565b61ffff60105416600052600d6020527f198eebe05113df5df81bdbe4c9e683a02ddc6fba993f628be1134e14485d6f256080604060002060ff604051915463ffffffff8116835263ffffffff8160201c166020840152818160401c16604084015260481c166060820152a1005b346102105760603660031901126102105761358d613c27565b6044356001600160401b038111610210576135b46001600160401b03913690600401613d83565b916135bd6145ae565b6135c561407d565b602435600052600c6020526135e6600160ff60406000205416151514614635565b16600052600a602052613605600160ff604060002054161515146145f2565b6060810151602435600052600b60205263ffffffff600560406000200154161015613949576001600160401b03815116602435600052600b6020526001600160401b03604060002054160361391057602435600052600b60205260406000206001600160401b038251166001600160401b03198254161781556020820151600182015560028101604083015190815191600160401b8311610e7e5760209082548484558085106138c0575b500190600052602060002090600080915b848310613875578686606082015160038201556004810190608083019182518051906001600160401b038211610e7e576136fb83546146d7565b601f8111613843575b50602090601f83116001146137d55791806005949260c096946000926137ca575b50508160011b916000199060031b1c19161790555b019263ffffffff60a08201511663ffffffff198554161784550151916004831015610dad576137759261376c91614711565b516024356149cb565b602435600052600b6020527fcb3ac6bc0041b968fb472d167fa1c374afbb340bafff09e0711a3099b21a45746137bd60406000206040519182916040835260408301906147cc565b60243560208301520390a1005b015190508880613725565b90601f198316918460005260206000209260005b81811061382b575092600192859260c098966005989610613812575b505050811b01905561373a565b015160001960f88460031b161c19169055888080613805565b929360206001819287860151815501950193016137e9565b61386f90846000526020600020601f850160051c8101916020861061201057601f0160051c01906146c0565b86613704565b60208163ffffffff600493511686548560031b63ffffffff811b9283911b1691191617865501910191601c83116138b1575b60010191906136c1565b600190930192600092506138a7565b6138f0908460005283600020600780880160031c820192601c8960021b16806138f6575b500160031c01906146c0565b866136b0565b60001990818601918254918a0360031b1c1690558b6138e4565b60405162461bcd60e51b8152602060048201526011602482015270496e76616c6964204576656e742049442160781b6044820152606490fd5b60405162461bcd60e51b815260206004820152602960248201527f5468657365206e6f206f6620636f70696573206861766520616c7265616479206044820152681899595b881cdbdb1960ba1b6064820152608490fd5b34610210576020366003190112610210576004356000526012602052610f7f6139d66139dd604060002060405192838092614736565b0382613c58565b604051918291602083526020830190613bd6565b3461021057600036600319011261021057610f7f604051613a1181613c3d565b60128152715765623320494e534944335253205061737360701b6020820152604051918291602083526020830190613bd6565b6020366003190112610210576004353360005260056020528060406000205410613aa257600080808093338252600560205260408220613a85828254614b35565b9055818115613a99575b3390f115611cec57005b506108fc613a8f565b60405162461bcd60e51b815260206004820152603d60248201527f596f75722042616c616e6365206d75737420626520477265617465722054686160448201527f6e206f7220457175616c20746f20776974686472617720416d6f756e740000006064820152608490fd5b346102105760203660031901126102105760043563ffffffff60e01b811680910361021057602090636cdb3d1360e11b8114908115613b6a575b8115613b59575b506040519015158152f35b6301ffc9a760e01b14905082613b4e565b6303a24d0760e21b81149150613b47565b34610210576040366003190112610210576020613ba2613b99613baa565b602435906140d5565b604051908152f35b600435906001600160a01b038216820361021057565b602435906001600160a01b038216820361021057565b91908251928382526000905b848210613c0f575092806020939411613c02575b601f01601f1916010190565b6000838284010152613bf6565b90602090818082850101519082860101520190613be2565b600435906001600160401b038216820361021057565b604081019081106001600160401b03821117610e7e57604052565b90601f801991011681019081106001600160401b03821117610e7e57604052565b6001600160401b038111610e7e5760051b60200190565b6024359063ffffffff8216820361021057565b6044359063ffffffff8216820361021057565b359063ffffffff8216820361021057565b81601f8201121561021057803591613cde83613c79565b92613cec6040519485613c58565b808452602092838086019260051b820101928311610210578301905b828210613d16575050505090565b838091613d2284613cb6565b815201910190613d08565b81601f82011215610210578035906001600160401b038211610e7e5760405192613d61601f8401601f191660200185613c58565b8284526020838301011161021057816000926020809301838601378301015290565b919060e083820312610210576040519060e08201936001600160401b039483811086821117610e7e576040528294813581811681036102105784526020820135602085015260408201358181116102105783613de0918401613cc7565b60408501526060820135606085015260808201359081116102105760c092613e09918301613d2d565b6080840152613e1a60a08201613cb6565b60a084015201359060048210156102105760c00152565b9080601f8301121561021057813590613e4982613c79565b92613e576040519485613c58565b828452602092838086019160051b8301019280841161021057848301915b848310613e855750505050505090565b82356001600160401b038111610210578691613ea684848094890101613d83565b815201920191613e75565b6064359060ff8216820361021057565b6084359060ff8216820361021057565b81601f8201121561021057803591613ee883613c79565b92613ef66040519485613c58565b808452602092838086019260051b820101928311610210578301905b828210613f20575050505090565b81358152908301908301613f12565b6004359061ffff8216820361021057565b81601f8201121561021057803591613f5783613c79565b92613f656040519485613c58565b808452602092838086019260051b820101928311610210578301905b828210613f8f575050505090565b813561ffff81168103610210578152908301908301613f81565b60243590811515820361021057565b81601f8201121561021057803591613fcf83613c79565b92613fdd6040519485613c58565b808452602092838086019260051b820101928311610210578301905b828210614007575050505090565b81356001600160a01b0381168103610210578152908301908301613ff9565b90815180825260208080930193019160005b828110614046575050505090565b835185529381019392810192600101614038565b6040906003190112610210576004359060243590565b906004821015610dad5752565b6000546001600160a01b0316330361409157565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6001600160a01b031690811561410257600052600160205260406000209060005260205260406000205490565b60405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b6064820152608490fd5b600019811461140e5760010190565b80518210156114985760209160051b010190565b6001600160a01b0316338114610923573360005260026020526040600020816000526020526040600020600160ff19825416179055604051600181527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3565b156141e857565b60405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201526d195c881bdc88185c1c1c9bdd995960921b6064820152608490fd5b1561424b57565b60405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b156142a557565b60405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b6064820152608490fd5b8119811161140e570190565b1561431057565b60405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608490fd5b909161437d61438b93604084526040840190614026565b916020818403910152614026565b90565b9081602091031261021057516001600160e01b0319811681036102105790565b60809060208152602860208201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b60608201520190565b60009060033d1161440457565b905060046000803e60005160e01c90565b600060443d1061438b57604051600319913d83016004833e81516001600160401b03918282113d6024840111176144725781840194855193841161447a573d85010160208487010111614472575061438b92910160200190613c58565b949350505050565b50949350505050565b919390803b614494575b5050505050565b6144e293600060209460405180978196829563f23a6e6160e01b9b8c855260018060a01b0380961660048601528660248601526044850152606484015260a0608484015260a4830190613bd6565b0393165af160009181614556575b5061452e57505060016145016143f7565b6308c379a01461451b575b6104cb575b388080808061448d565b614523614415565b80612476575061450c565b6001600160e01b031916146145115760405162461bcd60e51b81528061052d600482016143ae565b61456f91925060203d81116105b8576105a98183613c58565b90386144f0565b6040519061458382613c3d565b60018252602082016020368237825115611498575290565b61ffff80911690811461140e5760010190565b60ff600454166145ba57565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fd5b156145f957565b60405162461bcd60e51b8152602060048201526014602482015273115d995b9d08111bd95cc81b9bdd08195e1a5cdd60621b6044820152606490fd5b1561463c57565b60405162461bcd60e51b8152602060048201526015602482015274151a58dad95d08111bd95cc81b9bdd08195e1a5cdd605a1b6044820152606490fd5b60ff1660ff811461140e5760010190565b919091805483101561149857600052601c60206000208360031c019260021b1690565b806000190482118115151661140e570290565b8181106146cb575050565b600081556001016146c0565b90600182811c92168015614707575b60208310146146f157565b634e487b7160e01b600052602260045260246000fd5b91607f16916146e6565b906004811015610dad5764ff0000000082549160201b169064ff000000001916179055565b9060009291805491614747836146d7565b9182825260019384811690816000146147a95750600114614769575b50505050565b90919394506000526020928360002092846000945b838610614795575050505001019038808080614763565b80548587018301529401938590820161477e565b9294505050602093945060ff191683830152151560051b01019038808080614763565b9060e0908181016001600160401b03845416825260018085015493602094858501526002860192604092828487015284548092526101009081870195600052876000206000925b84600785011061496757509588979560c095600595614897958b9561438b9d60ff9c5495848410614951575b848410614939575b848410614920575b50838310614907575b8383106148ee575b8383106148d5575b8383106148bd575b5050106148b0575b5050905060038901546060860152848103608086015260048901614736565b9601549163ffffffff831660a082015201921c16614070565b1c81520186903880614878565b90919563ffffffff868c1c1681520194013886614870565b81929663ffffffff8760a01c1681520195019086614868565b81929663ffffffff8760801c1681520195019086614860565b81929663ffffffff8760601c1681520195019086614858565b9663ffffffff878495991c16815201950190863861484f565b86821c63ffffffff1688529681019692820192614847565b63ffffffff87168852968101969282019261483f565b815463ffffffff8082168a52818c1c81168c8b015281891c8116898b0152606082811c8216908b0152608082811c8216908b015260a082811c8216908b015260c082811c909116908a0152861c868901529687019660089093019290820190614813565b9190916000928184526020601281526040852082516001600160401b038111614b21576149f882546146d7565b601f8111614af3575b508296601f8211600114614a71577f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b95969782614a66575b508160011b916000199060031b1c19161790555b614a61604051928284938452830190613bd6565b0390a2565b905084015138614a39565b96601f198216838952848920985b818110614adc57509782916001937f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b98999a10614ac3575b5050811b019055614a4d565b86015160001960f88460031b161c191690553880614ab7565b868301518a55600190990198918501918501614a7f565b614b1b90838952848920601f840160051c81019186851061201057601f0160051c01906146c0565b38614a01565b634e487b7160e01b87526041600452602487fd5b81811061140e570390565b15614b4757565b60405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b15614b9d57565b60405162461bcd60e51b815260206004820152602d60248201527f4e6f74204f776e6572206f66205061636b616765206f72205061636b6167652060448201526c02237b2b993ba1022bc34b9ba1609d1b6064820152608490fd5b80548210156114985760005260206000200190600090565b15614c1757565b60405162461bcd60e51b8152602060048201526014602482015273436f70696573206e6f7420417661696c61626c6560601b6044820152606490fd5b15614c5a57565b60405162461bcd60e51b815260206004820152600c60248201526b115d995b9d0814185cdcd95960a21b6044820152606490fd5b90600160401b8111610e7e57815490808355818110614cac57505050565b614cc292600052602060002091820191016146c0565b565b906004811015610dad5760ff80198354169116179055565b90815480825260208092019260005281600020916000905b828210614d02575050505090565b835485529384019360019384019390910190614cf4565b908152602091604083830152610180806040840152614d3c6101c0840183614cdc565b93603f199485858203016060860152614d6f614d5c600192838701614cdc565b8787820301608088015260028601614cdc565b9060018060a01b03918260038701541660a088015260048601978782030160c088015283885491828152019760005283600020926000905b828210614e175750505050506009836101a09360ff8094600561438b99980154908163ffffffff9182821660e08c01521c1661010089015260401c161515610120870152600682015461014087015283600783015416610160870152600882015490860152015416910190614070565b845481168a52988501989383019390830190614da7565b9190600083815260079060209180835260018060a01b039260039660409433818a8888200154160361557657818552838352858520600190810180549192918381106155625798838686614e898f958d9e6000190190614bf8565b905490861b1c94600360a01b60ff60a01b1960065416176006558b8b859f82965b615490575b505050505050508915600014614ff15750508186818988878f85965b614f64575b5050505092509050905b614ef7575b505083525220600501805460ff60401b191690559150565b8286528484528686205461ffff82161015614f5f5780614f1f614f599260028a8a2001614bf8565b9054908c1b1c338852600986528888208589528787528c614f42848c8c20614bf8565b9054911b1c895286526107ab898920918254614b35565b81614eda565b614edf565b818652828b528a600480868920015461ffff8a161015614fea57879686889796614fac948d614f998e80978d9c8d2001614bf8565b905490891b1c1697895252862001614bf8565b9054911b1c90828215614fe1575bf115614fd757614fca839161459b565b90808988878f8c95614ecb565b87513d88823e3d90fd5b506108fc614fba565b5050614ed0565b939297969591909498999a8887905b615294575b50838752828a52878720600501805460ff60401b1916905586895b6151da575b50838752828a5287872060040180548a81106151c657898c856150776150ee9b9a99989796957fd14ea1fc9b217f16ea2aee708749b3f4ecaffb8eec1409e6e170b055b6fc3910956000190190614bf8565b905490861b1c168251918a8352820152a1838852828b5289898920018054898255806151ad575b5050838852600489892001805489825580615194575b5050848852600d8b5260ff898920548a1c169282600654169489528b52888820015416928652600d895260ff8787205460481c16936155d8565b30331461513e578190338152600285528181203082528552208260ff19825416179055519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3130923392a390565b815162461bcd60e51b815260048101859052602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608490fd5b6151a6918a528c8a20908101906146c0565b38806150b4565b6151bf918a528c8a20908101906146c0565b388061509e565b634e487b7160e01b89526011600452602489fd5b848852838b526004808a8a2001548b8110615281578c8588868f958f968f978c976000190161ffff8b1610156152735788978897889761523b966152298e80988b8d52868652878d2001614bf8565b9054911b1c1696885252852001614bf8565b905490881b1c9082821561526a575bf1156152605761525a8a9161459b565b90615020565b88513d89823e3d90fd5b506108fc61524a565b505050505050505050615025565b634e487b7160e01b8a526011825260248afd5b848852838b528888205461ffff8216101561548b5760026152b982828c8c2001614bf8565b905490841b1c338a5260098d528c868c8c2091898d52526152dc848d8d20614bf8565b905490861b1c8b528d526152f48b8b20918254614b35565b9055858952848c52898920600490810180549192918d8110615478578691615320916000190190614bf8565b905490861b1c168a5260088d528c868c8c2091898d5252615343848d8d20614bf8565b905490861b1c8b528d528a8a208c01805460ff19168d179055868a52858d528a8a20820180548d811061547857848f94938e8e8b8b61538b8f986153b6986000190190614bf8565b9054908d1b1c16988783528181526153a586858520614bf8565b9054908d1b1c978352522001614bf8565b905490861b1c92303b15615474578c51637921219560e11b8152338482019081526001600160a01b0390921660208301526040820192909252606081019390935260a060808401819052600090840152918a908390819060c001038183305af1801561546a57908c939291615437575b50506154319061459b565b90615000565b909192506001600160401b03821161545757508952899061543138615426565b634e487b7160e01b8a5260419052602489fd5b8b513d8c823e3d90fd5b8b80fd5b634e487b7160e01b8c526011845260248cfd5b615005565b8483528186528083205461ffff8816101561555d578287926154ce8c87856154f098200154166154c286868620614bf8565b905490891b1c906140d5565b978783528181528c878585200154168352600981528383209783525220614bf8565b9054911b1c8b5288528a8a2054118061552a575b615520575b615513859161459b565b90868e8b8b8e8c95614eaa565b9799508997615509565b508589528787528c61553e828c8c20614bf8565b9054911b1c8952600b87526001600160401b038a8a2054168214615504565b614eaf565b634e487b7160e01b88526011600452602488fd5b855162461bcd60e51b815260048101849052603560248201527f43616e6e6f74206163636570742042696420617320796f7520617265206e6f74604482015274081bdddb995c881bd9881d1a1a5cc8151a58dad95d605a1b6064820152608490fd5b93606491826155ed60ff61562a9416886146ad565b04809660018060a01b036156558160065416928260009889988998899889988952600560205261562260408a209182546142fd565b9055846146ad565b04991684526005602052604084206156438a82546142fd565b905561564f898c6142fd565b90614b35565b978891839183156156af575b1690f1156156a35750916060917f0d458e9c8fba143aaee61251301adef6b137ef1cbd15c288bca321eeec6121da9360405192835260208301526040820152a1565b604051903d90823e3d90fd5b6108fc925061566156fea2646970667358221220c1ce1f0ddfe129db1e8e2b3e5dd064abecee086d3937d2424af3e0fc4b14078664736f6c634300080f0033