Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 773 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Settle Current A... | 20145077 | 225 days ago | IN | 0 ETH | 0.00141497 | ||||
Settle Current A... | 18945463 | 393 days ago | IN | 0 ETH | 0.01113431 | ||||
Create Bid | 18902468 | 399 days ago | IN | 0 ETH | 0.00154179 | ||||
Settle Current A... | 18902459 | 399 days ago | IN | 0 ETH | 0.01088477 | ||||
Create Bid | 18409676 | 469 days ago | IN | 0 ETH | 0.00112712 | ||||
Settle Current A... | 18409672 | 469 days ago | IN | 0 ETH | 0.00791683 | ||||
Create Bid | 18206582 | 497 days ago | IN | 0 ETH | 0.00110026 | ||||
Settle Current A... | 18206575 | 497 days ago | IN | 0 ETH | 0.00757401 | ||||
Create Bid | 16880021 | 684 days ago | IN | 0 ETH | 0.00104929 | ||||
Create Bid | 16874237 | 684 days ago | IN | 0 ETH | 0.00146465 | ||||
Settle Current A... | 16874235 | 684 days ago | IN | 0 ETH | 0.00935571 | ||||
Create Bid | 16489527 | 738 days ago | IN | 0 ETH | 0.00103809 | ||||
Create Bid | 16488496 | 738 days ago | IN | 0 ETH | 0.00157749 | ||||
Create Bid | 16488051 | 738 days ago | IN | 0 ETH | 0.00195501 | ||||
Settle Current A... | 16483272 | 739 days ago | IN | 0 ETH | 0.0121793 | ||||
Create Bid | 16483244 | 739 days ago | IN | 0 ETH | 0.00128586 | ||||
Create Bid | 16483234 | 739 days ago | IN | 0 ETH | 0.0014143 | ||||
Create Bid | 16481916 | 739 days ago | IN | 0 ETH | 0.00181178 | ||||
Settle Current A... | 16476077 | 740 days ago | IN | 0 ETH | 0.01330565 | ||||
Create Bid | 16467803 | 741 days ago | IN | 0 ETH | 0.00196543 | ||||
Settle Current A... | 16465888 | 742 days ago | IN | 0 ETH | 0.01288569 | ||||
Create Bid | 16465850 | 742 days ago | IN | 0 ETH | 0.00126754 | ||||
Create Bid | 16465290 | 742 days ago | IN | 0 ETH | 0.00123967 | ||||
Create Bid | 16461529 | 742 days ago | IN | 0 ETH | 0.00190441 | ||||
Settle Current A... | 16458727 | 743 days ago | IN | 0 ETH | 0.01271593 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
AxonsAuctionHouse
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-06 */ // File: contracts/AnonymiceLibrary.sol pragma solidity ^0.8.0; library AnonymiceLibrary { string internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ""; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for { } lt(dataPtr, endPtr) { } { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(input, 0x3F)))) ) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } function parseInt(string memory _a) internal pure returns (uint8 _parsedInt) { bytes memory bresult = bytes(_a); uint8 mint = 0; for (uint8 i = 0; i < bresult.length; i++) { if ( (uint8(uint8(bresult[i])) >= 48) && (uint8(uint8(bresult[i])) <= 57) ) { mint *= 10; mint += uint8(bresult[i]) - 48; } } return mint; } function substring( string memory str, uint256 startIndex, uint256 endIndex ) internal pure returns (string memory) { bytes memory strBytes = bytes(str); bytes memory result = new bytes(endIndex - startIndex); for (uint256 i = startIndex; i < endIndex; i++) { result[i - startIndex] = strBytes[i]; } return string(result); } function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } } // File: contracts/interfaces/IAxonsVoting.sol /// @title Interface for Axons Auction Houses pragma solidity ^0.8.6; interface IAxonsVoting { struct Auction { // ID for the Axon (ERC721 token ID) uint256 axonId; // The current highest bid amount uint256 amount; // The time that the auction started uint256 startTime; // The time that the auction is scheduled to end uint256 endTime; // The address of the current highest bid address payable bidder; // Whether or not the auction has been settled bool settled; } function currentWinnerForAuction(uint256 counter) external view returns (uint256); function setupVoting(uint256 auctionCounter) external; } // File: contracts/interfaces/IAxonsAuctionHouse.sol /// @title Interface for Axons Auction Houses pragma solidity ^0.8.6; interface IAxonsAuctionHouse { struct Auction { // ID for the Axon (ERC721 token ID) uint256 axonId; // The current highest bid amount uint256 amount; // The time that the auction started uint256 startTime; // The time that the auction is scheduled to end uint256 endTime; // The address of the current highest bid address payable bidder; // Whether or not the auction has been settled bool settled; // The auction counter uint256 counter; } event AuctionCreated(uint256 indexed axonId, uint256 startTime, uint256 endTime); event AuctionBid(uint256 indexed axonId, address sender, uint256 value, bool extended); event AuctionExtended(uint256 indexed axonId, uint256 endTime); event AuctionSettled(uint256 indexed axonId, address winner, uint256 amount); event AuctionTimeBufferUpdated(uint256 timeBuffer); event AuctionReservePriceUpdated(uint256 reservePrice); event AuctionMinBidIncrementPercentageUpdated(uint256 minBidIncrementPercentage); function currentAuction() external view returns(IAxonsAuctionHouse.Auction memory); function settleAuction() external; function settleCurrentAndCreateNewAuction() external; function createBid(uint256 axonId, uint256 amount) external; function pause() external; function unpause() external; function setTimeBuffer(uint256 timeBuffer) external; function setReservePrice(uint256 reservePrice) external; function setMinBidIncrementPercentage(uint8 minBidIncrementPercentage) external; } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/interfaces/IAxonsToken.sol /// @title Interface for AxonsToken pragma solidity ^0.8.6; interface IAxonsToken is IERC20 { event Claimed(address account, uint256 amount); function generateReward(address recipient, uint256 amount) external; function isGenesisAddress(address addressToCheck) external view returns(bool); function burn(uint256 amount) external; } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: contracts/interfaces/IAxons.sol /// @title Interface for Axons pragma solidity ^0.8.6; interface IAxons is IERC721Enumerable { event AxonCreated(uint256 indexed tokenId); event AxonBurned(uint256 indexed tokenId); event MinterUpdated(address minter); event MinterLocked(); function mint(uint256 axonId) external returns (uint256); function burn(uint256 tokenId) external; function dataURI(uint256 tokenId) external returns (string memory); function setMinter(address minter) external; function lockMinter() external; } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File: @openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol pragma solidity ^0.8.0; /** * @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 ReentrancyGuardUpgradeable is Initializable { // 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; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _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 make 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; } uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol pragma solidity ^0.8.0; /** * @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 PausableUpgradeable is Initializable, ContextUpgradeable { /** * @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. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { 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()); } uint256[49] private __gap; } // File: @openzeppelin/contracts/utils/math/SafeMath.sol pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: contracts/AxonsAuctionHouse.sol /// @title The Axons auction house // LICENSE // AxonsAuctionHouse.sol is a modified version of NounsAuctionHouse.sol: // https://raw.githubusercontent.com/nounsDAO/nouns-monorepo/master/packages/nouns-contracts/contracts/NounsAuctionHouse.sol // // AuctionHouse.sol source code Copyright Zora licensed under the GPL-3.0 license. // With modifications by Axons. pragma solidity ^0.8.6; contract AxonsAuctionHouse is IAxonsAuctionHouse, PausableUpgradeable, ReentrancyGuardUpgradeable, OwnableUpgradeable { using SafeMath for uint256; // The Axons ERC721 token contract IAxons public axons; // The voting contract IAxonsVoting public axonsVoting; // The address of the AxonToken contract address public axonsToken; // The minimum amount of time left in an auction after a new bid is created uint256 public timeBuffer; // The minimum price accepted in an auction uint256 public reservePrice; // The minimum percentage difference between the last bid amount and the current bid uint8 public minBidIncrementPercentage; // The duration of a single auction uint256 public duration; // Auction counter uint256 public auctionCounter = 0; // The active auction IAxonsAuctionHouse.Auction public auction; /** * @notice Initialize the auction house and base contracts, * populate configuration values, and pause the contract. * @dev This function can only be called once. */ function initialize( IAxons _axons, IAxonsVoting _axonsVoting, address _axonsToken, uint256 _timeBuffer, uint256 _reservePrice, uint8 _minBidIncrementPercentage, uint256 _duration ) external initializer { __Pausable_init(); __ReentrancyGuard_init(); __Ownable_init(); _pause(); axons = _axons; axonsToken = _axonsToken; axonsVoting = _axonsVoting; timeBuffer = _timeBuffer; reservePrice = _reservePrice * 10**18; minBidIncrementPercentage = _minBidIncrementPercentage; duration = _duration; } function currentAuction() external view override returns(IAxonsAuctionHouse.Auction memory) { IAxonsAuctionHouse.Auction memory _auction = auction; return _auction; } /** * @dev Generates a random axon number * @param _a The address to be used within the hash. */ function randomAxonNumber( address _a, uint256 _c ) internal view returns (uint256) { uint256 _rand = uint256( uint256( keccak256( abi.encodePacked( block.timestamp, block.difficulty, _a, _c ) ) ) % 900719925474000 ); return _rand; } /** * @notice Settle the current auction, mint a new Axon, and put it up for auction. */ function settleCurrentAndCreateNewAuction() external override nonReentrant whenNotPaused { IAxonsAuctionHouse.Auction memory _auction = auction; _settleAuction(); uint256 nextAxonNumber = IAxonsVoting(axonsVoting).currentWinnerForAuction(_auction.counter); _createAuction(nextAxonNumber); IAxonsVoting(axonsVoting).setupVoting(_auction.counter+1); } /** * @notice Settle the current auction. * @dev This function can only be called when the contract is paused. */ function settleAuction() external override whenPaused nonReentrant onlyOwner { _settleAuction(); } /** * @notice Create a bid for an Axon, with a given amount. * @dev This contract only accepts payment in $AXON. */ function createBid(uint256 axonId, uint256 amount) external override nonReentrant { IAxonsAuctionHouse.Auction memory _auction = auction; require(_auction.axonId == axonId, 'Axon not up for auction'); require(block.timestamp < _auction.endTime, 'Auction expired'); require(amount >= reservePrice, 'Must send at least reservePrice'); require( amount >= _auction.amount + ((_auction.amount * minBidIncrementPercentage) / 100), 'Must send more than last bid by minBidIncrementPercentage amount' ); address payable lastBidder = _auction.bidder; // Refund the last bidder, if applicable if (lastBidder != address(0)) { IAxonsToken(axonsToken).transferFrom(address(this), lastBidder, _auction.amount); } // We must check the balance that was actually transferred to the auction, // as some tokens impose a transfer fee and would not actually transfer the // full amount to the market, resulting in potentally locked funds IAxonsToken token = IAxonsToken(axonsToken); uint256 beforeBalance = token.balanceOf(address(this)); token.transferFrom(msg.sender, address(this), amount); uint256 afterBalance = token.balanceOf(address(this)); require(beforeBalance.add(amount) == afterBalance, "Token transfer call did not transfer expected amount"); auction.amount = amount; auction.bidder = payable(msg.sender); // Extend the auction if the bid was received within `timeBuffer` of the auction end time bool extended = _auction.endTime - block.timestamp < timeBuffer; if (extended) { auction.endTime = _auction.endTime = block.timestamp + timeBuffer; } emit AuctionBid(_auction.axonId, msg.sender, amount, extended); if (extended) { emit AuctionExtended(_auction.axonId, _auction.endTime); } } /** * @notice Pause the Axons auction house. * @dev This function can only be called by the owner when the * contract is unpaused. While no new auctions can be started when paused, * anyone can settle an ongoing auction. */ function pause() external override onlyOwner { _pause(); } /** * @notice Unpause the Axons auction house. * @dev This function can only be called by the owner when the * contract is paused. If required, this function will start a new auction. */ function unpause() external override onlyOwner { _unpause(); if (auction.startTime == 0 || auction.settled) { _createAuction(randomAxonNumber(address(this),69420)); IAxonsAuctionHouse.Auction memory _auction = auction; IAxonsVoting(axonsVoting).setupVoting(_auction.counter); } } /** * @notice Set the auction time buffer. * @dev Only callable by the owner. */ function setTimeBuffer(uint256 _timeBuffer) external override onlyOwner { timeBuffer = _timeBuffer; emit AuctionTimeBufferUpdated(_timeBuffer); } /** * @notice Set the auction reserve price. * @dev Only callable by the owner. */ function setReservePrice(uint256 _reservePrice) external override onlyOwner { reservePrice = _reservePrice; emit AuctionReservePriceUpdated(_reservePrice); } /** * @notice Set the auction minimum bid increment percentage. * @dev Only callable by the owner. */ function setMinBidIncrementPercentage(uint8 _minBidIncrementPercentage) external override onlyOwner { minBidIncrementPercentage = _minBidIncrementPercentage; emit AuctionMinBidIncrementPercentageUpdated(_minBidIncrementPercentage); } /** * @notice Create an auction. * @dev Store the auction details in the `auction` state variable and emit an AuctionCreated event. * If the mint reverts, the minter was updated without pausing this contract first. To remedy this, * catch the revert and pause this contract. */ function _createAuction(uint256 axonId) internal { try axons.mint(axonId) returns (uint256 tokenId) { uint256 startTime = block.timestamp; uint256 endTime = startTime + duration; auction = Auction({ axonId: tokenId, amount: 0, startTime: startTime, endTime: endTime, bidder: payable(0), settled: false, counter: auctionCounter }); emit AuctionCreated(axonId, startTime, endTime); auctionCounter++; } catch Error(string memory) { _pause(); } } /** * @notice Settle an auction, finalizing the bid and paying out to the owner. * @dev If there are no bids, the Axon is burned. */ function _settleAuction() internal { IAxonsAuctionHouse.Auction memory _auction = auction; require(_auction.startTime != 0, "Auction hasn't begun"); require(!_auction.settled, 'Auction has already been settled'); require(block.timestamp >= _auction.endTime, "Auction hasn't completed"); auction.settled = true; if (_auction.bidder == address(0)) { axons.burn(_auction.axonId); } else { axons.transferFrom(address(this), _auction.bidder, _auction.axonId); } if (_auction.amount > 0) { IAxonsToken(axonsToken).transferFrom(address(this), msg.sender, 1 * 10**18); IAxonsToken(axonsToken).burn(_auction.amount - (1 * 10**18)); } emit AuctionSettled(_auction.axonId, _auction.bidder, _auction.amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"axonId","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bool","name":"extended","type":"bool"}],"name":"AuctionBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"axonId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"AuctionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"axonId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"AuctionExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minBidIncrementPercentage","type":"uint256"}],"name":"AuctionMinBidIncrementPercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reservePrice","type":"uint256"}],"name":"AuctionReservePriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"axonId","type":"uint256"},{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AuctionSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timeBuffer","type":"uint256"}],"name":"AuctionTimeBufferUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"auction","outputs":[{"internalType":"uint256","name":"axonId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"bool","name":"settled","type":"bool"},{"internalType":"uint256","name":"counter","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"axons","outputs":[{"internalType":"contract IAxons","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"axonsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"axonsVoting","outputs":[{"internalType":"contract IAxonsVoting","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"axonId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"createBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentAuction","outputs":[{"components":[{"internalType":"uint256","name":"axonId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"bool","name":"settled","type":"bool"},{"internalType":"uint256","name":"counter","type":"uint256"}],"internalType":"struct IAxonsAuctionHouse.Auction","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IAxons","name":"_axons","type":"address"},{"internalType":"contract IAxonsVoting","name":"_axonsVoting","type":"address"},{"internalType":"address","name":"_axonsToken","type":"address"},{"internalType":"uint256","name":"_timeBuffer","type":"uint256"},{"internalType":"uint256","name":"_reservePrice","type":"uint256"},{"internalType":"uint8","name":"_minBidIncrementPercentage","type":"uint8"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minBidIncrementPercentage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_minBidIncrementPercentage","type":"uint8"}],"name":"setMinBidIncrementPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reservePrice","type":"uint256"}],"name":"setReservePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timeBuffer","type":"uint256"}],"name":"setTimeBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settleAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settleCurrentAndCreateNewAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeBuffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600060d05534801561001557600080fd5b50611e25806100256000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80638456cb59116100c3578063bd4a8efb1161007c578063bd4a8efb14610341578063ce9c7c0d14610354578063db2e1eed14610367578063ec91f2a414610370578063f25efffc14610379578063f2fde38b1461038157600080fd5b80638456cb59146102e55780638da5cb5b146102ed578063a4d0a17e146102fe578063a7e7664414610306578063b296024d1461030f578063b7751c711461032e57600080fd5b80635c975abb116101155780635c975abb1461021a57806360fca2591461023057806370ee4fe3146102435780637120334b14610256578063715018a6146102695780637d9f6db51461027157600080fd5b806307893d48146101525780630fb5a6b41461018257806336ebdb38146101995780633f4ba83a146101ae578063496a698d146101b6575b600080fd5b60cb54610165906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018b60cf5481565b604051908152602001610179565b6101ac6101a7366004611a39565b610394565b005b6101ac610410565b6101be610523565b6040516101799190815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a08083015115159082015260c0918201519181019190915260e00190565b60335460ff166040519015158152602001610179565b6101ac61023e366004611a69565b6105c6565b60c954610165906001600160a01b031681565b6101ac610264366004611ae0565b6106c4565b6101ac610723565b60d15460d25460d35460d45460d55460d6546102a595949392916001600160a01b03811691600160a01b90910460ff169087565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03166080840152151560a083015260c082015260e001610179565b6101ac610757565b6097546001600160a01b0316610165565b6101ac610789565b61018b60d05481565b60ce5461031c9060ff1681565b60405160ff9091168152602001610179565b6101ac61033c366004611af9565b610833565b60ca54610165906001600160a01b031681565b6101ac610362366004611ae0565b610d7c565b61018b60cd5481565b61018b60cc5481565b6101ac610ddb565b6101ac61038f366004611b1b565b610fa2565b6097546001600160a01b031633146103c75760405162461bcd60e51b81526004016103be90611b38565b60405180910390fd5b60ce805460ff191660ff83169081179091556040519081527fec5ccd96cc77b6219e9d44143df916af68fc169339ea7de5008ff15eae13450d906020015b60405180910390a150565b6097546001600160a01b0316331461043a5760405162461bcd60e51b81526004016103be90611b38565b61044261103d565b60d354158061045a575060d554600160a01b900460ff165b156105215761047461046f3062010f2c6110d0565b611145565b6040805160e08101825260d154815260d254602082015260d3548183015260d454606082015260d5546001600160a01b038082166080840152600160a01b90910460ff16151560a083015260d65460c0830181905260ca549351631bcd247760e31b815260048101919091529192169063de6923b890602401600060405180830381600087803b15801561050757600080fd5b505af115801561051b573d6000803e3d6000fd5b50505050505b565b61056e6040518060e001604052806000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001600015158152602001600081525090565b506040805160e08101825260d154815260d254602082015260d3549181019190915260d454606082015260d5546001600160a01b0381166080830152600160a01b900460ff16151560a082015260d65460c082015290565b600054610100900460ff16806105df575060005460ff16155b6105fb5760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff1615801561061d576000805461ffff19166101011790555b6106256112c4565b61062d61133f565b61063561139e565b61063d611405565b60c980546001600160a01b03808b166001600160a01b03199283161790925560cb805489841690831617905560ca8054928a169290911691909117905560cc85905561069184670de0b6b3a7640000611bd1565b60cd5560ce805460ff191660ff851617905560cf82905580156106ba576000805461ff00191690555b5050505050505050565b6097546001600160a01b031633146106ee5760405162461bcd60e51b81526004016103be90611b38565b60cc8190556040518181527f1b55d9f7002bda4490f467e326f22a4a847629c0f2d1ed421607d318d25b410d90602001610405565b6097546001600160a01b0316331461074d5760405162461bcd60e51b81526004016103be90611b38565b6105216000611480565b6097546001600160a01b031633146107815760405162461bcd60e51b81526004016103be90611b38565b610521611405565b60335460ff166107d25760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016103be565b600260655414156107f55760405162461bcd60e51b81526004016103be90611bf0565b60026065556097546001600160a01b031633146108245760405162461bcd60e51b81526004016103be90611b38565b61082c6114d2565b6001606555565b600260655414156108565760405162461bcd60e51b81526004016103be90611bf0565b60026065556040805160e08101825260d15480825260d254602083015260d3549282019290925260d454606082015260d5546001600160a01b0381166080830152600160a01b900460ff16151560a082015260d65460c08201529083146108ff5760405162461bcd60e51b815260206004820152601760248201527f41786f6e206e6f7420757020666f722061756374696f6e00000000000000000060448201526064016103be565b806060015142106109445760405162461bcd60e51b815260206004820152600f60248201526e105d58dd1a5bdb88195e1c1a5c9959608a1b60448201526064016103be565b60cd548210156109965760405162461bcd60e51b815260206004820152601f60248201527f4d7573742073656e64206174206c65617374207265736572766550726963650060448201526064016103be565b60ce5460208201516064916109b09160ff90911690611bd1565b6109ba9190611c3d565b81602001516109c99190611c51565b821015610a40576040805162461bcd60e51b81526020600482015260248101919091527f4d7573742073656e64206d6f7265207468616e206c617374206269642062792060448201527f6d696e426964496e6372656d656e7450657263656e7461676520616d6f756e7460648201526084016103be565b60808101516001600160a01b03811615610ad05760cb5460208301516040516323b872dd60e01b81526001600160a01b03909216916323b872dd91610a8b9130918691600401611c69565b6020604051808303816000875af1158015610aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ace9190611c8d565b505b60cb546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015610b1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b419190611caf565b6040516323b872dd60e01b81529091506001600160a01b038316906323b872dd90610b7490339030908a90600401611c69565b6020604051808303816000875af1158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb79190611c8d565b506040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c239190611caf565b905080610c308388611861565b14610c9a5760405162461bcd60e51b815260206004820152603460248201527f546f6b656e207472616e736665722063616c6c20646964206e6f74207472616e6044820152731cd9995c88195e1c1958dd195908185b5bdd5b9d60621b60648201526084016103be565b60d286905560d580546001600160a01b0319163317905560cc54606086015160009190610cc8904290611cc8565b1090508015610ce95760cc54610cde9042611c51565b6060870181905260d4555b855160408051338152602081018a90528315158183015290517f1159164c56f277e6fc99c11731bd380e0347deb969b75523398734c252706ea39181900360600190a28015610d6d57855160608701516040519081527f6e912a3a9105bdd2af817ba5adc14e6c127c1035b5b648faa29ca0d58ab8ff4e9060200160405180910390a25b50506001606555505050505050565b6097546001600160a01b03163314610da65760405162461bcd60e51b81526004016103be90611b38565b60cd8190556040518181527f6ab2e127d7fdf53b8f304e59d3aab5bfe97979f52a85479691a6fab27a28a6b290602001610405565b60026065541415610dfe5760405162461bcd60e51b81526004016103be90611bf0565b600260655560335460ff1615610e495760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016103be565b6040805160e08101825260d154815260d254602082015260d3549181019190915260d454606082015260d5546001600160a01b0381166080830152600160a01b900460ff16151560a082015260d65460c0820152610ea56114d2565b60ca5460c08201516040516302b70c5360e31b815260048101919091526000916001600160a01b0316906315b8629890602401602060405180830381865afa158015610ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f199190611caf565b9050610f2481611145565b60ca5460c08301516001600160a01b039091169063de6923b890610f49906001611c51565b6040518263ffffffff1660e01b8152600401610f6791815260200190565b600060405180830381600087803b158015610f8157600080fd5b505af1158015610f95573d6000803e3d6000fd5b5050600160655550505050565b6097546001600160a01b03163314610fcc5760405162461bcd60e51b81526004016103be90611b38565b6001600160a01b0381166110315760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103be565b61103a81611480565b50565b60335460ff166110865760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016103be565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60008066033333333332d04244868660405160200161111a9493929190938452602084019290925260601b6bffffffffffffffffffffffff19166040830152605482015260740190565b6040516020818303038152906040528051906020012060001c61113d9190611cdf565b949350505050565b60c95460405163140e25ad60e31b8152600481018390526001600160a01b039091169063a0712d68906024016020604051808303816000875af19250505080156111ac575060408051601f3d908101601f191682019092526111a991810190611caf565b60015b6111f0576111b8611cf3565b806308c379a014156111e457506111cd611d4a565b806111d857506111e6565b6111e0611405565b5050565b505b3d6000803e3d6000fd5b60cf5442906000906112029083611c51565b6040805160e081018252858152600060208201819052818301869052606082018490526080820181905260a0820181905260d05460c090920182905260d187905560d25560d385905560d483905560d580546001600160a81b031916905560d6555190915084907fd6eddd1118d71820909c1197aa966dbc15ed6f508554252169cc3d5ccac756ca906112a19085908590918252602082015260400190565b60405180910390a260d080549060006112b983611dd4565b919050555050505050565b600054610100900460ff16806112dd575060005460ff16155b6112f95760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff1615801561131b576000805461ffff19166101011790555b611323611874565b61132b6118de565b801561103a576000805461ff001916905550565b600054610100900460ff1680611358575060005460ff16155b6113745760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff16158015611396576000805461ffff19166101011790555b61132b611953565b600054610100900460ff16806113b7575060005460ff16155b6113d35760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff161580156113f5576000805461ffff19166101011790555b6113fd611874565b61132b6119c3565b60335460ff161561144b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016103be565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586110b33390565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160e08101825260d154815260d254602082015260d35491810182905260d454606082015260d5546001600160a01b0381166080830152600160a01b900460ff16151560a082015260d65460c0820152906115695760405162461bcd60e51b815260206004820152601460248201527320bab1ba34b7b7103430b9b713ba103132b3bab760611b60448201526064016103be565b8060a00151156115bb5760405162461bcd60e51b815260206004820181905260248201527f41756374696f6e2068617320616c7265616479206265656e20736574746c656460448201526064016103be565b806060015142101561160f5760405162461bcd60e51b815260206004820152601860248201527f41756374696f6e206861736e277420636f6d706c65746564000000000000000060448201526064016103be565b60d5805460ff60a01b1916600160a01b17905560808101516001600160a01b031661169f5760c9548151604051630852cd8d60e31b81526001600160a01b03909216916342966c68916116689160040190815260200190565b600060405180830381600087803b15801561168257600080fd5b505af1158015611696573d6000803e3d6000fd5b50505050611709565b60c954608082015182516040516323b872dd60e01b81526001600160a01b03909316926323b872dd926116d6923092600401611c69565b600060405180830381600087803b1580156116f057600080fd5b505af1158015611704573d6000803e3d6000fd5b505050505b6020810151156118115760cb546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061174f9030903390670de0b6b3a764000090600401611c69565b6020604051808303816000875af115801561176e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117929190611c8d565b5060cb5460208201516001600160a01b03909116906342966c68906117c090670de0b6b3a764000090611cc8565b6040518263ffffffff1660e01b81526004016117de91815260200190565b600060405180830381600087803b1580156117f857600080fd5b505af115801561180c573d6000803e3d6000fd5b505050505b80516080820151602080840151604080516001600160a01b039094168452918301527fc9f72b276a388619c6d185d146697036241880c36654b1a3ffdad07c24038d99910160405180910390a250565b600061186d8284611c51565b9392505050565b600054610100900460ff168061188d575060005460ff16155b6118a95760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff1615801561132b576000805461ffff1916610101179055801561103a576000805461ff001916905550565b600054610100900460ff16806118f7575060005460ff16155b6119135760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff16158015611935576000805461ffff19166101011790555b6033805460ff19169055801561103a576000805461ff001916905550565b600054610100900460ff168061196c575060005460ff16155b6119885760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff161580156119aa576000805461ffff19166101011790555b6001606555801561103a576000805461ff001916905550565b600054610100900460ff16806119dc575060005460ff16155b6119f85760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff16158015611a1a576000805461ffff19166101011790555b61132b33611480565b803560ff81168114611a3457600080fd5b919050565b600060208284031215611a4b57600080fd5b61186d82611a23565b6001600160a01b038116811461103a57600080fd5b600080600080600080600060e0888a031215611a8457600080fd5b8735611a8f81611a54565b96506020880135611a9f81611a54565b95506040880135611aaf81611a54565b94506060880135935060808801359250611acb60a08901611a23565b915060c0880135905092959891949750929550565b600060208284031215611af257600080fd5b5035919050565b60008060408385031215611b0c57600080fd5b50508035926020909101359150565b600060208284031215611b2d57600080fd5b813561186d81611a54565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611beb57611beb611bbb565b500290565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082611c4c57611c4c611c27565b500490565b60008219821115611c6457611c64611bbb565b500190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215611c9f57600080fd5b8151801515811461186d57600080fd5b600060208284031215611cc157600080fd5b5051919050565b600082821015611cda57611cda611bbb565b500390565b600082611cee57611cee611c27565b500690565b600060033d1115611d0c5760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff81118282101715611d4357634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d1015611d585790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611d8857505050505090565b8285019150815181811115611da05750505050505090565b843d8701016020828501011115611dba5750505050505090565b611dc960208286010187611d0f565b509095945050505050565b6000600019821415611de857611de8611bbb565b506001019056fea26469706673582212201a1f178f175fddb42179996db69250efaf8fb1e6d03a522f22263a25b15fc85564736f6c634300080a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80638456cb59116100c3578063bd4a8efb1161007c578063bd4a8efb14610341578063ce9c7c0d14610354578063db2e1eed14610367578063ec91f2a414610370578063f25efffc14610379578063f2fde38b1461038157600080fd5b80638456cb59146102e55780638da5cb5b146102ed578063a4d0a17e146102fe578063a7e7664414610306578063b296024d1461030f578063b7751c711461032e57600080fd5b80635c975abb116101155780635c975abb1461021a57806360fca2591461023057806370ee4fe3146102435780637120334b14610256578063715018a6146102695780637d9f6db51461027157600080fd5b806307893d48146101525780630fb5a6b41461018257806336ebdb38146101995780633f4ba83a146101ae578063496a698d146101b6575b600080fd5b60cb54610165906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018b60cf5481565b604051908152602001610179565b6101ac6101a7366004611a39565b610394565b005b6101ac610410565b6101be610523565b6040516101799190815181526020808301519082015260408083015190820152606080830151908201526080808301516001600160a01b03169082015260a08083015115159082015260c0918201519181019190915260e00190565b60335460ff166040519015158152602001610179565b6101ac61023e366004611a69565b6105c6565b60c954610165906001600160a01b031681565b6101ac610264366004611ae0565b6106c4565b6101ac610723565b60d15460d25460d35460d45460d55460d6546102a595949392916001600160a01b03811691600160a01b90910460ff169087565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03166080840152151560a083015260c082015260e001610179565b6101ac610757565b6097546001600160a01b0316610165565b6101ac610789565b61018b60d05481565b60ce5461031c9060ff1681565b60405160ff9091168152602001610179565b6101ac61033c366004611af9565b610833565b60ca54610165906001600160a01b031681565b6101ac610362366004611ae0565b610d7c565b61018b60cd5481565b61018b60cc5481565b6101ac610ddb565b6101ac61038f366004611b1b565b610fa2565b6097546001600160a01b031633146103c75760405162461bcd60e51b81526004016103be90611b38565b60405180910390fd5b60ce805460ff191660ff83169081179091556040519081527fec5ccd96cc77b6219e9d44143df916af68fc169339ea7de5008ff15eae13450d906020015b60405180910390a150565b6097546001600160a01b0316331461043a5760405162461bcd60e51b81526004016103be90611b38565b61044261103d565b60d354158061045a575060d554600160a01b900460ff165b156105215761047461046f3062010f2c6110d0565b611145565b6040805160e08101825260d154815260d254602082015260d3548183015260d454606082015260d5546001600160a01b038082166080840152600160a01b90910460ff16151560a083015260d65460c0830181905260ca549351631bcd247760e31b815260048101919091529192169063de6923b890602401600060405180830381600087803b15801561050757600080fd5b505af115801561051b573d6000803e3d6000fd5b50505050505b565b61056e6040518060e001604052806000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001600015158152602001600081525090565b506040805160e08101825260d154815260d254602082015260d3549181019190915260d454606082015260d5546001600160a01b0381166080830152600160a01b900460ff16151560a082015260d65460c082015290565b600054610100900460ff16806105df575060005460ff16155b6105fb5760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff1615801561061d576000805461ffff19166101011790555b6106256112c4565b61062d61133f565b61063561139e565b61063d611405565b60c980546001600160a01b03808b166001600160a01b03199283161790925560cb805489841690831617905560ca8054928a169290911691909117905560cc85905561069184670de0b6b3a7640000611bd1565b60cd5560ce805460ff191660ff851617905560cf82905580156106ba576000805461ff00191690555b5050505050505050565b6097546001600160a01b031633146106ee5760405162461bcd60e51b81526004016103be90611b38565b60cc8190556040518181527f1b55d9f7002bda4490f467e326f22a4a847629c0f2d1ed421607d318d25b410d90602001610405565b6097546001600160a01b0316331461074d5760405162461bcd60e51b81526004016103be90611b38565b6105216000611480565b6097546001600160a01b031633146107815760405162461bcd60e51b81526004016103be90611b38565b610521611405565b60335460ff166107d25760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016103be565b600260655414156107f55760405162461bcd60e51b81526004016103be90611bf0565b60026065556097546001600160a01b031633146108245760405162461bcd60e51b81526004016103be90611b38565b61082c6114d2565b6001606555565b600260655414156108565760405162461bcd60e51b81526004016103be90611bf0565b60026065556040805160e08101825260d15480825260d254602083015260d3549282019290925260d454606082015260d5546001600160a01b0381166080830152600160a01b900460ff16151560a082015260d65460c08201529083146108ff5760405162461bcd60e51b815260206004820152601760248201527f41786f6e206e6f7420757020666f722061756374696f6e00000000000000000060448201526064016103be565b806060015142106109445760405162461bcd60e51b815260206004820152600f60248201526e105d58dd1a5bdb88195e1c1a5c9959608a1b60448201526064016103be565b60cd548210156109965760405162461bcd60e51b815260206004820152601f60248201527f4d7573742073656e64206174206c65617374207265736572766550726963650060448201526064016103be565b60ce5460208201516064916109b09160ff90911690611bd1565b6109ba9190611c3d565b81602001516109c99190611c51565b821015610a40576040805162461bcd60e51b81526020600482015260248101919091527f4d7573742073656e64206d6f7265207468616e206c617374206269642062792060448201527f6d696e426964496e6372656d656e7450657263656e7461676520616d6f756e7460648201526084016103be565b60808101516001600160a01b03811615610ad05760cb5460208301516040516323b872dd60e01b81526001600160a01b03909216916323b872dd91610a8b9130918691600401611c69565b6020604051808303816000875af1158015610aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ace9190611c8d565b505b60cb546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015610b1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b419190611caf565b6040516323b872dd60e01b81529091506001600160a01b038316906323b872dd90610b7490339030908a90600401611c69565b6020604051808303816000875af1158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb79190611c8d565b506040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c239190611caf565b905080610c308388611861565b14610c9a5760405162461bcd60e51b815260206004820152603460248201527f546f6b656e207472616e736665722063616c6c20646964206e6f74207472616e6044820152731cd9995c88195e1c1958dd195908185b5bdd5b9d60621b60648201526084016103be565b60d286905560d580546001600160a01b0319163317905560cc54606086015160009190610cc8904290611cc8565b1090508015610ce95760cc54610cde9042611c51565b6060870181905260d4555b855160408051338152602081018a90528315158183015290517f1159164c56f277e6fc99c11731bd380e0347deb969b75523398734c252706ea39181900360600190a28015610d6d57855160608701516040519081527f6e912a3a9105bdd2af817ba5adc14e6c127c1035b5b648faa29ca0d58ab8ff4e9060200160405180910390a25b50506001606555505050505050565b6097546001600160a01b03163314610da65760405162461bcd60e51b81526004016103be90611b38565b60cd8190556040518181527f6ab2e127d7fdf53b8f304e59d3aab5bfe97979f52a85479691a6fab27a28a6b290602001610405565b60026065541415610dfe5760405162461bcd60e51b81526004016103be90611bf0565b600260655560335460ff1615610e495760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016103be565b6040805160e08101825260d154815260d254602082015260d3549181019190915260d454606082015260d5546001600160a01b0381166080830152600160a01b900460ff16151560a082015260d65460c0820152610ea56114d2565b60ca5460c08201516040516302b70c5360e31b815260048101919091526000916001600160a01b0316906315b8629890602401602060405180830381865afa158015610ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f199190611caf565b9050610f2481611145565b60ca5460c08301516001600160a01b039091169063de6923b890610f49906001611c51565b6040518263ffffffff1660e01b8152600401610f6791815260200190565b600060405180830381600087803b158015610f8157600080fd5b505af1158015610f95573d6000803e3d6000fd5b5050600160655550505050565b6097546001600160a01b03163314610fcc5760405162461bcd60e51b81526004016103be90611b38565b6001600160a01b0381166110315760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103be565b61103a81611480565b50565b60335460ff166110865760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016103be565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60008066033333333332d04244868660405160200161111a9493929190938452602084019290925260601b6bffffffffffffffffffffffff19166040830152605482015260740190565b6040516020818303038152906040528051906020012060001c61113d9190611cdf565b949350505050565b60c95460405163140e25ad60e31b8152600481018390526001600160a01b039091169063a0712d68906024016020604051808303816000875af19250505080156111ac575060408051601f3d908101601f191682019092526111a991810190611caf565b60015b6111f0576111b8611cf3565b806308c379a014156111e457506111cd611d4a565b806111d857506111e6565b6111e0611405565b5050565b505b3d6000803e3d6000fd5b60cf5442906000906112029083611c51565b6040805160e081018252858152600060208201819052818301869052606082018490526080820181905260a0820181905260d05460c090920182905260d187905560d25560d385905560d483905560d580546001600160a81b031916905560d6555190915084907fd6eddd1118d71820909c1197aa966dbc15ed6f508554252169cc3d5ccac756ca906112a19085908590918252602082015260400190565b60405180910390a260d080549060006112b983611dd4565b919050555050505050565b600054610100900460ff16806112dd575060005460ff16155b6112f95760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff1615801561131b576000805461ffff19166101011790555b611323611874565b61132b6118de565b801561103a576000805461ff001916905550565b600054610100900460ff1680611358575060005460ff16155b6113745760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff16158015611396576000805461ffff19166101011790555b61132b611953565b600054610100900460ff16806113b7575060005460ff16155b6113d35760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff161580156113f5576000805461ffff19166101011790555b6113fd611874565b61132b6119c3565b60335460ff161561144b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016103be565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586110b33390565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160e08101825260d154815260d254602082015260d35491810182905260d454606082015260d5546001600160a01b0381166080830152600160a01b900460ff16151560a082015260d65460c0820152906115695760405162461bcd60e51b815260206004820152601460248201527320bab1ba34b7b7103430b9b713ba103132b3bab760611b60448201526064016103be565b8060a00151156115bb5760405162461bcd60e51b815260206004820181905260248201527f41756374696f6e2068617320616c7265616479206265656e20736574746c656460448201526064016103be565b806060015142101561160f5760405162461bcd60e51b815260206004820152601860248201527f41756374696f6e206861736e277420636f6d706c65746564000000000000000060448201526064016103be565b60d5805460ff60a01b1916600160a01b17905560808101516001600160a01b031661169f5760c9548151604051630852cd8d60e31b81526001600160a01b03909216916342966c68916116689160040190815260200190565b600060405180830381600087803b15801561168257600080fd5b505af1158015611696573d6000803e3d6000fd5b50505050611709565b60c954608082015182516040516323b872dd60e01b81526001600160a01b03909316926323b872dd926116d6923092600401611c69565b600060405180830381600087803b1580156116f057600080fd5b505af1158015611704573d6000803e3d6000fd5b505050505b6020810151156118115760cb546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061174f9030903390670de0b6b3a764000090600401611c69565b6020604051808303816000875af115801561176e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117929190611c8d565b5060cb5460208201516001600160a01b03909116906342966c68906117c090670de0b6b3a764000090611cc8565b6040518263ffffffff1660e01b81526004016117de91815260200190565b600060405180830381600087803b1580156117f857600080fd5b505af115801561180c573d6000803e3d6000fd5b505050505b80516080820151602080840151604080516001600160a01b039094168452918301527fc9f72b276a388619c6d185d146697036241880c36654b1a3ffdad07c24038d99910160405180910390a250565b600061186d8284611c51565b9392505050565b600054610100900460ff168061188d575060005460ff16155b6118a95760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff1615801561132b576000805461ffff1916610101179055801561103a576000805461ff001916905550565b600054610100900460ff16806118f7575060005460ff16155b6119135760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff16158015611935576000805461ffff19166101011790555b6033805460ff19169055801561103a576000805461ff001916905550565b600054610100900460ff168061196c575060005460ff16155b6119885760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff161580156119aa576000805461ffff19166101011790555b6001606555801561103a576000805461ff001916905550565b600054610100900460ff16806119dc575060005460ff16155b6119f85760405162461bcd60e51b81526004016103be90611b6d565b600054610100900460ff16158015611a1a576000805461ffff19166101011790555b61132b33611480565b803560ff81168114611a3457600080fd5b919050565b600060208284031215611a4b57600080fd5b61186d82611a23565b6001600160a01b038116811461103a57600080fd5b600080600080600080600060e0888a031215611a8457600080fd5b8735611a8f81611a54565b96506020880135611a9f81611a54565b95506040880135611aaf81611a54565b94506060880135935060808801359250611acb60a08901611a23565b915060c0880135905092959891949750929550565b600060208284031215611af257600080fd5b5035919050565b60008060408385031215611b0c57600080fd5b50508035926020909101359150565b600060208284031215611b2d57600080fd5b813561186d81611a54565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611beb57611beb611bbb565b500290565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082611c4c57611c4c611c27565b500490565b60008219821115611c6457611c64611bbb565b500190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215611c9f57600080fd5b8151801515811461186d57600080fd5b600060208284031215611cc157600080fd5b5051919050565b600082821015611cda57611cda611bbb565b500390565b600082611cee57611cee611c27565b500690565b600060033d1115611d0c5760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff81118282101715611d4357634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d1015611d585790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611d8857505050505090565b8285019150815181811115611da05750505050505090565b843d8701016020828501011115611dba5750505050505090565b611dc960208286010187611d0f565b509095945050505050565b6000600019821415611de857611de8611bbb565b506001019056fea26469706673582212201a1f178f175fddb42179996db69250efaf8fb1e6d03a522f22263a25b15fc85564736f6c634300080a0033
Deployed Bytecode Sourcemap
35969:9474:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36315:25;;;;;-1:-1:-1;;;;;36315:25:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;36315:25:0;;;;;;;;36727:23;;;;;;;;;368:25:1;;;356:2;341:18;36727:23:0;222:177:1;43143:258:0;;;;;;:::i;:::-;;:::i;:::-;;42080:352;;;:::i;37776:189::-;;;:::i;:::-;;;;;;965:13:1;;947:32;;1035:4;1023:17;;;1017:24;995:20;;;988:54;1098:4;1086:17;;;1080:24;1058:20;;;1051:54;1161:4;1149:17;;;1143:24;1121:20;;;1114:54;1228:4;1216:17;;;1210:24;-1:-1:-1;;;;;1206:50:1;1184:20;;;1177:80;1244:3;1315:17;;;1309:24;1302:32;1295:40;1273:20;;;1266:70;1392:4;1380:17;;;1374:24;1352:20;;;1345:54;;;;934:3;919:19;;752:653;27326:86:0;27397:7;;;;27326:86;;1575:14:1;;1568:22;1550:41;;1538:2;1523:18;27326:86:0;1410:187:1;37100:668:0;;;;;;:::i;:::-;;:::i;36173:19::-;;;;;-1:-1:-1;;;;;36173:19:0;;;42544:170;;;;;;:::i;:::-;;:::i;25346:94::-;;;:::i;36852:41::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36852:41:0;;;-1:-1:-1;;;36852:41:0;;;;;;;;;;;;3348:25:1;;;3404:2;3389:18;;3382:34;;;;3432:18;;;3425:34;;;;3490:2;3475:18;;3468:34;;;;-1:-1:-1;;;;;3539:32:1;3533:3;3518:19;;3511:61;3616:14;3609:22;3559:3;3588:19;;3581:51;3663:3;3648:19;;3641:35;3335:3;3320:19;36852:41:0;3023:659:1;41784:72:0;;;:::i;24695:87::-;24768:6;;-1:-1:-1;;;;;24768:6:0;24695:87;;39243:112;;;:::i;36783:33::-;;;;;;36639:38;;;;;;;;;;;;3859:4:1;3847:17;;;3829:36;;3817:2;3802:18;36639:38:0;3687:184:1;39502:2015:0;;;;;;:::i;:::-;;:::i;36229:31::-;;;;;-1:-1:-1;;;;;36229:31:0;;;42828:182;;;;;;:::i;:::-;;:::i;36513:27::-;;;;;;36430:25;;;;;;38699:399;;;:::i;25595:192::-;;;;;;:::i;:::-;;:::i;43143:258::-;24768:6;;-1:-1:-1;;;;;24768:6:0;23289:10;24915:23;24907:68;;;;-1:-1:-1;;;24907:68:0;;;;;;;:::i;:::-;;;;;;;;;43254:25:::1;:54:::0;;-1:-1:-1;;43254:54:0::1;;::::0;::::1;::::0;;::::1;::::0;;;43326:67:::1;::::0;3829:36:1;;;43326:67:0::1;::::0;3817:2:1;3802:18;43326:67:0::1;;;;;;;;43143:258:::0;:::o;42080:352::-;24768:6;;-1:-1:-1;;;;;24768:6:0;23289:10;24915:23;24907:68;;;;-1:-1:-1;;;24907:68:0;;;;;;;:::i;:::-;42138:10:::1;:8;:10::i;:::-;42165:17:::0;;:22;;:41:::1;;-1:-1:-1::0;42191:15:0;;-1:-1:-1;;;42191:15:0;::::1;;;42165:41;42161:264;;;42223:53;42238:37;42263:4;42269:5;42238:16;:37::i;:::-;42223:14;:53::i;:::-;42291:52;::::0;;::::1;::::0;::::1;::::0;;42336:7:::1;42291:52:::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42291:52:0;;::::1;::::0;;;;-1:-1:-1;;;42291:52:0;;::::1;;;;;::::0;;;;;;;;;;;;42371:11:::1;::::0;42358:55;;-1:-1:-1;;;42358:55:0;;42291:52:::1;42358:55:::0;::::1;368:25:1::0;;;;42291:52:0;;42371:11:::1;::::0;42358:37:::1;::::0;341:18:1;;42358:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42208:217;42161:264;42080:352::o:0;37776:189::-;37833:33;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37833:33:0;-1:-1:-1;37879:52:0;;;;;;;;37924:7;37879:52;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37879:52:0;;;;;;-1:-1:-1;;;37879:52:0;;;;;;;;;;;;;;;;;37776:189::o;37100:668::-;19066:13;;;;;;;;:30;;-1:-1:-1;19084:12:0;;;;19083:13;19066:30;19058:89;;;;-1:-1:-1;;;19058:89:0;;;;;;;:::i;:::-;19160:19;19183:13;;;;;;19182:14;19207:101;;;;19242:13;:20;;-1:-1:-1;;19277:19:0;;;;;19207:101;37382:17:::1;:15;:17::i;:::-;37410:24;:22;:24::i;:::-;37445:16;:14;:16::i;:::-;37474:8;:6;:8::i;:::-;37495:5;:14:::0;;-1:-1:-1;;;;;37495:14:0;;::::1;-1:-1:-1::0;;;;;;37495:14:0;;::::1;;::::0;;;37520:10:::1;:24:::0;;;;::::1;::::0;;::::1;;::::0;;37555:11:::1;:26:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;37592:10:::1;:24:::0;;;37642:22:::1;:13:::0;37658:6:::1;37642:22;:::i;:::-;37627:12;:37:::0;37675:25:::1;:54:::0;;-1:-1:-1;;37675:54:0::1;;::::0;::::1;;::::0;;37740:8:::1;:20:::0;;;19334:68;;;;19385:5;19369:21;;-1:-1:-1;;19369:21:0;;;19334:68;19047:362;37100:668;;;;;;;:::o;42544:170::-;24768:6;;-1:-1:-1;;;;;24768:6:0;23289:10;24915:23;24907:68;;;;-1:-1:-1;;;24907:68:0;;;;;;;:::i;:::-;42627:10:::1;:24:::0;;;42669:37:::1;::::0;368:25:1;;;42669:37:0::1;::::0;356:2:1;341:18;42669:37:0::1;222:177:1::0;25346:94:0;24768:6;;-1:-1:-1;;;;;24768:6:0;23289:10;24915:23;24907:68;;;;-1:-1:-1;;;24907:68:0;;;;;;;:::i;:::-;25411:21:::1;25429:1;25411:9;:21::i;41784:72::-:0;24768:6;;-1:-1:-1;;;;;24768:6:0;23289:10;24915:23;24907:68;;;;-1:-1:-1;;;24907:68:0;;;;;;;:::i;:::-;41840:8:::1;:6;:8::i;39243:112::-:0;27397:7;;;;27921:41;;;;-1:-1:-1;;;27921:41:0;;6091:2:1;27921:41:0;;;6073:21:1;6130:2;6110:18;;;6103:30;-1:-1:-1;;;6149:18:1;;;6142:50;6209:18;;27921:41:0;5889:344:1;27921:41:0;21216:1:::1;21979:7;;:19;;21971:63;;;;-1:-1:-1::0;;;21971:63:0::1;;;;;;;:::i;:::-;21216:1;22112:7;:18:::0;24768:6;;-1:-1:-1;;;;;24768:6:0;23289:10;24915:23:::2;24907:68;;;;-1:-1:-1::0;;;24907:68:0::2;;;;;;;:::i;:::-;39331:16:::3;:14;:16::i;:::-;21172:1:::1;22291:7;:22:::0;39243:112::o;39502:2015::-;21216:1;21979:7;;:19;;21971:63;;;;-1:-1:-1;;;21971:63:0;;;;;;;:::i;:::-;21216:1;22112:7;:18;39595:52:::1;::::0;;::::1;::::0;::::1;::::0;;39640:7:::1;39595:52:::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39595:52:0;::::1;::::0;;;;-1:-1:-1;;;39595:52:0;::::1;;;;;::::0;;;;;;;;;;;39668:25;::::1;39660:61;;;::::0;-1:-1:-1;;;39660:61:0;;6800:2:1;39660:61:0::1;::::0;::::1;6782:21:1::0;6839:2;6819:18;;;6812:30;6878:25;6858:18;;;6851:53;6921:18;;39660:61:0::1;6598:347:1::0;39660:61:0::1;39758:8;:16;;;39740:15;:34;39732:62;;;::::0;-1:-1:-1;;;39732:62:0;;7152:2:1;39732:62:0::1;::::0;::::1;7134:21:1::0;7191:2;7171:18;;;7164:30;-1:-1:-1;;;7210:18:1;;;7203:45;7265:18;;39732:62:0::1;6950:339:1::0;39732:62:0::1;39823:12;;39813:6;:22;;39805:66;;;::::0;-1:-1:-1;;;39805:66:0;;7496:2:1;39805:66:0::1;::::0;::::1;7478:21:1::0;7535:2;7515:18;;;7508:30;7574:33;7554:18;;;7547:61;7625:18;;39805:66:0::1;7294:355:1::0;39805:66:0::1;39952:25;::::0;39934:15:::1;::::0;::::1;::::0;39981:3:::1;::::0;39934:43:::1;::::0;39952:25:::1;::::0;;::::1;::::0;39934:43:::1;:::i;:::-;39933:51;;;;:::i;:::-;39914:8;:15;;;:71;;;;:::i;:::-;39904:6;:81;;39882:195;;;::::0;;-1:-1:-1;;;39882:195:0;;8246:2:1;39882:195:0::1;::::0;::::1;8228:21:1::0;8265:18;;;8258:30;;;;8324:34;8304:18;;;8297:62;8395:34;8375:18;;;8368:62;8447:19;;39882:195:0::1;8044:428:1::0;39882:195:0::1;40119:15;::::0;::::1;::::0;-1:-1:-1;;;;;40201:24:0;::::1;::::0;40197:137:::1;;40254:10;::::0;40306:15:::1;::::0;::::1;::::0;40242:80:::1;::::0;-1:-1:-1;;;40242:80:0;;-1:-1:-1;;;;;40254:10:0;;::::1;::::0;40242:36:::1;::::0;:80:::1;::::0;40287:4:::1;::::0;40294:10;;40242:80:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40197:137;40631:10;::::0;40677:30:::1;::::0;-1:-1:-1;;;40677:30:0;;40701:4:::1;40677:30;::::0;::::1;160:51:1::0;-1:-1:-1;;;;;40631:10:0;;::::1;::::0;40599:17:::1;::::0;40631:10;;40677:15:::1;::::0;133:18:1;;40677:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40718:53;::::0;-1:-1:-1;;;40718:53:0;;40653:54;;-1:-1:-1;;;;;;40718:18:0;::::1;::::0;::::1;::::0;:53:::1;::::0;40737:10:::1;::::0;40757:4:::1;::::0;40764:6;;40718:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;40805:30:0::1;::::0;-1:-1:-1;;;40805:30:0;;40829:4:::1;40805:30;::::0;::::1;160:51:1::0;40782:20:0::1;::::0;-1:-1:-1;;;;;40805:15:0;::::1;::::0;::::1;::::0;133:18:1;;40805:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40782:53:::0;-1:-1:-1;40782:53:0;40854:25:::1;:13:::0;40872:6;40854:17:::1;:25::i;:::-;:41;40846:106;;;::::0;-1:-1:-1;;;40846:106:0;;9918:2:1;40846:106:0::1;::::0;::::1;9900:21:1::0;9957:2;9937:18;;;9930:30;9996:34;9976:18;;;9969:62;-1:-1:-1;;;10047:18:1;;;10040:50;10107:19;;40846:106:0::1;9716:416:1::0;40846:106:0::1;40965:14:::0;:23;;;40999:14;:36;;-1:-1:-1;;;;;;40999:36:0::1;41024:10;40999:36;::::0;;41200:10:::1;::::0;41163:16:::1;::::0;::::1;::::0;40999:14:::1;::::0;41200:10;41163:34:::1;::::0;41182:15:::1;::::0;41163:34:::1;:::i;:::-;:47;41147:63;;41225:8;41221:106;;;41305:10;::::0;41287:28:::1;::::0;:15:::1;:28;:::i;:::-;41268:16;::::0;::::1;:47:::0;;;41250:15;:65;41221:106:::1;41355:15:::0;;41344:57:::1;::::0;;41372:10:::1;10463:51:1::0;;10545:2;10530:18;;10523:34;;;10600:14;;10593:22;10573:18;;;10566:50;41344:57:0;;::::1;::::0;;;;10451:2:1;41344:57:0;;::::1;41418:8;41414:96;;;41464:15:::0;;41481:16:::1;::::0;::::1;::::0;41448:50:::1;::::0;368:25:1;;;41448:50:0::1;::::0;356:2:1;341:18;41448:50:0::1;;;;;;;41414:96;-1:-1:-1::0;;21172:1:0;22291:7;:22;-1:-1:-1;;;;;;39502:2015:0:o;42828:182::-;24768:6;;-1:-1:-1;;;;;24768:6:0;23289:10;24915:23;24907:68;;;;-1:-1:-1;;;24907:68:0;;;;;;;:::i;:::-;42915:12:::1;:28:::0;;;42961:41:::1;::::0;368:25:1;;;42961:41:0::1;::::0;356:2:1;341:18;42961:41:0::1;222:177:1::0;38699:399:0;21216:1;21979:7;;:19;;21971:63;;;;-1:-1:-1;;;21971:63:0;;;;;;;:::i;:::-;21216:1;22112:7;:18;27397:7;;;;27651:9:::1;27643:38;;;::::0;-1:-1:-1;;;27643:38:0;;10829:2:1;27643:38:0::1;::::0;::::1;10811:21:1::0;10868:2;10848:18;;;10841:30;-1:-1:-1;;;10887:18:1;;;10880:46;10943:18;;27643:38:0::1;10627:340:1::0;27643:38:0::1;38799:52:::2;::::0;;::::2;::::0;::::2;::::0;;38844:7:::2;38799:52:::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38799:52:0;::::2;::::0;;;;-1:-1:-1;;;38799:52:0;::::2;;;;;::::0;;;;;;;;;;38862:16:::2;:14;:16::i;:::-;38927:11;::::0;38964:16:::2;::::0;::::2;::::0;38914:67:::2;::::0;-1:-1:-1;;;38914:67:0;;::::2;::::0;::::2;368:25:1::0;;;;38889:22:0::2;::::0;-1:-1:-1;;;;;38927:11:0::2;::::0;38914:49:::2;::::0;341:18:1;;38914:67:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38889:92;;38992:30;39007:14;38992;:30::i;:::-;39046:11;::::0;39071:16:::2;::::0;::::2;::::0;-1:-1:-1;;;;;39046:11:0;;::::2;::::0;39033:37:::2;::::0;39071:18:::2;::::0;39046:11;39071:18:::2;:::i;:::-;39033:57;;;;;;;;;;;;;368:25:1::0;;356:2;341:18;;222:177;39033:57:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;21172:1:0;22291:7;:22;-1:-1:-1;;;;38699:399:0:o;25595:192::-;24768:6;;-1:-1:-1;;;;;24768:6:0;23289:10;24915:23;24907:68;;;;-1:-1:-1;;;24907:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25684:22:0;::::1;25676:73;;;::::0;-1:-1:-1;;;25676:73:0;;11174:2:1;25676:73:0::1;::::0;::::1;11156:21:1::0;11213:2;11193:18;;;11186:30;11252:34;11232:18;;;11225:62;-1:-1:-1;;;11303:18:1;;;11296:36;11349:19;;25676:73:0::1;10972:402:1::0;25676:73:0::1;25760:19;25770:8;25760:9;:19::i;:::-;25595:192:::0;:::o;28385:120::-;27397:7;;;;27921:41;;;;-1:-1:-1;;;27921:41:0;;6091:2:1;27921:41:0;;;6073:21:1;6130:2;6110:18;;;6103:30;-1:-1:-1;;;6149:18:1;;;6142:50;6209:18;;27921:41:0;5889:344:1;27921:41:0;28444:7:::1;:15:::0;;-1:-1:-1;;28444:15:0::1;::::0;;28475:22:::1;23289:10:::0;28484:12:::1;28475:22;::::0;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;28475:22:0::1;;;;;;;28385:120::o:0;38093:492::-;38191:7;38211:13;38526:15;38350;38392:16;38435:2;38464;38307:182;;;;;;;;;;11592:19:1;;;11636:2;11627:12;;11620:28;;;;11686:2;11682:15;-1:-1:-1;;11678:53:1;11673:2;11664:12;;11657:75;11757:2;11748:12;;11741:28;11794:3;11785:13;;11379:425;38307:182:0;;;;;;;;;;;;;38275:233;;;;;;38249:274;;:292;;;;:::i;:::-;38211:341;38093:492;-1:-1:-1;;;;38093:492:0:o;43722:690::-;43786:5;;:18;;-1:-1:-1;;;43786:18:0;;;;;368:25:1;;;-1:-1:-1;;;;;43786:5:0;;;;:10;;341:18:1;;43786::0;;;;;;;;;;;;;;;;;;;-1:-1:-1;43786:18:0;;;;;;;;-1:-1:-1;;43786:18:0;;;;;;;;;;;;:::i;:::-;;;43782:623;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;44385:8;:6;:8::i;:::-;44343:62;25595:192;:::o;43782:623::-;;;;;;;;;;;43926:8;;43866:15;;43846:17;;43914:20;;43866:15;43914:20;:::i;:::-;43961:272;;;;;;;;;;;-1:-1:-1;43961:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44203:14;;43961:272;;;;;;;43951:7;:282;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43951:282:0;;;;;44255:42;43896:38;;-1:-1:-1;44270:6:0;;44255:42;;;;44061:9;;43896:38;;13311:25:1;;;13367:2;13352:18;;13345:34;13299:2;13284:18;;13137:248;44255:42:0;;;;;;;;44314:14;:16;;;:14;:16;;;:::i;:::-;;;;;;43831:511;;43805:537;43722:690;:::o;26995:131::-;19066:13;;;;;;;;:30;;-1:-1:-1;19084:12:0;;;;19083:13;19066:30;19058:89;;;;-1:-1:-1;;;19058:89:0;;;;;;;:::i;:::-;19160:19;19183:13;;;;;;19182:14;19207:101;;;;19242:13;:20;;-1:-1:-1;;19277:19:0;;;;;19207:101;27054:26:::1;:24;:26::i;:::-;27091:27;:25;:27::i;:::-;19338:14:::0;19334:68;;;19385:5;19369:21;;-1:-1:-1;;19369:21:0;;;19047:362;26995:131::o;21258:108::-;19066:13;;;;;;;;:30;;-1:-1:-1;19084:12:0;;;;19083:13;19066:30;19058:89;;;;-1:-1:-1;;;19058:89:0;;;;;;;:::i;:::-;19160:19;19183:13;;;;;;19182:14;19207:101;;;;19242:13;:20;;-1:-1:-1;;19277:19:0;;;;;19207:101;21324:34:::1;:32;:34::i;24378:129::-:0;19066:13;;;;;;;;:30;;-1:-1:-1;19084:12:0;;;;19083:13;19066:30;19058:89;;;;-1:-1:-1;;;19058:89:0;;;;;;;:::i;:::-;19160:19;19183:13;;;;;;19182:14;19207:101;;;;19242:13;:20;;-1:-1:-1;;19277:19:0;;;;;19207:101;24436:26:::1;:24;:26::i;:::-;24473;:24;:26::i;28126:118::-:0;27397:7;;;;27651:9;27643:38;;;;-1:-1:-1;;;27643:38:0;;10829:2:1;27643:38:0;;;10811:21:1;10868:2;10848:18;;;10841:30;-1:-1:-1;;;10887:18:1;;;10880:46;10943:18;;27643:38:0;10627:340:1;27643:38:0;28186:7:::1;:14:::0;;-1:-1:-1;;28186:14:0::1;28196:4;28186:14;::::0;;28216:20:::1;28223:12;23289:10:::0;;23209:98;25795:173;25870:6;;;-1:-1:-1;;;;;25887:17:0;;;-1:-1:-1;;;;;;25887:17:0;;;;;;;25920:40;;25870:6;;;25887:17;25870:6;;25920:40;;25851:16;;25920:40;25840:128;25795:173;:::o;44576:864::-;44622:52;;;;;;;;44667:7;44622:52;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44622:52:0;;;;;;-1:-1:-1;;;44622:52:0;;;;;;;;;;;;;;;;;44687:56;;;;-1:-1:-1;;;44687:56:0;;13732:2:1;44687:56:0;;;13714:21:1;13771:2;13751:18;;;13744:30;-1:-1:-1;;;13790:18:1;;;13783:50;13850:18;;44687:56:0;13530:344:1;44687:56:0;44763:8;:16;;;44762:17;44754:62;;;;-1:-1:-1;;;44754:62:0;;14081:2:1;44754:62:0;;;14063:21:1;;;14100:18;;;14093:30;14159:34;14139:18;;;14132:62;14211:18;;44754:62:0;13879:356:1;44754:62:0;44854:8;:16;;;44835:15;:35;;44827:72;;;;-1:-1:-1;;;44827:72:0;;14442:2:1;44827:72:0;;;14424:21:1;14481:2;14461:18;;;14454:30;14520:26;14500:18;;;14493:54;14564:18;;44827:72:0;14240:348:1;44827:72:0;44912:15;:22;;-1:-1:-1;;;;44912:22:0;-1:-1:-1;;;44912:22:0;;;44951:15;;;;-1:-1:-1;;;;;44951:29:0;44947:189;;44997:5;;45008:15;;44997:27;;-1:-1:-1;;;44997:27:0;;-1:-1:-1;;;;;44997:5:0;;;;:10;;:27;;;;368:25:1;;;356:2;341:18;;222:177;44997:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44947:189;;;45057:5;;45091:15;;;;45108;;45057:67;;-1:-1:-1;;;45057:67:0;;-1:-1:-1;;;;;45057:5:0;;;;:18;;:67;;45084:4;;45057:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44947:189;45152:15;;;;:19;45148:202;;45200:10;;45188:75;;-1:-1:-1;;;45188:75:0;;-1:-1:-1;;;;;45200:10:0;;;;45188:36;;:75;;45233:4;;45240:10;;45252;;45188:75;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;45290:10:0;;45307:15;;;;-1:-1:-1;;;;;45290:10:0;;;;45278:28;;45307:30;;45326:10;;45307:30;:::i;:::-;45278:60;;;;;;;;;;;;;368:25:1;;356:2;341:18;;222:177;45278:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45148:202;45382:15;;45399;;;;45416;;;;;45367:65;;;-1:-1:-1;;;;;15199:32:1;;;15181:51;;15248:18;;;15241:34;45367:65:0;;15154:18:1;45367:65:0;;;;;;;44611:829;44576:864::o;31336:98::-;31394:7;31421:5;31425:1;31421;:5;:::i;:::-;31414:12;31336:98;-1:-1:-1;;;31336:98:0:o;23138:65::-;19066:13;;;;;;;;:30;;-1:-1:-1;19084:12:0;;;;19083:13;19066:30;19058:89;;;;-1:-1:-1;;;19058:89:0;;;;;;;:::i;:::-;19160:19;19183:13;;;;;;19182:14;19207:101;;;;19242:13;:20;;-1:-1:-1;;19277:19:0;;;;;19334:68;;;;19385:5;19369:21;;-1:-1:-1;;19369:21:0;;;19047:362;23138:65::o;27134:92::-;19066:13;;;;;;;;:30;;-1:-1:-1;19084:12:0;;;;19083:13;19066:30;19058:89;;;;-1:-1:-1;;;19058:89:0;;;;;;;:::i;:::-;19160:19;19183:13;;;;;;19182:14;19207:101;;;;19242:13;:20;;-1:-1:-1;;19277:19:0;;;;;19207:101;27203:7:::1;:15:::0;;-1:-1:-1;;27203:15:0::1;::::0;;19334:68;;;;19385:5;19369:21;;-1:-1:-1;;19369:21:0;;;19047:362;27134:92::o;21374:106::-;19066:13;;;;;;;;:30;;-1:-1:-1;19084:12:0;;;;19083:13;19066:30;19058:89;;;;-1:-1:-1;;;19058:89:0;;;;;;;:::i;:::-;19160:19;19183:13;;;;;;19182:14;19207:101;;;;19242:13;:20;;-1:-1:-1;;19277:19:0;;;;;19207:101;21172:1:::1;21450:7;:22:::0;19334:68;;;;19385:5;19369:21;;-1:-1:-1;;19369:21:0;;;19047:362;21374:106::o;24515:99::-;19066:13;;;;;;;;:30;;-1:-1:-1;19084:12:0;;;;19083:13;19066:30;19058:89;;;;-1:-1:-1;;;19058:89:0;;;;;;;:::i;:::-;19160:19;19183:13;;;;;;19182:14;19207:101;;;;19242:13;:20;;-1:-1:-1;;19277:19:0;;;;;19207:101;24583:23:::1;23289:10:::0;24583:9:::1;:23::i;404:156:1:-:0;470:20;;530:4;519:16;;509:27;;499:55;;550:1;547;540:12;499:55;404:156;;;:::o;565:182::-;622:6;675:2;663:9;654:7;650:23;646:32;643:52;;;691:1;688;681:12;643:52;714:27;731:9;714:27;:::i;1602:139::-;-1:-1:-1;;;;;1685:31:1;;1675:42;;1665:70;;1731:1;1728;1721:12;1746:865;1891:6;1899;1907;1915;1923;1931;1939;1992:3;1980:9;1971:7;1967:23;1963:33;1960:53;;;2009:1;2006;1999:12;1960:53;2048:9;2035:23;2067:39;2100:5;2067:39;:::i;:::-;2125:5;-1:-1:-1;2182:2:1;2167:18;;2154:32;2195:41;2154:32;2195:41;:::i;:::-;2255:7;-1:-1:-1;2314:2:1;2299:18;;2286:32;2327:41;2286:32;2327:41;:::i;:::-;2387:7;-1:-1:-1;2441:2:1;2426:18;;2413:32;;-1:-1:-1;2492:3:1;2477:19;;2464:33;;-1:-1:-1;2516:37:1;2548:3;2533:19;;2516:37;:::i;:::-;2506:47;;2600:3;2589:9;2585:19;2572:33;2562:43;;1746:865;;;;;;;;;;:::o;2838:180::-;2897:6;2950:2;2938:9;2929:7;2925:23;2921:32;2918:52;;;2966:1;2963;2956:12;2918:52;-1:-1:-1;2989:23:1;;2838:180;-1:-1:-1;2838:180:1:o;3876:248::-;3944:6;3952;4005:2;3993:9;3984:7;3980:23;3976:32;3973:52;;;4021:1;4018;4011:12;3973:52;-1:-1:-1;;4044:23:1;;;4114:2;4099:18;;;4086:32;;-1:-1:-1;3876:248:1:o;4357:255::-;4416:6;4469:2;4457:9;4448:7;4444:23;4440:32;4437:52;;;4485:1;4482;4475:12;4437:52;4524:9;4511:23;4543:39;4576:5;4543:39;:::i;4617:356::-;4819:2;4801:21;;;4838:18;;;4831:30;4897:34;4892:2;4877:18;;4870:62;4964:2;4949:18;;4617:356::o;5169:410::-;5371:2;5353:21;;;5410:2;5390:18;;;5383:30;5449:34;5444:2;5429:18;;5422:62;-1:-1:-1;;;5515:2:1;5500:18;;5493:44;5569:3;5554:19;;5169:410::o;5584:127::-;5645:10;5640:3;5636:20;5633:1;5626:31;5676:4;5673:1;5666:15;5700:4;5697:1;5690:15;5716:168;5756:7;5822:1;5818;5814:6;5810:14;5807:1;5804:21;5799:1;5792:9;5785:17;5781:45;5778:71;;;5829:18;;:::i;:::-;-1:-1:-1;5869:9:1;;5716:168::o;6238:355::-;6440:2;6422:21;;;6479:2;6459:18;;;6452:30;6518:33;6513:2;6498:18;;6491:61;6584:2;6569:18;;6238:355::o;7654:127::-;7715:10;7710:3;7706:20;7703:1;7696:31;7746:4;7743:1;7736:15;7770:4;7767:1;7760:15;7786:120;7826:1;7852;7842:35;;7857:18;;:::i;:::-;-1:-1:-1;7891:9:1;;7786:120::o;7911:128::-;7951:3;7982:1;7978:6;7975:1;7972:13;7969:39;;;7988:18;;:::i;:::-;-1:-1:-1;8024:9:1;;7911:128::o;8477:383::-;-1:-1:-1;;;;;8743:15:1;;;8725:34;;8795:15;;;;8790:2;8775:18;;8768:43;8842:2;8827:18;;8820:34;;;;8675:2;8660:18;;8477:383::o;8865:277::-;8932:6;8985:2;8973:9;8964:7;8960:23;8956:32;8953:52;;;9001:1;8998;8991:12;8953:52;9033:9;9027:16;9086:5;9079:13;9072:21;9065:5;9062:32;9052:60;;9108:1;9105;9098:12;9147:184;9217:6;9270:2;9258:9;9249:7;9245:23;9241:32;9238:52;;;9286:1;9283;9276:12;9238:52;-1:-1:-1;9309:16:1;;9147:184;-1:-1:-1;9147:184:1:o;10137:125::-;10177:4;10205:1;10202;10199:8;10196:34;;;10210:18;;:::i;:::-;-1:-1:-1;10247:9:1;;10137:125::o;11809:112::-;11841:1;11867;11857:35;;11872:18;;:::i;:::-;-1:-1:-1;11906:9:1;;11809:112::o;11926:179::-;11961:3;12003:1;11985:16;11982:23;11979:120;;;12049:1;12046;12043;12028:23;-1:-1:-1;12086:1:1;12080:8;12075:3;12071:18;11979:120;11926:179;:::o;12110:346::-;12220:2;12201:13;;-1:-1:-1;;12197:27:1;12185:40;;12255:18;12240:34;;12276:22;;;12237:62;12234:185;;;12341:10;12336:3;12332:20;12329:1;12322:31;12376:4;12373:1;12366:15;12404:4;12401:1;12394:15;12234:185;12435:2;12428:22;-1:-1:-1;;12110:346:1:o;12461:671::-;12500:3;12542:4;12524:16;12521:26;12518:39;;;12461:671;:::o;12518:39::-;12584:2;12578:9;-1:-1:-1;;12649:16:1;12645:25;;12642:1;12578:9;12621:50;12700:4;12694:11;12724:16;12759:18;12830:2;12823:4;12815:6;12811:17;12808:25;12803:2;12795:6;12792:14;12789:45;12786:58;;;12837:5;;;;;12461:671;:::o;12786:58::-;12874:6;12868:4;12864:17;12853:28;;12910:3;12904:10;12937:2;12929:6;12926:14;12923:27;;;12943:5;;;;;;12461:671;:::o;12923:27::-;13027:2;13008:16;13002:4;12998:27;12994:36;12987:4;12978:6;12973:3;12969:16;12965:27;12962:69;12959:82;;;13034:5;;;;;;12461:671;:::o;12959:82::-;13050:57;13101:4;13092:6;13084;13080:19;13076:30;13070:4;13050:57;:::i;:::-;-1:-1:-1;13123:3:1;;12461:671;-1:-1:-1;;;;;12461:671:1:o;13390:135::-;13429:3;-1:-1:-1;;13450:17:1;;13447:43;;;13470:18;;:::i;:::-;-1:-1:-1;13517:1:1;13506:13;;13390:135::o
Swarm Source
ipfs://1a1f178f175fddb42179996db69250efaf8fb1e6d03a522f22263a25b15fc855
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.