Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Contract Name:
DigitalaxPodeMaterials
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-15 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity ^0.6.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); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol pragma solidity ^0.6.2; /** * @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 be 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; } // File: @openzeppelin/contracts/token/ERC1155/IERC1155MetadataURI.sol pragma solidity ^0.6.2; /** * @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); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol pragma solidity ^0.6.0; /** * _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. 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. 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); } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/ERC1155/ERC1155.sol // Contract based from the following: // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/aaa5ef81cf75454d1c337dc3de03d12480849ad1/contracts/token/ERC1155/ERC1155.sol pragma solidity 0.6.12; /** * * @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._ * * @notice Modifications to uri logic made by BlockRocket.tech */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using SafeMath for uint256; 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; // Token ID to its URI mapping (uint256 => string) internal tokenUris; // Token ID to its total supply mapping(uint256 => uint256) public tokenTotalSupply; /* * bytes4(keccak256('balanceOf(address,uint256)')) == 0x00fdd58e * bytes4(keccak256('balanceOfBatch(address[],uint256[])')) == 0x4e1273f4 * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('safeTransferFrom(address,address,uint256,uint256,bytes)')) == 0xf242432a * bytes4(keccak256('safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)')) == 0x2eb2c2d6 * * => 0x00fdd58e ^ 0x4e1273f4 ^ 0xa22cb465 ^ * 0xe985e9c5 ^ 0xf242432a ^ 0x2eb2c2d6 == 0xd9b67a26 */ bytes4 private constant _INTERFACE_ID_ERC1155 = 0xd9b67a26; /* * bytes4(keccak256('uri(uint256)')) == 0x0e89341c */ bytes4 private constant _INTERFACE_ID_ERC1155_METADATA_URI = 0x0e89341c; constructor () public { // register the supported interfaces to conform to ERC1155 via ERC165 _registerInterface(_INTERFACE_ID_ERC1155); // register the supported interfaces to conform to ERC1155MetadataURI via ERC165 _registerInterface(_INTERFACE_ID_ERC1155_METADATA_URI); } /** * @dev See {IERC1155MetadataURI-uri}. */ function uri(uint256 tokenId) external view override returns (string memory) { return tokenUris[tokenId]; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); 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 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) { require(accounts[i] != address(0), "ERC1155: batch balance query for the zero address"); batchBalances[i] = _balances[ids[i]][accounts[i]]; } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) external virtual override { require(_msgSender() != operator, "ERC1155: setting approval status for self"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) external virtual override { require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][from] = _balances[id][from].sub(amount, "ERC1155: insufficient balance for transfer"); _balances[id][to] = _balances[id][to].add(amount); emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) external virtual override { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); 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]; _balances[id][from] = _balances[id][from].sub( amount, "ERC1155: insufficient balance for transfer" ); _balances[id][to] = _balances[id][to].add(amount); } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for a given token ID */ function _setURI(uint256 tokenId, string memory newuri) internal virtual { tokenUris[tokenId] = newuri; emit URI(newuri, tokenId); } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` 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 account, uint256 id, uint256 amount, bytes memory data) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] = _balances[id][account].add(amount); tokenTotalSupply[id] = tokenTotalSupply[id].add(amount); emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * 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 (uint i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; _balances[id][to] = amount.add(_balances[id][to]); tokenTotalSupply[id] = tokenTotalSupply[id].add(amount); } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn(address account, uint256 id, uint256 amount) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); _balances[id][account] = _balances[id][account].sub( amount, "ERC1155: burn amount exceeds balance" ); tokenTotalSupply[id] = tokenTotalSupply[id].sub(amount); emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; _balances[id][account] = _balances[id][account].sub( amount, "ERC1155: burn amount exceeds balance" ); tokenTotalSupply[id] = tokenTotalSupply[id].sub(amount); } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @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 `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 _beforeTokenTransfer( 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(to).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(to).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; } } // File: contracts/ERC1155/ERC1155Burnable.sol //imported from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/aaa5ef81cf75454d1c337dc3de03d12480849ad1/contracts/token/ERC1155/ERC1155Burnable.sol pragma solidity 0.6.12; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { function burn(address account, uint256 id, uint256 amount) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burn(account, id, amount); } function burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burnBatch(account, ids, amounts); } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity ^0.6.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/access/AccessControl.sol pragma solidity ^0.6.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context { using EnumerableSet for EnumerableSet.AddressSet; using Address for address; struct RoleData { EnumerableSet.AddressSet members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view returns (bool) { return _roles[role].members.contains(account); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view returns (uint256) { return _roles[role].members.length(); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view returns (address) { return _roles[role].members.at(index); } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, _roles[role].adminRole, adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (_roles[role].members.add(account)) { emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (_roles[role].members.remove(account)) { emit RoleRevoked(role, account, _msgSender()); } } } // File: contracts/DigitalaxAccessControls.sol pragma solidity 0.6.12; /** * @notice Access Controls contract for the Digitalax Platform * @author BlockRocket.tech */ contract DigitalaxAccessControls is AccessControl { /// @notice Role definitions bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant SMART_CONTRACT_ROLE = keccak256("SMART_CONTRACT_ROLE"); bytes32 public constant VERIFIED_MINTER_ROLE = keccak256("VERIFIED_MINTER_ROLE"); /// @notice Events for adding and removing various roles event AdminRoleGranted( address indexed beneficiary, address indexed caller ); event AdminRoleRemoved( address indexed beneficiary, address indexed caller ); event MinterRoleGranted( address indexed beneficiary, address indexed caller ); event MinterRoleRemoved( address indexed beneficiary, address indexed caller ); event SmartContractRoleGranted( address indexed beneficiary, address indexed caller ); event SmartContractRoleRemoved( address indexed beneficiary, address indexed caller ); event VerifiedMinterRoleGranted( address indexed beneficiary, address indexed caller ); event VerifiedMinterRoleRemoved( address indexed beneficiary, address indexed caller ); /** * @notice The deployer is automatically given the admin role which will allow them to then grant roles to other addresses */ constructor() public { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); } ///////////// // Lookups // ///////////// /** * @notice Used to check whether an address has the admin role * @param _address EOA or contract being checked * @return bool True if the account has the role or false if it does not */ function hasAdminRole(address _address) external view returns (bool) { return hasRole(DEFAULT_ADMIN_ROLE, _address); } /** * @notice Used to check whether an address has the minter role * @param _address EOA or contract being checked * @return bool True if the account has the role or false if it does not */ function hasMinterRole(address _address) external view returns (bool) { return hasRole(MINTER_ROLE, _address); } /** * @notice Used to check whether an address has the verified minter role * @param _address EOA or contract being checked * @return bool True if the account has the role or false if it does not */ function hasVerifiedMinterRole(address _address) external view returns (bool) { return hasRole(VERIFIED_MINTER_ROLE, _address); } /** * @notice Used to check whether an address has the smart contract role * @param _address EOA or contract being checked * @return bool True if the account has the role or false if it does not */ function hasSmartContractRole(address _address) external view returns (bool) { return hasRole(SMART_CONTRACT_ROLE, _address); } /////////////// // Modifiers // /////////////// /** * @notice Grants the admin role to an address * @dev The sender must have the admin role * @param _address EOA or contract receiving the new role */ function addAdminRole(address _address) external { grantRole(DEFAULT_ADMIN_ROLE, _address); emit AdminRoleGranted(_address, _msgSender()); } /** * @notice Removes the admin role from an address * @dev The sender must have the admin role * @param _address EOA or contract affected */ function removeAdminRole(address _address) external { revokeRole(DEFAULT_ADMIN_ROLE, _address); emit AdminRoleRemoved(_address, _msgSender()); } /** * @notice Grants the minter role to an address * @dev The sender must have the admin role * @param _address EOA or contract receiving the new role */ function addMinterRole(address _address) external { grantRole(MINTER_ROLE, _address); emit MinterRoleGranted(_address, _msgSender()); } /** * @notice Removes the minter role from an address * @dev The sender must have the admin role * @param _address EOA or contract affected */ function removeMinterRole(address _address) external { revokeRole(MINTER_ROLE, _address); emit MinterRoleRemoved(_address, _msgSender()); } /** * @notice Grants the verified minter role to an address * @dev The sender must have the admin role * @param _address EOA or contract receiving the new role */ function addVerifiedMinterRole(address _address) external { grantRole(VERIFIED_MINTER_ROLE, _address); emit VerifiedMinterRoleGranted(_address, _msgSender()); } /** * @notice Removes the verified minter role from an address * @dev The sender must have the admin role * @param _address EOA or contract affected */ function removeVerifiedMinterRole(address _address) external { revokeRole(VERIFIED_MINTER_ROLE, _address); emit VerifiedMinterRoleRemoved(_address, _msgSender()); } /** * @notice Grants the smart contract role to an address * @dev The sender must have the admin role * @param _address EOA or contract receiving the new role */ function addSmartContractRole(address _address) external { grantRole(SMART_CONTRACT_ROLE, _address); emit SmartContractRoleGranted(_address, _msgSender()); } /** * @notice Removes the smart contract role from an address * @dev The sender must have the admin role * @param _address EOA or contract affected */ function removeSmartContractRole(address _address) external { revokeRole(SMART_CONTRACT_ROLE, _address); emit SmartContractRoleRemoved(_address, _msgSender()); } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.6.2; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol pragma solidity ^0.6.2; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity ^0.6.2; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.6.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/utils/EnumerableMap.sol pragma solidity ^0.6.0; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping (bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({ _key: key, _value: value })); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { return _get(map, key, "EnumerableMap: nonexistent key"); } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint256(value))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint256(_get(map._inner, bytes32(key)))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint256(_get(map._inner, bytes32(key), errorMessage))); } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.6.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = byte(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } } // File: contracts/ERC721/ERC721WithSameTokenURIForAllTokens.sol pragma solidity 0.6.12; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 * @dev This is a modified OZ ERC721 base contract with one change where all tokens have the same token URI */ contract ERC721WithSameTokenURIForAllTokens is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; // Token name string private _name; // Token symbol string private _symbol; // Single token URI for all tokens string public tokenURI_; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @dev See {IERC721Metadata-name}. */ function name() public view override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return tokenURI_; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _holderTokens[owner].remove(tokenId); _tokenOwners.remove(tokenId); emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (!to.isContract()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } function _approve(address to, uint256 tokenId) private { _tokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File: contracts/DigitalaxPodeNFT.sol pragma solidity 0.6.12; /** * @title Digitalax Pode NFT * @dev To facilitate the pode sale for the Digitialax platform */ contract DigitalaxPodeNFT is ERC721WithSameTokenURIForAllTokens("DigitalaxPode", "PODE") { using SafeMath for uint256; // @notice event emitted upon construction of this contract, used to bootstrap external indexers event DigitalaxPodeNFTContractDeployed(); // @notice event emitted when a contributor buys a Pode NFT event PodePurchased( address indexed buyer, uint256 indexed tokenId, uint256 contribution ); // @notice event emitted when a contributors amount is increased event ContributionIncreased( address indexed buyer, uint256 contribution ); // @notice all funds will be sent to this address pon purchase of a Pode NFT address payable public fundsMultisig; // @notice start date for them the Pode sale is open to the public, before this data no purchases can be made uint256 public podeStartTimestamp; // @notice end date for them the Pode sale is closed, no more purchased can be made after this point uint256 public podeEndTimestamp; // @notice set after end time has been changed once, prevents further changes to end timestamp bool public podeEndTimestampLocked; // @notice set the transfer lock time, so no noe can move Pode NFT uint256 public podeLockTimestamp; // @notice the minimum amount a buyer can contribute in a single go uint256 public constant minimumContributionAmount = 1 ether; // @notice accumulative => contribution total mapping(address => uint256) public contribution; // @notice global accumulative contribution amount uint256 public totalContributions; // @notice max number of paid contributions to the pode sale uint256 public constant maxPodeContributionTokens = 500; constructor( address payable _fundsMultisig, uint256 _podeStartTimestamp, uint256 _podeEndTimestamp, uint256 _podeLockTimestamp, string memory _tokenURI ) public { fundsMultisig = _fundsMultisig; podeStartTimestamp = _podeStartTimestamp; podeEndTimestamp = _podeEndTimestamp; podeLockTimestamp = _podeLockTimestamp; tokenURI_ = _tokenURI; emit DigitalaxPodeNFTContractDeployed(); } /** * @dev Facilitating the initial purchase of a Pode NFT * @dev Cannot contribute less than minimumContributionAmount * @dev Reverts if already owns an pode token * @dev Buyer receives a NFT on success * @dev All funds move to fundsMultisig */ function buy() public payable { require(contribution[_msgSender()] == 0, "DigitalaxPodeNFT.buy: You already own a pode NFT"); require( _getNow() >= podeStartTimestamp && _getNow() <= podeEndTimestamp, "DigitalaxPodeNFT.buy: No pode are available outside of the pode window" ); uint256 _contributionAmount = msg.value; require( _contributionAmount >= minimumContributionAmount, "DigitalaxPodeNFT.buy: Contribution does not meet minimum requirement" ); require(remainingPodeTokens() > 0, "DigitalaxPodeNFT.buy: Total number of pode token holders reached"); contribution[_msgSender()] = _contributionAmount; totalContributions = totalContributions.add(_contributionAmount); (bool fundsTransferSuccess,) = fundsMultisig.call{value : _contributionAmount}(""); require(fundsTransferSuccess, "DigitalaxPodeNFT.buy: Unable to send contribution to funds multisig"); uint256 tokenId = totalSupply().add(1); _safeMint(_msgSender(), tokenId); emit PodePurchased(_msgSender(), tokenId, _contributionAmount); } /** * @dev Returns total remaining number of tokens available in the Pode sale */ function remainingPodeTokens() public view returns (uint256) { return _getMaxPodeContributionTokens() - totalSupply(); } // Internal function _getNow() internal virtual view returns (uint256) { return block.timestamp; } function _getMaxPodeContributionTokens() internal virtual view returns (uint256) { return maxPodeContributionTokens; } /** * @dev Before token transfer hook to enforce that no token can be moved to another address until the pode sale has ended */ function _beforeTokenTransfer(address from, address, uint256) internal override { if (from != address(0) && _getNow() <= podeLockTimestamp) { revert("DigitalaxPodeNFT._beforeTokenTransfer: Transfers are currently locked at this time"); } } } // File: contracts/DigitalaxPodeMaterials.sol pragma solidity 0.6.12; pragma experimental ABIEncoderV2; /** * @title Digitalax PODEM NFT */ contract DigitalaxPodeMaterials is ERC1155Burnable { // @notice event emitted on contract creation event DigitalaxPodeMaterialsDeployed(); // @notice a single child has been created event TokenUriAdded( uint256 indexed tokenId ); string public name; string public symbol; // @notice current token ID pointer uint256 public tokenIdPointer; /// @dev Limit of tokens per address uint256 public maxLimit = 1; /// @dev List of metadata string[] public metadataList; // @notice enforcing access controls DigitalaxAccessControls public accessControls; DigitalaxPodeNFT public podeNft; constructor( string memory _name, string memory _symbol, DigitalaxAccessControls _accessControls, DigitalaxPodeNFT _podeNft ) public { name = _name; symbol = _symbol; accessControls = _accessControls; podeNft = _podeNft; emit DigitalaxPodeMaterialsDeployed(); } /////////////////////////// // Creating new nft // /////////////////////////// /** @notice Creates a single child ERC1155 token @dev Only callable with smart contact role @return id the generated child Token ID */ function addTokenUri(string calldata _uri) external returns (uint256 id) { require( accessControls.hasSmartContractRole(_msgSender()) || accessControls.hasAdminRole(_msgSender()), "DigitalaxPodeMaterials.createChild: Sender must be smart contract or admin" ); require(bytes(_uri).length > 0, "DigitalaxPodeMaterials.createChild: URI is a blank string"); id = tokenIdPointer; _setURI(id, _uri); tokenIdPointer = tokenIdPointer.add(1); emit TokenUriAdded(id); } ////////////////////////////////// // Minting of existing children // ////////////////////////////////// /** @notice Mints a single child ERC1155 tokens, increasing its supply by the _amount specified. msg.data along with the parent contract as the recipient can be used to map the created children to a given parent token @dev Only callable with smart contact role */ function mint(address _beneficiary) external { require(totalBalanceOf(_msgSender()) < maxLimit, "DigitalaxPodeMaterials.mint: Sender already minted"); require(podeNft.balanceOf(_msgSender()) > 0, "DigitalaxPodeMaterials.mint: Sender must have PODE NFT"); uint256 _randomIndex = _rand(); _mint(_beneficiary, _randomIndex, 1, abi.encodePacked("")); } /** @notice Method for setting max limit @dev Only admin @param _maxLimit New max limit */ function setMaxLimit(uint256 _maxLimit) external { require( accessControls.hasAdminRole(_msgSender()), "DigitalaxPodeMaterials.addTokenURI: Sender must be an authorised contract or admin" ); maxLimit = _maxLimit; } function updateAccessControls(DigitalaxAccessControls _accessControls) external { require( accessControls.hasAdminRole(_msgSender()), "DigitalaxPodeMaterials.updateAccessControls: Sender must be admin" ); require( address(_accessControls) != address(0), "DigitalaxPodeMaterials.updateAccessControls: New access controls cannot be ZERO address" ); accessControls = _accessControls; } /** @notice Method for getting balance of account @param account Account address */ function totalBalanceOf(address account) public view returns (uint256) { require(account != address(0), "DigitalaxPodeMaterials: balance query for the zero address"); uint256 totalBalance = 0; for (uint256 i = 0; i < tokenIdPointer; i ++) { totalBalance = totalBalance.add(balanceOf(account, i)); } return totalBalance; } /** @notice Method for getting tokenId by index @param account Account address @param index Index */ function tokenOfOwnerByIndex(address account, uint256 index) public view returns (uint256) { uint256 tokenId; uint256 holdingIndex; for (uint256 i = 0; i < tokenIdPointer; i ++) { if (balanceOf(account, i) > 0) { if (holdingIndex == index) { tokenId = i; } holdingIndex = holdingIndex.add(1); } } if (holdingIndex <= index) { revert("Index out of holding tokens."); } return tokenId; } /** @notice Generate unpredictable random number */ function _rand() private view returns (uint256) { uint256 seed = uint256(keccak256(abi.encodePacked( block.timestamp + block.difficulty + ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)) + block.gaslimit + ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)) + block.number ))); return seed.sub(seed.div(tokenIdPointer).mul(tokenIdPointer)); } /** * @notice Reclaims ERC20 Compatible tokens for entire balance * @dev Only access controls admin * @param _tokenContract The address of the token contract */ function reclaimERC20(address _tokenContract) external { require( accessControls.hasAdminRole(_msgSender()), "DigitalaxMarketplace.reclaimERC20: Sender must be admin" ); require(_tokenContract != address(0), "Invalid address"); IERC20 token = IERC20(_tokenContract); uint256 balance = token.balanceOf(address(this)); require(token.transfer(msg.sender, balance), "Transfer failed"); } /** * @notice Reclaims ETH, drains all ETH sitting on the smart contract * @dev The instant buy feature means technically, ETH should never sit on contract. * @dev Only access controls admin can access */ function reclaimETH() external { require( accessControls.hasAdminRole(_msgSender()), "DigitalaxMarketplace.reclaimETH: Sender must be admin" ); msg.sender.transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"contract DigitalaxAccessControls","name":"_accessControls","type":"address"},{"internalType":"contract DigitalaxPodeNFT","name":"_podeNft","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":[],"name":"DigitalaxPodeMaterialsDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenUriAdded","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":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"accessControls","outputs":[{"internalType":"contract DigitalaxAccessControls","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"addTokenUri","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"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":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","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":[],"name":"maxLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"metadataList","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"podeNft","outputs":[{"internalType":"contract DigitalaxPodeNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"reclaimERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reclaimETH","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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxLimit","type":"uint256"}],"name":"setMaxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIdPointer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"totalBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract DigitalaxAccessControls","name":"_accessControls","type":"address"}],"name":"updateAccessControls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260016008553480156200001657600080fd5b506040516200324d3803806200324d83398101604081905262000039916200029c565b6200004b6301ffc9a760e01b620000fe565b6200005d636cdb3d1360e11b620000fe565b6200006f6303a24d0760e21b620000fe565b83516200008490600590602087019062000159565b5082516200009a90600690602086019062000159565b50600a80546001600160a01b038085166001600160a01b031992831617909255600b8054928416929091169190911790556040517f5a2949ff2ba58b13a0286d8fc943436117b7f873bf0e4fe83fb40e63c9ff253390600090a1505050506200037d565b6001600160e01b03198082161415620001345760405162461bcd60e51b81526004016200012b906200032d565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200019c57805160ff1916838001178555620001cc565b82800160010185558215620001cc579182015b82811115620001cc578251825591602001919060010190620001af565b50620001da929150620001de565b5090565b5b80821115620001da5760008155600101620001df565b600082601f83011262000206578081fd5b81516001600160401b03808211156200021d578283fd5b6040516020601f8401601f19168201810183811183821017156200023f578586fd5b806040525081945083825286818588010111156200025c57600080fd5b600092505b8383101562000280578583018101518284018201529182019162000261565b83831115620002925760008185840101525b5050505092915050565b60008060008060808587031215620002b2578384fd5b84516001600160401b0380821115620002c9578586fd5b620002d788838901620001f5565b95506020870151915080821115620002ed578485fd5b50620002fc87828801620001f5565b93505060408501516200030f8162000364565b6060860151909250620003228162000364565b939692955090935050565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6001600160a01b03811681146200037a57600080fd5b50565b612ec0806200038d6000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80635c4fbd5d116100de5780638905fd4f11610097578063bf8bcee411610071578063bf8bcee414610333578063e985e9c514610346578063f242432a14610359578063f5298aca1461036c5761018d565b80638905fd4f1461030557806395d89b4114610318578063a22cb465146103205761018d565b80635c4fbd5d1461029e5780636468e317146102b15780636a627842146102c45780636b20c454146102d75780636ef3da94146102ea578063748365ef146102fd5761018d565b80631b40f0831161014b5780633b3a1a7a116101255780633b3a1a7a146102505780634b0ee02a146102585780634e1273f41461026b57806357f7f2981461028b5761018d565b80631b40f083146102155780632eb2c2d61461022a5780632f745c591461023d5761018d565b8062fdd58e1461019257806301ffc9a7146101bb57806306fdde03146101db5780630e89341c146101f05780630f144a48146102035780631a861d261461020d575b600080fd5b6101a56101a03660046120b9565b61037f565b6040516101b2919061236e565b60405180910390f35b6101ce6101c93660046121f7565b6103db565b6040516101b29190612488565b6101e36103fa565b6040516101b29190612493565b6101e36101fe36600461229c565b610488565b61020b610529565b005b6101a56105f9565b61021d6105ff565b6040516101b29190612377565b61020b610238366004611f08565b61060e565b6101a561024b3660046120b9565b610828565b6101a5610894565b6101a5610266366004611eb4565b61089a565b61027e610279366004612118565b6108f5565b6040516101b29190612447565b6101a561029936600461222f565b610a2d565b6101e36102ac36600461229c565b610c00565b6101a56102bf36600461229c565b610c73565b61020b6102d2366004611eb4565b610c85565b61020b6102e5366004612019565b610d8f565b61020b6102f8366004611eb4565b610de9565b61021d610ed2565b61020b610313366004611eb4565b610ee1565b6101e36110c8565b61020b61032e36600461208c565b611123565b61020b61034136600461229c565b6111f1565b6101ce610354366004611ed0565b611297565b61020b610367366004611fb2565b6112c5565b61020b61037a3660046120e4565b611459565b60006001600160a01b0383166103b05760405162461bcd60e51b81526004016103a790612613565b60405180910390fd5b5060008181526001602090815260408083206001600160a01b03861684529091529020545b92915050565b6001600160e01b03191660009081526020819052604090205460ff1690565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104805780601f1061045557610100808354040283529160200191610480565b820191906000526020600020905b81548152906001019060200180831161046357829003601f168201915b505050505081565b60008181526003602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084526060939283018282801561051d5780601f106104f25761010080835404028352916020019161051d565b820191906000526020600020905b81548152906001019060200180831161050057829003601f168201915b50505050509050919050565b600a546001600160a01b031663c395fcb36105426114ae565b6040518263ffffffff1660e01b815260040161055e9190612377565b60206040518083038186803b15801561057657600080fd5b505afa15801561058a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ae91906121db565b6105ca5760405162461bcd60e51b81526004016103a79061282f565b60405133904780156108fc02916000818181858888f193505050501580156105f6573d6000803e3d6000fd5b50565b60085481565b600b546001600160a01b031681565b815183511461062f5760405162461bcd60e51b81526004016103a790612c7a565b6001600160a01b0384166106555760405162461bcd60e51b81526004016103a790612884565b61065d6114ae565b6001600160a01b0316856001600160a01b031614806106835750610683856103546114ae565b61069f5760405162461bcd60e51b81526004016103a79061294c565b60006106a96114ae565b90506106b9818787878787610820565b60005b84518110156107ba5760008582815181106106d357fe5b6020026020010151905060008583815181106106eb57fe5b60200260200101519050610758816040518060600160405280602a8152602001612e61602a91396001600086815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020546114b39092919063ffffffff16565b60008381526001602090815260408083206001600160a01b038e811685529252808320939093558a168152205461078f90826114df565b60009283526001602081815260408086206001600160a01b038d1687529091529093205550016106bc565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161080a92919061245a565b60405180910390a461082081878787878761150b565b505050505050565b60008080805b60075481101561086c576000610844878361037f565b11156108645784821415610856578092505b6108618260016114df565b91505b60010161082e565b5083811161088c5760405162461bcd60e51b81526004016103a790612b54565b509392505050565b60075481565b60006001600160a01b0382166108c25760405162461bcd60e51b81526004016103a790612c1d565b6000805b6007548110156108ee576108e46108dd858361037f565b83906114df565b91506001016108c6565b5092915050565b606081518351146109185760405162461bcd60e51b81526004016103a790612bd4565b6060835167ffffffffffffffff8111801561093257600080fd5b5060405190808252806020026020018201604052801561095c578160200160208202803683370190505b50905060005b845181101561088c5760006001600160a01b031685828151811061098257fe5b60200260200101516001600160a01b031614156109b15760405162461bcd60e51b81526004016103a79061265e565b600160008583815181106109c157fe5b6020026020010151815260200190815260200160002060008683815181106109e557fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110610a1a57fe5b6020908102919091010152600101610962565b600a546000906001600160a01b031663113b0ab2610a496114ae565b6040518263ffffffff1660e01b8152600401610a659190612377565b60206040518083038186803b158015610a7d57600080fd5b505afa158015610a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab591906121db565b80610b405750600a546001600160a01b031663c395fcb3610ad46114ae565b6040518263ffffffff1660e01b8152600401610af09190612377565b60206040518083038186803b158015610b0857600080fd5b505afa158015610b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4091906121db565b610b5c5760405162461bcd60e51b81526004016103a7906127bf565b81610b795760405162461bcd60e51b81526004016103a790612af7565b6007549050610bbe8184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061162292505050565b600754610bcc9060016114df565b60075560405181907f681752c038b5d514f6ae8f2ce8213787d94b4c18dafbf220e7c8f500fa6c812190600090a292915050565b60098181548110610c0d57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152935090918301828280156104805780601f1061045557610100808354040283529160200191610480565b60046020526000908152604090205481565b600854610c936102666114ae565b10610cb05760405162461bcd60e51b81526004016103a790612598565b600b546000906001600160a01b03166370a08231610ccc6114ae565b6040518263ffffffff1660e01b8152600401610ce89190612377565b60206040518083038186803b158015610d0057600080fd5b505afa158015610d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3891906122b4565b11610d555760405162461bcd60e51b81526004016103a790612542565b6000610d5f61167e565b9050610d8b82826001604051602001610d77906114b0565b604051602081830303815290604052611743565b5050565b610d976114ae565b6001600160a01b0316836001600160a01b03161480610dbd5750610dbd836103546114ae565b610dd95760405162461bcd60e51b81526004016103a790612776565b610de483838361185e565b505050565b600a546001600160a01b031663c395fcb3610e026114ae565b6040518263ffffffff1660e01b8152600401610e1e9190612377565b60206040518083038186803b158015610e3657600080fd5b505afa158015610e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6e91906121db565b610e8a5760405162461bcd60e51b81526004016103a79061270f565b6001600160a01b038116610eb05760405162461bcd60e51b81526004016103a7906128c9565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031681565b600a546001600160a01b031663c395fcb3610efa6114ae565b6040518263ffffffff1660e01b8152600401610f169190612377565b60206040518083038186803b158015610f2e57600080fd5b505afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6691906121db565b610f825760405162461bcd60e51b81526004016103a790612a59565b6001600160a01b038116610fa85760405162461bcd60e51b81526004016103a7906125ea565b6040516370a0823160e01b815281906000906001600160a01b038316906370a0823190610fd9903090600401612377565b60206040518083038186803b158015610ff157600080fd5b505afa158015611005573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102991906122b4565b60405163a9059cbb60e01b81529091506001600160a01b0383169063a9059cbb9061105a903390859060040161238b565b602060405180830381600087803b15801561107457600080fd5b505af1158015611088573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ac91906121db565b610de45760405162461bcd60e51b81526004016103a7906126af565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104805780601f1061045557610100808354040283529160200191610480565b816001600160a01b03166111356114ae565b6001600160a01b0316141561115c5760405162461bcd60e51b81526004016103a790612b8b565b80600260006111696114ae565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556111ad6114ae565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111e59190612488565b60405180910390a35050565b600a546001600160a01b031663c395fcb361120a6114ae565b6040518263ffffffff1660e01b81526004016112269190612377565b60206040518083038186803b15801561123e57600080fd5b505afa158015611252573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127691906121db565b6112925760405162461bcd60e51b81526004016103a7906129e1565b600855565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b6001600160a01b0384166112eb5760405162461bcd60e51b81526004016103a790612884565b6112f36114ae565b6001600160a01b0316856001600160a01b031614806113195750611319856103546114ae565b6113355760405162461bcd60e51b81526004016103a790612776565b600061133f6114ae565b905061135f81878761135088611a06565b61135988611a06565b87610820565b6113a6836040518060600160405280602a8152602001612e61602a913960008781526001602090815260408083206001600160a01b038d16845290915290205491906114b3565b60008581526001602090815260408083206001600160a01b038b811685529252808320939093558716815220546113dd90846114df565b60008581526001602090815260408083206001600160a01b03808b168086529190935292819020939093559151909188811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906114439089908990612d03565b60405180910390a4610820818787878787611a4a565b6114616114ae565b6001600160a01b0316836001600160a01b031614806114875750611487836103546114ae565b6114a35760405162461bcd60e51b81526004016103a790612776565b610de4838383611b1b565b335b90565b600081848411156114d75760405162461bcd60e51b81526004016103a79190612493565b505050900390565b6000828201838110156115045760405162461bcd60e51b81526004016103a7906126d8565b9392505050565b61151d846001600160a01b0316611c4f565b156108205760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061155690899089908890889088906004016123a4565b602060405180830381600087803b15801561157057600080fd5b505af19250505080156115a0575060408051601f3d908101601f1916820190925261159d91810190612213565b60015b6115e9576115ac612d5e565b806115b757506115d1565b8060405162461bcd60e51b81526004016103a79190612493565b60405162461bcd60e51b81526004016103a7906124a6565b6001600160e01b0319811663bc197c8160e01b146116195760405162461bcd60e51b81526004016103a7906124fa565b50505050505050565b6000828152600360209081526040909120825161164192840190611d4a565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516116729190612493565b60405180910390a25050565b6000804342336040516020016116949190612351565b6040516020818303038152906040528051906020012060001c816116b457fe5b044542416040516020016116c89190612351565b6040516020818303038152906040528051906020012060001c816116e857fe5b0444420101010101604051602001611700919061236e565b60408051601f19818403018152919052805160209091012060075490915061173d90611736906117308482611c55565b90611c97565b8290611cd1565b91505090565b6001600160a01b0384166117695760405162461bcd60e51b81526004016103a790612cc2565b60006117736114ae565b90506117858160008761135088611a06565b60008481526001602090815260408083206001600160a01b03891684529091529020546117b290846114df565b60008581526001602090815260408083206001600160a01b038a1684528252808320939093558682526004905220546117eb90846114df565b6000858152600460205260408082209290925590516001600160a01b038088169291908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906118409089908990612d03565b60405180910390a461185781600087878787611a4a565b5050505050565b6001600160a01b0383166118845760405162461bcd60e51b81526004016103a79061299e565b80518251146118a55760405162461bcd60e51b81526004016103a790612c7a565b60006118af6114ae565b90506118cf81856000868660405180602001604052806000815250610820565b60005b83518110156119a75760008482815181106118e957fe5b60200260200101519050600084838151811061190157fe5b6020026020010151905061195281604051806060016040528060248152602001612e3d6024913960008581526001602090815260408083206001600160a01b038e16845290915290205491906114b3565b60008381526001602090815260408083206001600160a01b038c16845282528083209390935584825260049052205461198b9082611cd1565b60009283526004602052604090922091909155506001016118d2565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516119f892919061245a565b60405180910390a450505050565b604080516001808252818301909252606091829190602080830190803683370190505090508281600081518110611a3957fe5b602090810291909101015292915050565b611a5c846001600160a01b0316611c4f565b156108205760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611a959089908990889088908890600401612402565b602060405180830381600087803b158015611aaf57600080fd5b505af1925050508015611adf575060408051601f3d908101601f19168201909252611adc91810190612213565b60015b611aeb576115ac612d5e565b6001600160e01b0319811663f23a6e6160e01b146116195760405162461bcd60e51b81526004016103a7906124fa565b6001600160a01b038316611b415760405162461bcd60e51b81526004016103a79061299e565b6000611b4b6114ae565b9050611b7b81856000611b5d87611a06565b611b6687611a06565b60405180602001604052806000815250610820565b611bc282604051806060016040528060248152602001612e3d6024913960008681526001602090815260408083206001600160a01b038b16845290915290205491906114b3565b60008481526001602090815260408083206001600160a01b0389168452825280832093909355858252600490522054611bfb9083611cd1565b6000848152600460205260408082209290925590516001600160a01b0386811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906119f89088908890612d03565b3b151590565b600061150483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611d13565b600082611ca6575060006103d5565b82820282848281611cb357fe5b04146115045760405162461bcd60e51b81526004016103a790612ab6565b600061150483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114b3565b60008183611d345760405162461bcd60e51b81526004016103a79190612493565b506000838581611d4057fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611d8b57805160ff1916838001178555611db8565b82800160010185558215611db8579182015b82811115611db8578251825591602001919060010190611d9d565b50611dc4929150611dc8565b5090565b5b80821115611dc45760008155600101611dc9565b600082601f830112611ded578081fd5b8135611e00611dfb82612d38565b612d11565b818152915060208083019084810181840286018201871015611e2157600080fd5b60005b84811015611e4057813584529282019290820190600101611e24565b505050505092915050565b600082601f830112611e5b578081fd5b813567ffffffffffffffff811115611e71578182fd5b611e84601f8201601f1916602001612d11565b9150808252836020828501011115611e9b57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611ec5578081fd5b813561150481612e03565b60008060408385031215611ee2578081fd5b8235611eed81612e03565b91506020830135611efd81612e03565b809150509250929050565b600080600080600060a08688031215611f1f578081fd5b8535611f2a81612e03565b94506020860135611f3a81612e03565b9350604086013567ffffffffffffffff80821115611f56578283fd5b611f6289838a01611ddd565b94506060880135915080821115611f77578283fd5b611f8389838a01611ddd565b93506080880135915080821115611f98578283fd5b50611fa588828901611e4b565b9150509295509295909350565b600080600080600060a08688031215611fc9578081fd5b8535611fd481612e03565b94506020860135611fe481612e03565b93506040860135925060608601359150608086013567ffffffffffffffff81111561200d578182fd5b611fa588828901611e4b565b60008060006060848603121561202d578283fd5b833561203881612e03565b9250602084013567ffffffffffffffff80821115612054578384fd5b61206087838801611ddd565b93506040860135915080821115612075578283fd5b5061208286828701611ddd565b9150509250925092565b6000806040838503121561209e578182fd5b82356120a981612e03565b91506020830135611efd81612e18565b600080604083850312156120cb578182fd5b82356120d681612e03565b946020939093013593505050565b6000806000606084860312156120f8578283fd5b833561210381612e03565b95602085013595506040909401359392505050565b6000806040838503121561212a578182fd5b823567ffffffffffffffff80821115612141578384fd5b818501915085601f830112612154578384fd5b8135612162611dfb82612d38565b80828252602080830192508086018a828387028901011115612182578889fd5b8896505b848710156121ad57803561219981612e03565b845260019690960195928101928101612186565b5090965087013593505050808211156121c4578283fd5b506121d185828601611ddd565b9150509250929050565b6000602082840312156121ec578081fd5b815161150481612e18565b600060208284031215612208578081fd5b813561150481612e26565b600060208284031215612224578081fd5b815161150481612e26565b60008060208385031215612241578182fd5b823567ffffffffffffffff80821115612258578384fd5b818501915085601f83011261226b578384fd5b813581811115612279578485fd5b86602082850101111561228a578485fd5b60209290920196919550909350505050565b6000602082840312156122ad578081fd5b5035919050565b6000602082840312156122c5578081fd5b5051919050565b6000815180845260208085019450808401835b838110156122fb578151875295820195908201906001016122df565b509495945050505050565b60008151808452815b8181101561232b5760208185018101518683018201520161230f565b8181111561233c5782602083870101525b50601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0386811682528516602082015260a0604082018190526000906123d0908301866122cc565b82810360608401526123e281866122cc565b905082810360808401526123f68185612306565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061243c90830184612306565b979650505050505050565b60006020825261150460208301846122cc565b60006040825261246d60408301856122cc565b828103602084015261247f81856122cc565b95945050505050565b901515815260200190565b6000602082526115046020830184612306565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526036908201527f4469676974616c6178506f64654d6174657269616c732e6d696e743a2053656e60408201527519195c881b5d5cdd081a185d99481413d1114813919560521b606082015260800190565b60208082526032908201527f4469676974616c6178506f64654d6174657269616c732e6d696e743a2053656e60408201527119195c88185b1c9958591e481b5a5b9d195960721b606082015260800190565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526031908201527f455243313135353a2062617463682062616c616e636520717565727920666f7260408201527020746865207a65726f206164647265737360781b606082015260800190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526041908201527f4469676974616c6178506f64654d6174657269616c732e75706461746541636360408201527f657373436f6e74726f6c733a2053656e646572206d7573742062652061646d696060820152603760f91b608082015260a00190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b6020808252604a908201527f4469676974616c6178506f64654d6174657269616c732e63726561746543686960408201527f6c643a2053656e646572206d75737420626520736d61727420636f6e747261636060820152693a1037b91030b236b4b760b11b608082015260a00190565b60208082526035908201527f4469676974616c61784d61726b6574706c6163652e7265636c61696d4554483a6040820152741029b2b73232b91036bab9ba1031329030b236b4b760591b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526057908201527f4469676974616c6178506f64654d6174657269616c732e75706461746541636360408201527f657373436f6e74726f6c733a204e65772061636365737320636f6e74726f6c7360608201527f2063616e6e6f74206265205a45524f2061646472657373000000000000000000608082015260a00190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526052908201527f4469676974616c6178506f64654d6174657269616c732e616464546f6b656e5560408201527f52493a2053656e646572206d75737420626520616e20617574686f72697365646060820152711031b7b73a3930b1ba1037b91030b236b4b760711b608082015260a00190565b60208082526037908201527f4469676974616c61784d61726b6574706c6163652e7265636c61696d4552433260408201527f303a2053656e646572206d7573742062652061646d696e000000000000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526039908201527f4469676974616c6178506f64654d6174657269616c732e63726561746543686960408201527f6c643a20555249206973206120626c616e6b20737472696e6700000000000000606082015260800190565b6020808252601c908201527f496e646578206f7574206f6620686f6c64696e6720746f6b656e732e00000000604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252603a908201527f4469676974616c6178506f64654d6174657269616c733a2062616c616e63652060408201527f717565727920666f7220746865207a65726f2061646472657373000000000000606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715612d3057600080fd5b604052919050565b600067ffffffffffffffff821115612d4e578081fd5b5060209081020190565b60e01c90565b600060443d1015612d6e576114b0565b600481823e6308c379a0612d828251612d58565b14612d8c576114b0565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715612dbc57505050506114b0565b82840192508251915080821115612dd657505050506114b0565b503d83016020828401011115612dee575050506114b0565b601f01601f1916810160200160405291505090565b6001600160a01b03811681146105f657600080fd5b80151581146105f657600080fd5b6001600160e01b0319811681146105f657600080fdfe455243313135353a206275726e20616d6f756e7420657863656564732062616c616e6365455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e73666572a2646970667358221220d659821caa7a3627b2e0467f922163f94e8c96b4e5acf2b53cfaa9fbad8065e264736f6c634300060c0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000e6fff33bdef5e1894d898b24b366fbec6d74c0730000000000000000000000003a778b794885b04b3a1290f0d802d82b5f42dcbb00000000000000000000000000000000000000000000000000000000000000164469676974616c6178506f64654d6174657269616c73000000000000000000000000000000000000000000000000000000000000000000000000000000000005504f44454d000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018d5760003560e01c80635c4fbd5d116100de5780638905fd4f11610097578063bf8bcee411610071578063bf8bcee414610333578063e985e9c514610346578063f242432a14610359578063f5298aca1461036c5761018d565b80638905fd4f1461030557806395d89b4114610318578063a22cb465146103205761018d565b80635c4fbd5d1461029e5780636468e317146102b15780636a627842146102c45780636b20c454146102d75780636ef3da94146102ea578063748365ef146102fd5761018d565b80631b40f0831161014b5780633b3a1a7a116101255780633b3a1a7a146102505780634b0ee02a146102585780634e1273f41461026b57806357f7f2981461028b5761018d565b80631b40f083146102155780632eb2c2d61461022a5780632f745c591461023d5761018d565b8062fdd58e1461019257806301ffc9a7146101bb57806306fdde03146101db5780630e89341c146101f05780630f144a48146102035780631a861d261461020d575b600080fd5b6101a56101a03660046120b9565b61037f565b6040516101b2919061236e565b60405180910390f35b6101ce6101c93660046121f7565b6103db565b6040516101b29190612488565b6101e36103fa565b6040516101b29190612493565b6101e36101fe36600461229c565b610488565b61020b610529565b005b6101a56105f9565b61021d6105ff565b6040516101b29190612377565b61020b610238366004611f08565b61060e565b6101a561024b3660046120b9565b610828565b6101a5610894565b6101a5610266366004611eb4565b61089a565b61027e610279366004612118565b6108f5565b6040516101b29190612447565b6101a561029936600461222f565b610a2d565b6101e36102ac36600461229c565b610c00565b6101a56102bf36600461229c565b610c73565b61020b6102d2366004611eb4565b610c85565b61020b6102e5366004612019565b610d8f565b61020b6102f8366004611eb4565b610de9565b61021d610ed2565b61020b610313366004611eb4565b610ee1565b6101e36110c8565b61020b61032e36600461208c565b611123565b61020b61034136600461229c565b6111f1565b6101ce610354366004611ed0565b611297565b61020b610367366004611fb2565b6112c5565b61020b61037a3660046120e4565b611459565b60006001600160a01b0383166103b05760405162461bcd60e51b81526004016103a790612613565b60405180910390fd5b5060008181526001602090815260408083206001600160a01b03861684529091529020545b92915050565b6001600160e01b03191660009081526020819052604090205460ff1690565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104805780601f1061045557610100808354040283529160200191610480565b820191906000526020600020905b81548152906001019060200180831161046357829003601f168201915b505050505081565b60008181526003602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084526060939283018282801561051d5780601f106104f25761010080835404028352916020019161051d565b820191906000526020600020905b81548152906001019060200180831161050057829003601f168201915b50505050509050919050565b600a546001600160a01b031663c395fcb36105426114ae565b6040518263ffffffff1660e01b815260040161055e9190612377565b60206040518083038186803b15801561057657600080fd5b505afa15801561058a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ae91906121db565b6105ca5760405162461bcd60e51b81526004016103a79061282f565b60405133904780156108fc02916000818181858888f193505050501580156105f6573d6000803e3d6000fd5b50565b60085481565b600b546001600160a01b031681565b815183511461062f5760405162461bcd60e51b81526004016103a790612c7a565b6001600160a01b0384166106555760405162461bcd60e51b81526004016103a790612884565b61065d6114ae565b6001600160a01b0316856001600160a01b031614806106835750610683856103546114ae565b61069f5760405162461bcd60e51b81526004016103a79061294c565b60006106a96114ae565b90506106b9818787878787610820565b60005b84518110156107ba5760008582815181106106d357fe5b6020026020010151905060008583815181106106eb57fe5b60200260200101519050610758816040518060600160405280602a8152602001612e61602a91396001600086815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020546114b39092919063ffffffff16565b60008381526001602090815260408083206001600160a01b038e811685529252808320939093558a168152205461078f90826114df565b60009283526001602081815260408086206001600160a01b038d1687529091529093205550016106bc565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161080a92919061245a565b60405180910390a461082081878787878761150b565b505050505050565b60008080805b60075481101561086c576000610844878361037f565b11156108645784821415610856578092505b6108618260016114df565b91505b60010161082e565b5083811161088c5760405162461bcd60e51b81526004016103a790612b54565b509392505050565b60075481565b60006001600160a01b0382166108c25760405162461bcd60e51b81526004016103a790612c1d565b6000805b6007548110156108ee576108e46108dd858361037f565b83906114df565b91506001016108c6565b5092915050565b606081518351146109185760405162461bcd60e51b81526004016103a790612bd4565b6060835167ffffffffffffffff8111801561093257600080fd5b5060405190808252806020026020018201604052801561095c578160200160208202803683370190505b50905060005b845181101561088c5760006001600160a01b031685828151811061098257fe5b60200260200101516001600160a01b031614156109b15760405162461bcd60e51b81526004016103a79061265e565b600160008583815181106109c157fe5b6020026020010151815260200190815260200160002060008683815181106109e557fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110610a1a57fe5b6020908102919091010152600101610962565b600a546000906001600160a01b031663113b0ab2610a496114ae565b6040518263ffffffff1660e01b8152600401610a659190612377565b60206040518083038186803b158015610a7d57600080fd5b505afa158015610a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab591906121db565b80610b405750600a546001600160a01b031663c395fcb3610ad46114ae565b6040518263ffffffff1660e01b8152600401610af09190612377565b60206040518083038186803b158015610b0857600080fd5b505afa158015610b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4091906121db565b610b5c5760405162461bcd60e51b81526004016103a7906127bf565b81610b795760405162461bcd60e51b81526004016103a790612af7565b6007549050610bbe8184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061162292505050565b600754610bcc9060016114df565b60075560405181907f681752c038b5d514f6ae8f2ce8213787d94b4c18dafbf220e7c8f500fa6c812190600090a292915050565b60098181548110610c0d57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152935090918301828280156104805780601f1061045557610100808354040283529160200191610480565b60046020526000908152604090205481565b600854610c936102666114ae565b10610cb05760405162461bcd60e51b81526004016103a790612598565b600b546000906001600160a01b03166370a08231610ccc6114ae565b6040518263ffffffff1660e01b8152600401610ce89190612377565b60206040518083038186803b158015610d0057600080fd5b505afa158015610d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3891906122b4565b11610d555760405162461bcd60e51b81526004016103a790612542565b6000610d5f61167e565b9050610d8b82826001604051602001610d77906114b0565b604051602081830303815290604052611743565b5050565b610d976114ae565b6001600160a01b0316836001600160a01b03161480610dbd5750610dbd836103546114ae565b610dd95760405162461bcd60e51b81526004016103a790612776565b610de483838361185e565b505050565b600a546001600160a01b031663c395fcb3610e026114ae565b6040518263ffffffff1660e01b8152600401610e1e9190612377565b60206040518083038186803b158015610e3657600080fd5b505afa158015610e4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6e91906121db565b610e8a5760405162461bcd60e51b81526004016103a79061270f565b6001600160a01b038116610eb05760405162461bcd60e51b81526004016103a7906128c9565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031681565b600a546001600160a01b031663c395fcb3610efa6114ae565b6040518263ffffffff1660e01b8152600401610f169190612377565b60206040518083038186803b158015610f2e57600080fd5b505afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6691906121db565b610f825760405162461bcd60e51b81526004016103a790612a59565b6001600160a01b038116610fa85760405162461bcd60e51b81526004016103a7906125ea565b6040516370a0823160e01b815281906000906001600160a01b038316906370a0823190610fd9903090600401612377565b60206040518083038186803b158015610ff157600080fd5b505afa158015611005573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102991906122b4565b60405163a9059cbb60e01b81529091506001600160a01b0383169063a9059cbb9061105a903390859060040161238b565b602060405180830381600087803b15801561107457600080fd5b505af1158015611088573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ac91906121db565b610de45760405162461bcd60e51b81526004016103a7906126af565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104805780601f1061045557610100808354040283529160200191610480565b816001600160a01b03166111356114ae565b6001600160a01b0316141561115c5760405162461bcd60e51b81526004016103a790612b8b565b80600260006111696114ae565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556111ad6114ae565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111e59190612488565b60405180910390a35050565b600a546001600160a01b031663c395fcb361120a6114ae565b6040518263ffffffff1660e01b81526004016112269190612377565b60206040518083038186803b15801561123e57600080fd5b505afa158015611252573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127691906121db565b6112925760405162461bcd60e51b81526004016103a7906129e1565b600855565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b6001600160a01b0384166112eb5760405162461bcd60e51b81526004016103a790612884565b6112f36114ae565b6001600160a01b0316856001600160a01b031614806113195750611319856103546114ae565b6113355760405162461bcd60e51b81526004016103a790612776565b600061133f6114ae565b905061135f81878761135088611a06565b61135988611a06565b87610820565b6113a6836040518060600160405280602a8152602001612e61602a913960008781526001602090815260408083206001600160a01b038d16845290915290205491906114b3565b60008581526001602090815260408083206001600160a01b038b811685529252808320939093558716815220546113dd90846114df565b60008581526001602090815260408083206001600160a01b03808b168086529190935292819020939093559151909188811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906114439089908990612d03565b60405180910390a4610820818787878787611a4a565b6114616114ae565b6001600160a01b0316836001600160a01b031614806114875750611487836103546114ae565b6114a35760405162461bcd60e51b81526004016103a790612776565b610de4838383611b1b565b335b90565b600081848411156114d75760405162461bcd60e51b81526004016103a79190612493565b505050900390565b6000828201838110156115045760405162461bcd60e51b81526004016103a7906126d8565b9392505050565b61151d846001600160a01b0316611c4f565b156108205760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061155690899089908890889088906004016123a4565b602060405180830381600087803b15801561157057600080fd5b505af19250505080156115a0575060408051601f3d908101601f1916820190925261159d91810190612213565b60015b6115e9576115ac612d5e565b806115b757506115d1565b8060405162461bcd60e51b81526004016103a79190612493565b60405162461bcd60e51b81526004016103a7906124a6565b6001600160e01b0319811663bc197c8160e01b146116195760405162461bcd60e51b81526004016103a7906124fa565b50505050505050565b6000828152600360209081526040909120825161164192840190611d4a565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516116729190612493565b60405180910390a25050565b6000804342336040516020016116949190612351565b6040516020818303038152906040528051906020012060001c816116b457fe5b044542416040516020016116c89190612351565b6040516020818303038152906040528051906020012060001c816116e857fe5b0444420101010101604051602001611700919061236e565b60408051601f19818403018152919052805160209091012060075490915061173d90611736906117308482611c55565b90611c97565b8290611cd1565b91505090565b6001600160a01b0384166117695760405162461bcd60e51b81526004016103a790612cc2565b60006117736114ae565b90506117858160008761135088611a06565b60008481526001602090815260408083206001600160a01b03891684529091529020546117b290846114df565b60008581526001602090815260408083206001600160a01b038a1684528252808320939093558682526004905220546117eb90846114df565b6000858152600460205260408082209290925590516001600160a01b038088169291908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906118409089908990612d03565b60405180910390a461185781600087878787611a4a565b5050505050565b6001600160a01b0383166118845760405162461bcd60e51b81526004016103a79061299e565b80518251146118a55760405162461bcd60e51b81526004016103a790612c7a565b60006118af6114ae565b90506118cf81856000868660405180602001604052806000815250610820565b60005b83518110156119a75760008482815181106118e957fe5b60200260200101519050600084838151811061190157fe5b6020026020010151905061195281604051806060016040528060248152602001612e3d6024913960008581526001602090815260408083206001600160a01b038e16845290915290205491906114b3565b60008381526001602090815260408083206001600160a01b038c16845282528083209390935584825260049052205461198b9082611cd1565b60009283526004602052604090922091909155506001016118d2565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516119f892919061245a565b60405180910390a450505050565b604080516001808252818301909252606091829190602080830190803683370190505090508281600081518110611a3957fe5b602090810291909101015292915050565b611a5c846001600160a01b0316611c4f565b156108205760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611a959089908990889088908890600401612402565b602060405180830381600087803b158015611aaf57600080fd5b505af1925050508015611adf575060408051601f3d908101601f19168201909252611adc91810190612213565b60015b611aeb576115ac612d5e565b6001600160e01b0319811663f23a6e6160e01b146116195760405162461bcd60e51b81526004016103a7906124fa565b6001600160a01b038316611b415760405162461bcd60e51b81526004016103a79061299e565b6000611b4b6114ae565b9050611b7b81856000611b5d87611a06565b611b6687611a06565b60405180602001604052806000815250610820565b611bc282604051806060016040528060248152602001612e3d6024913960008681526001602090815260408083206001600160a01b038b16845290915290205491906114b3565b60008481526001602090815260408083206001600160a01b0389168452825280832093909355858252600490522054611bfb9083611cd1565b6000848152600460205260408082209290925590516001600160a01b0386811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906119f89088908890612d03565b3b151590565b600061150483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611d13565b600082611ca6575060006103d5565b82820282848281611cb357fe5b04146115045760405162461bcd60e51b81526004016103a790612ab6565b600061150483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114b3565b60008183611d345760405162461bcd60e51b81526004016103a79190612493565b506000838581611d4057fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611d8b57805160ff1916838001178555611db8565b82800160010185558215611db8579182015b82811115611db8578251825591602001919060010190611d9d565b50611dc4929150611dc8565b5090565b5b80821115611dc45760008155600101611dc9565b600082601f830112611ded578081fd5b8135611e00611dfb82612d38565b612d11565b818152915060208083019084810181840286018201871015611e2157600080fd5b60005b84811015611e4057813584529282019290820190600101611e24565b505050505092915050565b600082601f830112611e5b578081fd5b813567ffffffffffffffff811115611e71578182fd5b611e84601f8201601f1916602001612d11565b9150808252836020828501011115611e9b57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611ec5578081fd5b813561150481612e03565b60008060408385031215611ee2578081fd5b8235611eed81612e03565b91506020830135611efd81612e03565b809150509250929050565b600080600080600060a08688031215611f1f578081fd5b8535611f2a81612e03565b94506020860135611f3a81612e03565b9350604086013567ffffffffffffffff80821115611f56578283fd5b611f6289838a01611ddd565b94506060880135915080821115611f77578283fd5b611f8389838a01611ddd565b93506080880135915080821115611f98578283fd5b50611fa588828901611e4b565b9150509295509295909350565b600080600080600060a08688031215611fc9578081fd5b8535611fd481612e03565b94506020860135611fe481612e03565b93506040860135925060608601359150608086013567ffffffffffffffff81111561200d578182fd5b611fa588828901611e4b565b60008060006060848603121561202d578283fd5b833561203881612e03565b9250602084013567ffffffffffffffff80821115612054578384fd5b61206087838801611ddd565b93506040860135915080821115612075578283fd5b5061208286828701611ddd565b9150509250925092565b6000806040838503121561209e578182fd5b82356120a981612e03565b91506020830135611efd81612e18565b600080604083850312156120cb578182fd5b82356120d681612e03565b946020939093013593505050565b6000806000606084860312156120f8578283fd5b833561210381612e03565b95602085013595506040909401359392505050565b6000806040838503121561212a578182fd5b823567ffffffffffffffff80821115612141578384fd5b818501915085601f830112612154578384fd5b8135612162611dfb82612d38565b80828252602080830192508086018a828387028901011115612182578889fd5b8896505b848710156121ad57803561219981612e03565b845260019690960195928101928101612186565b5090965087013593505050808211156121c4578283fd5b506121d185828601611ddd565b9150509250929050565b6000602082840312156121ec578081fd5b815161150481612e18565b600060208284031215612208578081fd5b813561150481612e26565b600060208284031215612224578081fd5b815161150481612e26565b60008060208385031215612241578182fd5b823567ffffffffffffffff80821115612258578384fd5b818501915085601f83011261226b578384fd5b813581811115612279578485fd5b86602082850101111561228a578485fd5b60209290920196919550909350505050565b6000602082840312156122ad578081fd5b5035919050565b6000602082840312156122c5578081fd5b5051919050565b6000815180845260208085019450808401835b838110156122fb578151875295820195908201906001016122df565b509495945050505050565b60008151808452815b8181101561232b5760208185018101518683018201520161230f565b8181111561233c5782602083870101525b50601f01601f19169290920160200192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0386811682528516602082015260a0604082018190526000906123d0908301866122cc565b82810360608401526123e281866122cc565b905082810360808401526123f68185612306565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061243c90830184612306565b979650505050505050565b60006020825261150460208301846122cc565b60006040825261246d60408301856122cc565b828103602084015261247f81856122cc565b95945050505050565b901515815260200190565b6000602082526115046020830184612306565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526036908201527f4469676974616c6178506f64654d6174657269616c732e6d696e743a2053656e60408201527519195c881b5d5cdd081a185d99481413d1114813919560521b606082015260800190565b60208082526032908201527f4469676974616c6178506f64654d6174657269616c732e6d696e743a2053656e60408201527119195c88185b1c9958591e481b5a5b9d195960721b606082015260800190565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526031908201527f455243313135353a2062617463682062616c616e636520717565727920666f7260408201527020746865207a65726f206164647265737360781b606082015260800190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526041908201527f4469676974616c6178506f64654d6174657269616c732e75706461746541636360408201527f657373436f6e74726f6c733a2053656e646572206d7573742062652061646d696060820152603760f91b608082015260a00190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b6020808252604a908201527f4469676974616c6178506f64654d6174657269616c732e63726561746543686960408201527f6c643a2053656e646572206d75737420626520736d61727420636f6e747261636060820152693a1037b91030b236b4b760b11b608082015260a00190565b60208082526035908201527f4469676974616c61784d61726b6574706c6163652e7265636c61696d4554483a6040820152741029b2b73232b91036bab9ba1031329030b236b4b760591b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526057908201527f4469676974616c6178506f64654d6174657269616c732e75706461746541636360408201527f657373436f6e74726f6c733a204e65772061636365737320636f6e74726f6c7360608201527f2063616e6e6f74206265205a45524f2061646472657373000000000000000000608082015260a00190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526052908201527f4469676974616c6178506f64654d6174657269616c732e616464546f6b656e5560408201527f52493a2053656e646572206d75737420626520616e20617574686f72697365646060820152711031b7b73a3930b1ba1037b91030b236b4b760711b608082015260a00190565b60208082526037908201527f4469676974616c61784d61726b6574706c6163652e7265636c61696d4552433260408201527f303a2053656e646572206d7573742062652061646d696e000000000000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526039908201527f4469676974616c6178506f64654d6174657269616c732e63726561746543686960408201527f6c643a20555249206973206120626c616e6b20737472696e6700000000000000606082015260800190565b6020808252601c908201527f496e646578206f7574206f6620686f6c64696e6720746f6b656e732e00000000604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b6020808252603a908201527f4469676974616c6178506f64654d6174657269616c733a2062616c616e63652060408201527f717565727920666f7220746865207a65726f2061646472657373000000000000606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715612d3057600080fd5b604052919050565b600067ffffffffffffffff821115612d4e578081fd5b5060209081020190565b60e01c90565b600060443d1015612d6e576114b0565b600481823e6308c379a0612d828251612d58565b14612d8c576114b0565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715612dbc57505050506114b0565b82840192508251915080821115612dd657505050506114b0565b503d83016020828401011115612dee575050506114b0565b601f01601f1916810160200160405291505090565b6001600160a01b03811681146105f657600080fd5b80151581146105f657600080fd5b6001600160e01b0319811681146105f657600080fdfe455243313135353a206275726e20616d6f756e7420657863656564732062616c616e6365455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e73666572a2646970667358221220d659821caa7a3627b2e0467f922163f94e8c96b4e5acf2b53cfaa9fbad8065e264736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000e6fff33bdef5e1894d898b24b366fbec6d74c0730000000000000000000000003a778b794885b04b3a1290f0d802d82b5f42dcbb00000000000000000000000000000000000000000000000000000000000000164469676974616c6178506f64654d6174657269616c73000000000000000000000000000000000000000000000000000000000000000000000000000000000005504f44454d000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): DigitalaxPodeMaterials
Arg [1] : _symbol (string): PODEM
Arg [2] : _accessControls (address): 0xe6FFf33bDef5e1894d898b24B366FBeC6d74c073
Arg [3] : _podeNft (address): 0x3A778b794885B04b3a1290f0D802d82B5f42DcBb
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000e6fff33bdef5e1894d898b24b366fbec6d74c073
Arg [3] : 0000000000000000000000003a778b794885b04b3a1290f0d802d82b5f42dcbb
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000016
Arg [5] : 4469676974616c6178506f64654d6174657269616c7300000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 504f44454d000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
99043:6487:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27555:223;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12666:142;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;99318:18::-;;;:::i;:::-;;;;;;;:::i;27283:121::-;;;;;;:::i;:::-;;:::i;105280:247::-;;;:::i;:::-;;99493:27;;;:::i;99691:31::-;;;:::i;:::-;;;;;;;:::i;30243:1210::-;;;;;;:::i;:::-;;:::i;103266:566::-;;;;;;:::i;:::-;;:::i;99413:29::-;;;:::i;102740:388::-;;;;;;:::i;:::-;;:::i;27944:618::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;100351:559::-;;;;;;:::i;:::-;;:::i;99560:28::-;;;;;;:::i;:::-;;:::i;25934:51::-;;;;;;:::i;:::-;;:::i;101338:391::-;;;;;;:::i;:::-;;:::i;39622:321::-;;;;;;:::i;:::-;;:::i;102137:488::-;;;;;;:::i;:::-;;:::i;99639:45::-;;;:::i;104570:468::-;;;;;;:::i;:::-;;:::i;99343:20::-;;;:::i;28635:313::-;;;;;;:::i;:::-;;:::i;101857:272::-;;;;;;:::i;:::-;;:::i;29020:160::-;;;;;;:::i;:::-;;:::i;29252:914::-;;;;;;:::i;:::-;;:::i;39325:289::-;;;;;;:::i;:::-;;:::i;27555:223::-;27633:7;-1:-1:-1;;;;;27661:21:0;;27653:77;;;;-1:-1:-1;;;27653:77:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;27748:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;27748:22:0;;;;;;;;;;27555:223;;;;;:::o;12666:142::-;-1:-1:-1;;;;;;12767:33:0;12743:4;12767:33;;;;;;;;;;;;;;12666:142::o;99318:18::-;;;;;;;;;;;;;;;-1:-1:-1;;99318:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27283:121::-;27378:18;;;;:9;:18;;;;;;;;;27371:25;;;;;;-1:-1:-1;;27371:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27345:13;;27371:25;;;27378:18;27371:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27283:121;;;:::o;105280:247::-;105344:14;;-1:-1:-1;;;;;105344:14:0;:27;105372:12;:10;:12::i;:::-;105344:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;105322:144;;;;-1:-1:-1;;;105322:144:0;;;;;;;:::i;:::-;105477:42;;:10;;105497:21;105477:42;;;;;;;;;105497:21;105477:10;:42;;;;;;;;;;;;;;;;;;;;;105280:247::o;99493:27::-;;;;:::o;99691:31::-;;;-1:-1:-1;;;;;99691:31:0;;:::o;30243:1210::-;30498:7;:14;30484:3;:10;:28;30476:81;;;;-1:-1:-1;;;30476:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30576:16:0;;30568:66;;;;-1:-1:-1;;;30568:66:0;;;;;;;:::i;:::-;30675:12;:10;:12::i;:::-;-1:-1:-1;;;;;30667:20:0;:4;-1:-1:-1;;;;;30667:20:0;;:60;;;;30691:36;30708:4;30714:12;:10;:12::i;30691:36::-;30645:160;;;;-1:-1:-1;;;30645:160:0;;;;;;;:::i;:::-;30818:16;30837:12;:10;:12::i;:::-;30818:31;;30862:60;30883:8;30893:4;30899:2;30903:3;30908:7;30917:4;30862:20;:60::i;:::-;30940:9;30935:358;30959:3;:10;30955:1;:14;30935:358;;;30991:10;31004:3;31008:1;31004:6;;;;;;;;;;;;;;30991:19;;31025:14;31042:7;31050:1;31042:10;;;;;;;;;;;;;;31025:27;;31091:126;31133:6;31091:126;;;;;;;;;;;;;;;;;:9;:13;31101:2;31091:13;;;;;;;;;;;:19;31105:4;-1:-1:-1;;;;;31091:19:0;-1:-1:-1;;;;;31091:19:0;;;;;;;;;;;;;:23;;:126;;;;;:::i;:::-;31069:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;31069:19:0;;;;;;;;;;:148;;;;31252:17;;;;;;:29;;31274:6;31252:21;:29::i;:::-;31232:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;31232:17:0;;;;;;;;;;:49;-1:-1:-1;30971:3:0;30935:358;;;;31340:2;-1:-1:-1;;;;;31310:47:0;31334:4;-1:-1:-1;;;;;31310:47:0;31324:8;-1:-1:-1;;;;;31310:47:0;;31344:3;31349:7;31310:47;;;;;;;:::i;:::-;;;;;;;;31370:75;31406:8;31416:4;31422:2;31426:3;31431:7;31440:4;31370:35;:75::i;:::-;30243:1210;;;;;;:::o;103266:566::-;103348:7;;;;103425:271;103449:14;;103445:1;:18;103425:271;;;103514:1;103490:21;103500:7;103509:1;103490:9;:21::i;:::-;:25;103486:199;;;103556:5;103540:12;:21;103536:81;;;103596:1;103586:11;;103536:81;103650:19;:12;103667:1;103650:16;:19::i;:::-;103635:34;;103486:199;103465:4;;103425:271;;;;103728:5;103712:12;:21;103708:92;;103750:38;;-1:-1:-1;;;103750:38:0;;;;;;;:::i;103708:92::-;-1:-1:-1;103817:7:0;103266:566;-1:-1:-1;;;103266:566:0:o;99413:29::-;;;;:::o;102740:388::-;102802:7;-1:-1:-1;;;;;102830:21:0;;102822:92;;;;-1:-1:-1;;;102822:92:0;;;;;;;:::i;:::-;102927:20;102967:9;102962:127;102986:14;;102982:1;:18;102962:127;;;103038:39;103055:21;103065:7;103074:1;103055:9;:21::i;:::-;103038:12;;:16;:39::i;:::-;103023:54;-1:-1:-1;103002:4:0;;102962:127;;;-1:-1:-1;103108:12:0;102740:388;-1:-1:-1;;102740:388:0:o;27944:618::-;28092:16;28153:3;:10;28134:8;:15;:29;28126:83;;;;-1:-1:-1;;;28126:83:0;;;;;;;:::i;:::-;28222:30;28269:8;:15;28255:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28255:30:0;;28222:63;;28303:9;28298:224;28322:8;:15;28318:1;:19;28298:224;;;28390:1;-1:-1:-1;;;;;28367:25:0;:8;28376:1;28367:11;;;;;;;;;;;;;;-1:-1:-1;;;;;28367:25:0;;;28359:87;;;;-1:-1:-1;;;28359:87:0;;;;;;;:::i;:::-;28480:9;:17;28490:3;28494:1;28490:6;;;;;;;;;;;;;;28480:17;;;;;;;;;;;:30;28498:8;28507:1;28498:11;;;;;;;;;;;;;;-1:-1:-1;;;;;28480:30:0;-1:-1:-1;;;;;28480:30:0;;;;;;;;;;;;;28461:13;28475:1;28461:16;;;;;;;;;;;;;;;;;:49;28339:3;;28298:224;;100351:559;100457:14;;100412:10;;-1:-1:-1;;;;;100457:14:0;:35;100493:12;:10;:12::i;:::-;100457:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:94;;;-1:-1:-1;100510:14:0;;-1:-1:-1;;;;;100510:14:0;:27;100538:12;:10;:12::i;:::-;100510:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;100435:218;;;;-1:-1:-1;;;100435:218:0;;;;;;;:::i;:::-;100674:22;100666:92;;;;-1:-1:-1;;;100666:92:0;;;;;;;:::i;:::-;100776:14;;100771:19;;100801:17;100809:2;100813:4;;100801:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;100801:7:0;;-1:-1:-1;;;100801:17:0:i;:::-;100846:14;;:21;;100865:1;100846:18;:21::i;:::-;100829:14;:38;100885:17;;100899:2;;100885:17;;;;;100351:559;;;;:::o;99560:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;99560:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;99560:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25934:51;;;;;;;;;;;;;:::o;101338:391::-;101433:8;;101402:28;101417:12;:10;:12::i;101402:28::-;:39;101394:102;;;;-1:-1:-1;;;101394:102:0;;;;;;;:::i;:::-;101515:7;;101549:1;;-1:-1:-1;;;;;101515:7:0;:17;101533:12;:10;:12::i;:::-;101515:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;101507:102;;;;-1:-1:-1;;;101507:102:0;;;;;;;:::i;:::-;101622:20;101645:7;:5;:7::i;:::-;101622:30;;101663:58;101669:12;101683;101697:1;101700:20;;;;;;;:::i;:::-;;;;;;;;;;;;;101663:5;:58::i;:::-;101338:391;;:::o;39622:321::-;39765:12;:10;:12::i;:::-;-1:-1:-1;;;;;39754:23:0;:7;-1:-1:-1;;;;;39754:23:0;;:66;;;;39781:39;39798:7;39807:12;:10;:12::i;39781:39::-;39732:157;;;;-1:-1:-1;;;39732:157:0;;;;;;;:::i;:::-;39902:33;39913:7;39922:3;39927:7;39902:10;:33::i;:::-;39622:321;;;:::o;102137:488::-;102250:14;;-1:-1:-1;;;;;102250:14:0;:27;102278:12;:10;:12::i;:::-;102250:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;102228:156;;;;-1:-1:-1;;;102228:156:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;102419:38:0;;102397:175;;;;-1:-1:-1;;;102397:175:0;;;;;;;:::i;:::-;102585:14;:32;;-1:-1:-1;;;;;;102585:32:0;-1:-1:-1;;;;;102585:32:0;;;;;;;;;;102137:488::o;99639:45::-;;;-1:-1:-1;;;;;99639:45:0;;:::o;104570:468::-;104658:14;;-1:-1:-1;;;;;104658:14:0;:27;104686:12;:10;:12::i;:::-;104658:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104636:146;;;;-1:-1:-1;;;104636:146:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;104801:28:0;;104793:56;;;;-1:-1:-1;;;104793:56:0;;;;;;;:::i;:::-;104926:30;;-1:-1:-1;;;104926:30:0;;104882:14;;104860:12;;-1:-1:-1;;;;;104926:15:0;;;;;:30;;104950:4;;104926:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104975:35;;-1:-1:-1;;;104975:35:0;;104908:48;;-1:-1:-1;;;;;;104975:14:0;;;;;:35;;104990:10;;104908:48;;104975:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104967:63;;;;-1:-1:-1;;;104967:63:0;;;;;;;:::i;99343:20::-;;;;;;;;;;;;;;;-1:-1:-1;;99343:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28635:313;28756:8;-1:-1:-1;;;;;28740:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;28740:24:0;;;28732:78;;;;-1:-1:-1;;;28732:78:0;;;;;;;:::i;:::-;28868:8;28823:18;:32;28842:12;:10;:12::i;:::-;-1:-1:-1;;;;;28823:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;28823:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;28823:53:0;;;;;;;;;;;28907:12;:10;:12::i;:::-;-1:-1:-1;;;;;28892:48:0;;28931:8;28892:48;;;;;;:::i;:::-;;;;;;;;28635:313;;:::o;101857:272::-;101939:14;;-1:-1:-1;;;;;101939:14:0;:27;101967:12;:10;:12::i;:::-;101939:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;101917:173;;;;-1:-1:-1;;;101917:173:0;;;;;;;:::i;:::-;102101:8;:20;101857:272::o;29020:160::-;-1:-1:-1;;;;;29135:27:0;;;29111:4;29135:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;29020:160::o;29252:914::-;-1:-1:-1;;;;;29468:16:0;;29460:66;;;;-1:-1:-1;;;29460:66:0;;;;;;;:::i;:::-;29567:12;:10;:12::i;:::-;-1:-1:-1;;;;;29559:20:0;:4;-1:-1:-1;;;;;29559:20:0;;:60;;;;29583:36;29600:4;29606:12;:10;:12::i;29583:36::-;29537:151;;;;-1:-1:-1;;;29537:151:0;;;;;;;:::i;:::-;29701:16;29720:12;:10;:12::i;:::-;29701:31;;29745:96;29766:8;29776:4;29782:2;29786:21;29804:2;29786:17;:21::i;:::-;29809:25;29827:6;29809:17;:25::i;:::-;29836:4;29745:20;:96::i;:::-;29876:77;29900:6;29876:77;;;;;;;;;;;;;;;;;:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;29876:19:0;;;;;;;;;;;:77;:23;:77::i;:::-;29854:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;29854:19:0;;;;;;;;;;:99;;;;29984:17;;;;;;:29;;30006:6;29984:21;:29::i;:::-;29964:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;29964:17:0;;;;;;;;;;;;;;:49;;;;30031:46;;29964:17;;30031:46;;;;;;;;;;;;29974:2;;30070:6;;30031:46;:::i;:::-;;;;;;;;30090:68;30121:8;30131:4;30137:2;30141;30145:6;30153:4;30090:30;:68::i;39325:289::-;39443:12;:10;:12::i;:::-;-1:-1:-1;;;;;39432:23:0;:7;-1:-1:-1;;;;;39432:23:0;;:66;;;;39459:39;39476:7;39485:12;:10;:12::i;39459:39::-;39410:157;;;;-1:-1:-1;;;39410:157:0;;;;;;;:::i;:::-;39580:26;39586:7;39595:2;39599:6;39580:5;:26::i;11325:106::-;11413:10;11325:106;;:::o;15251:192::-;15337:7;15373:12;15365:6;;;;15357:29;;;;-1:-1:-1;;;15357:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;15409:5:0;;;15251:192::o;14348:181::-;14406:7;14438:5;;;14462:6;;;;14454:46;;;;-1:-1:-1;;;14454:46:0;;;;;;;:::i;:::-;14520:1;14348:181;-1:-1:-1;;;14348:181:0:o;37833:795::-;38083:15;:2;-1:-1:-1;;;;;38083:13:0;;:15::i;:::-;38079:542;;;38119:79;;-1:-1:-1;;;38119:79:0;;-1:-1:-1;;;;;38119:43:0;;;;;:79;;38163:8;;38173:4;;38179:3;;38184:7;;38193:4;;38119:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38119:79:0;;;;;;;;-1:-1:-1;;38119:79:0;;;;;;;;;;;;:::i;:::-;;;38115:495;;;;:::i;:::-;;;;;;;;38483:6;38476:14;;-1:-1:-1;;;38476:14:0;;;;;;;;:::i;38115:495::-;38532:62;;-1:-1:-1;;;38532:62:0;;;;;;;:::i;38115:495::-;-1:-1:-1;;;;;;38248:64:0;;-1:-1:-1;;;38248:64:0;38244:163;;38337:50;;-1:-1:-1;;;38337:50:0;;;;;;;:::i;38244:163::-;38199:223;37833:795;;;;;;:::o;31528:155::-;31612:18;;;;:9;:18;;;;;;;;:27;;;;;;;;:::i;:::-;;31667:7;31655:20;31659:6;31655:20;;;;;;:::i;:::-;;;;;;;;31528:155;;:::o;103909:467::-;103948:7;103968:12;104269;104248:3;104230:10;104213:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;104203:39;;;;;;104195:48;;104194:58;;;;;;104162:14;104141:3;104119:14;104102:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;104092:43;;;;;;104084:52;;104083:62;;;;;;104050:16;104032:15;:34;:114;:144;:221;:249;104001:291;;;;;;;;:::i;:::-;;;;-1:-1:-1;;104001:291:0;;;;;;;;;103991:302;;104001:291;103991:302;;;;104352:14;;103991:302;;-1:-1:-1;104314:54:0;;104323:44;;:24;103991:302;104352:14;104323:8;:24::i;:::-;:28;;:44::i;:::-;104314:4;;:8;:54::i;:::-;104307:61;;;103909:467;:::o;32079:649::-;-1:-1:-1;;;;;32194:21:0;;32186:67;;;;-1:-1:-1;;;32186:67:0;;;;;;;:::i;:::-;32266:16;32285:12;:10;:12::i;:::-;32266:31;;32310:107;32331:8;32349:1;32353:7;32362:21;32380:2;32362:17;:21::i;32310:107::-;32455:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;32455:22:0;;;;;;;;;;:34;;32482:6;32455:26;:34::i;:::-;32430:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;32430:22:0;;;;;;;;;:59;;;;32523:20;;;:16;:20;;;;:32;;32548:6;32523:24;:32::i;:::-;32500:20;;;;:16;:20;;;;;;:55;;;;32571:57;;-1:-1:-1;;;;;32571:57:0;;;;32500:20;32571:57;;;;;;;;32517:2;;32621:6;;32571:57;:::i;:::-;;;;;;;;32641:79;32672:8;32690:1;32694:7;32703:2;32707:6;32715:4;32641:30;:79::i;:::-;32079:649;;;;;:::o;35014:857::-;-1:-1:-1;;;;;35135:21:0;;35127:69;;;;-1:-1:-1;;;35127:69:0;;;;;;;:::i;:::-;35229:7;:14;35215:3;:10;:28;35207:81;;;;-1:-1:-1;;;35207:81:0;;;;;;;:::i;:::-;35301:16;35320:12;:10;:12::i;:::-;35301:31;;35345:69;35366:8;35376:7;35393:1;35397:3;35402:7;35345:69;;;;;;;;;;;;:20;:69::i;:::-;35432:6;35427:361;35448:3;:10;35444:1;:14;35427:361;;;35480:10;35493:3;35497:1;35493:6;;;;;;;;;;;;;;35480:19;;35514:14;35531:7;35539:1;35531:10;;;;;;;;;;;;;;35514:27;;35581:123;35626:6;35581:123;;;;;;;;;;;;;;;;;:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;35581:22:0;;;;;;;;;;;:123;:26;:123::i;:::-;35556:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;35556:22:0;;;;;;;;;:148;;;;35744:20;;;:16;:20;;;;:32;;35769:6;35744:24;:32::i;:::-;35721:20;;;;:16;:20;;;;;;:55;;;;-1:-1:-1;35460:3:0;;35427:361;;;;35846:1;-1:-1:-1;;;;;35805:58:0;35829:7;-1:-1:-1;;;;;35805:58:0;35819:8;-1:-1:-1;;;;;35805:58:0;;35850:3;35855:7;35805:58;;;;;;;:::i;:::-;;;;;;;;35014:857;;;;:::o;38636:198::-;38756:16;;;38770:1;38756:16;;;;;;;;;38702;;;;38756;;;;;;;;;;;;-1:-1:-1;38756:16:0;38731:41;;38794:7;38783:5;38789:1;38783:8;;;;;;;;;;;;;;;;;:18;38821:5;38636:198;-1:-1:-1;;38636:198:0:o;37067:758::-;37292:15;:2;-1:-1:-1;;;;;37292:13:0;;:15::i;:::-;37288:530;;;37328:72;;-1:-1:-1;;;37328:72:0;;-1:-1:-1;;;;;37328:38:0;;;;;:72;;37367:8;;37377:4;;37383:2;;37387:6;;37395:4;;37328:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37328:72:0;;;;;;;;-1:-1:-1;;37328:72:0;;;;;;;;;;;;:::i;:::-;;;37324:483;;;;:::i;:::-;-1:-1:-1;;;;;;37450:59:0;;-1:-1:-1;;;37450:59:0;37446:158;;37534:50;;-1:-1:-1;;;37534:50:0;;;;;;;:::i;34192:619::-;-1:-1:-1;;;;;34288:21:0;;34280:69;;;;-1:-1:-1;;;34280:69:0;;;;;;;:::i;:::-;34362:16;34381:12;:10;:12::i;:::-;34362:31;;34406:105;34427:8;34437:7;34454:1;34458:21;34476:2;34458:17;:21::i;:::-;34481:25;34499:6;34481:17;:25::i;:::-;34406:105;;;;;;;;;;;;:20;:105::i;:::-;34549:111;34590:6;34549:111;;;;;;;;;;;;;;;;;:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;34549:22:0;;;;;;;;;;;:111;:26;:111::i;:::-;34524:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;34524:22:0;;;;;;;;;:136;;;;34696:20;;;:16;:20;;;;:32;;34721:6;34696:24;:32::i;:::-;34673:20;;;;:16;:20;;;;;;:55;;;;34746:57;;-1:-1:-1;;;;;34746:57:0;;;;;;;;;;;;34690:2;;34796:6;;34746:57;:::i;19574:422::-;19941:20;19980:8;;;19574:422::o;16649:132::-;16707:7;16734:39;16738:1;16741;16734:39;;;;;;;;;;;;;;;;;:3;:39::i;15702:471::-;15760:7;16005:6;16001:47;;-1:-1:-1;16035:1:0;16028:8;;16001:47;16072:5;;;16076:1;16072;:5;:1;16096:5;;;;;:10;16088:56;;;;-1:-1:-1;;;16088:56:0;;;;;;;:::i;14812:136::-;14870:7;14897:43;14901:1;14904;14897:43;;;;;;;;;;;;;;;;;:3;:43::i;17277:278::-;17363:7;17398:12;17391:5;17383:28;;;;-1:-1:-1;;;17383:28:0;;;;;;;;:::i;:::-;;17422:9;17438:1;17434;:5;;;;;;;17277:278;-1:-1:-1;;;;;17277:278:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;893:707;;1010:3;1003:4;995:6;991:17;987:27;977:2;;-1:-1;;1018:12;977:2;1065:6;1052:20;1087:80;1102:64;1159:6;1102:64;:::i;:::-;1087:80;:::i;:::-;1195:21;;;1078:89;-1:-1;1239:4;1252:14;;;;1227:17;;;1341;;;1332:27;;;;1329:36;-1:-1;1326:2;;;1378:1;;1368:12;1326:2;1403:1;1388:206;1413:6;1410:1;1407:13;1388:206;;;3225:20;;1481:50;;1545:14;;;;1573;;;;1435:1;1428:9;1388:206;;;1392:14;;;;;970:630;;;;:::o;2149:440::-;;2250:3;2243:4;2235:6;2231:17;2227:27;2217:2;;-1:-1;;2258:12;2217:2;2305:6;2292:20;43252:18;43244:6;43241:30;43238:2;;;-1:-1;;43274:12;43238:2;2327:64;43347:9;43328:17;;-1:-1;;43324:33;43415:4;43405:15;2327:64;:::i;:::-;2318:73;;2411:6;2404:5;2397:21;2515:3;43415:4;2506:6;2439;2497:16;;2494:25;2491:2;;;2532:1;;2522:12;2491:2;46697:6;43415:4;2439:6;2435:17;43415:4;2473:5;2469:16;46674:30;46753:1;46735:16;;;43415:4;46735:16;46728:27;2473:5;2210:379;-1:-1;;2210:379::o;3436:241::-;;3540:2;3528:9;3519:7;3515:23;3511:32;3508:2;;;-1:-1;;3546:12;3508:2;85:6;72:20;97:33;124:5;97:33;:::i;3684:366::-;;;3805:2;3793:9;3784:7;3780:23;3776:32;3773:2;;;-1:-1;;3811:12;3773:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3863:63;-1:-1;3963:2;4002:22;;72:20;97:33;72:20;97:33;:::i;:::-;3971:63;;;;3767:283;;;;;:::o;4057:1119::-;;;;;;4288:3;4276:9;4267:7;4263:23;4259:33;4256:2;;;-1:-1;;4295:12;4256:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4347:63;-1:-1;4447:2;4486:22;;72:20;97:33;72:20;97:33;:::i;:::-;4455:63;-1:-1;4583:2;4568:18;;4555:32;4607:18;4596:30;;;4593:2;;;-1:-1;;4629:12;4593:2;4659:78;4729:7;4720:6;4709:9;4705:22;4659:78;:::i;:::-;4649:88;;4802:2;4791:9;4787:18;4774:32;4760:46;;4607:18;4818:6;4815:30;4812:2;;;-1:-1;;4848:12;4812:2;4878:78;4948:7;4939:6;4928:9;4924:22;4878:78;:::i;:::-;4868:88;;5021:3;5010:9;5006:19;4993:33;4979:47;;4607:18;5038:6;5035:30;5032:2;;;-1:-1;;5068:12;5032:2;;5098:62;5152:7;5143:6;5132:9;5128:22;5098:62;:::i;:::-;5088:72;;;4250:926;;;;;;;;:::o;5183:847::-;;;;;;5364:3;5352:9;5343:7;5339:23;5335:33;5332:2;;;-1:-1;;5371:12;5332:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5423:63;-1:-1;5523:2;5562:22;;72:20;97:33;72:20;97:33;:::i;:::-;5531:63;-1:-1;5631:2;5670:22;;3225:20;;-1:-1;5739:2;5778:22;;3225:20;;-1:-1;5875:3;5860:19;;5847:33;5900:18;5889:30;;5886:2;;;-1:-1;;5922:12;5886:2;5952:62;6006:7;5997:6;5986:9;5982:22;5952:62;:::i;6037:763::-;;;;6225:2;6213:9;6204:7;6200:23;6196:32;6193:2;;;-1:-1;;6231:12;6193:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6283:63;-1:-1;6411:2;6396:18;;6383:32;6435:18;6424:30;;;6421:2;;;-1:-1;;6457:12;6421:2;6487:78;6557:7;6548:6;6537:9;6533:22;6487:78;:::i;:::-;6477:88;;6630:2;6619:9;6615:18;6602:32;6588:46;;6435:18;6646:6;6643:30;6640:2;;;-1:-1;;6676:12;6640:2;;6706:78;6776:7;6767:6;6756:9;6752:22;6706:78;:::i;:::-;6696:88;;;6187:613;;;;;:::o;6807:360::-;;;6925:2;6913:9;6904:7;6900:23;6896:32;6893:2;;;-1:-1;;6931:12;6893:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6983:63;-1:-1;7083:2;7119:22;;1672:20;1697:30;1672:20;1697:30;:::i;7174:366::-;;;7295:2;7283:9;7274:7;7270:23;7266:32;7263:2;;;-1:-1;;7301:12;7263:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7353:63;7453:2;7492:22;;;;3225:20;;-1:-1;;;7257:283::o;7547:491::-;;;;7685:2;7673:9;7664:7;7660:23;7656:32;7653:2;;;-1:-1;;7691:12;7653:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7743:63;7843:2;7882:22;;3225:20;;-1:-1;7951:2;7990:22;;;3225:20;;7647:391;-1:-1;;;7647:391::o;8045:638::-;;;8216:2;8204:9;8195:7;8191:23;8187:32;8184:2;;;-1:-1;;8222:12;8184:2;8280:17;8267:31;8318:18;;8310:6;8307:30;8304:2;;;-1:-1;;8340:12;8304:2;8431:6;8420:9;8416:22;;;277:3;270:4;262:6;258:17;254:27;244:2;;-1:-1;;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;:::i;354:80::-;440:16;476:6;469:5;462:21;506:4;;523:3;519:14;512:21;;506:4;498:6;494:17;628:3;506:4;;612:6;608:17;498:6;599:27;;596:36;593:2;;;-1:-1;;635:12;593:2;-1:-1;661:10;;655:206;680:6;677:1;674:13;655:206;;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;748:50;;702:1;695:9;;;;;812:14;;;;840;;655:206;;;-1:-1;8360:88;;-1:-1;8498:18;;8485:32;;-1:-1;;;8526:30;;;8523:2;;;-1:-1;;8559:12;8523:2;;8589:78;8659:7;8650:6;8639:9;8635:22;8589:78;:::i;:::-;8579:88;;;8178:505;;;;;:::o;8690:257::-;;8802:2;8790:9;8781:7;8777:23;8773:32;8770:2;;;-1:-1;;8808:12;8770:2;1820:6;1814:13;1832:30;1856:5;1832:30;:::i;8954:239::-;;9057:2;9045:9;9036:7;9032:23;9028:32;9025:2;;;-1:-1;;9063:12;9025:2;1953:6;1940:20;1965:32;1991:5;1965:32;:::i;9200:261::-;;9314:2;9302:9;9293:7;9289:23;9285:32;9282:2;;;-1:-1;;9320:12;9282:2;2092:6;2086:13;2104:32;2130:5;2104:32;:::i;9780:367::-;;;9904:2;9892:9;9883:7;9879:23;9875:32;9872:2;;;-1:-1;;9910:12;9872:2;9968:17;9955:31;10006:18;;9998:6;9995:30;9992:2;;;-1:-1;;10028:12;9992:2;10114:6;10103:9;10099:22;;;2928:3;2921:4;2913:6;2909:17;2905:27;2895:2;;-1:-1;;2936:12;2895:2;2979:6;2966:20;10006:18;2998:6;2995:30;2992:2;;;-1:-1;;3028:12;2992:2;3123:3;9904:2;3103:17;3064:6;3089:32;;3086:41;3083:2;;;-1:-1;;3130:12;3083:2;9904;3060:17;;;;;10048:83;;-1:-1;9866:281;;-1:-1;;;;9866:281::o;10154:241::-;;10258:2;10246:9;10237:7;10233:23;10229:32;10226:2;;;-1:-1;;10264:12;10226:2;-1:-1;3225:20;;10220:175;-1:-1;10220:175::o;10402:263::-;;10517:2;10505:9;10496:7;10492:23;10488:32;10485:2;;;-1:-1;;10523:12;10485:2;-1:-1;3373:13;;10479:186;-1:-1;10479:186::o;11345:690::-;;11538:5;43698:12;44242:6;44237:3;44230:19;44279:4;;44274:3;44270:14;11550:93;;44279:4;11714:5;43552:14;-1:-1;11753:260;11778:6;11775:1;11772:13;11753:260;;;11839:13;;24203:37;;10826:14;;;;44085;;;;11800:1;11793:9;11753:260;;;-1:-1;12019:10;;11469:566;-1:-1;;;;;11469:566::o;12154:343::-;;12296:5;43698:12;44242:6;44237:3;44230:19;-1:-1;46842:101;46856:6;46853:1;46850:13;46842:101;;;44279:4;46923:11;;;;;46917:18;46904:11;;;;;46897:39;46871:10;46842:101;;;46958:6;46955:1;46952:13;46949:2;;;-1:-1;44279:4;47014:6;44274:3;47005:16;;46998:27;46949:2;-1:-1;43347:9;47401:14;-1:-1;;47397:28;12453:39;;;;44279:4;12453:39;;12244:253;-1:-1;;12244:253::o;24531:285::-;47512:2;47508:14;;;;-1:-1;;47508:14;11108:74;;24788:2;24779:12;;24663:153::o;25211:253::-;24203:37;;;25436:2;25427:12;;25327:137::o;25471:222::-;-1:-1;;;;;45434:54;;;;11265:37;;25598:2;25583:18;;25569:124::o;25945:349::-;-1:-1;;;;;45434:54;;;;10933:58;;26280:2;26265:18;;24203:37;26108:2;26093:18;;26079:215::o;26301:1048::-;-1:-1;;;;;45434:54;;;11265:37;;45434:54;;26823:2;26808:18;;11265:37;47508:14;26860:2;26845:18;;26838:48;;;26301:1048;;26900:108;;26643:19;;26994:6;26900:108;:::i;:::-;27056:9;27050:4;27046:20;27041:2;27030:9;27026:18;27019:48;27081:108;27184:4;27175:6;27081:108;:::i;:::-;27073:116;;27238:9;27232:4;27228:20;27222:3;27211:9;27207:19;27200:49;27263:76;27334:4;27325:6;27263:76;:::i;:::-;27255:84;26629:720;-1:-1;;;;;;;;26629:720::o;27356:752::-;-1:-1;;;;;45434:54;;;11265:37;;45434:54;;27778:2;27763:18;;11265:37;27861:2;27846:18;;24203:37;;;27944:2;27929:18;;24203:37;;;47508:14;27981:3;27966:19;;27959:49;;;27356:752;;28022:76;;27598:19;;28084:6;28022:76;:::i;:::-;28014:84;27584:524;-1:-1;;;;;;;27584:524::o;28115:370::-;;28292:2;28313:17;28306:47;28367:108;28292:2;28281:9;28277:18;28461:6;28367:108;:::i;28492:629::-;;28747:2;28768:17;28761:47;28822:108;28747:2;28736:9;28732:18;28916:6;28822:108;:::i;:::-;28978:9;28972:4;28968:20;28963:2;28952:9;28948:18;28941:48;29003:108;29106:4;29097:6;29003:108;:::i;:::-;28995:116;28718:403;-1:-1;;;;;28718:403::o;29128:210::-;45065:13;;45058:21;12108:34;;29249:2;29234:18;;29220:118::o;29917:310::-;;30064:2;30085:17;30078:47;30139:78;30064:2;30053:9;30049:18;30203:6;30139:78;:::i;30234:416::-;30434:2;30448:47;;;13463:2;30419:18;;;44230:19;13499:34;44270:14;;;13479:55;-1:-1;;;13554:12;;;13547:44;13610:12;;;30405:245::o;30657:416::-;30857:2;30871:47;;;13861:2;30842:18;;;44230:19;13897:34;44270:14;;;13877:55;-1:-1;;;13952:12;;;13945:32;13996:12;;;30828:245::o;31080:416::-;31280:2;31294:47;;;14247:2;31265:18;;;44230:19;14283:34;44270:14;;;14263:55;-1:-1;;;14338:12;;;14331:46;14396:12;;;31251:245::o;31503:416::-;31703:2;31717:47;;;14647:2;31688:18;;;44230:19;14683:34;44270:14;;;14663:55;-1:-1;;;14738:12;;;14731:42;14792:12;;;31674:245::o;31926:416::-;32126:2;32140:47;;;15043:2;32111:18;;;44230:19;-1:-1;;;44270:14;;;15059:38;15116:12;;;32097:245::o;32349:416::-;32549:2;32563:47;;;15367:2;32534:18;;;44230:19;15403:34;44270:14;;;15383:55;-1:-1;;;15458:12;;;15451:35;15505:12;;;32520:245::o;32772:416::-;32972:2;32986:47;;;15756:2;32957:18;;;44230:19;15792:34;44270:14;;;15772:55;-1:-1;;;15847:12;;;15840:41;15900:12;;;32943:245::o;33195:416::-;33395:2;33409:47;;;16151:2;33380:18;;;44230:19;-1:-1;;;44270:14;;;16167:38;16224:12;;;33366:245::o;33618:416::-;33818:2;33832:47;;;16475:2;33803:18;;;44230:19;16511:29;44270:14;;;16491:50;16560:12;;;33789:245::o;34041:416::-;34241:2;34255:47;;;16811:2;34226:18;;;44230:19;16847:34;44270:14;;;16827:55;16916:34;16902:12;;;16895:56;-1:-1;;;16971:12;;;16964:25;17008:12;;;34212:245::o;34464:416::-;34664:2;34678:47;;;17259:2;34649:18;;;44230:19;17295:34;44270:14;;;17275:55;-1:-1;;;17350:12;;;17343:33;17395:12;;;34635:245::o;34887:416::-;35087:2;35101:47;;;17646:2;35072:18;;;44230:19;17682:34;44270:14;;;17662:55;17751:34;17737:12;;;17730:56;-1:-1;;;17806:12;;;17799:34;17852:12;;;35058:245::o;35310:416::-;35510:2;35524:47;;;18103:2;35495:18;;;44230:19;18139:34;44270:14;;;18119:55;-1:-1;;;18194:12;;;18187:45;18251:12;;;35481:245::o;35733:416::-;35933:2;35947:47;;;18502:2;35918:18;;;44230:19;18538:34;44270:14;;;18518:55;-1:-1;;;18593:12;;;18586:29;18634:12;;;35904:245::o;36156:416::-;36356:2;36370:47;;;18885:2;36341:18;;;44230:19;18921:34;44270:14;;;18901:55;18990:34;18976:12;;;18969:56;19059:25;19045:12;;;19038:47;19104:12;;;36327:245::o;36579:416::-;36779:2;36793:47;;;19355:2;36764:18;;;44230:19;19391:34;44270:14;;;19371:55;-1:-1;;;19446:12;;;19439:42;19500:12;;;36750:245::o;37002:416::-;37202:2;37216:47;;;19751:2;37187:18;;;44230:19;19787:34;44270:14;;;19767:55;-1:-1;;;19842:12;;;19835:27;19881:12;;;37173:245::o;37425:416::-;37625:2;37639:47;;;20132:2;37610:18;;;44230:19;20168:34;44270:14;;;20148:55;20237:34;20223:12;;;20216:56;-1:-1;;;20292:12;;;20285:42;20346:12;;;37596:245::o;37848:416::-;38048:2;38062:47;;;20597:2;38033:18;;;44230:19;20633:34;44270:14;;;20613:55;20702:25;20688:12;;;20681:47;20747:12;;;38019:245::o;38271:416::-;38471:2;38485:47;;;20998:2;38456:18;;;44230:19;21034:34;44270:14;;;21014:55;-1:-1;;;21089:12;;;21082:25;21126:12;;;38442:245::o;38694:416::-;38894:2;38908:47;;;21377:2;38879:18;;;44230:19;21413:34;44270:14;;;21393:55;21482:27;21468:12;;;21461:49;21529:12;;;38865:245::o;39117:416::-;39317:2;39331:47;;;21780:2;39302:18;;;44230:19;21816:30;44270:14;;;21796:51;21866:12;;;39288:245::o;39540:416::-;39740:2;39754:47;;;22424:2;39725:18;;;44230:19;22460:34;44270:14;;;22440:55;-1:-1;;;22515:12;;;22508:33;22560:12;;;39711:245::o;39963:416::-;40163:2;40177:47;;;22811:2;40148:18;;;44230:19;22847:34;44270:14;;;22827:55;-1:-1;;;22902:12;;;22895:33;22947:12;;;40134:245::o;40386:416::-;40586:2;40600:47;;;23198:2;40571:18;;;44230:19;23234:34;44270:14;;;23214:55;23303:28;23289:12;;;23282:50;23351:12;;;40557:245::o;40809:416::-;41009:2;41023:47;;;23602:2;40994:18;;;44230:19;23638:34;44270:14;;;23618:55;-1:-1;;;23693:12;;;23686:32;23737:12;;;40980:245::o;41232:416::-;41432:2;41446:47;;;23988:2;41417:18;;;44230:19;24024:34;44270:14;;;24004:55;-1:-1;;;24079:12;;;24072:25;24116:12;;;41403:245::o;41884:333::-;24203:37;;;42203:2;42188:18;;24203:37;42039:2;42024:18;;42010:207::o;42224:256::-;42286:2;42280:9;42312:17;;;42387:18;42372:34;;42408:22;;;42369:62;42366:2;;;42444:1;;42434:12;42366:2;42286;42453:22;42264:216;;-1:-1;42264:216::o;42487:304::-;;42646:18;42638:6;42635:30;42632:2;;;-1:-1;;42668:12;42632:2;-1:-1;42713:4;42701:17;;;42766:15;;42569:222::o;47540:106::-;47625:3;47621:15;;47593:53::o;47654:739::-;;47727:4;47709:16;47706:26;47703:2;;;47735:5;;47703:2;47769:1;-1:-1;;47748:23;47844:10;47787:34;-1:-1;47812:8;47787:34;:::i;:::-;47836:19;47826:2;;47859:5;;47826:2;47890;47884:9;47926:16;-1:-1;;47922:24;47769:1;47884:9;47898:49;47973:4;47967:11;48054:16;48006:18;48054:16;48047:4;48039:6;48035:17;48032:39;48006:18;47998:6;47995:30;47986:91;47983:2;;;48085:5;;;;;;47983:2;48123:6;48117:4;48113:17;48102:28;;48155:3;48149:10;48135:24;;48006:18;48170:6;48167:30;48164:2;;;48200:5;;;;;;48164:2;;48277:16;48271:4;48267:27;48237:4;48244:6;48232:3;48224:27;;48259:36;48256:2;;;48298:5;;;;;48256:2;43347:9;47401:14;-1:-1;;47397:28;48322:50;;48237:4;48322:50;47890:2;48311:62;48330:3;-1:-1;;47697:696;:::o;48400:117::-;-1:-1;;;;;45434:54;;48459:35;;48449:2;;48508:1;;48498:12;48524:111;48605:5;45065:13;45058:21;48583:5;48580:32;48570:2;;48626:1;;48616:12;48642:115;-1:-1;;;;;;45152:78;;48700:34;;48690:2;;48748:1;;48738:12
Swarm Source
ipfs://d659821caa7a3627b2e0467f922163f94e8c96b4e5acf2b53cfaa9fbad8065e2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.