Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 10,868 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 19175883 | 329 days ago | IN | 0 ETH | 0.00248377 | ||||
Refund | 19173377 | 329 days ago | IN | 0 ETH | 0.00169872 | ||||
Refund | 19173375 | 329 days ago | IN | 0 ETH | 0.00174029 | ||||
Redeem | 19155112 | 331 days ago | IN | 0 ETH | 0.00164453 | ||||
Refund | 19151658 | 332 days ago | IN | 0 ETH | 0.00073789 | ||||
Redeem | 18965160 | 358 days ago | IN | 0 ETH | 0.0019294 | ||||
Redeem | 18965158 | 358 days ago | IN | 0 ETH | 0.00197139 | ||||
Redeem | 18965158 | 358 days ago | IN | 0 ETH | 0.00197168 | ||||
Redeem | 18965152 | 358 days ago | IN | 0 ETH | 0.00203276 | ||||
Redeem | 18965152 | 358 days ago | IN | 0 ETH | 0.00208899 | ||||
Redeem | 18965151 | 358 days ago | IN | 0 ETH | 0.00182987 | ||||
Redeem | 18965151 | 358 days ago | IN | 0 ETH | 0.00182987 | ||||
Redeem | 18851293 | 374 days ago | IN | 0 ETH | 0.00151016 | ||||
Redeem | 18851290 | 374 days ago | IN | 0 ETH | 0.00154024 | ||||
Draw | 18837394 | 376 days ago | IN | 0 ETH | 0.00329268 | ||||
Draw | 18837392 | 376 days ago | IN | 0 ETH | 0.00302897 | ||||
Create Raffle | 18837390 | 376 days ago | IN | 0 ETH | 0.00266672 | ||||
Create Raffle | 18837388 | 376 days ago | IN | 0 ETH | 0.00288353 | ||||
Draw | 18773702 | 385 days ago | IN | 0 ETH | 0.00482946 | ||||
Create Raffle | 18773699 | 385 days ago | IN | 0 ETH | 0.00403932 | ||||
Refund | 18739600 | 390 days ago | IN | 0 ETH | 0.00210973 | ||||
Redeem | 18688918 | 397 days ago | IN | 0 ETH | 0.00247047 | ||||
Redeem | 18688917 | 397 days ago | IN | 0 ETH | 0.00254025 | ||||
Refund | 18688915 | 397 days ago | IN | 0 ETH | 0.00176732 | ||||
Redeem | 18688912 | 397 days ago | IN | 0 ETH | 0.00244621 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
KaijuMart
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "./interfaces/IKaijuMart.sol"; error KaijuMart_CannotClaimRefund(); error KaijuMart_CannotRedeemAuction(); error KaijuMart_InvalidRedeemerContract(); error KaijuMart_InvalidTokenType(); error KaijuMart_LotAlreadyExists(); error KaijuMart_LotDoesNotExist(); error KaijuMart_MustBeAKing(); /** . :++- *##- +####* -##+ *####- :%######%. -%###* *######: =##########= .######* *#######*-#############*-*#######* *################################* *################################* *################################* *################################* *################################* :*******************************+. .:. *###%*=: .##########+-. +###############=: %##################%+ =###################### -######################++++++++++++++++++=-: =###########################################*: =#############################################. +####%#*+=-:. -#############################################: %############################################################= %############################################################## %##############################################################%=----::. %#######################################################################%: %##########################################+: :+%#######################: *########################################* *####################### -%###################################### %###################### -%###################################% ####################### =###################################- :####################### ....+##################################*. .+######################## +###########################################%*++*%########################## %#########################################################################*. %#######################################################################+ ########################################################################- *#######################################################################- .######################################################################%. :+#################################################################- :=#####################################################:..... :--:.:##############################################+ :: +###############################################%- ####%+-. %##################################################. %#######%*-. :###################################################% %###########%*=*####################################################= %#################################################################### %####################################################################+ %#####################################################################. %#####################################################################% %######################################################################- .+*********************************************************************. * @title KaijuMart * @author Augminted Labs, LLC */ contract KaijuMart is IKaijuMart, AccessControl, ReentrancyGuard { bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE"); KaijuContracts public kaijuContracts; ManagerContracts public managerContracts; mapping(uint256 => Lot) public lots; constructor( KaijuContracts memory _kaijuContracts, ManagerContracts memory _managerContracts, address admin ) { _grantRole(DEFAULT_ADMIN_ROLE, admin); kaijuContracts = _kaijuContracts; managerContracts = _managerContracts; } /** * @notice Modifier that requires a sender to be part of the KaijuKingz ecosystem */ modifier onlyKingz() { if (!isKing(_msgSender())) revert KaijuMart_MustBeAKing(); _; } /** * @notice Modifier that ensures a lot identifier is unused * @param lotId Globally unique identifier for a lot */ modifier reserveLot(uint256 lotId) { if (lots[lotId].lotType != LotType.NONE) revert KaijuMart_LotAlreadyExists(); _; } /** * @notice Modifier that ensures a lot exists * @param lotId Unique identifier for a lot */ modifier lotExists(uint256 lotId) { if (lots[lotId].lotType == LotType.NONE) revert KaijuMart_LotDoesNotExist(); _; } /** * @notice Returns whether or not an address holds any KaijuKingz ecosystem tokens * @param account Address to return the holder status of */ function isKing(address account) public view returns (bool) { return kaijuContracts.scientists.balanceOf(account) > 0 || kaijuContracts.mutants.balanceOf(account) > 0 || kaijuContracts.kaiju.isHolder(account); } /** * @notice Set KaijuKingz contracts * @param _kaijuContracts New set of KaijuKingz contracts */ function setKaijuContracts(KaijuContracts calldata _kaijuContracts) external onlyRole(DEFAULT_ADMIN_ROLE) { kaijuContracts = _kaijuContracts; } /** * @notice Set manager contracts * @param _managerContracts New set of manager contract */ function setManagerContracts(ManagerContracts calldata _managerContracts) external onlyRole(DEFAULT_ADMIN_ROLE) { managerContracts = _managerContracts; } /** * @notice Return the address of the manager contract for a specified lot type * @param lotType Specified lot type */ function _manager(LotType lotType) internal view returns (address) { if (lotType == LotType.RAFFLE) return address(managerContracts.raffle); else if (lotType == LotType.DOORBUSTER) return address(managerContracts.doorbuster); else if (lotType == LotType.AUCTION) return address(managerContracts.auction); else return address(0); } /** * @notice Create a new lot * @param id Unique identifier * @param lot Struct describing lot * @param lotType Sale mechanism of the lot * @param rwastePrice Price in $RWASTE when applicable * @param scalesPrice Price in $SCALES when applicable */ function _create( uint256 id, CreateLot calldata lot, LotType lotType, uint104 rwastePrice, uint104 scalesPrice ) internal { if ( address(lot.redeemer) != address(0) && !lot.redeemer.supportsInterface(type(IKaijuMartRedeemable).interfaceId) ) revert KaijuMart_InvalidRedeemerContract(); lots[id] = Lot({ rwastePrice: rwastePrice, scalesPrice: scalesPrice, lotType: lotType, paymentToken: lot.paymentToken, redeemer: lot.redeemer }); emit Create(id, lotType, _manager(lotType)); } /** * @notice Calculate the cost of a lot based on amount * @param lotId Lot to calculate cost for * @param amount Number of items to purchase * @param token Preferred payment token type */ function _getCost( uint256 lotId, uint32 amount, PaymentToken token ) internal view returns (uint104) { PaymentToken acceptedPaymentToken = lots[lotId].paymentToken; if (acceptedPaymentToken != PaymentToken.EITHER && acceptedPaymentToken != token) revert KaijuMart_InvalidTokenType(); return amount * (token == PaymentToken.SCALES ? lots[lotId].scalesPrice : lots[lotId].rwastePrice); } /** * @notice Charge an account a specified amount of tokens * @dev Payment defaults to $RWASTE if `EITHER` is specified * @param account Address to charge * @param token Preferred payment token * @param value Amount to charge */ function _charge( address account, PaymentToken token, uint104 value ) internal nonReentrant { if (value > 0) { if (token == PaymentToken.SCALES) kaijuContracts.scales.spend(account, value); else kaijuContracts.rwaste.burn(account, value); } } /** * @notice Refund an account a specified amount of tokens * @dev No payment default, if `EITHER` is specified this is a noop * @param account Address to refund * @param token Type of tokens to refund * @param value Amount of tokens to refund */ function _refund( address account, PaymentToken token, uint104 value ) internal nonReentrant { if (token == PaymentToken.RWASTE) kaijuContracts.rwaste.claimLaboratoryExperimentRewards(account, value); else if (token == PaymentToken.SCALES) kaijuContracts.scales.credit(account, value); } /** * @notice Redeem a lot * @param lotId Lot to redeem * @param amount Quantity to redeem * @param to Address redeeming the lot */ function _redeem( uint256 lotId, uint32 amount, address to ) internal nonReentrant { IKaijuMartRedeemable redeemer = lots[lotId].redeemer; if (address(redeemer) != address(0)) { redeemer.kmartRedeem(lotId, amount, to); emit Redeem(lotId, amount, to, redeemer); } } // 📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣 // 📣 AUCTION MANAGER 📣 // 📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣 /** * @notice Return the details of an auction * @param auctionId Lot identifier for the auction */ function getAuction( uint256 auctionId ) public view returns (IAuctionManager.Auction memory) { return managerContracts.auction.get(auctionId); } /** * @notice Return an account's current bid on an auction lot * @param auctionId Lot identifier for the auction * @param account Address to return the current bid of */ function getBid( uint256 auctionId, address account ) public view returns (uint104) { return managerContracts.auction.getBid(auctionId, account); } /** * @notice Create a new auction lot * @param lotId Globally unique lot identifier * @param auction Configuration details of the new auction lot */ function createAuction( uint256 lotId, CreateLot calldata lot, IAuctionManager.CreateAuction calldata auction ) external reserveLot(lotId) onlyRole(MANAGER_ROLE) { if (lot.paymentToken == PaymentToken.EITHER) revert KaijuMart_InvalidTokenType(); _create(lotId, lot, LotType.AUCTION, 0, 0); managerContracts.auction.create(lotId, auction); } /** * @notice Close an auction lot * @param auctionId Lot identifier for the auction * @param lowestWinningBid Lowest amount that is considered a winning bid * @param tiebrokenWinners An array of winning addresses use to tiebreak identical winning bids */ function close( uint256 auctionId, uint104 lowestWinningBid, address[] calldata tiebrokenWinners ) external lotExists(auctionId) onlyRole(MANAGER_ROLE) { managerContracts.auction.close(auctionId, lowestWinningBid, tiebrokenWinners); } /** * @notice Replaces the sender's current bid on an auction lot * @dev Auctions cannot accept `EITHER` PaymentType so we can just assume the token type from the auction details * @param auctionId Lot identifier for the auction * @param value New bid to replace the current bid with */ function bid( uint256 auctionId, uint104 value ) external lotExists(auctionId) onlyKingz { uint104 increase = managerContracts.auction.bid(auctionId, value, _msgSender()); _charge( _msgSender(), lots[auctionId].paymentToken, increase ); emit Bid(auctionId, _msgSender(), value); } /** * @notice Claim a refund for spent tokens on a lost auction lot * @param auctionId Lot identifier for the auction */ function refund( uint256 auctionId ) external lotExists(auctionId) { if (managerContracts.auction.isWinner(auctionId, _msgSender())) revert KaijuMart_CannotClaimRefund(); uint104 refundAmount = managerContracts.auction.settle(auctionId, _msgSender()); _refund( _msgSender(), lots[auctionId].paymentToken, refundAmount ); emit Refund(auctionId, _msgSender(), refundAmount); } /** * @notice Redeem a winning auction lot * @param auctionId Lot identifier for the auction */ function redeem( uint256 auctionId ) external lotExists(auctionId) { if (!managerContracts.auction.isWinner(auctionId, _msgSender())) revert KaijuMart_CannotRedeemAuction(); managerContracts.auction.settle(auctionId, _msgSender()); _redeem(auctionId, 1, _msgSender()); } // 🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟 // 🎟 RAFFLE MANAGER 🎟 // 🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟🎟 /** * @notice Return the details of a raffle * @param raffleId Lot identifier for the raffle */ function getRaffle( uint256 raffleId ) public view returns (IRaffleManager.Raffle memory) { return managerContracts.raffle.get(raffleId); } /** * @notice Create a new raffle lot * @param lotId Globally unique lot identifier * @param raffle Configuration details of the new raffle lot */ function createRaffle( uint256 lotId, CreateLot calldata lot, uint104 rwastePrice, uint104 scalesPrice, IRaffleManager.CreateRaffle calldata raffle ) external reserveLot(lotId) onlyRole(MANAGER_ROLE) { _create(lotId, lot, LotType.RAFFLE, rwastePrice, scalesPrice); managerContracts.raffle.create(lotId, raffle); } /** * @notice Draw the results of a raffle lot * @param raffleId Lot identifier for the raffle * @param vrf Flag indicating if the results should be drawn using Chainlink VRF */ function draw( uint256 raffleId, bool vrf ) external lotExists(raffleId) onlyRole(MANAGER_ROLE) { managerContracts.raffle.draw(raffleId, vrf); } /** * @notice Purchase entry into a raffle lot * @param raffleId Lot identifier for the raffle * @param amount Number of entries to purchase * @param token Preferred payment token */ function enter( uint256 raffleId, uint32 amount, PaymentToken token ) external lotExists(raffleId) onlyKingz { managerContracts.raffle.enter(raffleId, amount); _charge( _msgSender(), token, _getCost(raffleId, amount, token) ); emit Enter(raffleId, _msgSender(), amount); } // 🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒 // 🛒 DOORBUSTER MANAGER 🛒 // 🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒🛒 /** * @notice Return the details of a doorbuster * @param doorbusterId Lot identifier for the doorbuster */ function getDoorbuster( uint256 doorbusterId ) public view returns (IDoorbusterManager.Doorbuster memory) { return managerContracts.doorbuster.get(doorbusterId); } /** * @notice Create a new doorbuster lot * @param lotId Globally unique lot identifier * @param supply Total purchasable supply */ function createDoorbuster( uint256 lotId, CreateLot calldata lot, uint104 rwastePrice, uint104 scalesPrice, uint32 supply ) external reserveLot(lotId) onlyRole(MANAGER_ROLE) { _create(lotId, lot, LotType.DOORBUSTER, rwastePrice, scalesPrice); managerContracts.doorbuster.create(lotId, supply); } /** * @notice Purchase from a doorbuster lot * @param doorbusterId Lot identifier for the doorbuster * @param amount Number of items to purchase * @param token Preferred payment token * @param nonce Single use number encoded into signature * @param signature Signature created by the current doorbuster `signer` account */ function purchase( uint256 doorbusterId, uint32 amount, PaymentToken token, uint256 nonce, bytes calldata signature ) external lotExists(doorbusterId) onlyKingz { managerContracts.doorbuster.purchase(doorbusterId, amount, nonce, signature); _charge( _msgSender(), token, _getCost(doorbusterId, amount, token) ); _redeem(doorbusterId, amount, _msgSender()); emit Purchase(doorbusterId, _msgSender(), amount); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.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 ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "./IKingzInTheShell.sol"; import "./IMutants.sol"; import "./IScientists.sol"; import "./IScales.sol"; import "./IRWaste.sol"; import "./IKaijuMartRedeemable.sol"; import "./IAuctionManager.sol"; import "./IDoorbusterManager.sol"; import "./IRaffleManager.sol"; import "./IKaijuMart.sol"; interface IKaijuMart { enum LotType { NONE, AUCTION, RAFFLE, DOORBUSTER } enum PaymentToken { RWASTE, SCALES, EITHER } struct Lot { uint104 rwastePrice; uint104 scalesPrice; LotType lotType; PaymentToken paymentToken; IKaijuMartRedeemable redeemer; } struct CreateLot { PaymentToken paymentToken; IKaijuMartRedeemable redeemer; } struct KaijuContracts { IKingzInTheShell kaiju; IMutants mutants; IScientists scientists; IRWaste rwaste; IScales scales; } struct ManagerContracts { IAuctionManager auction; IDoorbusterManager doorbuster; IRaffleManager raffle; } event Create( uint256 indexed id, LotType indexed lotType, address indexed managerContract ); event Bid( uint256 indexed id, address indexed account, uint104 value ); event Redeem( uint256 indexed id, uint32 indexed amount, address indexed to, IKaijuMartRedeemable redeemer ); event Refund( uint256 indexed id, address indexed account, uint104 value ); event Purchase( uint256 indexed id, address indexed account, uint64 amount ); event Enter( uint256 indexed id, address indexed account, uint64 amount ); // 🦖👑👶🧬👨🔬👩🔬🧪 function isKing(address account) external view returns (bool); // 💻💻💻💻💻 ADMIN FUNCTIONS 💻💻💻💻💻 function setKaijuContracts(KaijuContracts calldata _kaijuContracts) external; function setManagerContracts(ManagerContracts calldata _managerContracts) external; // 📣📣📣📣📣 AUCTION FUNCTIONS 📣📣📣📣📣 function getAuction(uint256 auctionId) external view returns (IAuctionManager.Auction memory); function getBid(uint256 auctionId, address account) external view returns (uint104); function createAuction( uint256 lotId, CreateLot calldata lot, IAuctionManager.CreateAuction calldata auction ) external; function close( uint256 auctionId, uint104 lowestWinningBid, address[] calldata tiebrokenWinners ) external; function bid(uint256 auctionId, uint104 value) external; function refund(uint256 auctionId) external; function redeem(uint256 auctionId) external; // 🎟🎟🎟🎟🎟 RAFFLE FUNCTIONS 🎟🎟🎟🎟🎟 function getRaffle(uint256 raffleId) external view returns (IRaffleManager.Raffle memory); function createRaffle( uint256 lotId, CreateLot calldata lot, uint104 rwastePrice, uint104 scalesPrice, IRaffleManager.CreateRaffle calldata raffle ) external; function draw(uint256 raffleId, bool vrf) external; function enter(uint256 raffleId, uint32 amount, PaymentToken token) external; // 🛒🛒🛒🛒🛒 DOORBUSTER FUNCTIONS 🛒🛒🛒🛒🛒 function getDoorbuster(uint256 doorbusterId) external view returns (IDoorbusterManager.Doorbuster memory); function createDoorbuster( uint256 lotId, CreateLot calldata lot, uint104 rwastePrice, uint104 scalesPrice, uint32 supply ) external; function purchase( uint256 doorbusterId, uint32 amount, PaymentToken token, uint256 nonce, bytes calldata signature ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; interface IKingzInTheShell is IERC721 { function isHolder(address) external view returns (bool); }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; interface IMutants is IERC721 {}
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; interface IScientists is IERC721 {}
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IScales is IERC20 { function spend(address, uint256) external; function credit(address, uint256) external; }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IRWaste is IERC20 { function burn(address, uint256) external; function claimLaboratoryExperimentRewards(address, uint256) external; }
// SPDX-License-Identifier: Unlicense import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; pragma solidity ^0.8.0; interface IKaijuMartRedeemable is IERC165 { function kmartRedeem(uint256 lotId, uint32 amount, address to) external; }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; interface IAuctionManager { struct CreateAuction { uint104 reservePrice; uint16 winners; uint64 endsAt; } struct Auction { uint104 reservePrice; uint104 lowestWinningBid; uint16 winners; uint64 endsAt; } function get(uint256 id) external view returns (Auction memory); function getBid(uint256 id, address sender) external view returns (uint104); function isWinner(uint256 id, address sender) external view returns (bool); function create(uint256 id, CreateAuction calldata auction) external; function close(uint256 id, uint104 lowestWinningBid, address[] calldata _tiebrokenWinners) external; function bid(uint256 id, uint104 value, address sender) external returns (uint104); function settle(uint256 id, address sender) external returns (uint104); }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; interface IDoorbusterManager { struct Doorbuster { uint32 supply; } function get(uint256 id) external view returns (Doorbuster memory); function create(uint256 id, uint32 supply) external; function purchase( uint256 id, uint32 amount, uint256 nonce, bytes memory signature ) external; }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; interface IRaffleManager { struct CreateRaffle { uint64 scriptId; uint64 winners; uint64 endsAt; } struct Raffle { uint256 seed; uint64 scriptId; uint64 winners; uint64 endsAt; } function get(uint256 id) external view returns (Raffle memory); function isDrawn(uint256 id) external view returns (bool); function create(uint256 id, CreateRaffle calldata raffle) external; function enter(uint256 id, uint32 amount) external; function draw(uint256 id, bool vrf) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"components":[{"internalType":"contract IKingzInTheShell","name":"kaiju","type":"address"},{"internalType":"contract IMutants","name":"mutants","type":"address"},{"internalType":"contract IScientists","name":"scientists","type":"address"},{"internalType":"contract IRWaste","name":"rwaste","type":"address"},{"internalType":"contract IScales","name":"scales","type":"address"}],"internalType":"struct IKaijuMart.KaijuContracts","name":"_kaijuContracts","type":"tuple"},{"components":[{"internalType":"contract IAuctionManager","name":"auction","type":"address"},{"internalType":"contract IDoorbusterManager","name":"doorbuster","type":"address"},{"internalType":"contract IRaffleManager","name":"raffle","type":"address"}],"internalType":"struct IKaijuMart.ManagerContracts","name":"_managerContracts","type":"tuple"},{"internalType":"address","name":"admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"KaijuMart_CannotClaimRefund","type":"error"},{"inputs":[],"name":"KaijuMart_CannotRedeemAuction","type":"error"},{"inputs":[],"name":"KaijuMart_InvalidRedeemerContract","type":"error"},{"inputs":[],"name":"KaijuMart_InvalidTokenType","type":"error"},{"inputs":[],"name":"KaijuMart_LotAlreadyExists","type":"error"},{"inputs":[],"name":"KaijuMart_LotDoesNotExist","type":"error"},{"inputs":[],"name":"KaijuMart_MustBeAKing","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint104","name":"value","type":"uint104"}],"name":"Bid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"enum IKaijuMart.LotType","name":"lotType","type":"uint8"},{"indexed":true,"internalType":"address","name":"managerContract","type":"address"}],"name":"Create","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint64","name":"amount","type":"uint64"}],"name":"Enter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint64","name":"amount","type":"uint64"}],"name":"Purchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"amount","type":"uint32"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"contract IKaijuMartRedeemable","name":"redeemer","type":"address"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint104","name":"value","type":"uint104"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"},{"internalType":"uint104","name":"value","type":"uint104"}],"name":"bid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"},{"internalType":"uint104","name":"lowestWinningBid","type":"uint104"},{"internalType":"address[]","name":"tiebrokenWinners","type":"address[]"}],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lotId","type":"uint256"},{"components":[{"internalType":"enum IKaijuMart.PaymentToken","name":"paymentToken","type":"uint8"},{"internalType":"contract IKaijuMartRedeemable","name":"redeemer","type":"address"}],"internalType":"struct IKaijuMart.CreateLot","name":"lot","type":"tuple"},{"components":[{"internalType":"uint104","name":"reservePrice","type":"uint104"},{"internalType":"uint16","name":"winners","type":"uint16"},{"internalType":"uint64","name":"endsAt","type":"uint64"}],"internalType":"struct IAuctionManager.CreateAuction","name":"auction","type":"tuple"}],"name":"createAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lotId","type":"uint256"},{"components":[{"internalType":"enum IKaijuMart.PaymentToken","name":"paymentToken","type":"uint8"},{"internalType":"contract IKaijuMartRedeemable","name":"redeemer","type":"address"}],"internalType":"struct IKaijuMart.CreateLot","name":"lot","type":"tuple"},{"internalType":"uint104","name":"rwastePrice","type":"uint104"},{"internalType":"uint104","name":"scalesPrice","type":"uint104"},{"internalType":"uint32","name":"supply","type":"uint32"}],"name":"createDoorbuster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lotId","type":"uint256"},{"components":[{"internalType":"enum IKaijuMart.PaymentToken","name":"paymentToken","type":"uint8"},{"internalType":"contract IKaijuMartRedeemable","name":"redeemer","type":"address"}],"internalType":"struct IKaijuMart.CreateLot","name":"lot","type":"tuple"},{"internalType":"uint104","name":"rwastePrice","type":"uint104"},{"internalType":"uint104","name":"scalesPrice","type":"uint104"},{"components":[{"internalType":"uint64","name":"scriptId","type":"uint64"},{"internalType":"uint64","name":"winners","type":"uint64"},{"internalType":"uint64","name":"endsAt","type":"uint64"}],"internalType":"struct IRaffleManager.CreateRaffle","name":"raffle","type":"tuple"}],"name":"createRaffle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"raffleId","type":"uint256"},{"internalType":"bool","name":"vrf","type":"bool"}],"name":"draw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"raffleId","type":"uint256"},{"internalType":"uint32","name":"amount","type":"uint32"},{"internalType":"enum IKaijuMart.PaymentToken","name":"token","type":"uint8"}],"name":"enter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"getAuction","outputs":[{"components":[{"internalType":"uint104","name":"reservePrice","type":"uint104"},{"internalType":"uint104","name":"lowestWinningBid","type":"uint104"},{"internalType":"uint16","name":"winners","type":"uint16"},{"internalType":"uint64","name":"endsAt","type":"uint64"}],"internalType":"struct IAuctionManager.Auction","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"getBid","outputs":[{"internalType":"uint104","name":"","type":"uint104"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"doorbusterId","type":"uint256"}],"name":"getDoorbuster","outputs":[{"components":[{"internalType":"uint32","name":"supply","type":"uint32"}],"internalType":"struct IDoorbusterManager.Doorbuster","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"raffleId","type":"uint256"}],"name":"getRaffle","outputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint64","name":"scriptId","type":"uint64"},{"internalType":"uint64","name":"winners","type":"uint64"},{"internalType":"uint64","name":"endsAt","type":"uint64"}],"internalType":"struct IRaffleManager.Raffle","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isKing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kaijuContracts","outputs":[{"internalType":"contract IKingzInTheShell","name":"kaiju","type":"address"},{"internalType":"contract IMutants","name":"mutants","type":"address"},{"internalType":"contract IScientists","name":"scientists","type":"address"},{"internalType":"contract IRWaste","name":"rwaste","type":"address"},{"internalType":"contract IScales","name":"scales","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lots","outputs":[{"internalType":"uint104","name":"rwastePrice","type":"uint104"},{"internalType":"uint104","name":"scalesPrice","type":"uint104"},{"internalType":"enum IKaijuMart.LotType","name":"lotType","type":"uint8"},{"internalType":"enum IKaijuMart.PaymentToken","name":"paymentToken","type":"uint8"},{"internalType":"contract IKaijuMartRedeemable","name":"redeemer","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerContracts","outputs":[{"internalType":"contract IAuctionManager","name":"auction","type":"address"},{"internalType":"contract IDoorbusterManager","name":"doorbuster","type":"address"},{"internalType":"contract IRaffleManager","name":"raffle","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"doorbusterId","type":"uint256"},{"internalType":"uint32","name":"amount","type":"uint32"},{"internalType":"enum IKaijuMart.PaymentToken","name":"token","type":"uint8"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"purchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"contract IKingzInTheShell","name":"kaiju","type":"address"},{"internalType":"contract IMutants","name":"mutants","type":"address"},{"internalType":"contract IScientists","name":"scientists","type":"address"},{"internalType":"contract IRWaste","name":"rwaste","type":"address"},{"internalType":"contract IScales","name":"scales","type":"address"}],"internalType":"struct IKaijuMart.KaijuContracts","name":"_kaijuContracts","type":"tuple"}],"name":"setKaijuContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"contract IAuctionManager","name":"auction","type":"address"},{"internalType":"contract IDoorbusterManager","name":"doorbuster","type":"address"},{"internalType":"contract IRaffleManager","name":"raffle","type":"address"}],"internalType":"struct IKaijuMart.ManagerContracts","name":"_managerContracts","type":"tuple"}],"name":"setManagerContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005aa038038062005aa0833981810160405281019062000037919062000843565b60018081905550620000536000801b82620002a060201b60201c565b82600260008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505081600760008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050505050620008a1565b620002b282826200039160201b60201c565b6200038d57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000332620003fb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b6000604051905090565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004628262000417565b810181811067ffffffffffffffff8211171562000484576200048362000428565b5b80604052505050565b60006200049962000403565b9050620004a7828262000457565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004d982620004ac565b9050919050565b6000620004ed82620004cc565b9050919050565b620004ff81620004e0565b81146200050b57600080fd5b50565b6000815190506200051f81620004f4565b92915050565b60006200053282620004cc565b9050919050565b620005448162000525565b81146200055057600080fd5b50565b600081519050620005648162000539565b92915050565b60006200057782620004cc565b9050919050565b62000589816200056a565b81146200059557600080fd5b50565b600081519050620005a9816200057e565b92915050565b6000620005bc82620004cc565b9050919050565b620005ce81620005af565b8114620005da57600080fd5b50565b600081519050620005ee81620005c3565b92915050565b60006200060182620004cc565b9050919050565b6200061381620005f4565b81146200061f57600080fd5b50565b600081519050620006338162000608565b92915050565b600060a0828403121562000652576200065162000412565b5b6200065e60a06200048d565b9050600062000670848285016200050e565b6000830152506020620006868482850162000553565b60208301525060406200069c8482850162000598565b6040830152506060620006b284828501620005dd565b6060830152506080620006c88482850162000622565b60808301525092915050565b6000620006e182620004cc565b9050919050565b620006f381620006d4565b8114620006ff57600080fd5b50565b6000815190506200071381620006e8565b92915050565b60006200072682620004cc565b9050919050565b620007388162000719565b81146200074457600080fd5b50565b60008151905062000758816200072d565b92915050565b60006200076b82620004cc565b9050919050565b6200077d816200075e565b81146200078957600080fd5b50565b6000815190506200079d8162000772565b92915050565b600060608284031215620007bc57620007bb62000412565b5b620007c860606200048d565b90506000620007da8482850162000702565b6000830152506020620007f08482850162000747565b602083015250604062000806848285016200078c565b60408301525092915050565b6200081d81620004cc565b81146200082957600080fd5b50565b6000815190506200083d8162000812565b92915050565b6000806000610120848603121562000860576200085f6200040d565b5b6000620008708682870162000639565b93505060a06200088386828701620007a3565b92505061010062000897868287016200082c565b9150509250925092565b6151ef80620008b16000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063926dde7e116100f9578063d547741f11610097578063e4dafec911610071578063e4dafec9146104ed578063eba1b60b1461051d578063ec87621c1461054d578063f1648e841461056b576101c4565b8063d547741f14610499578063db006a75146104b5578063e050a52d146104d1576101c4565b8063ae56f21d116100d3578063ae56f21d14610411578063af4da83914610431578063c91c9cfe1461044d578063d24e0d5d1461047d576101c4565b8063926dde7e146103bb578063a1cfd5e8146103d7578063a217fddf146103f3576101c4565b806336667e2f1161016657806378bd79351161014057806378bd79351461030f57806382069f681461033f57806385ffa4f61461035b57806391d148541461038b576101c4565b806336667e2f146102bb5780634d293ca0146102d757806358096a6c146102f3576101c4565b806324ba223f116101a257806324ba223f1461024b578063278ecde1146102675780632f2ff15d1461028357806336568abe1461029f576101c4565b806301ffc9a7146101c9578063074868c7146101f9578063248a9ca31461021b575b600080fd5b6101e360048036038101906101de919061313b565b61059f565b6040516101f09190613183565b60405180910390f35b610201610619565b6040516102129594939291906132a1565b60405180910390f35b6102356004803603810190610230919061332a565b6106dd565b6040516102429190613366565b60405180910390f35b610265600480360381019061026091906133a5565b6106fc565b005b610281600480360381019061027c9190613408565b61071f565b005b61029d60048036038101906102989190613473565b6109be565b005b6102b960048036038101906102b49190613473565b6109df565b005b6102d560048036038101906102d09190613553565b610a62565b005b6102f160048036038101906102ec91906135f3565b610bb7565b005b61030d600480360381019061030891906136ab565b610d89565b005b61032960048036038101906103249190613408565b610ed3565b60405161033691906137c3565b60405180910390f35b6103596004803603810190610354919061380a565b610f81565b005b61037560048036038101906103709190613408565b6110c5565b6040516103829190613875565b60405180910390f35b6103a560048036038101906103a09190613473565b611173565b6040516103b29190613183565b60405180910390f35b6103d560048036038101906103d091906138af565b6111dd565b005b6103f160048036038101906103ec9190613921565b6113a0565b005b6103fb6114f5565b6040516104089190613366565b60405180910390f35b6104196114fc565b60405161042893929190613a00565b60405180910390f35b61044b60048036038101906104469190613a8d565b611574565b005b61046760048036038101906104629190613b27565b611761565b6040516104749190613183565b60405180910390f35b61049760048036038101906104929190613b73565b611959565b005b6104b360048036038101906104ae9190613473565b61197c565b005b6104cf60048036038101906104ca9190613408565b61199d565b005b6104eb60048036038101906104e69190613ba0565b611bbf565b005b61050760048036038101906105029190613408565b611dc8565b6040516105149190613c44565b60405180910390f35b61053760048036038101906105329190613c5f565b611e76565b6040516105449190613cae565b60405180910390f35b610555611f21565b6040516105629190613366565b60405180910390f35b61058560048036038101906105809190613408565b611f45565b604051610596959493929190613da9565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610612575061061182611fe7565b5b9050919050565b60028060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b6000806000838152602001908152602001600020600101549050919050565b6000801b61070981612051565b81600781816107189190614056565b9050505050565b806000600381111561073457610733613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff16600381111561076a57610769613cc9565b5b036107a1576040517f89f434fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bdd415af836107eb612065565b6040518363ffffffff1660e01b8152600401610808929190614082565b602060405180830381865afa158015610825573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084991906140c0565b15610880576040517f3639ff5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663962d1938846108cc612065565b6040518363ffffffff1660e01b81526004016108e9929190614082565b6020604051808303816000875af1158015610908573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092c9190614102565b9050610963610939612065565b600a6000868152602001908152602001600020600001601b9054906101000a900460ff168361206d565b61096b612065565b73ffffffffffffffffffffffffffffffffffffffff16837fa40ff684c1460a7c45ee0cbf0fb9acf8a630e2f42a69c20fa2691208a96e34e8836040516109b19190613cae565b60405180910390a3505050565b6109c7826106dd565b6109d081612051565b6109da8383612249565b505050565b6109e7612065565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4b906141b2565b60405180910390fd5b610a5e8282612329565b5050565b8460006003811115610a7757610a76613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff166003811115610aad57610aac613cc9565b5b14610ae4576040517f5df8eb1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08610b0e81612051565b610b1c87876003888861240a565b600760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663effab51d88856040518363ffffffff1660e01b8152600401610b7c9291906141e1565b600060405180830381600087803b158015610b9657600080fd5b505af1158015610baa573d6000803e3d6000fd5b5050505050505050505050565b8260006003811115610bcc57610bcb613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff166003811115610c0257610c01613cc9565b5b03610c39576040517f89f434fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c49610c44612065565b611761565b610c7f576040517f6b250b0a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639559840885856040518363ffffffff1660e01b8152600401610cdf9291906141e1565b600060405180830381600087803b158015610cf957600080fd5b505af1158015610d0d573d6000803e3d6000fd5b50505050610d2d610d1c612065565b83610d28878787612771565b6128d6565b610d35612065565b73ffffffffffffffffffffffffffffffffffffffff16847feb49607c28612130e00b61547df43aeee3a36e9dc0bd1e61f3e8232b52c49fe685604051610d7b919061423b565b60405180910390a350505050565b8360006003811115610d9e57610d9d613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff166003811115610dd457610dd3613cc9565b5b03610e0b576040517f89f434fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08610e3581612051565b600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166358096a6c878787876040518563ffffffff1660e01b8152600401610e999493929190614319565b600060405180830381600087803b158015610eb357600080fd5b505af1158015610ec7573d6000803e3d6000fd5b50505050505050505050565b610edb61301c565b600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639507d39a836040518263ffffffff1660e01b8152600401610f399190614359565b608060405180830381865afa158015610f56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7a91906144d5565b9050919050565b8160006003811115610f9657610f95613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff166003811115610fcc57610fcb613cc9565b5b03611003576040517f89f434fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861102d81612051565b600760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166382069f6885856040518363ffffffff1660e01b815260040161108d929190614502565b600060405180830381600087803b1580156110a757600080fd5b505af11580156110bb573d6000803e3d6000fd5b5050505050505050565b6110cd613070565b600760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639507d39a836040518263ffffffff1660e01b815260040161112b9190614359565b602060405180830381865afa158015611148573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116c919061457c565b9050919050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b82600060038111156111f2576111f1613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff16600381111561122857611227613cc9565b5b1461125f576040517f5df8eb1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861128981612051565b60028081111561129c5761129b613cc9565b5b8460000160208101906112af91906145a9565b60028111156112c1576112c0613cc9565b5b036112f8576040517f427b76e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113078585600160008061240a565b600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387e193c486856040518363ffffffff1660e01b815260040161136792919061469f565b600060405180830381600087803b15801561138157600080fd5b505af1158015611395573d6000803e3d6000fd5b505050505050505050565b84600060038111156113b5576113b4613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff1660038111156113eb576113ea613cc9565b5b14611422576040517f5df8eb1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861144c81612051565b61145a87876002888861240a565b600760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b5e0ae388856040518363ffffffff1660e01b81526004016114ba929190614722565b600060405180830381600087803b1580156114d457600080fd5b505af11580156114e8573d6000803e3d6000fd5b5050505050505050505050565b6000801b81565b60078060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b856000600381111561158957611588613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff1660038111156115bf576115be613cc9565b5b036115f6576040517f89f434fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611606611601612065565b611761565b61163c576040517f6b250b0a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f0bdfc488888787876040518663ffffffff1660e01b81526004016116a2959493929190614798565b600060405180830381600087803b1580156116bc57600080fd5b505af11580156116d0573d6000803e3d6000fd5b505050506116f06116df612065565b866116eb8a8a8a612771565b6128d6565b61170287876116fd612065565b612a9e565b61170a612065565b73ffffffffffffffffffffffffffffffffffffffff16877fd409be915a21896abe80da3c45f50d7c2c1ed84b49387ce67bfc33f0f4f42aa288604051611750919061423b565b60405180910390a350505050505050565b6000806002800160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016117c191906147e6565b602060405180830381865afa1580156117de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118029190614816565b11806118ac57506000600260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161186991906147e6565b602060405180830381865afa158015611886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118aa9190614816565b115b806119525750600260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d4d7b19a836040518263ffffffff1660e01b815260040161191091906147e6565b602060405180830381865afa15801561192d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195191906140c0565b5b9050919050565b6000801b61196681612051565b81600281816119759190614bbc565b9050505050565b611985826106dd565b61198e81612051565b6119988383612329565b505050565b80600060038111156119b2576119b1613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff1660038111156119e8576119e7613cc9565b5b03611a1f576040517f89f434fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bdd415af83611a69612065565b6040518363ffffffff1660e01b8152600401611a86929190614082565b602060405180830381865afa158015611aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac791906140c0565b611afd576040517fa43a60a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663962d193883611b47612065565b6040518363ffffffff1660e01b8152600401611b64929190614082565b6020604051808303816000875af1158015611b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba79190614102565b50611bbb826001611bb6612065565b612a9e565b5050565b8160006003811115611bd457611bd3613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff166003811115611c0a57611c09613cc9565b5b03611c41576040517f89f434fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c51611c4c612065565b611761565b611c87576040517f6b250b0a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632c7917928585611cd4612065565b6040518463ffffffff1660e01b8152600401611cf293929190614bca565b6020604051808303816000875af1158015611d11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d359190614102565b9050611d6c611d42612065565b600a6000878152602001908152602001600020600001601b9054906101000a900460ff16836128d6565b611d74612065565b73ffffffffffffffffffffffffffffffffffffffff16847ff5f85a03080c51311bcb72afaec718b95d023da3ca02828b1f23e30c4e42eaf685604051611dba9190613cae565b60405180910390a350505050565b611dd0613089565b600760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639507d39a836040518263ffffffff1660e01b8152600401611e2e9190614359565b608060405180830381865afa158015611e4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6f9190614c79565b9050919050565b6000600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eba1b60b84846040518363ffffffff1660e01b8152600401611ed8929190614082565b602060405180830381865afa158015611ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f199190614102565b905092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0881565b600a6020528060005260406000206000915090508060000160009054906101000a90046cffffffffffffffffffffffffff169080600001600d9054906101000a90046cffffffffffffffffffffffffff169080600001601a9054906101000a900460ff169080600001601b9054906101000a900460ff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6120628161205d612065565b612c2d565b50565b600033905090565b6002600154036120b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a990614cf2565b60405180910390fd5b6002600181905550600060028111156120ce576120cd613cc9565b5b8260028111156120e1576120e0613cc9565b5b0361217d57600260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633de230c384836040518363ffffffff1660e01b8152600401612146929190614d43565b600060405180830381600087803b15801561216057600080fd5b505af1158015612174573d6000803e3d6000fd5b5050505061223d565b6001600281111561219157612190613cc9565b5b8260028111156121a4576121a3613cc9565b5b0361223c57600260040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ef6506db84836040518363ffffffff1660e01b8152600401612209929190614d43565b600060405180830381600087803b15801561222357600080fd5b505af1158015612237573d6000803e3d6000fd5b505050505b5b60018081905550505050565b6122538282611173565b61232557600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506122ca612065565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6123338282611173565b1561240657600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506123ab612065565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168460200160208101906124359190614daa565b73ffffffffffffffffffffffffffffffffffffffff161415801561250257508360200160208101906124679190614daa565b73ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f067d6690000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016124bf9190614de6565b602060405180830381865afa1580156124dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250091906140c0565b155b15612539576040517fcdd7951a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060a00160405280836cffffffffffffffffffffffffff168152602001826cffffffffffffffffffffffffff16815260200184600381111561258157612580613cc9565b5b815260200185600001602081019061259991906145a9565b60028111156125ab576125aa613cc9565b5b81526020018560200160208101906125c39190614daa565b73ffffffffffffffffffffffffffffffffffffffff16815250600a600087815260200190815260200160002060008201518160000160006101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff160217905550602082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff160217905550604082015181600001601a6101000a81548160ff0219169083600381111561268c5761268b613cc9565b5b0217905550606082015181600001601b6101000a81548160ff021916908360028111156126bc576126bb613cc9565b5b021790555060808201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505061271483612cca565b73ffffffffffffffffffffffffffffffffffffffff1683600381111561273d5761273c613cc9565b5b867f43e6fe5ab208b61e1738d308954c5088333e4739034eb0dd1ffc60ebc0b1726460405160405180910390a45050505050565b600080600a6000868152602001908152602001600020600001601b9054906101000a900460ff1690506002808111156127ad576127ac613cc9565b5b8160028111156127c0576127bf613cc9565b5b141580156127f257508260028111156127dc576127db613cc9565b5b8160028111156127ef576127ee613cc9565b5b14155b15612829576040517f427b76e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600281111561283d5761283c613cc9565b5b8360028111156128505761284f613cc9565b5b1461288a57600a600086815260200190815260200160002060000160009054906101000a90046cffffffffffffffffffffffffff166128bb565b600a6000868152602001908152602001600020600001600d9054906101000a90046cffffffffffffffffffffffffff165b8463ffffffff166128cc9190614e30565b9150509392505050565b60026001540361291b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291290614cf2565b60405180910390fd5b60026001819055506000816cffffffffffffffffffffffffff161115612a92576001600281111561294f5761294e613cc9565b5b82600281111561296257612961613cc9565b5b036129fe57600260040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af7d6ca384836040518363ffffffff1660e01b81526004016129c7929190614d43565b600060405180830381600087803b1580156129e157600080fd5b505af11580156129f5573d6000803e3d6000fd5b50505050612a91565b600260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac84836040518363ffffffff1660e01b8152600401612a5e929190614d43565b600060405180830381600087803b158015612a7857600080fd5b505af1158015612a8c573d6000803e3d6000fd5b505050505b5b60018081905550505050565b600260015403612ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ada90614cf2565b60405180910390fd5b60026001819055506000600a600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c20578073ffffffffffffffffffffffffffffffffffffffff1663067d66908585856040518463ffffffff1660e01b8152600401612b9793929190614e77565b600060405180830381600087803b158015612bb157600080fd5b505af1158015612bc5573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff168363ffffffff16857f4a6e1acb18ad09dff0fabcf867fa6ce6ea262992495d6b5b3286921445f89eb384604051612c179190614eae565b60405180910390a45b5060018081905550505050565b612c378282611173565b612cc657612c5c8173ffffffffffffffffffffffffffffffffffffffff166014612de0565b612c6a8360001c6020612de0565b604051602001612c7b929190614fd2565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbd9190615045565b60405180910390fd5b5050565b600060026003811115612ce057612cdf613cc9565b5b826003811115612cf357612cf2613cc9565b5b03612d2557600760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612ddb565b600380811115612d3857612d37613cc9565b5b826003811115612d4b57612d4a613cc9565b5b03612d7d57600760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612ddb565b60016003811115612d9157612d90613cc9565b5b826003811115612da457612da3613cc9565b5b03612dd657600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612ddb565b600090505b919050565b606060006002836002612df39190615067565b612dfd91906150c1565b67ffffffffffffffff811115612e1657612e1561438a565b5b6040519080825280601f01601f191660200182016040528015612e485781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612e8057612e7f6150f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612ee457612ee36150f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612f249190615067565b612f2e91906150c1565b90505b6001811115612fce577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612f7057612f6f6150f5565b5b1a60f81b828281518110612f8757612f866150f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612fc790615124565b9050612f31565b5060008414613012576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300990615199565b60405180910390fd5b8091505092915050565b604051806080016040528060006cffffffffffffffffffffffffff16815260200160006cffffffffffffffffffffffffff168152602001600061ffff168152602001600067ffffffffffffffff1681525090565b6040518060200160405280600063ffffffff1681525090565b604051806080016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613118816130e3565b811461312357600080fd5b50565b6000813590506131358161310f565b92915050565b600060208284031215613151576131506130d9565b5b600061315f84828501613126565b91505092915050565b60008115159050919050565b61317d81613168565b82525050565b60006020820190506131986000830184613174565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006131e36131de6131d98461319e565b6131be565b61319e565b9050919050565b60006131f5826131c8565b9050919050565b6000613207826131ea565b9050919050565b613217816131fc565b82525050565b6000613228826131ea565b9050919050565b6132388161321d565b82525050565b6000613249826131ea565b9050919050565b6132598161323e565b82525050565b600061326a826131ea565b9050919050565b61327a8161325f565b82525050565b600061328b826131ea565b9050919050565b61329b81613280565b82525050565b600060a0820190506132b6600083018861320e565b6132c3602083018761322f565b6132d06040830186613250565b6132dd6060830185613271565b6132ea6080830184613292565b9695505050505050565b6000819050919050565b613307816132f4565b811461331257600080fd5b50565b600081359050613324816132fe565b92915050565b6000602082840312156133405761333f6130d9565b5b600061334e84828501613315565b91505092915050565b613360816132f4565b82525050565b600060208201905061337b6000830184613357565b92915050565b600080fd5b60006060828403121561339c5761339b613381565b5b81905092915050565b6000606082840312156133bb576133ba6130d9565b5b60006133c984828501613386565b91505092915050565b6000819050919050565b6133e5816133d2565b81146133f057600080fd5b50565b600081359050613402816133dc565b92915050565b60006020828403121561341e5761341d6130d9565b5b600061342c848285016133f3565b91505092915050565b60006134408261319e565b9050919050565b61345081613435565b811461345b57600080fd5b50565b60008135905061346d81613447565b92915050565b6000806040838503121561348a576134896130d9565b5b600061349885828601613315565b92505060206134a98582860161345e565b9150509250929050565b6000604082840312156134c9576134c8613381565b5b81905092915050565b60006cffffffffffffffffffffffffff82169050919050565b6134f4816134d2565b81146134ff57600080fd5b50565b600081359050613511816134eb565b92915050565b600063ffffffff82169050919050565b61353081613517565b811461353b57600080fd5b50565b60008135905061354d81613527565b92915050565b600080600080600060c0868803121561356f5761356e6130d9565b5b600061357d888289016133f3565b955050602061358e888289016134b3565b945050606061359f88828901613502565b93505060806135b088828901613502565b92505060a06135c18882890161353e565b9150509295509295909350565b600381106135db57600080fd5b50565b6000813590506135ed816135ce565b92915050565b60008060006060848603121561360c5761360b6130d9565b5b600061361a868287016133f3565b935050602061362b8682870161353e565b925050604061363c868287016135de565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261366b5761366a613646565b5b8235905067ffffffffffffffff8111156136885761368761364b565b5b6020830191508360208202830111156136a4576136a3613650565b5b9250929050565b600080600080606085870312156136c5576136c46130d9565b5b60006136d3878288016133f3565b94505060206136e487828801613502565b935050604085013567ffffffffffffffff811115613705576137046130de565b5b61371187828801613655565b925092505092959194509250565b613728816134d2565b82525050565b600061ffff82169050919050565b6137458161372e565b82525050565b600067ffffffffffffffff82169050919050565b6137688161374b565b82525050565b608082016000820151613784600085018261371f565b506020820151613797602085018261371f565b5060408201516137aa604085018261373c565b5060608201516137bd606085018261375f565b50505050565b60006080820190506137d8600083018461376e565b92915050565b6137e781613168565b81146137f257600080fd5b50565b600081359050613804816137de565b92915050565b60008060408385031215613821576138206130d9565b5b600061382f858286016133f3565b9250506020613840858286016137f5565b9150509250929050565b61385381613517565b82525050565b60208201600082015161386f600085018261384a565b50505050565b600060208201905061388a6000830184613859565b92915050565b6000606082840312156138a6576138a5613381565b5b81905092915050565b600080600060c084860312156138c8576138c76130d9565b5b60006138d6868287016133f3565b93505060206138e7868287016134b3565b92505060606138f886828701613890565b9150509250925092565b60006060828403121561391857613917613381565b5b81905092915050565b6000806000806000610100868803121561393e5761393d6130d9565b5b600061394c888289016133f3565b955050602061395d888289016134b3565b945050606061396e88828901613502565b935050608061397f88828901613502565b92505060a061399088828901613902565b9150509295509295909350565b60006139a8826131ea565b9050919050565b6139b88161399d565b82525050565b60006139c9826131ea565b9050919050565b6139d9816139be565b82525050565b60006139ea826131ea565b9050919050565b6139fa816139df565b82525050565b6000606082019050613a1560008301866139af565b613a2260208301856139d0565b613a2f60408301846139f1565b949350505050565b60008083601f840112613a4d57613a4c613646565b5b8235905067ffffffffffffffff811115613a6a57613a6961364b565b5b602083019150836001820283011115613a8657613a85613650565b5b9250929050565b60008060008060008060a08789031215613aaa57613aa96130d9565b5b6000613ab889828a016133f3565b9650506020613ac989828a0161353e565b9550506040613ada89828a016135de565b9450506060613aeb89828a016133f3565b935050608087013567ffffffffffffffff811115613b0c57613b0b6130de565b5b613b1889828a01613a37565b92509250509295509295509295565b600060208284031215613b3d57613b3c6130d9565b5b6000613b4b8482850161345e565b91505092915050565b600060a08284031215613b6a57613b69613381565b5b81905092915050565b600060a08284031215613b8957613b886130d9565b5b6000613b9784828501613b54565b91505092915050565b60008060408385031215613bb757613bb66130d9565b5b6000613bc5858286016133f3565b9250506020613bd685828601613502565b9150509250929050565b613be9816133d2565b82525050565b608082016000820151613c056000850182613be0565b506020820151613c18602085018261375f565b506040820151613c2b604085018261375f565b506060820151613c3e606085018261375f565b50505050565b6000608082019050613c596000830184613bef565b92915050565b60008060408385031215613c7657613c756130d9565b5b6000613c84858286016133f3565b9250506020613c958582860161345e565b9150509250929050565b613ca8816134d2565b82525050565b6000602082019050613cc36000830184613c9f565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110613d0957613d08613cc9565b5b50565b6000819050613d1a82613cf8565b919050565b6000613d2a82613d0c565b9050919050565b613d3a81613d1f565b82525050565b60038110613d5157613d50613cc9565b5b50565b6000819050613d6282613d40565b919050565b6000613d7282613d54565b9050919050565b613d8281613d67565b82525050565b6000613d93826131ea565b9050919050565b613da381613d88565b82525050565b600060a082019050613dbe6000830188613c9f565b613dcb6020830187613c9f565b613dd86040830186613d31565b613de56060830185613d79565b613df26080830184613d9a565b9695505050505050565b6000613e0782613435565b9050919050565b613e1781613dfc565b8114613e2257600080fd5b50565b60008135613e3281613e0e565b80915050919050565b60008160001b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff613e6884613e3b565b9350801983169250808416831791505092915050565b6000613e89826131c8565b9050919050565b6000613e9b82613e7e565b9050919050565b6000819050919050565b613eb582613e90565b613ec8613ec182613ea2565b8354613e48565b8255505050565b6000613eda82613435565b9050919050565b613eea81613ecf565b8114613ef557600080fd5b50565b60008135613f0581613ee1565b80915050919050565b6000613f19826131c8565b9050919050565b6000613f2b82613f0e565b9050919050565b6000819050919050565b613f4582613f20565b613f58613f5182613f32565b8354613e48565b8255505050565b6000613f6a82613435565b9050919050565b613f7a81613f5f565b8114613f8557600080fd5b50565b60008135613f9581613f71565b80915050919050565b6000613fa9826131c8565b9050919050565b6000613fbb82613f9e565b9050919050565b6000819050919050565b613fd582613fb0565b613fe8613fe182613fc2565b8354613e48565b8255505050565b60008101600083018061400181613e25565b905061400d8184613eac565b50505060018101602083018061402281613ef8565b905061402e8184613f3c565b50505060028101604083018061404381613f88565b905061404f8184613fcc565b5050505050565b6140608282613fef565b5050565b61406d816133d2565b82525050565b61407c81613435565b82525050565b60006040820190506140976000830185614064565b6140a46020830184614073565b9392505050565b6000815190506140ba816137de565b92915050565b6000602082840312156140d6576140d56130d9565b5b60006140e4848285016140ab565b91505092915050565b6000815190506140fc816134eb565b92915050565b600060208284031215614118576141176130d9565b5b6000614126848285016140ed565b91505092915050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061419c602f8361412f565b91506141a782614140565b604082019050919050565b600060208201905081810360008301526141cb8161418f565b9050919050565b6141db81613517565b82525050565b60006040820190506141f66000830185614064565b61420360208301846141d2565b9392505050565b600061422561422061421b84613517565b6131be565b61374b565b9050919050565b6142358161420a565b82525050565b6000602082019050614250600083018461422c565b92915050565b600082825260208201905092915050565b6000819050919050565b61427a81613435565b82525050565b600061428c8383614271565b60208301905092915050565b60006142a7602084018461345e565b905092915050565b6000602082019050919050565b60006142c88385614256565b93506142d382614267565b8060005b8581101561430c576142e98284614298565b6142f38882614280565b97506142fe836142af565b9250506001810190506142d7565b5085925050509392505050565b600060608201905061432e6000830187614064565b61433b6020830186613c9f565b818103604083015261434e8184866142bc565b905095945050505050565b600060208201905061436e6000830184614064565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6143c282614379565b810181811067ffffffffffffffff821117156143e1576143e061438a565b5b80604052505050565b60006143f46130cf565b905061440082826143b9565b919050565b61440e8161372e565b811461441957600080fd5b50565b60008151905061442b81614405565b92915050565b61443a8161374b565b811461444557600080fd5b50565b60008151905061445781614431565b92915050565b60006080828403121561447357614472614374565b5b61447d60806143ea565b9050600061448d848285016140ed565b60008301525060206144a1848285016140ed565b60208301525060406144b58482850161441c565b60408301525060606144c984828501614448565b60608301525092915050565b6000608082840312156144eb576144ea6130d9565b5b60006144f98482850161445d565b91505092915050565b60006040820190506145176000830185614064565b6145246020830184613174565b9392505050565b60008151905061453a81613527565b92915050565b60006020828403121561455657614555614374565b5b61456060206143ea565b905060006145708482850161452b565b60008301525092915050565b600060208284031215614592576145916130d9565b5b60006145a084828501614540565b91505092915050565b6000602082840312156145bf576145be6130d9565b5b60006145cd848285016135de565b91505092915050565b60006145e56020840184613502565b905092915050565b6000813590506145fc81614405565b92915050565b600061461160208401846145ed565b905092915050565b60008135905061462881614431565b92915050565b600061463d6020840184614619565b905092915050565b6060820161465660008301836145d6565b614663600085018261371f565b506146716020830183614602565b61467e602085018261373c565b5061468c604083018361462e565b614699604085018261375f565b50505050565b60006080820190506146b46000830185614064565b6146c16020830184614645565b9392505050565b606082016146d9600083018361462e565b6146e6600085018261375f565b506146f4602083018361462e565b614701602085018261375f565b5061470f604083018361462e565b61471c604085018261375f565b50505050565b60006080820190506147376000830185614064565b61474460208301846146c8565b9392505050565b600082825260208201905092915050565b82818337600083830152505050565b6000614777838561474b565b935061478483858461475c565b61478d83614379565b840190509392505050565b60006080820190506147ad6000830188614064565b6147ba60208301876141d2565b6147c76040830186614064565b81810360608301526147da81848661476b565b90509695505050505050565b60006020820190506147fb6000830184614073565b92915050565b600081519050614810816133dc565b92915050565b60006020828403121561482c5761482b6130d9565b5b600061483a84828501614801565b91505092915050565b600061484e82613435565b9050919050565b61485e81614843565b811461486957600080fd5b50565b6000813561487981614855565b80915050919050565b600061488d826131c8565b9050919050565b600061489f82614882565b9050919050565b6000819050919050565b6148b982614894565b6148cc6148c5826148a6565b8354613e48565b8255505050565b60006148de82613435565b9050919050565b6148ee816148d3565b81146148f957600080fd5b50565b60008135614909816148e5565b80915050919050565b600061491d826131c8565b9050919050565b600061492f82614912565b9050919050565b6000819050919050565b61494982614924565b61495c61495582614936565b8354613e48565b8255505050565b600061496e82613435565b9050919050565b61497e81614963565b811461498957600080fd5b50565b6000813561499981614975565b80915050919050565b60006149ad826131c8565b9050919050565b60006149bf826149a2565b9050919050565b6000819050919050565b6149d9826149b4565b6149ec6149e5826149c6565b8354613e48565b8255505050565b60006149fe82613435565b9050919050565b614a0e816149f3565b8114614a1957600080fd5b50565b60008135614a2981614a05565b80915050919050565b6000614a3d826131c8565b9050919050565b6000614a4f82614a32565b9050919050565b6000819050919050565b614a6982614a44565b614a7c614a7582614a56565b8354613e48565b8255505050565b6000614a8e82613435565b9050919050565b614a9e81614a83565b8114614aa957600080fd5b50565b60008135614ab981614a95565b80915050919050565b6000614acd826131c8565b9050919050565b6000614adf82614ac2565b9050919050565b6000819050919050565b614af982614ad4565b614b0c614b0582614ae6565b8354613e48565b8255505050565b600081016000830180614b258161486c565b9050614b3181846148b0565b505050600181016020830180614b46816148fc565b9050614b528184614940565b505050600281016040830180614b678161498c565b9050614b7381846149d0565b505050600381016060830180614b8881614a1c565b9050614b948184614a60565b505050600481016080830180614ba981614aac565b9050614bb58184614af0565b5050505050565b614bc68282614b13565b5050565b6000606082019050614bdf6000830186614064565b614bec6020830185613c9f565b614bf96040830184614073565b949350505050565b600060808284031215614c1757614c16614374565b5b614c2160806143ea565b90506000614c3184828501614801565b6000830152506020614c4584828501614448565b6020830152506040614c5984828501614448565b6040830152506060614c6d84828501614448565b60608301525092915050565b600060808284031215614c8f57614c8e6130d9565b5b6000614c9d84828501614c01565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614cdc601f8361412f565b9150614ce782614ca6565b602082019050919050565b60006020820190508181036000830152614d0b81614ccf565b9050919050565b6000614d2d614d28614d23846134d2565b6131be565b6133d2565b9050919050565b614d3d81614d12565b82525050565b6000604082019050614d586000830185614073565b614d656020830184614d34565b9392505050565b6000614d7782613435565b9050919050565b614d8781614d6c565b8114614d9257600080fd5b50565b600081359050614da481614d7e565b92915050565b600060208284031215614dc057614dbf6130d9565b5b6000614dce84828501614d95565b91505092915050565b614de0816130e3565b82525050565b6000602082019050614dfb6000830184614dd7565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e3b826134d2565b9150614e46836134d2565b9250816cffffffffffffffffffffffffff0483118215151615614e6c57614e6b614e01565b5b828202905092915050565b6000606082019050614e8c6000830186614064565b614e9960208301856141d2565b614ea66040830184614073565b949350505050565b6000602082019050614ec36000830184613d9a565b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614f0a601783614ec9565b9150614f1582614ed4565b601782019050919050565b600081519050919050565b60005b83811015614f49578082015181840152602081019050614f2e565b60008484015250505050565b6000614f6082614f20565b614f6a8185614ec9565b9350614f7a818560208601614f2b565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614fbc601183614ec9565b9150614fc782614f86565b601182019050919050565b6000614fdd82614efd565b9150614fe98285614f55565b9150614ff482614faf565b91506150008284614f55565b91508190509392505050565b600061501782614f20565b615021818561412f565b9350615031818560208601614f2b565b61503a81614379565b840191505092915050565b6000602082019050818103600083015261505f818461500c565b905092915050565b6000615072826133d2565b915061507d836133d2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150b6576150b5614e01565b5b828202905092915050565b60006150cc826133d2565b91506150d7836133d2565b92508282019050808211156150ef576150ee614e01565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061512f826133d2565b91506000820361514257615141614e01565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061518360208361412f565b915061518e8261514d565b602082019050919050565b600060208201905081810360008301526151b281615176565b905091905056fea2646970667358221220dd61ceaa567af5faefe184d35580e2aff78432e64d5123d2fd44a0ed97f4654964736f6c63430008100033000000000000000000000000855e43e2b049b4113993a096cc1f5f14b52f984e00000000000000000000000083f82414b5065bb9a85e330c67b4a10f798f4ed2000000000000000000000000a310425046661c523d98344f7e9d66b32195365d0000000000000000000000005cd2fac9702d68dde5a94b1af95962bcfb80fc7d00000000000000000000000027192b750ff796514f039512aaf5a3655a095ea00000000000000000000000003fe986e8cdbe32948a189a47f1a02257c300bb340000000000000000000000005c239078387ed7ab6d35c93ff37bbb20023c1d20000000000000000000000000e154dfeddf252495b11261225b8a4cf29aa9fd3a000000000000000000000000084fd17c6a5697bd651b6482fa916c0b3a0e6161
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063926dde7e116100f9578063d547741f11610097578063e4dafec911610071578063e4dafec9146104ed578063eba1b60b1461051d578063ec87621c1461054d578063f1648e841461056b576101c4565b8063d547741f14610499578063db006a75146104b5578063e050a52d146104d1576101c4565b8063ae56f21d116100d3578063ae56f21d14610411578063af4da83914610431578063c91c9cfe1461044d578063d24e0d5d1461047d576101c4565b8063926dde7e146103bb578063a1cfd5e8146103d7578063a217fddf146103f3576101c4565b806336667e2f1161016657806378bd79351161014057806378bd79351461030f57806382069f681461033f57806385ffa4f61461035b57806391d148541461038b576101c4565b806336667e2f146102bb5780634d293ca0146102d757806358096a6c146102f3576101c4565b806324ba223f116101a257806324ba223f1461024b578063278ecde1146102675780632f2ff15d1461028357806336568abe1461029f576101c4565b806301ffc9a7146101c9578063074868c7146101f9578063248a9ca31461021b575b600080fd5b6101e360048036038101906101de919061313b565b61059f565b6040516101f09190613183565b60405180910390f35b610201610619565b6040516102129594939291906132a1565b60405180910390f35b6102356004803603810190610230919061332a565b6106dd565b6040516102429190613366565b60405180910390f35b610265600480360381019061026091906133a5565b6106fc565b005b610281600480360381019061027c9190613408565b61071f565b005b61029d60048036038101906102989190613473565b6109be565b005b6102b960048036038101906102b49190613473565b6109df565b005b6102d560048036038101906102d09190613553565b610a62565b005b6102f160048036038101906102ec91906135f3565b610bb7565b005b61030d600480360381019061030891906136ab565b610d89565b005b61032960048036038101906103249190613408565b610ed3565b60405161033691906137c3565b60405180910390f35b6103596004803603810190610354919061380a565b610f81565b005b61037560048036038101906103709190613408565b6110c5565b6040516103829190613875565b60405180910390f35b6103a560048036038101906103a09190613473565b611173565b6040516103b29190613183565b60405180910390f35b6103d560048036038101906103d091906138af565b6111dd565b005b6103f160048036038101906103ec9190613921565b6113a0565b005b6103fb6114f5565b6040516104089190613366565b60405180910390f35b6104196114fc565b60405161042893929190613a00565b60405180910390f35b61044b60048036038101906104469190613a8d565b611574565b005b61046760048036038101906104629190613b27565b611761565b6040516104749190613183565b60405180910390f35b61049760048036038101906104929190613b73565b611959565b005b6104b360048036038101906104ae9190613473565b61197c565b005b6104cf60048036038101906104ca9190613408565b61199d565b005b6104eb60048036038101906104e69190613ba0565b611bbf565b005b61050760048036038101906105029190613408565b611dc8565b6040516105149190613c44565b60405180910390f35b61053760048036038101906105329190613c5f565b611e76565b6040516105449190613cae565b60405180910390f35b610555611f21565b6040516105629190613366565b60405180910390f35b61058560048036038101906105809190613408565b611f45565b604051610596959493929190613da9565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610612575061061182611fe7565b5b9050919050565b60028060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b6000806000838152602001908152602001600020600101549050919050565b6000801b61070981612051565b81600781816107189190614056565b9050505050565b806000600381111561073457610733613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff16600381111561076a57610769613cc9565b5b036107a1576040517f89f434fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bdd415af836107eb612065565b6040518363ffffffff1660e01b8152600401610808929190614082565b602060405180830381865afa158015610825573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084991906140c0565b15610880576040517f3639ff5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663962d1938846108cc612065565b6040518363ffffffff1660e01b81526004016108e9929190614082565b6020604051808303816000875af1158015610908573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092c9190614102565b9050610963610939612065565b600a6000868152602001908152602001600020600001601b9054906101000a900460ff168361206d565b61096b612065565b73ffffffffffffffffffffffffffffffffffffffff16837fa40ff684c1460a7c45ee0cbf0fb9acf8a630e2f42a69c20fa2691208a96e34e8836040516109b19190613cae565b60405180910390a3505050565b6109c7826106dd565b6109d081612051565b6109da8383612249565b505050565b6109e7612065565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4b906141b2565b60405180910390fd5b610a5e8282612329565b5050565b8460006003811115610a7757610a76613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff166003811115610aad57610aac613cc9565b5b14610ae4576040517f5df8eb1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08610b0e81612051565b610b1c87876003888861240a565b600760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663effab51d88856040518363ffffffff1660e01b8152600401610b7c9291906141e1565b600060405180830381600087803b158015610b9657600080fd5b505af1158015610baa573d6000803e3d6000fd5b5050505050505050505050565b8260006003811115610bcc57610bcb613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff166003811115610c0257610c01613cc9565b5b03610c39576040517f89f434fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c49610c44612065565b611761565b610c7f576040517f6b250b0a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639559840885856040518363ffffffff1660e01b8152600401610cdf9291906141e1565b600060405180830381600087803b158015610cf957600080fd5b505af1158015610d0d573d6000803e3d6000fd5b50505050610d2d610d1c612065565b83610d28878787612771565b6128d6565b610d35612065565b73ffffffffffffffffffffffffffffffffffffffff16847feb49607c28612130e00b61547df43aeee3a36e9dc0bd1e61f3e8232b52c49fe685604051610d7b919061423b565b60405180910390a350505050565b8360006003811115610d9e57610d9d613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff166003811115610dd457610dd3613cc9565b5b03610e0b576040517f89f434fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08610e3581612051565b600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166358096a6c878787876040518563ffffffff1660e01b8152600401610e999493929190614319565b600060405180830381600087803b158015610eb357600080fd5b505af1158015610ec7573d6000803e3d6000fd5b50505050505050505050565b610edb61301c565b600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639507d39a836040518263ffffffff1660e01b8152600401610f399190614359565b608060405180830381865afa158015610f56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7a91906144d5565b9050919050565b8160006003811115610f9657610f95613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff166003811115610fcc57610fcb613cc9565b5b03611003576040517f89f434fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861102d81612051565b600760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166382069f6885856040518363ffffffff1660e01b815260040161108d929190614502565b600060405180830381600087803b1580156110a757600080fd5b505af11580156110bb573d6000803e3d6000fd5b5050505050505050565b6110cd613070565b600760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639507d39a836040518263ffffffff1660e01b815260040161112b9190614359565b602060405180830381865afa158015611148573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116c919061457c565b9050919050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b82600060038111156111f2576111f1613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff16600381111561122857611227613cc9565b5b1461125f576040517f5df8eb1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861128981612051565b60028081111561129c5761129b613cc9565b5b8460000160208101906112af91906145a9565b60028111156112c1576112c0613cc9565b5b036112f8576040517f427b76e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113078585600160008061240a565b600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166387e193c486856040518363ffffffff1660e01b815260040161136792919061469f565b600060405180830381600087803b15801561138157600080fd5b505af1158015611395573d6000803e3d6000fd5b505050505050505050565b84600060038111156113b5576113b4613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff1660038111156113eb576113ea613cc9565b5b14611422576040517f5df8eb1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0861144c81612051565b61145a87876002888861240a565b600760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b5e0ae388856040518363ffffffff1660e01b81526004016114ba929190614722565b600060405180830381600087803b1580156114d457600080fd5b505af11580156114e8573d6000803e3d6000fd5b5050505050505050505050565b6000801b81565b60078060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b856000600381111561158957611588613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff1660038111156115bf576115be613cc9565b5b036115f6576040517f89f434fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611606611601612065565b611761565b61163c576040517f6b250b0a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f0bdfc488888787876040518663ffffffff1660e01b81526004016116a2959493929190614798565b600060405180830381600087803b1580156116bc57600080fd5b505af11580156116d0573d6000803e3d6000fd5b505050506116f06116df612065565b866116eb8a8a8a612771565b6128d6565b61170287876116fd612065565b612a9e565b61170a612065565b73ffffffffffffffffffffffffffffffffffffffff16877fd409be915a21896abe80da3c45f50d7c2c1ed84b49387ce67bfc33f0f4f42aa288604051611750919061423b565b60405180910390a350505050505050565b6000806002800160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016117c191906147e6565b602060405180830381865afa1580156117de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118029190614816565b11806118ac57506000600260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161186991906147e6565b602060405180830381865afa158015611886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118aa9190614816565b115b806119525750600260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d4d7b19a836040518263ffffffff1660e01b815260040161191091906147e6565b602060405180830381865afa15801561192d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195191906140c0565b5b9050919050565b6000801b61196681612051565b81600281816119759190614bbc565b9050505050565b611985826106dd565b61198e81612051565b6119988383612329565b505050565b80600060038111156119b2576119b1613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff1660038111156119e8576119e7613cc9565b5b03611a1f576040517f89f434fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bdd415af83611a69612065565b6040518363ffffffff1660e01b8152600401611a86929190614082565b602060405180830381865afa158015611aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac791906140c0565b611afd576040517fa43a60a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663962d193883611b47612065565b6040518363ffffffff1660e01b8152600401611b64929190614082565b6020604051808303816000875af1158015611b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba79190614102565b50611bbb826001611bb6612065565b612a9e565b5050565b8160006003811115611bd457611bd3613cc9565b5b600a6000838152602001908152602001600020600001601a9054906101000a900460ff166003811115611c0a57611c09613cc9565b5b03611c41576040517f89f434fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c51611c4c612065565b611761565b611c87576040517f6b250b0a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632c7917928585611cd4612065565b6040518463ffffffff1660e01b8152600401611cf293929190614bca565b6020604051808303816000875af1158015611d11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d359190614102565b9050611d6c611d42612065565b600a6000878152602001908152602001600020600001601b9054906101000a900460ff16836128d6565b611d74612065565b73ffffffffffffffffffffffffffffffffffffffff16847ff5f85a03080c51311bcb72afaec718b95d023da3ca02828b1f23e30c4e42eaf685604051611dba9190613cae565b60405180910390a350505050565b611dd0613089565b600760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639507d39a836040518263ffffffff1660e01b8152600401611e2e9190614359565b608060405180830381865afa158015611e4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6f9190614c79565b9050919050565b6000600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eba1b60b84846040518363ffffffff1660e01b8152600401611ed8929190614082565b602060405180830381865afa158015611ef5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f199190614102565b905092915050565b7f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0881565b600a6020528060005260406000206000915090508060000160009054906101000a90046cffffffffffffffffffffffffff169080600001600d9054906101000a90046cffffffffffffffffffffffffff169080600001601a9054906101000a900460ff169080600001601b9054906101000a900460ff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6120628161205d612065565b612c2d565b50565b600033905090565b6002600154036120b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a990614cf2565b60405180910390fd5b6002600181905550600060028111156120ce576120cd613cc9565b5b8260028111156120e1576120e0613cc9565b5b0361217d57600260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633de230c384836040518363ffffffff1660e01b8152600401612146929190614d43565b600060405180830381600087803b15801561216057600080fd5b505af1158015612174573d6000803e3d6000fd5b5050505061223d565b6001600281111561219157612190613cc9565b5b8260028111156121a4576121a3613cc9565b5b0361223c57600260040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ef6506db84836040518363ffffffff1660e01b8152600401612209929190614d43565b600060405180830381600087803b15801561222357600080fd5b505af1158015612237573d6000803e3d6000fd5b505050505b5b60018081905550505050565b6122538282611173565b61232557600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506122ca612065565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6123338282611173565b1561240657600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506123ab612065565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168460200160208101906124359190614daa565b73ffffffffffffffffffffffffffffffffffffffff161415801561250257508360200160208101906124679190614daa565b73ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f067d6690000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016124bf9190614de6565b602060405180830381865afa1580156124dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250091906140c0565b155b15612539576040517fcdd7951a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060a00160405280836cffffffffffffffffffffffffff168152602001826cffffffffffffffffffffffffff16815260200184600381111561258157612580613cc9565b5b815260200185600001602081019061259991906145a9565b60028111156125ab576125aa613cc9565b5b81526020018560200160208101906125c39190614daa565b73ffffffffffffffffffffffffffffffffffffffff16815250600a600087815260200190815260200160002060008201518160000160006101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff160217905550602082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff160217905550604082015181600001601a6101000a81548160ff0219169083600381111561268c5761268b613cc9565b5b0217905550606082015181600001601b6101000a81548160ff021916908360028111156126bc576126bb613cc9565b5b021790555060808201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505061271483612cca565b73ffffffffffffffffffffffffffffffffffffffff1683600381111561273d5761273c613cc9565b5b867f43e6fe5ab208b61e1738d308954c5088333e4739034eb0dd1ffc60ebc0b1726460405160405180910390a45050505050565b600080600a6000868152602001908152602001600020600001601b9054906101000a900460ff1690506002808111156127ad576127ac613cc9565b5b8160028111156127c0576127bf613cc9565b5b141580156127f257508260028111156127dc576127db613cc9565b5b8160028111156127ef576127ee613cc9565b5b14155b15612829576040517f427b76e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600281111561283d5761283c613cc9565b5b8360028111156128505761284f613cc9565b5b1461288a57600a600086815260200190815260200160002060000160009054906101000a90046cffffffffffffffffffffffffff166128bb565b600a6000868152602001908152602001600020600001600d9054906101000a90046cffffffffffffffffffffffffff165b8463ffffffff166128cc9190614e30565b9150509392505050565b60026001540361291b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291290614cf2565b60405180910390fd5b60026001819055506000816cffffffffffffffffffffffffff161115612a92576001600281111561294f5761294e613cc9565b5b82600281111561296257612961613cc9565b5b036129fe57600260040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663af7d6ca384836040518363ffffffff1660e01b81526004016129c7929190614d43565b600060405180830381600087803b1580156129e157600080fd5b505af11580156129f5573d6000803e3d6000fd5b50505050612a91565b600260030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac84836040518363ffffffff1660e01b8152600401612a5e929190614d43565b600060405180830381600087803b158015612a7857600080fd5b505af1158015612a8c573d6000803e3d6000fd5b505050505b5b60018081905550505050565b600260015403612ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ada90614cf2565b60405180910390fd5b60026001819055506000600a600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c20578073ffffffffffffffffffffffffffffffffffffffff1663067d66908585856040518463ffffffff1660e01b8152600401612b9793929190614e77565b600060405180830381600087803b158015612bb157600080fd5b505af1158015612bc5573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff168363ffffffff16857f4a6e1acb18ad09dff0fabcf867fa6ce6ea262992495d6b5b3286921445f89eb384604051612c179190614eae565b60405180910390a45b5060018081905550505050565b612c378282611173565b612cc657612c5c8173ffffffffffffffffffffffffffffffffffffffff166014612de0565b612c6a8360001c6020612de0565b604051602001612c7b929190614fd2565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbd9190615045565b60405180910390fd5b5050565b600060026003811115612ce057612cdf613cc9565b5b826003811115612cf357612cf2613cc9565b5b03612d2557600760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612ddb565b600380811115612d3857612d37613cc9565b5b826003811115612d4b57612d4a613cc9565b5b03612d7d57600760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612ddb565b60016003811115612d9157612d90613cc9565b5b826003811115612da457612da3613cc9565b5b03612dd657600760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612ddb565b600090505b919050565b606060006002836002612df39190615067565b612dfd91906150c1565b67ffffffffffffffff811115612e1657612e1561438a565b5b6040519080825280601f01601f191660200182016040528015612e485781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612e8057612e7f6150f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612ee457612ee36150f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612f249190615067565b612f2e91906150c1565b90505b6001811115612fce577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612f7057612f6f6150f5565b5b1a60f81b828281518110612f8757612f866150f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612fc790615124565b9050612f31565b5060008414613012576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300990615199565b60405180910390fd5b8091505092915050565b604051806080016040528060006cffffffffffffffffffffffffff16815260200160006cffffffffffffffffffffffffff168152602001600061ffff168152602001600067ffffffffffffffff1681525090565b6040518060200160405280600063ffffffff1681525090565b604051806080016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613118816130e3565b811461312357600080fd5b50565b6000813590506131358161310f565b92915050565b600060208284031215613151576131506130d9565b5b600061315f84828501613126565b91505092915050565b60008115159050919050565b61317d81613168565b82525050565b60006020820190506131986000830184613174565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006131e36131de6131d98461319e565b6131be565b61319e565b9050919050565b60006131f5826131c8565b9050919050565b6000613207826131ea565b9050919050565b613217816131fc565b82525050565b6000613228826131ea565b9050919050565b6132388161321d565b82525050565b6000613249826131ea565b9050919050565b6132598161323e565b82525050565b600061326a826131ea565b9050919050565b61327a8161325f565b82525050565b600061328b826131ea565b9050919050565b61329b81613280565b82525050565b600060a0820190506132b6600083018861320e565b6132c3602083018761322f565b6132d06040830186613250565b6132dd6060830185613271565b6132ea6080830184613292565b9695505050505050565b6000819050919050565b613307816132f4565b811461331257600080fd5b50565b600081359050613324816132fe565b92915050565b6000602082840312156133405761333f6130d9565b5b600061334e84828501613315565b91505092915050565b613360816132f4565b82525050565b600060208201905061337b6000830184613357565b92915050565b600080fd5b60006060828403121561339c5761339b613381565b5b81905092915050565b6000606082840312156133bb576133ba6130d9565b5b60006133c984828501613386565b91505092915050565b6000819050919050565b6133e5816133d2565b81146133f057600080fd5b50565b600081359050613402816133dc565b92915050565b60006020828403121561341e5761341d6130d9565b5b600061342c848285016133f3565b91505092915050565b60006134408261319e565b9050919050565b61345081613435565b811461345b57600080fd5b50565b60008135905061346d81613447565b92915050565b6000806040838503121561348a576134896130d9565b5b600061349885828601613315565b92505060206134a98582860161345e565b9150509250929050565b6000604082840312156134c9576134c8613381565b5b81905092915050565b60006cffffffffffffffffffffffffff82169050919050565b6134f4816134d2565b81146134ff57600080fd5b50565b600081359050613511816134eb565b92915050565b600063ffffffff82169050919050565b61353081613517565b811461353b57600080fd5b50565b60008135905061354d81613527565b92915050565b600080600080600060c0868803121561356f5761356e6130d9565b5b600061357d888289016133f3565b955050602061358e888289016134b3565b945050606061359f88828901613502565b93505060806135b088828901613502565b92505060a06135c18882890161353e565b9150509295509295909350565b600381106135db57600080fd5b50565b6000813590506135ed816135ce565b92915050565b60008060006060848603121561360c5761360b6130d9565b5b600061361a868287016133f3565b935050602061362b8682870161353e565b925050604061363c868287016135de565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261366b5761366a613646565b5b8235905067ffffffffffffffff8111156136885761368761364b565b5b6020830191508360208202830111156136a4576136a3613650565b5b9250929050565b600080600080606085870312156136c5576136c46130d9565b5b60006136d3878288016133f3565b94505060206136e487828801613502565b935050604085013567ffffffffffffffff811115613705576137046130de565b5b61371187828801613655565b925092505092959194509250565b613728816134d2565b82525050565b600061ffff82169050919050565b6137458161372e565b82525050565b600067ffffffffffffffff82169050919050565b6137688161374b565b82525050565b608082016000820151613784600085018261371f565b506020820151613797602085018261371f565b5060408201516137aa604085018261373c565b5060608201516137bd606085018261375f565b50505050565b60006080820190506137d8600083018461376e565b92915050565b6137e781613168565b81146137f257600080fd5b50565b600081359050613804816137de565b92915050565b60008060408385031215613821576138206130d9565b5b600061382f858286016133f3565b9250506020613840858286016137f5565b9150509250929050565b61385381613517565b82525050565b60208201600082015161386f600085018261384a565b50505050565b600060208201905061388a6000830184613859565b92915050565b6000606082840312156138a6576138a5613381565b5b81905092915050565b600080600060c084860312156138c8576138c76130d9565b5b60006138d6868287016133f3565b93505060206138e7868287016134b3565b92505060606138f886828701613890565b9150509250925092565b60006060828403121561391857613917613381565b5b81905092915050565b6000806000806000610100868803121561393e5761393d6130d9565b5b600061394c888289016133f3565b955050602061395d888289016134b3565b945050606061396e88828901613502565b935050608061397f88828901613502565b92505060a061399088828901613902565b9150509295509295909350565b60006139a8826131ea565b9050919050565b6139b88161399d565b82525050565b60006139c9826131ea565b9050919050565b6139d9816139be565b82525050565b60006139ea826131ea565b9050919050565b6139fa816139df565b82525050565b6000606082019050613a1560008301866139af565b613a2260208301856139d0565b613a2f60408301846139f1565b949350505050565b60008083601f840112613a4d57613a4c613646565b5b8235905067ffffffffffffffff811115613a6a57613a6961364b565b5b602083019150836001820283011115613a8657613a85613650565b5b9250929050565b60008060008060008060a08789031215613aaa57613aa96130d9565b5b6000613ab889828a016133f3565b9650506020613ac989828a0161353e565b9550506040613ada89828a016135de565b9450506060613aeb89828a016133f3565b935050608087013567ffffffffffffffff811115613b0c57613b0b6130de565b5b613b1889828a01613a37565b92509250509295509295509295565b600060208284031215613b3d57613b3c6130d9565b5b6000613b4b8482850161345e565b91505092915050565b600060a08284031215613b6a57613b69613381565b5b81905092915050565b600060a08284031215613b8957613b886130d9565b5b6000613b9784828501613b54565b91505092915050565b60008060408385031215613bb757613bb66130d9565b5b6000613bc5858286016133f3565b9250506020613bd685828601613502565b9150509250929050565b613be9816133d2565b82525050565b608082016000820151613c056000850182613be0565b506020820151613c18602085018261375f565b506040820151613c2b604085018261375f565b506060820151613c3e606085018261375f565b50505050565b6000608082019050613c596000830184613bef565b92915050565b60008060408385031215613c7657613c756130d9565b5b6000613c84858286016133f3565b9250506020613c958582860161345e565b9150509250929050565b613ca8816134d2565b82525050565b6000602082019050613cc36000830184613c9f565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110613d0957613d08613cc9565b5b50565b6000819050613d1a82613cf8565b919050565b6000613d2a82613d0c565b9050919050565b613d3a81613d1f565b82525050565b60038110613d5157613d50613cc9565b5b50565b6000819050613d6282613d40565b919050565b6000613d7282613d54565b9050919050565b613d8281613d67565b82525050565b6000613d93826131ea565b9050919050565b613da381613d88565b82525050565b600060a082019050613dbe6000830188613c9f565b613dcb6020830187613c9f565b613dd86040830186613d31565b613de56060830185613d79565b613df26080830184613d9a565b9695505050505050565b6000613e0782613435565b9050919050565b613e1781613dfc565b8114613e2257600080fd5b50565b60008135613e3281613e0e565b80915050919050565b60008160001b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff613e6884613e3b565b9350801983169250808416831791505092915050565b6000613e89826131c8565b9050919050565b6000613e9b82613e7e565b9050919050565b6000819050919050565b613eb582613e90565b613ec8613ec182613ea2565b8354613e48565b8255505050565b6000613eda82613435565b9050919050565b613eea81613ecf565b8114613ef557600080fd5b50565b60008135613f0581613ee1565b80915050919050565b6000613f19826131c8565b9050919050565b6000613f2b82613f0e565b9050919050565b6000819050919050565b613f4582613f20565b613f58613f5182613f32565b8354613e48565b8255505050565b6000613f6a82613435565b9050919050565b613f7a81613f5f565b8114613f8557600080fd5b50565b60008135613f9581613f71565b80915050919050565b6000613fa9826131c8565b9050919050565b6000613fbb82613f9e565b9050919050565b6000819050919050565b613fd582613fb0565b613fe8613fe182613fc2565b8354613e48565b8255505050565b60008101600083018061400181613e25565b905061400d8184613eac565b50505060018101602083018061402281613ef8565b905061402e8184613f3c565b50505060028101604083018061404381613f88565b905061404f8184613fcc565b5050505050565b6140608282613fef565b5050565b61406d816133d2565b82525050565b61407c81613435565b82525050565b60006040820190506140976000830185614064565b6140a46020830184614073565b9392505050565b6000815190506140ba816137de565b92915050565b6000602082840312156140d6576140d56130d9565b5b60006140e4848285016140ab565b91505092915050565b6000815190506140fc816134eb565b92915050565b600060208284031215614118576141176130d9565b5b6000614126848285016140ed565b91505092915050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061419c602f8361412f565b91506141a782614140565b604082019050919050565b600060208201905081810360008301526141cb8161418f565b9050919050565b6141db81613517565b82525050565b60006040820190506141f66000830185614064565b61420360208301846141d2565b9392505050565b600061422561422061421b84613517565b6131be565b61374b565b9050919050565b6142358161420a565b82525050565b6000602082019050614250600083018461422c565b92915050565b600082825260208201905092915050565b6000819050919050565b61427a81613435565b82525050565b600061428c8383614271565b60208301905092915050565b60006142a7602084018461345e565b905092915050565b6000602082019050919050565b60006142c88385614256565b93506142d382614267565b8060005b8581101561430c576142e98284614298565b6142f38882614280565b97506142fe836142af565b9250506001810190506142d7565b5085925050509392505050565b600060608201905061432e6000830187614064565b61433b6020830186613c9f565b818103604083015261434e8184866142bc565b905095945050505050565b600060208201905061436e6000830184614064565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6143c282614379565b810181811067ffffffffffffffff821117156143e1576143e061438a565b5b80604052505050565b60006143f46130cf565b905061440082826143b9565b919050565b61440e8161372e565b811461441957600080fd5b50565b60008151905061442b81614405565b92915050565b61443a8161374b565b811461444557600080fd5b50565b60008151905061445781614431565b92915050565b60006080828403121561447357614472614374565b5b61447d60806143ea565b9050600061448d848285016140ed565b60008301525060206144a1848285016140ed565b60208301525060406144b58482850161441c565b60408301525060606144c984828501614448565b60608301525092915050565b6000608082840312156144eb576144ea6130d9565b5b60006144f98482850161445d565b91505092915050565b60006040820190506145176000830185614064565b6145246020830184613174565b9392505050565b60008151905061453a81613527565b92915050565b60006020828403121561455657614555614374565b5b61456060206143ea565b905060006145708482850161452b565b60008301525092915050565b600060208284031215614592576145916130d9565b5b60006145a084828501614540565b91505092915050565b6000602082840312156145bf576145be6130d9565b5b60006145cd848285016135de565b91505092915050565b60006145e56020840184613502565b905092915050565b6000813590506145fc81614405565b92915050565b600061461160208401846145ed565b905092915050565b60008135905061462881614431565b92915050565b600061463d6020840184614619565b905092915050565b6060820161465660008301836145d6565b614663600085018261371f565b506146716020830183614602565b61467e602085018261373c565b5061468c604083018361462e565b614699604085018261375f565b50505050565b60006080820190506146b46000830185614064565b6146c16020830184614645565b9392505050565b606082016146d9600083018361462e565b6146e6600085018261375f565b506146f4602083018361462e565b614701602085018261375f565b5061470f604083018361462e565b61471c604085018261375f565b50505050565b60006080820190506147376000830185614064565b61474460208301846146c8565b9392505050565b600082825260208201905092915050565b82818337600083830152505050565b6000614777838561474b565b935061478483858461475c565b61478d83614379565b840190509392505050565b60006080820190506147ad6000830188614064565b6147ba60208301876141d2565b6147c76040830186614064565b81810360608301526147da81848661476b565b90509695505050505050565b60006020820190506147fb6000830184614073565b92915050565b600081519050614810816133dc565b92915050565b60006020828403121561482c5761482b6130d9565b5b600061483a84828501614801565b91505092915050565b600061484e82613435565b9050919050565b61485e81614843565b811461486957600080fd5b50565b6000813561487981614855565b80915050919050565b600061488d826131c8565b9050919050565b600061489f82614882565b9050919050565b6000819050919050565b6148b982614894565b6148cc6148c5826148a6565b8354613e48565b8255505050565b60006148de82613435565b9050919050565b6148ee816148d3565b81146148f957600080fd5b50565b60008135614909816148e5565b80915050919050565b600061491d826131c8565b9050919050565b600061492f82614912565b9050919050565b6000819050919050565b61494982614924565b61495c61495582614936565b8354613e48565b8255505050565b600061496e82613435565b9050919050565b61497e81614963565b811461498957600080fd5b50565b6000813561499981614975565b80915050919050565b60006149ad826131c8565b9050919050565b60006149bf826149a2565b9050919050565b6000819050919050565b6149d9826149b4565b6149ec6149e5826149c6565b8354613e48565b8255505050565b60006149fe82613435565b9050919050565b614a0e816149f3565b8114614a1957600080fd5b50565b60008135614a2981614a05565b80915050919050565b6000614a3d826131c8565b9050919050565b6000614a4f82614a32565b9050919050565b6000819050919050565b614a6982614a44565b614a7c614a7582614a56565b8354613e48565b8255505050565b6000614a8e82613435565b9050919050565b614a9e81614a83565b8114614aa957600080fd5b50565b60008135614ab981614a95565b80915050919050565b6000614acd826131c8565b9050919050565b6000614adf82614ac2565b9050919050565b6000819050919050565b614af982614ad4565b614b0c614b0582614ae6565b8354613e48565b8255505050565b600081016000830180614b258161486c565b9050614b3181846148b0565b505050600181016020830180614b46816148fc565b9050614b528184614940565b505050600281016040830180614b678161498c565b9050614b7381846149d0565b505050600381016060830180614b8881614a1c565b9050614b948184614a60565b505050600481016080830180614ba981614aac565b9050614bb58184614af0565b5050505050565b614bc68282614b13565b5050565b6000606082019050614bdf6000830186614064565b614bec6020830185613c9f565b614bf96040830184614073565b949350505050565b600060808284031215614c1757614c16614374565b5b614c2160806143ea565b90506000614c3184828501614801565b6000830152506020614c4584828501614448565b6020830152506040614c5984828501614448565b6040830152506060614c6d84828501614448565b60608301525092915050565b600060808284031215614c8f57614c8e6130d9565b5b6000614c9d84828501614c01565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614cdc601f8361412f565b9150614ce782614ca6565b602082019050919050565b60006020820190508181036000830152614d0b81614ccf565b9050919050565b6000614d2d614d28614d23846134d2565b6131be565b6133d2565b9050919050565b614d3d81614d12565b82525050565b6000604082019050614d586000830185614073565b614d656020830184614d34565b9392505050565b6000614d7782613435565b9050919050565b614d8781614d6c565b8114614d9257600080fd5b50565b600081359050614da481614d7e565b92915050565b600060208284031215614dc057614dbf6130d9565b5b6000614dce84828501614d95565b91505092915050565b614de0816130e3565b82525050565b6000602082019050614dfb6000830184614dd7565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e3b826134d2565b9150614e46836134d2565b9250816cffffffffffffffffffffffffff0483118215151615614e6c57614e6b614e01565b5b828202905092915050565b6000606082019050614e8c6000830186614064565b614e9960208301856141d2565b614ea66040830184614073565b949350505050565b6000602082019050614ec36000830184613d9a565b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614f0a601783614ec9565b9150614f1582614ed4565b601782019050919050565b600081519050919050565b60005b83811015614f49578082015181840152602081019050614f2e565b60008484015250505050565b6000614f6082614f20565b614f6a8185614ec9565b9350614f7a818560208601614f2b565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614fbc601183614ec9565b9150614fc782614f86565b601182019050919050565b6000614fdd82614efd565b9150614fe98285614f55565b9150614ff482614faf565b91506150008284614f55565b91508190509392505050565b600061501782614f20565b615021818561412f565b9350615031818560208601614f2b565b61503a81614379565b840191505092915050565b6000602082019050818103600083015261505f818461500c565b905092915050565b6000615072826133d2565b915061507d836133d2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150b6576150b5614e01565b5b828202905092915050565b60006150cc826133d2565b91506150d7836133d2565b92508282019050808211156150ef576150ee614e01565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061512f826133d2565b91506000820361514257615141614e01565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061518360208361412f565b915061518e8261514d565b602082019050919050565b600060208201905081810360008301526151b281615176565b905091905056fea2646970667358221220dd61ceaa567af5faefe184d35580e2aff78432e64d5123d2fd44a0ed97f4654964736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000855e43e2b049b4113993a096cc1f5f14b52f984e00000000000000000000000083f82414b5065bb9a85e330c67b4a10f798f4ed2000000000000000000000000a310425046661c523d98344f7e9d66b32195365d0000000000000000000000005cd2fac9702d68dde5a94b1af95962bcfb80fc7d00000000000000000000000027192b750ff796514f039512aaf5a3655a095ea00000000000000000000000003fe986e8cdbe32948a189a47f1a02257c300bb340000000000000000000000005c239078387ed7ab6d35c93ff37bbb20023c1d20000000000000000000000000e154dfeddf252495b11261225b8a4cf29aa9fd3a000000000000000000000000084fd17c6a5697bd651b6482fa916c0b3a0e6161
-----Decoded View---------------
Arg [0] : _kaijuContracts (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [1] : _managerContracts (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [2] : admin (address): 0x084FD17c6A5697bd651b6482fa916C0b3a0e6161
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000855e43e2b049b4113993a096cc1f5f14b52f984e
Arg [1] : 00000000000000000000000083f82414b5065bb9a85e330c67b4a10f798f4ed2
Arg [2] : 000000000000000000000000a310425046661c523d98344f7e9d66b32195365d
Arg [3] : 0000000000000000000000005cd2fac9702d68dde5a94b1af95962bcfb80fc7d
Arg [4] : 00000000000000000000000027192b750ff796514f039512aaf5a3655a095ea0
Arg [5] : 0000000000000000000000003fe986e8cdbe32948a189a47f1a02257c300bb34
Arg [6] : 0000000000000000000000005c239078387ed7ab6d35c93ff37bbb20023c1d20
Arg [7] : 000000000000000000000000e154dfeddf252495b11261225b8a4cf29aa9fd3a
Arg [8] : 000000000000000000000000084fd17c6a5697bd651b6482fa916c0b3a0e6161
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.