Contract Overview
Balance:
0 ETH
ETH Value:
$0.00
My Name Tag:
Not Available
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
ParticleMinter
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2022-08-31 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // ERC721A Contracts v4.1.0 // Creator: Chiru Labs // ERC721A Contracts v4.1.0 // Creator: Chiru Labs /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @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`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); // ============================== // IERC721Metadata // ============================== /** * @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); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer( uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to ); } /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-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 { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal returns (uint256) { return _safeMint(to, quantity, ""); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal returns (uint256) { uint256 startTokenId = _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } return startTokenId; } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal returns (uint256) { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); return startTokenId; } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer( startTokenId, startTokenId + quantity - 1, address(0), to ); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); ( uint256 approvedAddressSlot, address approvedAddress ) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); ( uint256 approvedAddressSlot, address approvedAddress ) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received( _msgSenderERC721A(), from, tokenId, _data ) returns (bytes4 retval) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } interface IRealm { function balanceOf(address owner) external view returns (uint256); function ownerOf(uint256 _realmId) external view returns (address owner); function safeTransferFrom( address from, address to, uint256 tokenId ) external; function isApprovedForAll(address owner, address operator) external returns (bool); function realmFeatures(uint256 realmId, uint256 index) external view returns (uint256); } interface IData { function data(uint256 _realmId, uint256 _type) external view returns (uint256); function collect(uint256 _realmId) external; function addToBuildQueue( uint256 _realmId, uint256 _queueSlot, uint256 _hours ) external; function addGoldSupply(uint256 _realmId, uint256 _gold) external; function add( uint256 _realmId, uint256 _type, uint256 _amount ) external; function remove( uint256 _realmId, uint256 _type, uint256 _amount ) external; function addBonus( uint256 _realmId, uint256 _type, uint256 _amount ) external; function removeBonus( uint256 _realmId, uint256 _type, uint256 _amount ) external; function addDataName(uint256 _type, string memory _name) external; } interface IStructure { function data(uint256 _realmId, uint256 _type) external view returns (uint256); function add( uint256 _realmId, uint256 _type, uint256 _amount ) external; function remove( uint256 _realmId, uint256 _type, uint256 _amount ) external; } interface IAdventurerData { function initData( address[] calldata _addresses, uint256[] calldata _ids, bytes32[][] calldata _proofs, uint256[] calldata _professions, uint256[][] calldata _points ) external; function baseProperties( address _addr, uint256 _id, uint256 _start, uint256 _end ) external view returns (uint256[] memory); function aovProperties( address _addr, uint256 _id, uint256 _start, uint256 _end ) external view returns (uint256[] memory); function extensionProperties( address _addr, uint256 _id, uint256 _start, uint256 _end ) external view returns (uint256[] memory); function createFor( address _addr, uint256 _id, uint256[] calldata _points ) external; function createFor( address _addr, uint256 _id, uint256 _archetype ) external; function addToBase( address _addr, uint256 _id, uint256 _prop, uint256 _val ) external; function updateBase( address _addr, uint256 _id, uint256 _prop, uint256 _val ) external; function removeFromBase( address _addr, uint256 _id, uint256 _prop, uint256 _val ) external; function addToAov( address _addr, uint256 _id, uint256 _prop, uint256 _val ) external; function updateAov( address _addr, uint256 _id, uint256 _prop, uint256 _val ) external; function removeFromAov( address _addr, uint256 _id, uint256 _prop, uint256 _val ) external; function addToExtension( address _addr, uint256 _id, uint256 _prop, uint256 _val ) external; function updateExtension( address _addr, uint256 _id, uint256 _prop, uint256 _val ) external; function removeFromExtension( address _addr, uint256 _id, uint256 _prop, uint256 _val ) external; function base( address _addr, uint256 _id, uint256 _prop ) external view returns (uint256); function aov( address _addr, uint256 _id, uint256 _prop ) external view returns (uint256); function extension( address _addr, uint256 _id, uint256 _prop ) external view returns (uint256); } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } interface IParticle is IERC20 { function mintFor(address _for, uint256 _amount) external; } interface IParticleTracker { function timer(address _addr, uint256 _adventurerId) external view returns (uint256); function currentRealm(address _addr, uint256 _adventurerId) external view returns (uint256, bool); function getExplorerCount(uint256 _realmId) external view returns (uint256); function addExplorer( uint256 _realmId, address _addr, uint256 _adventurerId, uint256 _amount ) external; function removeExplorer( uint256 _realmId, address _addr, uint256 _adventurerId, uint256 _amount ) external; function setTimer(address _addr, uint256 _adventurerId) external; } interface IPopulation { function getPopulation(uint256 _realmId) external view returns (uint256); } interface IAdventurerGateway { function checkAddress(address _addr, bytes32[] calldata _proof) external view; } interface IManager { function isAdmin(address _addr) external view returns (bool); function isManager(address _addr, uint256 _type) external view returns (bool); function addManager(address _addr, uint256 _type) external; function removeManager(address _addr, uint256 _type) external; function addAdmin(address _addr) external; function removeAdmin(address _addr) external; } abstract contract ManagerModifier { //======================================= // Immutables //======================================= IManager public immutable MANAGER; //======================================= // Constructor //======================================= constructor(address _manager) { MANAGER = IManager(_manager); } //======================================= // Modifiers //======================================= modifier onlyAdmin() { require(MANAGER.isAdmin(msg.sender), "Manager: Not an Admin"); _; } modifier onlyManager() { require(MANAGER.isManager(msg.sender, 0), "Manager: Not manager"); _; } modifier onlyMinter() { require(MANAGER.isManager(msg.sender, 1), "Manager: Not minter"); _; } modifier onlyTokenMinter() { require(MANAGER.isManager(msg.sender, 2), "Manager: Not token minter"); _; } modifier onlyBinder() { require(MANAGER.isManager(msg.sender, 3), "Manager: Not binder"); _; } } contract ParticleMinter is ManagerModifier, ReentrancyGuard, Pausable { //======================================= // Immutables //======================================= IRealm public immutable REALM; IData public immutable DATA; IStructure public immutable STRUCTURE; IAdventurerData public immutable ADVENTURER_DATA; IParticle public immutable PARTICLE; IParticleTracker public immutable PARTICLE_TRACKER; IPopulation public immutable POPULATION; IAdventurerGateway public immutable GATEWAY; //======================================= // Uints //======================================= uint256 public adventurerBaseParticle; uint256 public realmerBaseParticle; uint256 public professionBonus; uint256 public maxCaptureTime; uint256 public explorerWeight; //======================================= // Events //======================================= event Init(uint256 realmId, address addr, uint256 adventurerId); event Captured( uint256 realmId, address addr, uint256 adventurerId, uint256 adventurerParticles, uint256 realmerParticles ); //======================================= // Constructor //======================================= constructor( address _realm, address _manager, address _data, address _structure, address _adventurerData, address _particle, address _tracker, address _population, address _gateway, uint256 _adventurerBaseParticle, uint256 _realmerBaseParticle, uint256 _professionBonus ) ManagerModifier(_manager) { REALM = IRealm(_realm); DATA = IData(_data); STRUCTURE = IStructure(_structure); ADVENTURER_DATA = IAdventurerData(_adventurerData); PARTICLE = IParticle(_particle); PARTICLE_TRACKER = IParticleTracker(_tracker); POPULATION = IPopulation(_population); GATEWAY = IAdventurerGateway(_gateway); adventurerBaseParticle = _adventurerBaseParticle; realmerBaseParticle = _realmerBaseParticle; professionBonus = _professionBonus; maxCaptureTime = 3600 * 24 * 7; explorerWeight = 10; } //======================================= // External //======================================= function init( uint256[] calldata _realmIds, address[] calldata _addresses, uint256[] calldata _adventurerIds, bytes32[][] calldata _proofs ) external nonReentrant whenNotPaused { for (uint256 j = 0; j < _adventurerIds.length; j++) { uint256 realmId = _realmIds[j]; address addr = _addresses[j]; uint256 adventurerId = _adventurerIds[j]; // Get current realm exploring (, bool isRealmSet) = PARTICLE_TRACKER.currentRealm(addr, adventurerId); // Check current realm has not been set require(!isRealmSet, "ParticleMinter: You are already exploring"); // Check validity of address _checkAddress(addr, _proofs[j]); // Check sender owns adventurer require( ERC721A(addr).ownerOf(adventurerId) == msg.sender, "ParticleMinter: You do not own Adventurer" ); // Check realm exists REALM.ownerOf(realmId); // Check if realm has enough population _checkPopulation(realmId); // Set timer PARTICLE_TRACKER.setTimer(addr, adventurerId); // Add explorer PARTICLE_TRACKER.addExplorer(realmId, addr, adventurerId, explorerWeight); emit Init(realmId, addr, adventurerId); } } function capture( address[] calldata _addresses, uint256[] calldata _adventurerIds, bytes32[][] calldata _proofs ) external nonReentrant whenNotPaused { for (uint256 j = 0; j < _adventurerIds.length; j++) { address addr = _addresses[j]; uint256 adventurerId = _adventurerIds[j]; // Check validity of address _checkAddress(addr, _proofs[j]); // Capture _capture(addr, adventurerId); } } // With realmIds function capture( address[] calldata _addresses, uint256[] calldata _adventurerIds, bytes32[][] calldata _proofs, uint256[] calldata _realmIds ) external nonReentrant whenNotPaused { for (uint256 j = 0; j < _adventurerIds.length; j++) { uint256 realmId = _realmIds[j]; address addr = _addresses[j]; uint256 adventurerId = _adventurerIds[j]; // Check validity of address _checkAddress(addr, _proofs[j]); // Capture uint256 currentRealm = _capture(addr, adventurerId); // Check if realm has enough population _checkPopulation(realmId); // Remove explorer PARTICLE_TRACKER.removeExplorer( currentRealm, addr, adventurerId, explorerWeight ); // Add explorer PARTICLE_TRACKER.addExplorer(realmId, addr, adventurerId, explorerWeight); } } function getElapsedTime(address _addr, uint256 _adventurerId) external view returns (uint256) { return _elapsedTime(_addr, _adventurerId); } function particlesAccumulatedForRealmer( uint256 _realmId, address _addr, uint256 _adventurerId ) external view returns (uint256) { return _totalParticlesForRealmer(_realmId, _addr, _adventurerId); } function particlesAccumulatedForAdventurer( address _addr, uint256 _adventurerId ) external view returns (uint256) { return _totalParticlesForAdventurer(_addr, _adventurerId); } //======================================= // Admin //======================================= function pause() external onlyAdmin { _pause(); } function unpause() external onlyAdmin { _unpause(); } function updateAdventurerBaseParticle(uint256 _value) external onlyAdmin { adventurerBaseParticle = _value; } function updateRealmerBaseParticle(uint256 _value) external onlyAdmin { realmerBaseParticle = _value; } function updateProfessionBonus(uint256 _value) external onlyAdmin { professionBonus = _value; } function updateMaxCaptureTime(uint256 _value) external onlyAdmin { maxCaptureTime = _value; } function updateExplorerWeight(uint256 _value) external onlyAdmin { explorerWeight = _value; } //======================================= // Internal //======================================= function _capture(address _addr, uint256 _adventurerId) internal returns (uint256) { // Check sender owns adventurer require( ERC721A(_addr).ownerOf(_adventurerId) == msg.sender, "ParticleMinter: You do not own Adventurer" ); // Get current realm exploring (uint256 currentRealm, bool isRealmSet) = PARTICLE_TRACKER.currentRealm( _addr, _adventurerId ); // Check current realm has been set require( isRealmSet, "ParticleMinter: You must choose a realm to explore first" ); // Get total particles for adventurer uint256 adventurerParticles = _totalParticlesForAdventurer( _addr, _adventurerId ); // Mint particles for Adventurer PARTICLE.mintFor(msg.sender, adventurerParticles); // Get total particles for realmer uint256 realmerParticles = _totalParticlesForRealmer( currentRealm, _addr, _adventurerId ); // Mint particles for Realmer PARTICLE.mintFor(_realmOwner(currentRealm), realmerParticles); // Set timer PARTICLE_TRACKER.setTimer(_addr, _adventurerId); emit Captured( currentRealm, _addr, _adventurerId, adventurerParticles, realmerParticles ); return currentRealm; } function _totalResources(uint256 _realmId) internal view returns (uint256) { uint256 total = DATA.data(_realmId, 0) + DATA.data(_realmId, 1) + DATA.data(_realmId, 3) + DATA.data(_realmId, 5) + STRUCTURE.data(_realmId, 0) + STRUCTURE.data(_realmId, 1) + STRUCTURE.data(_realmId, 2) + STRUCTURE.data(_realmId, 3); // Check if total is zero, default returned should be 1 if (total == 0) return 1; return total; } function _getAdventurerData(address _addr, uint256 _adventurerId) internal view returns (uint256[] memory) { // Make sure these slots didn't change return ADVENTURER_DATA.aovProperties(_addr, _adventurerId, 0, 3); } function _totalParticlesForAdventurer(address _addr, uint256 _adventurerId) internal view returns (uint256) { uint256 particles = adventurerBaseParticle; // Retrieve adventurer data uint256[] memory properties = _getAdventurerData(_addr, _adventurerId); // Check if profession is Explorer if (properties[3] == 1) { particles += professionBonus; } return _elapsedTime(_addr, _adventurerId) * (particles / 24 / 60 / 60); } function _totalParticlesForRealmer( uint256 _realmId, address _addr, uint256 _adventurerId ) internal view returns (uint256) { uint256 particlesPerSecond = (realmerBaseParticle * _totalResources(_realmId)) / 24 / 60 / 60; return _elapsedTime(_addr, _adventurerId) * particlesPerSecond; } function _elapsedTime(address _addr, uint256 _adventurerId) internal view returns (uint256) { // Calculate elapsed time uint256 elapsedTime = block.timestamp - PARTICLE_TRACKER.timer(_addr, _adventurerId); // Check elapsed time is less than max capture time if (elapsedTime > maxCaptureTime) { return maxCaptureTime; } return elapsedTime; } function _realmOwner(uint256 _realmId) internal view returns (address) { return REALM.ownerOf(_realmId); } function _checkPopulation(uint256 _realmId) internal view { require( PARTICLE_TRACKER.getExplorerCount(_realmId) < POPULATION.getPopulation(_realmId), "ParticleMinter: Max Realm population reached" ); } function _checkAddress(address _addr, bytes32[] calldata _proof) internal view { // Verify address GATEWAY.checkAddress(_addr, _proof); } }
[{"inputs":[{"internalType":"address","name":"_realm","type":"address"},{"internalType":"address","name":"_manager","type":"address"},{"internalType":"address","name":"_data","type":"address"},{"internalType":"address","name":"_structure","type":"address"},{"internalType":"address","name":"_adventurerData","type":"address"},{"internalType":"address","name":"_particle","type":"address"},{"internalType":"address","name":"_tracker","type":"address"},{"internalType":"address","name":"_population","type":"address"},{"internalType":"address","name":"_gateway","type":"address"},{"internalType":"uint256","name":"_adventurerBaseParticle","type":"uint256"},{"internalType":"uint256","name":"_realmerBaseParticle","type":"uint256"},{"internalType":"uint256","name":"_professionBonus","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"realmId","type":"uint256"},{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"adventurerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adventurerParticles","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"realmerParticles","type":"uint256"}],"name":"Captured","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"realmId","type":"uint256"},{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"adventurerId","type":"uint256"}],"name":"Init","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ADVENTURER_DATA","outputs":[{"internalType":"contract IAdventurerData","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DATA","outputs":[{"internalType":"contract IData","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GATEWAY","outputs":[{"internalType":"contract IAdventurerGateway","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER","outputs":[{"internalType":"contract IManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PARTICLE","outputs":[{"internalType":"contract IParticle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PARTICLE_TRACKER","outputs":[{"internalType":"contract IParticleTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POPULATION","outputs":[{"internalType":"contract IPopulation","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REALM","outputs":[{"internalType":"contract IRealm","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STRUCTURE","outputs":[{"internalType":"contract IStructure","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adventurerBaseParticle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_adventurerIds","type":"uint256[]"},{"internalType":"bytes32[][]","name":"_proofs","type":"bytes32[][]"},{"internalType":"uint256[]","name":"_realmIds","type":"uint256[]"}],"name":"capture","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_adventurerIds","type":"uint256[]"},{"internalType":"bytes32[][]","name":"_proofs","type":"bytes32[][]"}],"name":"capture","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"explorerWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_adventurerId","type":"uint256"}],"name":"getElapsedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_realmIds","type":"uint256[]"},{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_adventurerIds","type":"uint256[]"},{"internalType":"bytes32[][]","name":"_proofs","type":"bytes32[][]"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxCaptureTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_adventurerId","type":"uint256"}],"name":"particlesAccumulatedForAdventurer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_realmId","type":"uint256"},{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_adventurerId","type":"uint256"}],"name":"particlesAccumulatedForRealmer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"professionBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"realmerBaseParticle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"updateAdventurerBaseParticle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"updateExplorerWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"updateMaxCaptureTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"updateProfessionBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"updateRealmerBaseParticle","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101a06040523480156200001257600080fd5b5060405162002a9338038062002a938339810160408190526200003591620000da565b6001600160601b031960609b8c1b811660805260016000819055805460ff191690559b8b1b8c1660a052988a1b8b1660c05296891b8a1660e05294881b89166101005292871b88166101205290861b871661014052851b86166101605290931b9093166101805260029190915560039190915560045562093a80600555600a600655620001b3565b80516001600160a01b0381168114620000d557600080fd5b919050565b6000806000806000806000806000806000806101808d8f031215620000fd578788fd5b620001088d620000bd565b9b506200011860208e01620000bd565b9a506200012860408e01620000bd565b99506200013860608e01620000bd565b98506200014860808e01620000bd565b97506200015860a08e01620000bd565b96506200016860c08e01620000bd565b95506200017860e08e01620000bd565b9450620001896101008e01620000bd565b93506101208d015192506101408d015191506101608d015190509295989b509295989b509295989b565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160601c6101405160601c6101605160601c6101805160601c61277b62000318600039600081816102e301526113090152600081816101ce01526117660152600081816103d1015281816106a30152818161073701528181610b7d01528181610e1b01528181610ead01528181611212015281816114450152818161168f01526117fe0152600081816103f80152818161156001526115d50152600081816104570152611b2001526000818161029601528181611c1301528181611caa01528181611d490152611de801526000818161024801528181611e8701528181611f2601528181611fc5015261206401526000818161037d01528181610d690152611a6701526000818161026f015281816104a3015281816107d3015281816108970152818161095401528181610a0c01528181610f83015261112f015261277b6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806361e6fbfe116100f9578063b74c6f7611610097578063e0ee20c011610071578063e0ee20c01461042d578063eaf094da14610440578063eb4de3c414610449578063fcac08921461045257600080fd5b8063b74c6f76146103cc578063c1a71c08146103f3578063da52aafe1461041a57600080fd5b80638456cb59116100d35780638456cb591461039f5780638f84cee5146103a7578063aa5b9000146103ba578063b4570dba146103c357600080fd5b806361e6fbfe1461035c578063656c9b621461036557806379604a171461037857600080fd5b80632c280bd3116101665780633f4ba83a116101405780633f4ba83a14610318578063453f2e5a14610320578063476513fb146103335780635c975abb1461034657600080fd5b80632c280bd3146102cb578063338c5371146102de57806333a878eb1461030557600080fd5b80630c0fd886116101a25780630c0fd886146102435780631b2df8501461026a5780631b62a26b1461029157806321712c73146102b857600080fd5b8063063c1f2f146101c957806306c37c571461020d5780630bd9449b1461022e575b600080fd5b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61022061021b3660046121d3565b610479565b604051908152602001610204565b61024161023c3660046124a7565b61048e565b005b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b6102416102c6366004612294565b61054f565b6102416102d93660046124a7565b6107be565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b6102206103133660046121d3565b610876565b610241610882565b61024161032e3660046124a7565b61093f565b6102416103413660046124a7565b6109f7565b60015460ff166040519015158152602001610204565b61022060065481565b610241610373366004612353565b610aaf565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b610241610f6e565b6102416103b53660046121fe565b611029565b61022060045481565b61022060025481565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b6102416104283660046124a7565b61111a565b61022061043b3660046124d7565b6111d2565b61022060035481565b61022060055481565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b600061048583836111e7565b90505b92915050565b604051630935e01b60e21b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906324d7806c9060240160206040518083038186803b1580156104ed57600080fd5b505afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610525919061248d565b61054a5760405162461bcd60e51b815260040161054190612604565b60405180910390fd5b600555565b600260005414156105725760405162461bcd60e51b8152600401610541906125cd565b600260005561057f6112ac565b60005b858110156107ae5760008383838181106105ac57634e487b7160e01b600052603260045260246000fd5b90506020020135905060008a8a848181106105d757634e487b7160e01b600052603260045260246000fd5b90506020020160208101906105ec919061219b565b9050600089898581811061061057634e487b7160e01b600052603260045260246000fd5b9050602002013590506106548289898781811061063d57634e487b7160e01b600052603260045260246000fd5b905060200281019061064f9190612633565b6112f2565b60006106608383611377565b905061066b84611750565b600654604051638b5e6a1b60e01b8152600481018390526001600160a01b0385811660248301526044820185905260648201929092527f000000000000000000000000000000000000000000000000000000000000000090911690638b5e6a1b90608401600060405180830381600087803b1580156106e957600080fd5b505af11580156106fd573d6000803e3d6000fd5b50506006546040516322a1955f60e11b8152600481018890526001600160a01b0387811660248301526044820187905260648201929092527f000000000000000000000000000000000000000000000000000000000000000090911692506345432abe9150608401600060405180830381600087803b15801561077f57600080fd5b505af1158015610793573d6000803e3d6000fd5b505050505050505080806107a6906126e9565b915050610582565b5050600160005550505050505050565b604051630935e01b60e21b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906324d7806c9060240160206040518083038186803b15801561081d57600080fd5b505afa158015610831573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610855919061248d565b6108715760405162461bcd60e51b815260040161054190612604565b600255565b600061048583836118e5565b604051630935e01b60e21b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906324d7806c9060240160206040518083038186803b1580156108e157600080fd5b505afa1580156108f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610919919061248d565b6109355760405162461bcd60e51b815260040161054190612604565b61093d611978565b565b604051630935e01b60e21b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906324d7806c9060240160206040518083038186803b15801561099e57600080fd5b505afa1580156109b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d6919061248d565b6109f25760405162461bcd60e51b815260040161054190612604565b600455565b604051630935e01b60e21b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906324d7806c9060240160206040518083038186803b158015610a5657600080fd5b505afa158015610a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8e919061248d565b610aaa5760405162461bcd60e51b815260040161054190612604565b600655565b60026000541415610ad25760405162461bcd60e51b8152600401610541906125cd565b6002600055610adf6112ac565b60005b838110156107ae576000898983818110610b0c57634e487b7160e01b600052603260045260246000fd5b9050602002013590506000888884818110610b3757634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610b4c919061219b565b90506000878785818110610b7057634e487b7160e01b600052603260045260246000fd5b90506020020135905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639928c11184846040518363ffffffff1660e01b8152600401610bdd9291906001600160a01b03929092168252602082015260400190565b604080518083038186803b158015610bf457600080fd5b505afa158015610c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2c919061250e565b9150508015610c8f5760405162461bcd60e51b815260206004820152602960248201527f5061727469636c654d696e7465723a20596f752061726520616c7265616479206044820152686578706c6f72696e6760b81b6064820152608401610541565b610cb38388888881811061063d57634e487b7160e01b600052603260045260246000fd5b6040516331a9108f60e11b81526004810183905233906001600160a01b03851690636352211e9060240160206040518083038186803b158015610cf557600080fd5b505afa158015610d09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2d91906121b7565b6001600160a01b031614610d535760405162461bcd60e51b815260040161054190612584565b6040516331a9108f60e11b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e9060240160206040518083038186803b158015610db357600080fd5b505afa158015610dc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610deb91906121b7565b50610df584611750565b6040516306bd653160e21b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000001690631af594c490604401600060405180830381600087803b158015610e5f57600080fd5b505af1158015610e73573d6000803e3d6000fd5b50506006546040516322a1955f60e11b8152600481018890526001600160a01b0387811660248301526044820187905260648201929092527f000000000000000000000000000000000000000000000000000000000000000090911692506345432abe9150608401600060405180830381600087803b158015610ef557600080fd5b505af1158015610f09573d6000803e3d6000fd5b5050604080518781526001600160a01b03871660208201529081018590527f2327f5bf59b14c582eb64204b9ff63fc97b98dfd6e660acc6e5de7bb5f1160c39250606001905060405180910390a1505050508080610f66906126e9565b915050610ae2565b604051630935e01b60e21b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906324d7806c9060240160206040518083038186803b158015610fcd57600080fd5b505afa158015610fe1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611005919061248d565b6110215760405162461bcd60e51b815260040161054190612604565b61093d6119ca565b6002600054141561104c5760405162461bcd60e51b8152600401610541906125cd565b60026000556110596112ac565b60005b8381101561110c57600087878381811061108657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061109b919061219b565b905060008686848181106110bf57634e487b7160e01b600052603260045260246000fd5b9050602002013590506110ec8286868681811061063d57634e487b7160e01b600052603260045260246000fd5b6110f68282611377565b5050508080611104906126e9565b91505061105c565b505060016000555050505050565b604051630935e01b60e21b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906324d7806c9060240160206040518083038186803b15801561117957600080fd5b505afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b1919061248d565b6111cd5760405162461bcd60e51b815260040161054190612604565b600355565b60006111df848484611a05565b949350505050565b60405163d64f83f960e01b81526001600160a01b0383811660048301526024820183905260009182917f0000000000000000000000000000000000000000000000000000000000000000169063d64f83f99060440160206040518083038186803b15801561125457600080fd5b505afa158015611268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128c91906124bf565b61129690426126d2565b9050600554811115610485575050600554610488565b60015460ff161561093d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610541565b6040516320be298160e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063417c53029061134290869086908690600401612539565b60006040518083038186803b15801561135a57600080fd5b505afa15801561136e573d6000803e3d6000fd5b50505050505050565b6040516331a9108f60e11b81526004810182905260009033906001600160a01b03851690636352211e9060240160206040518083038186803b1580156113bc57600080fd5b505afa1580156113d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f491906121b7565b6001600160a01b03161461141a5760405162461bcd60e51b815260040161054190612584565b604051639928c11160e01b81526001600160a01b0384811660048301526024820184905260009182917f00000000000000000000000000000000000000000000000000000000000000001690639928c11190604401604080518083038186803b15801561148657600080fd5b505afa15801561149a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114be919061250e565b91509150806115355760405162461bcd60e51b815260206004820152603860248201527f5061727469636c654d696e7465723a20596f75206d7573742063686f6f73652060448201527f61207265616c6d20746f206578706c6f726520666972737400000000000000006064820152608401610541565b600061154186866118e5565b60405163da1919b360e01b8152336004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063da1919b390604401600060405180830381600087803b1580156115ac57600080fd5b505af11580156115c0573d6000803e3d6000fd5b5050505060006115d1848888611a05565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663da1919b361160b86611a4e565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b15801561165357600080fd5b505af1158015611667573d6000803e3d6000fd5b50506040516306bd653160e21b81526001600160a01b038a81166004830152602482018a90527f0000000000000000000000000000000000000000000000000000000000000000169250631af594c49150604401600060405180830381600087803b1580156116d557600080fd5b505af11580156116e9573d6000803e3d6000fd5b5050604080518781526001600160a01b038b16602082015290810189905260608101859052608081018490527f7e9234980f69e2814f45bf433e66a0e95f02697ad3675a6aa7a793e2c1450c75925060a001905060405180910390a1509195945050505050565b604051631634a51d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631634a51d9060240160206040518083038186803b1580156117b057600080fd5b505afa1580156117c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e891906124bf565b6040516308c2855d60e21b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063230a15749060240160206040518083038186803b15801561184857600080fd5b505afa15801561185c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188091906124bf565b106118e25760405162461bcd60e51b815260206004820152602c60248201527f5061727469636c654d696e7465723a204d6178205265616c6d20706f70756c6160448201526b1d1a5bdb881c995858da195960a21b6064820152608401610541565b50565b600254600090816118f68585611ae9565b90508060038151811061191957634e487b7160e01b600052603260045260246000fd5b60200260200101516001141561193957600454611936908361267b565b91505b603c80611947601885612693565b6119519190612693565b61195b9190612693565b61196586866111e7565b61196f91906126b3565b95945050505050565b611980611ba0565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6119d26112ac565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336119ad565b600080603c806018611a1688611be9565b600354611a2391906126b3565b611a2d9190612693565b611a379190612693565b611a419190612693565b90508061196585856111e7565b6040516331a9108f60e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e9060240160206040518083038186803b158015611ab157600080fd5b505afa158015611ac5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048891906121b7565b60405163150bb41760e31b81526001600160a01b0383811660048301526024820183905260006044830152600360648301526060917f00000000000000000000000000000000000000000000000000000000000000009091169063a85da0b89060840160006040518083038186803b158015611b6457600080fd5b505afa158015611b78573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261048591908101906123cd565b60015460ff1661093d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610541565b6040516328b9de8f60e11b8152600481018290526003602482015260009081906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635173bd1e9060440160206040518083038186803b158015611c5557600080fd5b505afa158015611c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8d91906124bf565b6040516328b9de8f60e11b815260048101859052600260248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635173bd1e9060440160206040518083038186803b158015611cf457600080fd5b505afa158015611d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2c91906124bf565b6040516328b9de8f60e11b815260048101869052600160248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635173bd1e9060440160206040518083038186803b158015611d9357600080fd5b505afa158015611da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcb91906124bf565b6040516328b9de8f60e11b815260048101879052600060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635173bd1e9060440160206040518083038186803b158015611e3257600080fd5b505afa158015611e46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6a91906124bf565b6040516328b9de8f60e11b815260048101889052600560248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635173bd1e9060440160206040518083038186803b158015611ed157600080fd5b505afa158015611ee5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0991906124bf565b6040516328b9de8f60e11b815260048101899052600360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635173bd1e9060440160206040518083038186803b158015611f7057600080fd5b505afa158015611f84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa891906124bf565b6040516328b9de8f60e11b8152600481018a9052600160248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635173bd1e9060440160206040518083038186803b15801561200f57600080fd5b505afa158015612023573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204791906124bf565b6040516328b9de8f60e11b8152600481018b9052600060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635173bd1e9060440160206040518083038186803b1580156120ae57600080fd5b505afa1580156120c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e691906124bf565b6120f0919061267b565b6120fa919061267b565b612104919061267b565b61210e919061267b565b612118919061267b565b612122919061267b565b61212c919061267b565b9050806104885750600192915050565b60008083601f84011261214d578081fd5b50813567ffffffffffffffff811115612164578182fd5b6020830191508360208260051b850101111561217f57600080fd5b9250929050565b8051801515811461219657600080fd5b919050565b6000602082840312156121ac578081fd5b813561048581612730565b6000602082840312156121c8578081fd5b815161048581612730565b600080604083850312156121e5578081fd5b82356121f081612730565b946020939093013593505050565b60008060008060008060608789031215612216578182fd5b863567ffffffffffffffff8082111561222d578384fd5b6122398a838b0161213c565b90985096506020890135915080821115612251578384fd5b61225d8a838b0161213c565b90965094506040890135915080821115612275578384fd5b5061228289828a0161213c565b979a9699509497509295939492505050565b6000806000806000806000806080898b0312156122af578182fd5b883567ffffffffffffffff808211156122c6578384fd5b6122d28c838d0161213c565b909a50985060208b01359150808211156122ea578384fd5b6122f68c838d0161213c565b909850965060408b013591508082111561230e578384fd5b61231a8c838d0161213c565b909650945060608b0135915080821115612332578384fd5b5061233f8b828c0161213c565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b03121561236e578384fd5b883567ffffffffffffffff80821115612385578586fd5b6123918c838d0161213c565b909a50985060208b01359150808211156123a9578586fd5b6123b58c838d0161213c565b909850965060408b013591508082111561230e578586fd5b600060208083850312156123df578182fd5b825167ffffffffffffffff808211156123f6578384fd5b818501915085601f830112612409578384fd5b81518181111561241b5761241b61271a565b8060051b604051601f19603f830116810181811085821117156124405761244061271a565b604052828152858101935084860182860187018a101561245e578788fd5b8795505b83861015612480578051855260019590950194938601938601612462565b5098975050505050505050565b60006020828403121561249e578081fd5b61048582612186565b6000602082840312156124b8578081fd5b5035919050565b6000602082840312156124d0578081fd5b5051919050565b6000806000606084860312156124eb578283fd5b8335925060208401356124fd81612730565b929592945050506040919091013590565b60008060408385031215612520578081fd5b8251915061253060208401612186565b90509250929050565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b03831115612568578081fd5b8260051b80856060850137919091016060019081529392505050565b60208082526029908201527f5061727469636c654d696e7465723a20596f7520646f206e6f74206f776e2041604082015268323b32b73a3ab932b960b91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526015908201527426b0b730b3b2b91d102737ba1030b71020b236b4b760591b604082015260600190565b6000808335601e19843603018112612649578283fd5b83018035915067ffffffffffffffff821115612663578283fd5b6020019150600581901b360382131561217f57600080fd5b6000821982111561268e5761268e612704565b500190565b6000826126ae57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156126cd576126cd612704565b500290565b6000828210156126e4576126e4612704565b500390565b60006000198214156126fd576126fd612704565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146118e257600080fdfea2646970667358221220f5bde6e6922879d48dff07e64f6d0c8cc26b5ff774d20fbb1d78210cd956ba5364736f6c634300080400330000000000000000000000004de95c1e202102e22e801590c51d7b979f167fbb0000000000000000000000004e572433a3bfa336b6396d13afc9f69b58252861000000000000000000000000aae3a78ea8de1b89c64d5c64a26d5b1fc8f91496000000000000000000000000e3b4d0bf4f433bf981bd452134657ba1dc28f558000000000000000000000000c9797a6be31f052cdfbdcc7264005c1eea0f69b900000000000000000000000061462ff437b630e0c2f1f4711f5b276c47af2e630000000000000000000000007b37fb0e9ec8b45da1a753cceb0936fd2a84e2a60000000000000000000000009844fac4e399671ef24f775da12e88cafe0630360000000000000000000000009a9bbffe07ea36295a26b54379596b6d25234dc3000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000b5e620f48000000000000000000000000000000000000000000000000000002386f26fc10000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806361e6fbfe116100f9578063b74c6f7611610097578063e0ee20c011610071578063e0ee20c01461042d578063eaf094da14610440578063eb4de3c414610449578063fcac08921461045257600080fd5b8063b74c6f76146103cc578063c1a71c08146103f3578063da52aafe1461041a57600080fd5b80638456cb59116100d35780638456cb591461039f5780638f84cee5146103a7578063aa5b9000146103ba578063b4570dba146103c357600080fd5b806361e6fbfe1461035c578063656c9b621461036557806379604a171461037857600080fd5b80632c280bd3116101665780633f4ba83a116101405780633f4ba83a14610318578063453f2e5a14610320578063476513fb146103335780635c975abb1461034657600080fd5b80632c280bd3146102cb578063338c5371146102de57806333a878eb1461030557600080fd5b80630c0fd886116101a25780630c0fd886146102435780631b2df8501461026a5780631b62a26b1461029157806321712c73146102b857600080fd5b8063063c1f2f146101c957806306c37c571461020d5780630bd9449b1461022e575b600080fd5b6101f07f0000000000000000000000009844fac4e399671ef24f775da12e88cafe06303681565b6040516001600160a01b0390911681526020015b60405180910390f35b61022061021b3660046121d3565b610479565b604051908152602001610204565b61024161023c3660046124a7565b61048e565b005b6101f07f000000000000000000000000aae3a78ea8de1b89c64d5c64a26d5b1fc8f9149681565b6101f07f0000000000000000000000004e572433a3bfa336b6396d13afc9f69b5825286181565b6101f07f000000000000000000000000e3b4d0bf4f433bf981bd452134657ba1dc28f55881565b6102416102c6366004612294565b61054f565b6102416102d93660046124a7565b6107be565b6101f07f0000000000000000000000009a9bbffe07ea36295a26b54379596b6d25234dc381565b6102206103133660046121d3565b610876565b610241610882565b61024161032e3660046124a7565b61093f565b6102416103413660046124a7565b6109f7565b60015460ff166040519015158152602001610204565b61022060065481565b610241610373366004612353565b610aaf565b6101f07f0000000000000000000000004de95c1e202102e22e801590c51d7b979f167fbb81565b610241610f6e565b6102416103b53660046121fe565b611029565b61022060045481565b61022060025481565b6101f07f0000000000000000000000007b37fb0e9ec8b45da1a753cceb0936fd2a84e2a681565b6101f07f00000000000000000000000061462ff437b630e0c2f1f4711f5b276c47af2e6381565b6102416104283660046124a7565b61111a565b61022061043b3660046124d7565b6111d2565b61022060035481565b61022060055481565b6101f07f000000000000000000000000c9797a6be31f052cdfbdcc7264005c1eea0f69b981565b600061048583836111e7565b90505b92915050565b604051630935e01b60e21b81523360048201527f0000000000000000000000004e572433a3bfa336b6396d13afc9f69b582528616001600160a01b0316906324d7806c9060240160206040518083038186803b1580156104ed57600080fd5b505afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610525919061248d565b61054a5760405162461bcd60e51b815260040161054190612604565b60405180910390fd5b600555565b600260005414156105725760405162461bcd60e51b8152600401610541906125cd565b600260005561057f6112ac565b60005b858110156107ae5760008383838181106105ac57634e487b7160e01b600052603260045260246000fd5b90506020020135905060008a8a848181106105d757634e487b7160e01b600052603260045260246000fd5b90506020020160208101906105ec919061219b565b9050600089898581811061061057634e487b7160e01b600052603260045260246000fd5b9050602002013590506106548289898781811061063d57634e487b7160e01b600052603260045260246000fd5b905060200281019061064f9190612633565b6112f2565b60006106608383611377565b905061066b84611750565b600654604051638b5e6a1b60e01b8152600481018390526001600160a01b0385811660248301526044820185905260648201929092527f0000000000000000000000007b37fb0e9ec8b45da1a753cceb0936fd2a84e2a690911690638b5e6a1b90608401600060405180830381600087803b1580156106e957600080fd5b505af11580156106fd573d6000803e3d6000fd5b50506006546040516322a1955f60e11b8152600481018890526001600160a01b0387811660248301526044820187905260648201929092527f0000000000000000000000007b37fb0e9ec8b45da1a753cceb0936fd2a84e2a690911692506345432abe9150608401600060405180830381600087803b15801561077f57600080fd5b505af1158015610793573d6000803e3d6000fd5b505050505050505080806107a6906126e9565b915050610582565b5050600160005550505050505050565b604051630935e01b60e21b81523360048201527f0000000000000000000000004e572433a3bfa336b6396d13afc9f69b582528616001600160a01b0316906324d7806c9060240160206040518083038186803b15801561081d57600080fd5b505afa158015610831573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610855919061248d565b6108715760405162461bcd60e51b815260040161054190612604565b600255565b600061048583836118e5565b604051630935e01b60e21b81523360048201527f0000000000000000000000004e572433a3bfa336b6396d13afc9f69b582528616001600160a01b0316906324d7806c9060240160206040518083038186803b1580156108e157600080fd5b505afa1580156108f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610919919061248d565b6109355760405162461bcd60e51b815260040161054190612604565b61093d611978565b565b604051630935e01b60e21b81523360048201527f0000000000000000000000004e572433a3bfa336b6396d13afc9f69b582528616001600160a01b0316906324d7806c9060240160206040518083038186803b15801561099e57600080fd5b505afa1580156109b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d6919061248d565b6109f25760405162461bcd60e51b815260040161054190612604565b600455565b604051630935e01b60e21b81523360048201527f0000000000000000000000004e572433a3bfa336b6396d13afc9f69b582528616001600160a01b0316906324d7806c9060240160206040518083038186803b158015610a5657600080fd5b505afa158015610a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8e919061248d565b610aaa5760405162461bcd60e51b815260040161054190612604565b600655565b60026000541415610ad25760405162461bcd60e51b8152600401610541906125cd565b6002600055610adf6112ac565b60005b838110156107ae576000898983818110610b0c57634e487b7160e01b600052603260045260246000fd5b9050602002013590506000888884818110610b3757634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610b4c919061219b565b90506000878785818110610b7057634e487b7160e01b600052603260045260246000fd5b90506020020135905060007f0000000000000000000000007b37fb0e9ec8b45da1a753cceb0936fd2a84e2a66001600160a01b0316639928c11184846040518363ffffffff1660e01b8152600401610bdd9291906001600160a01b03929092168252602082015260400190565b604080518083038186803b158015610bf457600080fd5b505afa158015610c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2c919061250e565b9150508015610c8f5760405162461bcd60e51b815260206004820152602960248201527f5061727469636c654d696e7465723a20596f752061726520616c7265616479206044820152686578706c6f72696e6760b81b6064820152608401610541565b610cb38388888881811061063d57634e487b7160e01b600052603260045260246000fd5b6040516331a9108f60e11b81526004810183905233906001600160a01b03851690636352211e9060240160206040518083038186803b158015610cf557600080fd5b505afa158015610d09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2d91906121b7565b6001600160a01b031614610d535760405162461bcd60e51b815260040161054190612584565b6040516331a9108f60e11b8152600481018590527f0000000000000000000000004de95c1e202102e22e801590c51d7b979f167fbb6001600160a01b031690636352211e9060240160206040518083038186803b158015610db357600080fd5b505afa158015610dc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610deb91906121b7565b50610df584611750565b6040516306bd653160e21b81526001600160a01b038481166004830152602482018490527f0000000000000000000000007b37fb0e9ec8b45da1a753cceb0936fd2a84e2a61690631af594c490604401600060405180830381600087803b158015610e5f57600080fd5b505af1158015610e73573d6000803e3d6000fd5b50506006546040516322a1955f60e11b8152600481018890526001600160a01b0387811660248301526044820187905260648201929092527f0000000000000000000000007b37fb0e9ec8b45da1a753cceb0936fd2a84e2a690911692506345432abe9150608401600060405180830381600087803b158015610ef557600080fd5b505af1158015610f09573d6000803e3d6000fd5b5050604080518781526001600160a01b03871660208201529081018590527f2327f5bf59b14c582eb64204b9ff63fc97b98dfd6e660acc6e5de7bb5f1160c39250606001905060405180910390a1505050508080610f66906126e9565b915050610ae2565b604051630935e01b60e21b81523360048201527f0000000000000000000000004e572433a3bfa336b6396d13afc9f69b582528616001600160a01b0316906324d7806c9060240160206040518083038186803b158015610fcd57600080fd5b505afa158015610fe1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611005919061248d565b6110215760405162461bcd60e51b815260040161054190612604565b61093d6119ca565b6002600054141561104c5760405162461bcd60e51b8152600401610541906125cd565b60026000556110596112ac565b60005b8381101561110c57600087878381811061108657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061109b919061219b565b905060008686848181106110bf57634e487b7160e01b600052603260045260246000fd5b9050602002013590506110ec8286868681811061063d57634e487b7160e01b600052603260045260246000fd5b6110f68282611377565b5050508080611104906126e9565b91505061105c565b505060016000555050505050565b604051630935e01b60e21b81523360048201527f0000000000000000000000004e572433a3bfa336b6396d13afc9f69b582528616001600160a01b0316906324d7806c9060240160206040518083038186803b15801561117957600080fd5b505afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b1919061248d565b6111cd5760405162461bcd60e51b815260040161054190612604565b600355565b60006111df848484611a05565b949350505050565b60405163d64f83f960e01b81526001600160a01b0383811660048301526024820183905260009182917f0000000000000000000000007b37fb0e9ec8b45da1a753cceb0936fd2a84e2a6169063d64f83f99060440160206040518083038186803b15801561125457600080fd5b505afa158015611268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128c91906124bf565b61129690426126d2565b9050600554811115610485575050600554610488565b60015460ff161561093d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610541565b6040516320be298160e11b81526001600160a01b037f0000000000000000000000009a9bbffe07ea36295a26b54379596b6d25234dc3169063417c53029061134290869086908690600401612539565b60006040518083038186803b15801561135a57600080fd5b505afa15801561136e573d6000803e3d6000fd5b50505050505050565b6040516331a9108f60e11b81526004810182905260009033906001600160a01b03851690636352211e9060240160206040518083038186803b1580156113bc57600080fd5b505afa1580156113d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f491906121b7565b6001600160a01b03161461141a5760405162461bcd60e51b815260040161054190612584565b604051639928c11160e01b81526001600160a01b0384811660048301526024820184905260009182917f0000000000000000000000007b37fb0e9ec8b45da1a753cceb0936fd2a84e2a61690639928c11190604401604080518083038186803b15801561148657600080fd5b505afa15801561149a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114be919061250e565b91509150806115355760405162461bcd60e51b815260206004820152603860248201527f5061727469636c654d696e7465723a20596f75206d7573742063686f6f73652060448201527f61207265616c6d20746f206578706c6f726520666972737400000000000000006064820152608401610541565b600061154186866118e5565b60405163da1919b360e01b8152336004820152602481018290529091507f00000000000000000000000061462ff437b630e0c2f1f4711f5b276c47af2e636001600160a01b03169063da1919b390604401600060405180830381600087803b1580156115ac57600080fd5b505af11580156115c0573d6000803e3d6000fd5b5050505060006115d1848888611a05565b90507f00000000000000000000000061462ff437b630e0c2f1f4711f5b276c47af2e636001600160a01b031663da1919b361160b86611a4e565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b15801561165357600080fd5b505af1158015611667573d6000803e3d6000fd5b50506040516306bd653160e21b81526001600160a01b038a81166004830152602482018a90527f0000000000000000000000007b37fb0e9ec8b45da1a753cceb0936fd2a84e2a6169250631af594c49150604401600060405180830381600087803b1580156116d557600080fd5b505af11580156116e9573d6000803e3d6000fd5b5050604080518781526001600160a01b038b16602082015290810189905260608101859052608081018490527f7e9234980f69e2814f45bf433e66a0e95f02697ad3675a6aa7a793e2c1450c75925060a001905060405180910390a1509195945050505050565b604051631634a51d60e01b8152600481018290527f0000000000000000000000009844fac4e399671ef24f775da12e88cafe0630366001600160a01b031690631634a51d9060240160206040518083038186803b1580156117b057600080fd5b505afa1580156117c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e891906124bf565b6040516308c2855d60e21b8152600481018390527f0000000000000000000000007b37fb0e9ec8b45da1a753cceb0936fd2a84e2a66001600160a01b03169063230a15749060240160206040518083038186803b15801561184857600080fd5b505afa15801561185c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188091906124bf565b106118e25760405162461bcd60e51b815260206004820152602c60248201527f5061727469636c654d696e7465723a204d6178205265616c6d20706f70756c6160448201526b1d1a5bdb881c995858da195960a21b6064820152608401610541565b50565b600254600090816118f68585611ae9565b90508060038151811061191957634e487b7160e01b600052603260045260246000fd5b60200260200101516001141561193957600454611936908361267b565b91505b603c80611947601885612693565b6119519190612693565b61195b9190612693565b61196586866111e7565b61196f91906126b3565b95945050505050565b611980611ba0565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6119d26112ac565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336119ad565b600080603c806018611a1688611be9565b600354611a2391906126b3565b611a2d9190612693565b611a379190612693565b611a419190612693565b90508061196585856111e7565b6040516331a9108f60e11b8152600481018290526000907f0000000000000000000000004de95c1e202102e22e801590c51d7b979f167fbb6001600160a01b031690636352211e9060240160206040518083038186803b158015611ab157600080fd5b505afa158015611ac5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048891906121b7565b60405163150bb41760e31b81526001600160a01b0383811660048301526024820183905260006044830152600360648301526060917f000000000000000000000000c9797a6be31f052cdfbdcc7264005c1eea0f69b99091169063a85da0b89060840160006040518083038186803b158015611b6457600080fd5b505afa158015611b78573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261048591908101906123cd565b60015460ff1661093d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610541565b6040516328b9de8f60e11b8152600481018290526003602482015260009081906001600160a01b037f000000000000000000000000e3b4d0bf4f433bf981bd452134657ba1dc28f5581690635173bd1e9060440160206040518083038186803b158015611c5557600080fd5b505afa158015611c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8d91906124bf565b6040516328b9de8f60e11b815260048101859052600260248201527f000000000000000000000000e3b4d0bf4f433bf981bd452134657ba1dc28f5586001600160a01b031690635173bd1e9060440160206040518083038186803b158015611cf457600080fd5b505afa158015611d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2c91906124bf565b6040516328b9de8f60e11b815260048101869052600160248201527f000000000000000000000000e3b4d0bf4f433bf981bd452134657ba1dc28f5586001600160a01b031690635173bd1e9060440160206040518083038186803b158015611d9357600080fd5b505afa158015611da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcb91906124bf565b6040516328b9de8f60e11b815260048101879052600060248201527f000000000000000000000000e3b4d0bf4f433bf981bd452134657ba1dc28f5586001600160a01b031690635173bd1e9060440160206040518083038186803b158015611e3257600080fd5b505afa158015611e46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6a91906124bf565b6040516328b9de8f60e11b815260048101889052600560248201527f000000000000000000000000aae3a78ea8de1b89c64d5c64a26d5b1fc8f914966001600160a01b031690635173bd1e9060440160206040518083038186803b158015611ed157600080fd5b505afa158015611ee5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0991906124bf565b6040516328b9de8f60e11b815260048101899052600360248201527f000000000000000000000000aae3a78ea8de1b89c64d5c64a26d5b1fc8f914966001600160a01b031690635173bd1e9060440160206040518083038186803b158015611f7057600080fd5b505afa158015611f84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa891906124bf565b6040516328b9de8f60e11b8152600481018a9052600160248201527f000000000000000000000000aae3a78ea8de1b89c64d5c64a26d5b1fc8f914966001600160a01b031690635173bd1e9060440160206040518083038186803b15801561200f57600080fd5b505afa158015612023573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204791906124bf565b6040516328b9de8f60e11b8152600481018b9052600060248201527f000000000000000000000000aae3a78ea8de1b89c64d5c64a26d5b1fc8f914966001600160a01b031690635173bd1e9060440160206040518083038186803b1580156120ae57600080fd5b505afa1580156120c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e691906124bf565b6120f0919061267b565b6120fa919061267b565b612104919061267b565b61210e919061267b565b612118919061267b565b612122919061267b565b61212c919061267b565b9050806104885750600192915050565b60008083601f84011261214d578081fd5b50813567ffffffffffffffff811115612164578182fd5b6020830191508360208260051b850101111561217f57600080fd5b9250929050565b8051801515811461219657600080fd5b919050565b6000602082840312156121ac578081fd5b813561048581612730565b6000602082840312156121c8578081fd5b815161048581612730565b600080604083850312156121e5578081fd5b82356121f081612730565b946020939093013593505050565b60008060008060008060608789031215612216578182fd5b863567ffffffffffffffff8082111561222d578384fd5b6122398a838b0161213c565b90985096506020890135915080821115612251578384fd5b61225d8a838b0161213c565b90965094506040890135915080821115612275578384fd5b5061228289828a0161213c565b979a9699509497509295939492505050565b6000806000806000806000806080898b0312156122af578182fd5b883567ffffffffffffffff808211156122c6578384fd5b6122d28c838d0161213c565b909a50985060208b01359150808211156122ea578384fd5b6122f68c838d0161213c565b909850965060408b013591508082111561230e578384fd5b61231a8c838d0161213c565b909650945060608b0135915080821115612332578384fd5b5061233f8b828c0161213c565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b03121561236e578384fd5b883567ffffffffffffffff80821115612385578586fd5b6123918c838d0161213c565b909a50985060208b01359150808211156123a9578586fd5b6123b58c838d0161213c565b909850965060408b013591508082111561230e578586fd5b600060208083850312156123df578182fd5b825167ffffffffffffffff808211156123f6578384fd5b818501915085601f830112612409578384fd5b81518181111561241b5761241b61271a565b8060051b604051601f19603f830116810181811085821117156124405761244061271a565b604052828152858101935084860182860187018a101561245e578788fd5b8795505b83861015612480578051855260019590950194938601938601612462565b5098975050505050505050565b60006020828403121561249e578081fd5b61048582612186565b6000602082840312156124b8578081fd5b5035919050565b6000602082840312156124d0578081fd5b5051919050565b6000806000606084860312156124eb578283fd5b8335925060208401356124fd81612730565b929592945050506040919091013590565b60008060408385031215612520578081fd5b8251915061253060208401612186565b90509250929050565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b03831115612568578081fd5b8260051b80856060850137919091016060019081529392505050565b60208082526029908201527f5061727469636c654d696e7465723a20596f7520646f206e6f74206f776e2041604082015268323b32b73a3ab932b960b91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526015908201527426b0b730b3b2b91d102737ba1030b71020b236b4b760591b604082015260600190565b6000808335601e19843603018112612649578283fd5b83018035915067ffffffffffffffff821115612663578283fd5b6020019150600581901b360382131561217f57600080fd5b6000821982111561268e5761268e612704565b500190565b6000826126ae57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156126cd576126cd612704565b500290565b6000828210156126e4576126e4612704565b500390565b60006000198214156126fd576126fd612704565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146118e257600080fdfea2646970667358221220f5bde6e6922879d48dff07e64f6d0c8cc26b5ff774d20fbb1d78210cd956ba5364736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004de95c1e202102e22e801590c51d7b979f167fbb0000000000000000000000004e572433a3bfa336b6396d13afc9f69b58252861000000000000000000000000aae3a78ea8de1b89c64d5c64a26d5b1fc8f91496000000000000000000000000e3b4d0bf4f433bf981bd452134657ba1dc28f558000000000000000000000000c9797a6be31f052cdfbdcc7264005c1eea0f69b900000000000000000000000061462ff437b630e0c2f1f4711f5b276c47af2e630000000000000000000000007b37fb0e9ec8b45da1a753cceb0936fd2a84e2a60000000000000000000000009844fac4e399671ef24f775da12e88cafe0630360000000000000000000000009a9bbffe07ea36295a26b54379596b6d25234dc3000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000b5e620f48000000000000000000000000000000000000000000000000000002386f26fc10000
-----Decoded View---------------
Arg [0] : _realm (address): 0x4de95c1E202102E22E801590C51D7B979f167FBB
Arg [1] : _manager (address): 0x4E572433A3Bfa336b6396D13AfC9F69b58252861
Arg [2] : _data (address): 0xAae3A78EA8De1b89C64D5c64A26d5b1FC8F91496
Arg [3] : _structure (address): 0xe3B4d0BF4F433bF981bD452134657ba1dC28F558
Arg [4] : _adventurerData (address): 0xc9797A6Be31F052cdfbDCc7264005c1EEA0F69B9
Arg [5] : _particle (address): 0x61462FF437b630e0C2f1F4711f5B276c47Af2e63
Arg [6] : _tracker (address): 0x7b37fb0e9Ec8B45dA1a753cCEb0936fd2a84e2A6
Arg [7] : _population (address): 0x9844fac4e399671EF24F775Da12e88CAfE063036
Arg [8] : _gateway (address): 0x9A9BbFfE07Ea36295A26b54379596B6D25234dc3
Arg [9] : _adventurerBaseParticle (uint256): 100000000000000000
Arg [10] : _realmerBaseParticle (uint256): 200000000000000
Arg [11] : _professionBonus (uint256): 10000000000000000
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000004de95c1e202102e22e801590c51d7b979f167fbb
Arg [1] : 0000000000000000000000004e572433a3bfa336b6396d13afc9f69b58252861
Arg [2] : 000000000000000000000000aae3a78ea8de1b89c64d5c64a26d5b1fc8f91496
Arg [3] : 000000000000000000000000e3b4d0bf4f433bf981bd452134657ba1dc28f558
Arg [4] : 000000000000000000000000c9797a6be31f052cdfbdcc7264005c1eea0f69b9
Arg [5] : 00000000000000000000000061462ff437b630e0c2f1f4711f5b276c47af2e63
Arg [6] : 0000000000000000000000007b37fb0e9ec8b45da1a753cceb0936fd2a84e2a6
Arg [7] : 0000000000000000000000009844fac4e399671ef24f775da12e88cafe063036
Arg [8] : 0000000000000000000000009a9bbffe07ea36295a26b54379596b6d25234dc3
Arg [9] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [10] : 0000000000000000000000000000000000000000000000000000b5e620f48000
Arg [11] : 000000000000000000000000000000000000000000000000002386f26fc10000
Deployed ByteCode Sourcemap
57028:10360:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57466:39;;;;;;;;-1:-1:-1;;;;;8186:32:1;;;8168:51;;8156:2;8141:18;57466:39:0;;;;;;;;61997:166;;;;;;:::i;:::-;;:::i;:::-;;;14995:25:1;;;14983:2;14968:18;61997:166:0;14950:76:1;63185:101:0;;;;;;:::i;:::-;;:::i;:::-;;57244:27;;;;;56122:33;;;;;57276:37;;;;;61079:912;;;;;;:::i;:::-;;:::i;62836:117::-;;;;;;:::i;:::-;;:::i;57510:43::-;;;;;62400:198;;;;;;:::i;:::-;;:::i;62769:61::-;;;:::i;63076:103::-;;;;;;:::i;:::-;;:::i;63292:101::-;;;;;;:::i;:::-;;:::i;5121:86::-;5192:7;;;;5121:86;;9709:14:1;;9702:22;9684:41;;9672:2;9657:18;5121:86:0;9639:92:1;57812:29:0;;;;;;59309:1276;;;;;;:::i;:::-;;:::i;57210:29::-;;;;;62706:57;;;:::i;60591:462::-;;;;;;:::i;:::-;;:::i;57743:30::-;;;;;;57662:37;;;;;;57411:50;;;;;57371:35;;;;;62959:111;;;;;;:::i;:::-;;:::i;62169:225::-;;;;;;:::i;:::-;;:::i;57704:34::-;;;;;;57778:29;;;;;;57318:48;;;;;61997:166;62097:7;62123:34;62136:5;62143:13;62123:12;:34::i;:::-;62116:41;;61997:166;;;;;:::o;63185:101::-;56489:27;;-1:-1:-1;;;56489:27:0;;56505:10;56489:27;;;8168:51:1;56489:7:0;-1:-1:-1;;;;;56489:15:0;;;;8141:18:1;;56489:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56481:61;;;;-1:-1:-1;;;56481:61:0;;;;;;;:::i;:::-;;;;;;;;;63257:14:::1;:23:::0;63185:101::o;61079:912::-;1780:1;2378:7;;:19;;2370:63;;;;-1:-1:-1;;;2370:63:0;;;;;;;:::i;:::-;1780:1;2511:7;:18;4726:19:::1;:17;:19::i;:::-;61295:9:::2;61290:696;61310:25:::0;;::::2;61290:696;;;61351:15;61369:9;;61379:1;61369:12;;;;;-1:-1:-1::0;;;61369:12:0::2;;;;;;;;;;;;;;;61351:30;;61390:12;61405:10;;61416:1;61405:13;;;;;-1:-1:-1::0;;;61405:13:0::2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61390:28;;61427:20;61450:14;;61465:1;61450:17;;;;;-1:-1:-1::0;;;61450:17:0::2;;;;;;;;;;;;;;;61427:40;;61514:31;61528:4;61534:7;;61542:1;61534:10;;;;;-1:-1:-1::0;;;61534:10:0::2;;;;;;;;;;;;;;;;;;;;:::i;:::-;61514:13;:31::i;:::-;61574:20;61597:28;61606:4;61612:12;61597:8;:28::i;:::-;61574:51;;61683:25;61700:7;61683:16;:25::i;:::-;61848:14;::::0;61745:126:::2;::::0;-1:-1:-1;;;61745:126:0;;::::2;::::0;::::2;15612:25:1::0;;;-1:-1:-1;;;;;15673:32:1;;;15653:18;;;15646:60;15722:18;;;15715:34;;;15765:18;;;15758:34;;;;61745:16:0::2;:31:::0;;::::2;::::0;::::2;::::0;15584:19:1;;61745:126:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;61963:14:0::2;::::0;61905:73:::2;::::0;-1:-1:-1;;;61905:73:0;;::::2;::::0;::::2;15612:25:1::0;;;-1:-1:-1;;;;;15673:32:1;;;15653:18;;;15646:60;15722:18;;;15715:34;;;15765:18;;;15758:34;;;;61905:16:0::2;:28:::0;;::::2;::::0;-1:-1:-1;61905:28:0::2;::::0;-1:-1:-1;15584:19:1;;61905:73:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;61290:696;;;;61337:3;;;;;:::i;:::-;;;;61290:696;;;-1:-1:-1::0;;1736:1:0;2690:7;:22;-1:-1:-1;;;;;;;61079:912:0:o;62836:117::-;56489:27;;-1:-1:-1;;;56489:27:0;;56505:10;56489:27;;;8168:51:1;56489:7:0;-1:-1:-1;;;;;56489:15:0;;;;8141:18:1;;56489:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56481:61;;;;-1:-1:-1;;;56481:61:0;;;;;;;:::i;:::-;62916:22:::1;:31:::0;62836:117::o;62400:198::-;62519:7;62542:50;62571:5;62578:13;62542:28;:50::i;62769:61::-;56489:27;;-1:-1:-1;;;56489:27:0;;56505:10;56489:27;;;8168:51:1;56489:7:0;-1:-1:-1;;;;;56489:15:0;;;;8141:18:1;;56489:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56481:61;;;;-1:-1:-1;;;56481:61:0;;;;;;;:::i;:::-;62814:10:::1;:8;:10::i;:::-;62769:61::o:0;63076:103::-;56489:27;;-1:-1:-1;;;56489:27:0;;56505:10;56489:27;;;8168:51:1;56489:7:0;-1:-1:-1;;;;;56489:15:0;;;;8141:18:1;;56489:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56481:61;;;;-1:-1:-1;;;56481:61:0;;;;;;;:::i;:::-;63149:15:::1;:24:::0;63076:103::o;63292:101::-;56489:27;;-1:-1:-1;;;56489:27:0;;56505:10;56489:27;;;8168:51:1;56489:7:0;-1:-1:-1;;;;;56489:15:0;;;;8141:18:1;;56489:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56481:61;;;;-1:-1:-1;;;56481:61:0;;;;;;;:::i;:::-;63364:14:::1;:23:::0;63292:101::o;59309:1276::-;1780:1;2378:7;;:19;;2370:63;;;;-1:-1:-1;;;2370:63:0;;;;;;;:::i;:::-;1780:1;2511:7;:18;4726:19:::1;:17;:19::i;:::-;59522:9:::2;59517:1063;59537:25:::0;;::::2;59517:1063;;;59578:15;59596:9;;59606:1;59596:12;;;;;-1:-1:-1::0;;;59596:12:0::2;;;;;;;;;;;;;;;59578:30;;59617:12;59632:10;;59643:1;59632:13;;;;;-1:-1:-1::0;;;59632:13:0::2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59617:28;;59654:20;59677:14;;59692:1;59677:17;;;;;-1:-1:-1::0;;;59677:17:0::2;;;;;;;;;;;;;;;59654:40;;59746:15;59765:16;-1:-1:-1::0;;;;;59765:29:0::2;;59795:4;59801:12;59765:49;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;9019:32:1;;;;9001:51;;9083:2;9068:18;;9061:34;8989:2;8974:18;;8956:145;59765:49:0::2;;::::0;::::2;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59743:71;;;59881:10;59880:11;59872:65;;;::::0;-1:-1:-1;;;59872:65:0;;13586:2:1;59872:65:0::2;::::0;::::2;13568:21:1::0;13625:2;13605:18;;;13598:30;13664:34;13644:18;;;13637:62;-1:-1:-1;;;13715:18:1;;;13708:39;13764:19;;59872:65:0::2;13558:231:1::0;59872:65:0::2;59984:31;59998:4;60004:7;;60012:1;60004:10;;;;;-1:-1:-1::0;;;60004:10:0::2;;;;;;;;59984:31;60083:35;::::0;-1:-1:-1;;;60083:35:0;;::::2;::::0;::::2;14995:25:1::0;;;60122:10:0::2;::::0;-1:-1:-1;;;;;60083:21:0;::::2;::::0;::::2;::::0;14968:18:1;;60083:35:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;60083:49:0::2;;60065:130;;;;-1:-1:-1::0;;;60065:130:0::2;;;;;;;:::i;:::-;60235:22;::::0;-1:-1:-1;;;60235:22:0;;::::2;::::0;::::2;14995:25:1::0;;;60235:5:0::2;-1:-1:-1::0;;;;;60235:13:0::2;::::0;::::2;::::0;14968:18:1;;60235:22:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60315:25;60332:7;60315:16;:25::i;:::-;60371:45;::::0;-1:-1:-1;;;60371:45:0;;-1:-1:-1;;;;;9019:32:1;;;60371:45:0::2;::::0;::::2;9001:51:1::0;9068:18;;;9061:34;;;60371:16:0::2;:25;::::0;::::2;::::0;8974:18:1;;60371:45:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;60508:14:0::2;::::0;60450:73:::2;::::0;-1:-1:-1;;;60450:73:0;;::::2;::::0;::::2;15612:25:1::0;;;-1:-1:-1;;;;;15673:32:1;;;15653:18;;;15646:60;15722:18;;;15715:34;;;15765:18;;;15758:34;;;;60450:16:0::2;:28:::0;;::::2;::::0;-1:-1:-1;60450:28:0::2;::::0;-1:-1:-1;15584:19:1;;60450:73:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;60539:33:0::2;::::0;;15233:25:1;;;-1:-1:-1;;;;;15294:32:1;;15289:2;15274:18;;15267:60;15343:18;;;15336:34;;;60539:33:0::2;::::0;-1:-1:-1;15221:2:1;15206:18;;-1:-1:-1;60539:33:0::2;;;;;;;59517:1063;;;;59564:3;;;;;:::i;:::-;;;;59517:1063;;62706:57:::0;56489:27;;-1:-1:-1;;;56489:27:0;;56505:10;56489:27;;;8168:51:1;56489:7:0;-1:-1:-1;;;;;56489:15:0;;;;8141:18:1;;56489:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56481:61;;;;-1:-1:-1;;;56481:61:0;;;;;;;:::i;:::-;62749:8:::1;:6;:8::i;60591:462::-:0;1780:1;2378:7;;:19;;2370:63;;;;-1:-1:-1;;;2370:63:0;;;;;;;:::i;:::-;1780:1;2511:7;:18;4726:19:::1;:17;:19::i;:::-;60772:9:::2;60767:281;60787:25:::0;;::::2;60767:281;;;60828:12;60843:10;;60854:1;60843:13;;;;;-1:-1:-1::0;;;60843:13:0::2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60828:28;;60865:20;60888:14;;60903:1;60888:17;;;;;-1:-1:-1::0;;;60888:17:0::2;;;;;;;;;;;;;;;60865:40;;60952:31;60966:4;60972:7;;60980:1;60972:10;;;;;-1:-1:-1::0;;;60972:10:0::2;;;;;;;;60952:31;61012:28;61021:4;61027:12;61012:8;:28::i;:::-;;60767:281;;60814:3;;;;;:::i;:::-;;;;60767:281;;;-1:-1:-1::0;;1736:1:0;2690:7;:22;-1:-1:-1;;;;;60591:462:0:o;62959:111::-;56489:27;;-1:-1:-1;;;56489:27:0;;56505:10;56489:27;;;8168:51:1;56489:7:0;-1:-1:-1;;;;;56489:15:0;;;;8141:18:1;;56489:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56481:61;;;;-1:-1:-1;;;56481:61:0;;;;;;;:::i;:::-;63036:19:::1;:28:::0;62959:111::o;62169:225::-;62308:7;62331:57;62357:8;62367:5;62374:13;62331:25;:57::i;:::-;62324:64;62169:225;-1:-1:-1;;;;62169:225:0:o;66443:409::-;66638:44;;-1:-1:-1;;;66638:44:0;;-1:-1:-1;;;;;9019:32:1;;;66638:44:0;;;9001:51:1;9068:18;;;9061:34;;;66541:7:0;;;;66638:16;:22;;;;8974:18:1;;66638:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66613:69;;:15;:69;:::i;:::-;66591:91;;66766:14;;66752:11;:28;66748:72;;;-1:-1:-1;;66798:14:0;;66791:21;;5280:108;5192:7;;;;5350:9;5342:38;;;;-1:-1:-1;;;5342:38:0;;13996:2:1;5342:38:0;;;13978:21:1;14035:2;14015:18;;;14008:30;-1:-1:-1;;;14054:18:1;;;14047:46;14110:18;;5342:38:0;13968:166:1;67222:163:0;67344:35;;-1:-1:-1;;;67344:35:0;;-1:-1:-1;;;;;67344:7:0;:20;;;;:35;;67365:5;;67372:6;;;;67344:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67222:163;;;:::o;63504:1341::-;63660:37;;-1:-1:-1;;;63660:37:0;;;;;14995:25:1;;;63588:7:0;;63701:10;;-1:-1:-1;;;;;63660:22:0;;;;;14968:18:1;;63660:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;63660:51:0;;63644:126;;;;-1:-1:-1;;;63644:126:0;;;;;;;:::i;:::-;63857:72;;-1:-1:-1;;;63857:72:0;;-1:-1:-1;;;;;9019:32:1;;;63857:72:0;;;9001:51:1;9068:18;;;9061:34;;;63816:20:0;;;;63857:16;:29;;;;8974:18:1;;63857:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63815:114;;;;63995:10;63979:100;;;;-1:-1:-1;;;63979:100:0;;12748:2:1;63979:100:0;;;12730:21:1;12787:2;12767:18;;;12760:30;12826:34;12806:18;;;12799:62;12897:26;12877:18;;;12870:54;12941:19;;63979:100:0;12720:246:1;63979:100:0;64131:27;64161:71;64198:5;64212:13;64161:28;:71::i;:::-;64279:49;;-1:-1:-1;;;64279:49:0;;64296:10;64279:49;;;9001:51:1;9068:18;;;9061:34;;;64131:101:0;;-1:-1:-1;64279:8:0;-1:-1:-1;;;;;64279:16:0;;;;8974:18:1;;64279:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64377:24;64404:89;64438:12;64459:5;64473:13;64404:25;:89::i;:::-;64377:116;;64537:8;-1:-1:-1;;;;;64537:16:0;;64554:25;64566:12;64554:11;:25::i;:::-;64537:61;;-1:-1:-1;;;;;;64537:61:0;;;;;;;-1:-1:-1;;;;;9019:32:1;;;64537:61:0;;;9001:51:1;9068:18;;;9061:34;;;8974:18;;64537:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64625:47:0;;-1:-1:-1;;;64625:47:0;;-1:-1:-1;;;;;9019:32:1;;;64625:47:0;;;9001:51:1;9068:18;;;9061:34;;;64625:16:0;:25;;-1:-1:-1;64625:25:0;;-1:-1:-1;8974:18:1;;64625:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64686:125:0;;;16062:25:1;;;-1:-1:-1;;;;;16123:32:1;;16118:2;16103:18;;16096:60;16172:18;;;16165:34;;;16230:2;16215:18;;16208:34;;;16273:3;16258:19;;16251:35;;;64686:125:0;;-1:-1:-1;16049:3:1;16034:19;;-1:-1:-1;64686:125:0;;;;;;;-1:-1:-1;64827:12:0;;63504:1341;-1:-1:-1;;;;;63504:1341:0:o;66978:238::-;67114:34;;-1:-1:-1;;;67114:34:0;;;;;14995:25:1;;;67114:10:0;-1:-1:-1;;;;;67114:24:0;;;;14968:18:1;;67114:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67059:43;;-1:-1:-1;;;67059:43:0;;;;;14995:25:1;;;67059:16:0;-1:-1:-1;;;;;67059:33:0;;;;14968:18:1;;67059:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:89;67043:167;;;;-1:-1:-1;;;67043:167:0;;13173:2:1;67043:167:0;;;13155:21:1;13212:2;13192:18;;;13185:30;13251:34;13231:18;;;13224:62;-1:-1:-1;;;13302:18:1;;;13295:42;13354:19;;67043:167:0;13145:234:1;67043:167:0;66978:238;:::o;65594:489::-;65747:22;;65708:7;;;65841:40;65860:5;65867:13;65841:18;:40::i;:::-;65811:70;;65934:10;65945:1;65934:13;;;;;;-1:-1:-1;;;65934:13:0;;;;;;;;;;;;;;;65951:1;65934:18;65930:69;;;65976:15;;65963:28;;;;:::i;:::-;;;65930:69;66074:2;;66052:14;66064:2;66052:9;:14;:::i;:::-;:19;;;;:::i;:::-;:24;;;;:::i;:::-;66014:34;66027:5;66034:13;66014:12;:34::i;:::-;:63;;;;:::i;:::-;66007:70;65594:489;-1:-1:-1;;;;;65594:489:0:o;5976:120::-;4985:16;:14;:16::i;:::-;6035:7:::1;:15:::0;;-1:-1:-1;;6035:15:0::1;::::0;;6066:22:::1;3478:10:::0;6075:12:::1;6066:22;::::0;-1:-1:-1;;;;;8186:32:1;;;8168:51;;8156:2;8141:18;6066:22:0::1;;;;;;;5976:120::o:0;5717:118::-;4726:19;:17;:19::i;:::-;5787:4:::1;5777:14:::0;;-1:-1:-1;;5777:14:0::1;::::0;::::1;::::0;;5807:20:::1;3478:10:::0;5814:12:::1;3398:98:::0;66089:348;66223:7;66239:26;66358:2;66346;66334;66298:25;66314:8;66298:15;:25::i;:::-;66269:19;;:54;;;;:::i;:::-;66268:68;;;;:::i;:::-;:80;;;;:::i;:::-;:92;;;;:::i;:::-;66239:121;;66413:18;66376:34;66389:5;66396:13;66376:12;:34::i;66858:114::-;66943:23;;-1:-1:-1;;;66943:23:0;;;;;14995:25:1;;;66920:7:0;;66943:5;-1:-1:-1;;;;;66943:13:0;;;;14968:18:1;;66943:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;65342:246::-;65525:57;;-1:-1:-1;;;65525:57:0;;-1:-1:-1;;;;;9371:32:1;;;65525:57:0;;;9353:51:1;9420:18;;;9413:34;;;65577:1:0;9463:18:1;;;9456:34;65580:1:0;9506:18:1;;;9499:34;65446:16:0;;65525:15;:29;;;;;;9325:19:1;;65525:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65525:57:0;;;;;;;;;;;;:::i;5465:108::-;5192:7;;;;5524:41;;;;-1:-1:-1;;;5524:41:0;;11989:2:1;5524:41:0;;;11971:21:1;12028:2;12008:18;;;12001:30;-1:-1:-1;;;12047:18:1;;;12040:50;12107:18;;5524:41:0;11961:170:1;64851:485:0;65188:27;;-1:-1:-1;;;65188:27:0;;;;;16479:25:1;;;65213:1:0;16520:18:1;;;16513:34;64917:7:0;;;;-1:-1:-1;;;;;65188:9:0;:14;;;;16452:18:1;;65188:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65151;;-1:-1:-1;;;65151:27:0;;;;;16479:25:1;;;65176:1:0;16520:18:1;;;16513:34;65151:9:0;-1:-1:-1;;;;;65151:14:0;;;;16452:18:1;;65151:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65114;;-1:-1:-1;;;65114:27:0;;;;;16479:25:1;;;65139:1:0;16520:18:1;;;16513:34;65114:9:0;-1:-1:-1;;;;;65114:14:0;;;;16452:18:1;;65114:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65077;;-1:-1:-1;;;65077:27:0;;;;;16479:25:1;;;65102:1:0;16520:18:1;;;16513:34;65077:9:0;-1:-1:-1;;;;;65077:14:0;;;;16452:18:1;;65077:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65045:22;;-1:-1:-1;;;65045:22:0;;;;;16479:25:1;;;65065:1:0;16520:18:1;;;16513:34;65045:4:0;-1:-1:-1;;;;;65045:9:0;;;;16452:18:1;;65045:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65013;;-1:-1:-1;;;65013:22:0;;;;;16479:25:1;;;65033:1:0;16520:18:1;;;16513:34;65013:4:0;-1:-1:-1;;;;;65013:9:0;;;;16452:18:1;;65013:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64981;;-1:-1:-1;;;64981:22:0;;;;;16479:25:1;;;65001:1:0;16520:18:1;;;16513:34;64981:4:0;-1:-1:-1;;;;;64981:9:0;;;;16452:18:1;;64981:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64949;;-1:-1:-1;;;64949:22:0;;;;;16479:25:1;;;64969:1:0;16520:18:1;;;16513:34;64949:4:0;-1:-1:-1;;;;;64949:9:0;;;;16452:18:1;;64949:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;:86;;;;:::i;:::-;:118;;;;:::i;:::-;:155;;;;:::i;:::-;:192;;;;:::i;:::-;:229;;;;:::i;:::-;:266;;;;:::i;:::-;64933:282;-1:-1:-1;65289:10:0;65285:24;;-1:-1:-1;65308:1:0;;64851:485;-1:-1:-1;;64851:485:0:o;14:391:1:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:2;;164:6;156;149:22;108:2;-1:-1:-1;192:20:1;;235:18;224:30;;221:2;;;274:8;264;257:26;221:2;318:4;310:6;306:17;294:29;;378:3;371:4;361:6;358:1;354:14;346:6;342:27;338:38;335:47;332:2;;;395:1;392;385:12;332:2;98:307;;;;;:::o;410:164::-;486:13;;535;;528:21;518:32;;508:2;;564:1;561;554:12;508:2;467:107;;;:::o;579:257::-;638:6;691:2;679:9;670:7;666:23;662:32;659:2;;;712:6;704;697:22;659:2;756:9;743:23;775:31;800:5;775:31;:::i;841:261::-;911:6;964:2;952:9;943:7;939:23;935:32;932:2;;;985:6;977;970:22;932:2;1022:9;1016:16;1041:31;1066:5;1041:31;:::i;1107:325::-;1175:6;1183;1236:2;1224:9;1215:7;1211:23;1207:32;1204:2;;;1257:6;1249;1242:22;1204:2;1301:9;1288:23;1320:31;1345:5;1320:31;:::i;:::-;1370:5;1422:2;1407:18;;;;1394:32;;-1:-1:-1;;;1194:238:1:o;1437:1155::-;1622:6;1630;1638;1646;1654;1662;1715:2;1703:9;1694:7;1690:23;1686:32;1683:2;;;1736:6;1728;1721:22;1683:2;1781:9;1768:23;1810:18;1851:2;1843:6;1840:14;1837:2;;;1872:6;1864;1857:22;1837:2;1916:70;1978:7;1969:6;1958:9;1954:22;1916:70;:::i;:::-;2005:8;;-1:-1:-1;1890:96:1;-1:-1:-1;2093:2:1;2078:18;;2065:32;;-1:-1:-1;2109:16:1;;;2106:2;;;2143:6;2135;2128:22;2106:2;2187:72;2251:7;2240:8;2229:9;2225:24;2187:72;:::i;:::-;2278:8;;-1:-1:-1;2161:98:1;-1:-1:-1;2366:2:1;2351:18;;2338:32;;-1:-1:-1;2382:16:1;;;2379:2;;;2416:6;2408;2401:22;2379:2;;2460:72;2524:7;2513:8;2502:9;2498:24;2460:72;:::i;:::-;1673:919;;;;-1:-1:-1;1673:919:1;;-1:-1:-1;1673:919:1;;2551:8;;1673:919;-1:-1:-1;;;1673:919:1:o;2597:1481::-;2818:6;2826;2834;2842;2850;2858;2866;2874;2927:3;2915:9;2906:7;2902:23;2898:33;2895:2;;;2949:6;2941;2934:22;2895:2;2994:9;2981:23;3023:18;3064:2;3056:6;3053:14;3050:2;;;3085:6;3077;3070:22;3050:2;3129:70;3191:7;3182:6;3171:9;3167:22;3129:70;:::i;:::-;3218:8;;-1:-1:-1;3103:96:1;-1:-1:-1;3306:2:1;3291:18;;3278:32;;-1:-1:-1;3322:16:1;;;3319:2;;;3356:6;3348;3341:22;3319:2;3400:72;3464:7;3453:8;3442:9;3438:24;3400:72;:::i;:::-;3491:8;;-1:-1:-1;3374:98:1;-1:-1:-1;3579:2:1;3564:18;;3551:32;;-1:-1:-1;3595:16:1;;;3592:2;;;3629:6;3621;3614:22;3592:2;3673:72;3737:7;3726:8;3715:9;3711:24;3673:72;:::i;:::-;3764:8;;-1:-1:-1;3647:98:1;-1:-1:-1;3852:2:1;3837:18;;3824:32;;-1:-1:-1;3868:16:1;;;3865:2;;;3902:6;3894;3887:22;3865:2;;3946:72;4010:7;3999:8;3988:9;3984:24;3946:72;:::i;:::-;2885:1193;;;;-1:-1:-1;2885:1193:1;;-1:-1:-1;2885:1193:1;;;;;;4037:8;-1:-1:-1;;;2885:1193:1:o;4083:1481::-;4304:6;4312;4320;4328;4336;4344;4352;4360;4413:3;4401:9;4392:7;4388:23;4384:33;4381:2;;;4435:6;4427;4420:22;4381:2;4480:9;4467:23;4509:18;4550:2;4542:6;4539:14;4536:2;;;4571:6;4563;4556:22;4536:2;4615:70;4677:7;4668:6;4657:9;4653:22;4615:70;:::i;:::-;4704:8;;-1:-1:-1;4589:96:1;-1:-1:-1;4792:2:1;4777:18;;4764:32;;-1:-1:-1;4808:16:1;;;4805:2;;;4842:6;4834;4827:22;4805:2;4886:72;4950:7;4939:8;4928:9;4924:24;4886:72;:::i;:::-;4977:8;;-1:-1:-1;4860:98:1;-1:-1:-1;5065:2:1;5050:18;;5037:32;;-1:-1:-1;5081:16:1;;;5078:2;;;5115:6;5107;5100:22;5569:1161;5664:6;5695:2;5738;5726:9;5717:7;5713:23;5709:32;5706:2;;;5759:6;5751;5744:22;5706:2;5797:9;5791:16;5826:18;5867:2;5859:6;5856:14;5853:2;;;5888:6;5880;5873:22;5853:2;5931:6;5920:9;5916:22;5906:32;;5976:7;5969:4;5965:2;5961:13;5957:27;5947:2;;6003:6;5995;5988:22;5947:2;6037;6031:9;6059:2;6055;6052:10;6049:2;;;6065:18;;:::i;:::-;6111:2;6108:1;6104:10;6143:2;6137:9;6206:2;6202:7;6197:2;6193;6189:11;6185:25;6177:6;6173:38;6261:6;6249:10;6246:22;6241:2;6229:10;6226:18;6223:46;6220:2;;;6272:18;;:::i;:::-;6308:2;6301:22;6358:18;;;6392:15;;;;-1:-1:-1;6427:11:1;;;6457;;;6453:20;;6450:33;-1:-1:-1;6447:2:1;;;6501:6;6493;6486:22;6447:2;6528:6;6519:15;;6543:156;6557:2;6554:1;6551:9;6543:156;;;6614:10;;6602:23;;6575:1;6568:9;;;;;6645:12;;;;6677;;6543:156;;;-1:-1:-1;6718:6:1;5675:1055;-1:-1:-1;;;;;;;;5675:1055:1:o;6735:212::-;6802:6;6855:2;6843:9;6834:7;6830:23;6826:32;6823:2;;;6876:6;6868;6861:22;6823:2;6904:37;6931:9;6904:37;:::i;6952:190::-;7011:6;7064:2;7052:9;7043:7;7039:23;7035:32;7032:2;;;7085:6;7077;7070:22;7032:2;-1:-1:-1;7113:23:1;;7022:120;-1:-1:-1;7022:120:1:o;7147:194::-;7217:6;7270:2;7258:9;7249:7;7245:23;7241:32;7238:2;;;7291:6;7283;7276:22;7238:2;-1:-1:-1;7319:16:1;;7228:113;-1:-1:-1;7228:113:1:o;7346:393::-;7423:6;7431;7439;7492:2;7480:9;7471:7;7467:23;7463:32;7460:2;;;7513:6;7505;7498:22;7460:2;7554:9;7541:23;7531:33;;7614:2;7603:9;7599:18;7586:32;7627:31;7652:5;7627:31;:::i;:::-;7450:289;;7677:5;;-1:-1:-1;;;7729:2:1;7714:18;;;;7701:32;;7450:289::o;7744:273::-;7820:6;7828;7881:2;7869:9;7860:7;7856:23;7852:32;7849:2;;;7902:6;7894;7887:22;7849:2;7936:9;7930:16;7920:26;;7965:46;8007:2;7996:9;7992:18;7965:46;:::i;:::-;7955:56;;7839:178;;;;;:::o;8230:592::-;-1:-1:-1;;;;;8447:32:1;;8429:51;;8516:2;8511;8496:18;;8489:30;;;8535:18;;8528:34;;;-1:-1:-1;;;;;;8574:31:1;;8571:2;;;8621:4;8615;8608:18;8571:2;8658:6;8655:1;8651:14;8715:6;8707;8702:2;8691:9;8687:18;8674:48;8745:22;;;;8769:2;8741:31;8781:16;;;8741:31;8419:403;-1:-1:-1;;;8419:403:1:o;12136:405::-;12338:2;12320:21;;;12377:2;12357:18;;;12350:30;12416:34;12411:2;12396:18;;12389:62;-1:-1:-1;;;12482:2:1;12467:18;;12460:39;12531:3;12516:19;;12310:231::o;14139:355::-;14341:2;14323:21;;;14380:2;14360:18;;;14353:30;14419:33;14414:2;14399:18;;14392:61;14485:2;14470:18;;14313:181::o;14499:345::-;14701:2;14683:21;;;14740:2;14720:18;;;14713:30;-1:-1:-1;;;14774:2:1;14759:18;;14752:51;14835:2;14820:18;;14673:171::o;17602:557::-;17695:4;17701:6;17761:11;17748:25;17855:2;17851:7;17840:8;17824:14;17820:29;17816:43;17796:18;17792:68;17782:2;;17877:4;17871;17864:18;17782:2;17907:33;;17959:20;;;-1:-1:-1;18002:18:1;17991:30;;17988:2;;;18037:4;18031;18024:18;17988:2;18073:4;18061:17;;-1:-1:-1;18124:1:1;18120:14;;;18104;18100:35;18090:46;;18087:2;;;18149:1;18146;18139:12;18164:128;18204:3;18235:1;18231:6;18228:1;18225:13;18222:2;;;18241:18;;:::i;:::-;-1:-1:-1;18277:9:1;;18212:80::o;18297:217::-;18337:1;18363;18353:2;;-1:-1:-1;;;18388:31:1;;18442:4;18439:1;18432:15;18470:4;18395:1;18460:15;18353:2;-1:-1:-1;18499:9:1;;18343:171::o;18519:168::-;18559:7;18625:1;18621;18617:6;18613:14;18610:1;18607:21;18602:1;18595:9;18588:17;18584:45;18581:2;;;18632:18;;:::i;:::-;-1:-1:-1;18672:9:1;;18571:116::o;18692:125::-;18732:4;18760:1;18757;18754:8;18751:2;;;18765:18;;:::i;:::-;-1:-1:-1;18802:9:1;;18741:76::o;18822:135::-;18861:3;-1:-1:-1;;18882:17:1;;18879:2;;;18902:18;;:::i;:::-;-1:-1:-1;18949:1:1;18938:13;;18869:88::o;18962:127::-;19023:10;19018:3;19014:20;19011:1;19004:31;19054:4;19051:1;19044:15;19078:4;19075:1;19068:15;19094:127;19155:10;19150:3;19146:20;19143:1;19136:31;19186:4;19183:1;19176:15;19210:4;19207:1;19200:15;19226:131;-1:-1:-1;;;;;19301:31:1;;19291:42;;19281:2;;19347:1;19344;19337:12
Metadata Hash
f5bde6e6922879d48dff07e64f6d0c8cc26b5ff774d20fbb1d78210cd956ba53
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.