Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Passes | 16585925 | 570 days ago | IN | 0 ETH | 0.0039141 | ||||
Withdraw Passes | 16577517 | 571 days ago | IN | 0 ETH | 0.0043502 | ||||
Rent Pass | 16518309 | 579 days ago | IN | 0.0032 ETH | 0.00477362 | ||||
Rent Pass | 16514247 | 580 days ago | IN | 0.0128 ETH | 0.0052919 | ||||
Deposit Passes | 16512876 | 580 days ago | IN | 0 ETH | 0.00253674 | ||||
Rent Pass | 16511629 | 580 days ago | IN | 0.005 ETH | 0.00394193 | ||||
Rent Pass | 16511207 | 580 days ago | IN | 0.005 ETH | 0.00555916 | ||||
Deposit Passes | 16510972 | 580 days ago | IN | 0 ETH | 0.00247679 | ||||
0x60a06040 | 16510132 | 580 days ago | IN | 0 ETH | 0.0463724 |
Latest 8 internal transactions
Advanced mode:
Loading...
Loading
Contract Name:
PlayMyPass
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "./lib/IDelegationRegistry.sol"; import "./lib/IBAYCSewerPass.sol"; contract PlayMyPass is IERC721Receiver { struct PassData { uint16 passId; address passOwner; uint40 purchasePrice; // stored in GWEI uint32 hourlyRentalPrice; // stored in GWEI bool purchaseAllowed; bool rentalAllowed; bool boredPass; // for view functions, not stored in state bool dogPass; // for view functions, not stored in state } struct PassRental { uint16 passId; address renter; uint32 rentalEnd; uint32 hourlyRentalPrice; bool cannotExtend; bool boredPass; // for view functions, not stored in state bool dogPass; // for view functions, not stored in state } /// @dev Thrown when an ERC721 that is not the SewerPass tries to call onERC721Received error OnlySewerPass(); /// @dev Thrown when someone attempts to deposit, withdraw or update a pass they do not own error NotPassOwner(); /// @dev Thrown when attempting to rent or purchase and a pass owner has disabled rent/purchase error PassNotAvailable(); /// @dev Thrown when attempting to rent or purchase and the pass is already rented, or withdraw a pass that is currently rented error PassCurrentlyRented(); /// @dev Thrown when attempting to rent or purchase and msg.value is insufficent error InsufficientPayment(); /// @dev Thrown when a caller that is not the deployer tries to call the rescueToken function error OnlyDeployer(); /// @dev Thrown when the deployer tries to "rescue" the sponsored token error CannotRescueOwnedToken(); /// @dev Thrown when renter tries to rent past max time error SewersClosing(); /// @dev Thrown when attempting to set a pass for rental or sale at 0 cost error MustHaveValue(); PassData private CLEAR_PASS; address constant public SEWER_PASS = 0x764AeebcF425d56800eF2c84F2578689415a2DAa; IDelegationRegistry delegateCash = IDelegationRegistry(0x00000000000076A84feF008CDAbe6409d2FE638B); mapping(uint256 => PassData) public passData; mapping(uint256 => PassRental) public rentalData; uint256 constant public SEWERS_CLOSING = 1675814400; //February 8th, 12:00AM GMT, give pass owners time to get pass back in wallet & play before score freeze address constant public FEE_SPLITTER = 0xDa6058Bc88947004126089a8a5018c0121432379; //TODO: Update fee splitter address uint256 public constant FEE = 10; /// @dev store the deployer in case someone sends tokens to the contract without using safeTransferFrom address immutable DEPLOYER; constructor() { // set the deployer DEPLOYER = msg.sender; } /** * @notice Rents a Sewer Pass or extends rental for current renter * @param passId the sewer pass token ID being rented * @param rentalHours number of hours to rent the sewer pass for */ function rentPass(uint256 passId, uint256 rentalHours) external payable { PassData memory pd = passData[passId]; if(!pd.rentalAllowed) { revert PassNotAvailable(); } // revert if pass rental is disabled PassRental memory pr = rentalData[passId]; // load current rental data pr.passId = uint16(passId); //add passId to rental data, used later in UI functions if(pr.rentalEnd < block.timestamp) { // prior rental has expired if(pr.renter != msg.sender) { // new rental if(pr.renter != address(0)) { //revoke prior renter access if it exists delegateCash.delegateForToken(pr.renter, SEWER_PASS, passId, false); } delegateCash.delegateForToken(msg.sender, SEWER_PASS, passId, true); } pr.renter = msg.sender; // set renter pr.rentalEnd = uint32(block.timestamp + rentalHours * 1 hours); // set rental end } else { // current rental still active if(pr.renter == msg.sender) { // extend rental pr.rentalEnd += uint32(rentalHours * 1 hours); } else { // deny rental revert PassCurrentlyRented(); } } if(pr.rentalEnd > SEWERS_CLOSING) { revert SewersClosing(); } processRentalPayment(pd.passOwner, uint256(pd.hourlyRentalPrice), rentalHours); // pay pass owner rentalData[passId] = pr; // update state } /** * @notice Allows current renter for rented pass, or anyone for non-rented pass, to purchase a pass that the owner has set for sale * @param passId the sewer pass token ID being purchased */ function purchasePass(uint256 passId) external payable { PassData memory pd = passData[passId]; if(!pd.purchaseAllowed) { revert PassNotAvailable(); } // revert if pass purchase is disabled PassRental memory pr = rentalData[passId]; // load current rental data if(pr.renter != msg.sender && pr.rentalEnd > block.timestamp) { revert PassCurrentlyRented(); } // if currently rented, only current renter can purchase if(pr.renter != address(0)) { //clean up delegations delegateCash.delegateForToken(pr.renter, SEWER_PASS, passId, false); } processPurchasePayment(pd.passOwner, uint256(pd.purchasePrice)); // pay pass owner passData[passId] = CLEAR_PASS; // clean up state IERC721(SEWER_PASS).safeTransferFrom(address(this), msg.sender, passId); // transfer pass to purchaser } /** * @notice Internal function, converts calculates rental price, converts price from GWEI to WEI, checks payment amount, issues refund if necessary and sends payment to pass owner * @param passOwner the address of the pass holder to send payment to * @param hourlyRentalPrice the hourly rental price in GWEI for the sewer pass * @param rentalHours number of hours to rent the sewer pass for */ function processRentalPayment(address passOwner, uint256 hourlyRentalPrice, uint256 rentalHours) internal { uint256 rentalCost = hourlyRentalPrice * rentalHours * 1 gwei; // calculate cost, convert gwei to wei refundIfOver(rentalCost); payPassOwner(passOwner, rentalCost); } /** * @notice Internal function, converts purchase price from GWEI to WEI, checks payment amount, issues refund if necessary and sends payment to pass owner * @param passOwner the address of the pass holder to send payment to * @param purchasePrice the purchase price for the sewer pass in GWEI */ function processPurchasePayment(address passOwner, uint256 purchasePrice) internal { purchasePrice = purchasePrice * 1 gwei; //convert gwei to wei refundIfOver(purchasePrice); payPassOwner(passOwner, purchasePrice); } /** * @notice Send rental and purchase payments to pass owner, subtracts 10% FEE * @param passOwner the address of the pass holder to send payment to * @param price the total cost for the transaction */ function payPassOwner(address passOwner, uint256 price) internal { uint256 providerFee = price * FEE / 100; uint256 payment = price - providerFee; (bool sent, ) = payable(passOwner).call{value: payment}(""); require(sent); (sent, ) = payable(FEE_SPLITTER).call{value: providerFee}(""); require(sent); } /** * @notice Refund for overpayment on rental and purchases * @param price cost of the transaction */ function refundIfOver(uint256 price) private { if(msg.value < price) { revert InsufficientPayment(); } if (msg.value > price) { payable(msg.sender).transfer(msg.value - price); } } /** * @notice Withdraws sewer passes from contract, sewer pass cannot be withdrawn if actively rented * @param passIds the tokenIds of sewer passes to withdraw from the rental contract */ function withdrawPasses(uint256[] calldata passIds) external { address passOwner; for(uint256 i = 0;i < passIds.length;i++) { if(!isOwnerOrDelegate(msg.sender, passIds[i])) { revert NotPassOwner(); } // revert if msg.sender is not the owner of the pass or delegate if(rentalData[passIds[i]].rentalEnd >= block.timestamp) { revert PassCurrentlyRented(); } // revert if pass is currently on rent passOwner = passData[passIds[i]].passOwner; passData[passIds[i]] = CLEAR_PASS; // clean up state IERC721(SEWER_PASS).safeTransferFrom(address(this), passOwner, passIds[i]); // transfer pass back to owner } } /** * @notice Deposits passes to PlayMyPass and sets parameters * @param passIds array of sewer pass IDs to deposit to the rental contract, pass owner must setApprovalForAll on Sewer Pass to the rental contract * @param purchaseAllowed set if the pass is available for purchase * @param purchasePrice set the purchase price for the pass, price is in GWEI * @param hourlyRentalPrice set the hourly rental price for the pass, price is in GWEI */ function depositPasses(uint256[] calldata passIds, bool[] calldata purchaseAllowed, uint40[] calldata purchasePrice, uint32[] calldata hourlyRentalPrice) external { require(passIds.length == purchaseAllowed.length && purchaseAllowed.length == purchasePrice.length && purchasePrice.length == hourlyRentalPrice.length); PassData memory pd; pd.passOwner = msg.sender; pd.rentalAllowed = true; for(uint256 i = 0;i < passIds.length;i++) { if(IERC721(SEWER_PASS).ownerOf(passIds[i]) != msg.sender) { revert NotPassOwner(); } // revert if msg.sender is not the pass owner if(purchaseAllowed[i] && purchasePrice[i] == 0) { revert MustHaveValue(); } // revert if purchase is allowed but price is zero if(hourlyRentalPrice[i] == 0) { revert MustHaveValue(); } // revert if rental price is zero pd.passId = uint16(passIds[i]); pd.purchaseAllowed = purchaseAllowed[i]; pd.purchasePrice = purchasePrice[i]; pd.hourlyRentalPrice = hourlyRentalPrice[i]; passData[passIds[i]] = pd; // store pass rental parameters IERC721(SEWER_PASS).safeTransferFrom(msg.sender, address(this), passIds[i]); // transfer pass to rental contract } } /** * @notice Updates pass rental/purchase parameters * @param passIds array of sewer pass IDs to update rental parameters * @param purchaseAllowed set if the pass is available for purchase * @param rentalAllowed set if the pass is available for rent * @param purchasePrice set the purchase price for the pass, price is in GWEI * @param hourlyRentalPrice set the hourly rental price for the pass, price is in GWEI */ function updatePasses(uint256[] calldata passIds, bool[] calldata purchaseAllowed, bool[] calldata rentalAllowed, uint40[] calldata purchasePrice, uint32[] calldata hourlyRentalPrice) external { require(passIds.length == rentalAllowed.length && rentalAllowed.length == purchaseAllowed.length && purchaseAllowed.length == purchasePrice.length && purchasePrice.length == hourlyRentalPrice.length); PassData memory pd; for(uint256 i = 0;i < passIds.length;i++) { pd = passData[passIds[i]]; if(!isOwnerOrDelegate(msg.sender, passIds[i])) { revert NotPassOwner(); } // revert if msg.sender is not the owner or delegate for the sewer pass if(purchaseAllowed[i] && purchasePrice[i] == 0) { revert MustHaveValue(); } // revert if purchase is allowed but price is zero if(rentalAllowed[i] && hourlyRentalPrice[i] == 0) { revert MustHaveValue(); } // revert if rental is allowed but price is zero pd.purchaseAllowed = purchaseAllowed[i]; pd.rentalAllowed = rentalAllowed[i]; pd.purchasePrice = purchasePrice[i]; pd.hourlyRentalPrice = hourlyRentalPrice[i]; passData[passIds[i]] = pd; } } /** * @notice Receives sewer pass If transfer was not initiated by PlayMyPass contract, sets default values that do not allow purchase or rental Hot wallet delegate may update parameters after the pass is deposited by owner * @param operator account that initiated the safeTransferFrom * @param from account that owns the sewer pass and is transferring it into the rental contract * @param tokenId the tokenId for the sewer pass */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata) external returns (bytes4) { if(msg.sender != SEWER_PASS) { revert OnlySewerPass(); } if(operator != address(this)) { // if safeTransferFrom was not initiated by rental contract, store default parameters which do not allow for purchase or rental PassData memory pd; pd.passId = uint16(tokenId); pd.passOwner = from; passData[tokenId] = pd; } return IERC721Receiver.onERC721Received.selector; } /** * @notice Withdraws fees collected */ function withdraw() external { payable(FEE_SPLITTER).transfer(address(this).balance); } /** * @notice Returns an array of sewer pass tokens for specified address * @param owner the account to get a list of sewer pass tokenIds for */ function sewerpassTokenIds(address owner) external view returns(uint256[] memory tokenIds) { uint256 balance = IERC721(SEWER_PASS).balanceOf(owner); tokenIds = new uint256[](balance); for(uint256 tokenIndex = 0;tokenIndex < balance;tokenIndex++) { tokenIds[tokenIndex] = IERC721Enumerable(SEWER_PASS).tokenOfOwnerByIndex(owner, tokenIndex); } } /** * @notice Returns an array of sewer passes that are currently available to rent */ function availableToRent() external view returns(PassData[] memory passes) { PassData[] memory tmpPasses = new PassData[](1000); uint256[] memory tmpTokenIds = this.sewerpassTokenIds(address(this)); uint256 tmpIndex = 0; uint256 passTier; for(uint256 index = 0;index < tmpTokenIds.length;index++) { if((passData[tmpTokenIds[index]].rentalAllowed || passData[tmpTokenIds[index]].purchaseAllowed) && rentalData[tmpTokenIds[index]].rentalEnd < block.timestamp) { tmpPasses[tmpIndex] = passData[tmpTokenIds[index]]; (passTier,,) = IBAYCSewerPass(SEWER_PASS).getMintDataByTokenId(tmpTokenIds[index]); tmpPasses[tmpIndex].boredPass = (passTier > 2); tmpPasses[tmpIndex].dogPass = (passTier % 2 == 0); tmpIndex++; } } passes = new PassData[](tmpIndex); for(uint256 index = 0;index < tmpIndex;index++) { passes[index] = tmpPasses[index]; } } /** * @notice Returns an array of active passes owned by address * @param owner the account to list sewer passes deposited to the rental contract */ function myPassesForRent(address owner) external view returns(PassData[] memory passes) { PassData[] memory tmpPasses = new PassData[](1000); uint256[] memory tmpTokenIds = this.sewerpassTokenIds(address(this)); uint256 tmpIndex = 0; uint256 passTier; for(uint256 index = 0;index < tmpTokenIds.length;index++) { if(isOwnerOrDelegate(owner, tmpTokenIds[index])) { tmpPasses[tmpIndex] = passData[tmpTokenIds[index]]; (passTier,,) = IBAYCSewerPass(SEWER_PASS).getMintDataByTokenId(tmpTokenIds[index]); tmpPasses[tmpIndex].boredPass = (passTier > 2); tmpPasses[tmpIndex].dogPass = (passTier % 2 == 0); tmpIndex++; } } passes = new PassData[](tmpIndex); for(uint256 index = 0;index < tmpIndex;index++) { passes[index] = tmpPasses[index]; } } /** * @notice Returns an array of active pass rentals, includes cost to extend rental and if it can be extended * @param owner the address to check */ function myPassesRented(address owner) external view returns(PassRental[] memory rentals) { PassRental[] memory tmpRentals = new PassRental[](1000); uint256[] memory tmpTokenIds = this.sewerpassTokenIds(address(this)); uint256 tmpIndex = 0; uint256 passTier; for(uint256 index = 0;index < tmpTokenIds.length;index++) { if(rentalData[tmpTokenIds[index]].rentalEnd >= block.timestamp && isOwnerOrDelegate(owner, tmpTokenIds[index])) { tmpRentals[tmpIndex] = rentalData[tmpTokenIds[index]]; tmpRentals[tmpIndex].hourlyRentalPrice = passData[tmpTokenIds[index]].hourlyRentalPrice; tmpRentals[tmpIndex].cannotExtend = !passData[tmpTokenIds[index]].rentalAllowed; (passTier,,) = IBAYCSewerPass(SEWER_PASS).getMintDataByTokenId(tmpTokenIds[index]); tmpRentals[tmpIndex].boredPass = (passTier > 2); tmpRentals[tmpIndex].dogPass = (passTier % 2 == 0); tmpIndex++; } } rentals = new PassRental[](tmpIndex); for(uint256 index = 0;index < tmpIndex;index++) { rentals[index] = tmpRentals[index]; } } /** * @notice Returns an array of active pass rentals, includes cost to extend rental and if it can be extended * @param renter the address to check for active rentals */ function myRentals(address renter) external view returns(PassRental[] memory rentals) { PassRental[] memory tmpRentals = new PassRental[](1000); uint256[] memory tmpTokenIds = this.sewerpassTokenIds(address(this)); uint256 tmpIndex = 0; uint256 passTier; for(uint256 index = 0;index < tmpTokenIds.length;index++) { if(rentalData[tmpTokenIds[index]].rentalEnd >= block.timestamp && rentalData[tmpTokenIds[index]].renter == renter) { tmpRentals[tmpIndex] = rentalData[tmpTokenIds[index]]; tmpRentals[tmpIndex].hourlyRentalPrice = passData[tmpTokenIds[index]].hourlyRentalPrice; tmpRentals[tmpIndex].cannotExtend = !passData[tmpTokenIds[index]].rentalAllowed; (passTier,,) = IBAYCSewerPass(SEWER_PASS).getMintDataByTokenId(tmpTokenIds[index]); tmpRentals[tmpIndex].boredPass = (passTier > 2); tmpRentals[tmpIndex].dogPass = (passTier % 2 == 0); tmpIndex++; } } rentals = new PassRental[](tmpIndex); for(uint256 index = 0;index < tmpIndex;index++) { rentals[index] = tmpRentals[index]; } } /** * @notice check to see if operator is owner or delegate via delegate cash * @param operator the address of the account to check for access * @param passId the tokenId of the sewer pass */ function isOwnerOrDelegate( address operator, uint256 passId ) internal view returns (bool) { address tokenOwner = passData[passId].passOwner; return (operator == tokenOwner || delegateCash.checkDelegateForToken( operator, tokenOwner, SEWER_PASS, passId )); } /** * @notice Rescue tokens that were sent to this contract without using safeTransferFrom. Only callable by the * deployer, and disallows the deployer from removing the sponsored token. Borrowed from emo.eth Dookey4All */ function rescueToken(address tokenAddress, bool erc20, uint256 id) external { // restrict to deployer if (msg.sender != DEPLOYER) { revert OnlyDeployer(); } if (erc20) { // transfer entire ERC20 balance to the deployer IERC20(tokenAddress).transfer(msg.sender, IERC20(tokenAddress).balanceOf(address(this))); } else { // allow rescuing sewer pass tokens, but not the sponsored token // sewer pass tokens which are *not* the sponsored token can be transferred using normal transferFrom // but the onERC721Received callback will not be invoked to register them as the sponsored token, so they // cannot be withdrawn otherwise if (tokenAddress == address(SEWER_PASS) && passData[id].passOwner != address(0)) { revert CannotRescueOwnedToken(); } // transfer the token to the deployer IERC721(tokenAddress).transferFrom(address(this), msg.sender, id); } // no need to cover ERC1155 since they only implement safeTransferFrom, and this contract will reject them all // same with ether as there are no payable methods; those who selfdestruct, etc funds should expect to lose them } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; interface IBAYCSewerPass { function getMintDataByTokenId(uint256 tokenId) external view returns (uint256 tier, uint256 apeTokenId, uint256 dogTokenId); }
// SPDX-License-Identifier: CC0-1.0 pragma solidity ^0.8.17; /** * @title An immutable registry contract to be deployed as a standalone primitive * @dev See EIP-5639, new project launches can read previous cold wallet -> hot wallet delegations * from here and integrate those permissions into their flow */ interface IDelegationRegistry { /// @notice Delegation type enum DelegationType { NONE, ALL, CONTRACT, TOKEN } /// @notice Info about a single delegation, used for onchain enumeration struct DelegationInfo { DelegationType type_; address vault; address delegate; address contract_; uint256 tokenId; } /// @notice Info about a single contract-level delegation struct ContractDelegation { address contract_; address delegate; } /// @notice Info about a single token-level delegation struct TokenDelegation { address contract_; uint256 tokenId; address delegate; } /// @notice Emitted when a user delegates their entire wallet event DelegateForAll(address vault, address delegate, bool value); /// @notice Emitted when a user delegates a specific contract event DelegateForContract(address vault, address delegate, address contract_, bool value); /// @notice Emitted when a user delegates a specific token event DelegateForToken(address vault, address delegate, address contract_, uint256 tokenId, bool value); /// @notice Emitted when a user revokes all delegations event RevokeAllDelegates(address vault); /// @notice Emitted when a user revoes all delegations for a given delegate event RevokeDelegate(address vault, address delegate); /** * ----------- WRITE ----------- */ /** * @notice Allow the delegate to act on your behalf for all contracts * @param delegate The hotwallet to act on your behalf * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking */ function delegateForAll(address delegate, bool value) external; /** * @notice Allow the delegate to act on your behalf for a specific contract * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking */ function delegateForContract(address delegate, address contract_, bool value) external; /** * @notice Allow the delegate to act on your behalf for a specific token * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param tokenId The token id for the token you're delegating * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking */ function delegateForToken(address delegate, address contract_, uint256 tokenId, bool value) external; /** * @notice Revoke all delegates */ function revokeAllDelegates() external; /** * @notice Revoke a specific delegate for all their permissions * @param delegate The hotwallet to revoke */ function revokeDelegate(address delegate) external; /** * @notice Remove yourself as a delegate for a specific vault * @param vault The vault which delegated to the msg.sender, and should be removed */ function revokeSelf(address vault) external; /** * ----------- READ ----------- */ /** * @notice Returns all active delegations a given delegate is able to claim on behalf of * @param delegate The delegate that you would like to retrieve delegations for * @return info Array of DelegationInfo structs */ function getDelegationsByDelegate(address delegate) external view returns (DelegationInfo[] memory); /** * @notice Returns an array of wallet-level delegates for a given vault * @param vault The cold wallet who issued the delegation * @return addresses Array of wallet-level delegates for a given vault */ function getDelegatesForAll(address vault) external view returns (address[] memory); /** * @notice Returns an array of contract-level delegates for a given vault and contract * @param vault The cold wallet who issued the delegation * @param contract_ The address for the contract you're delegating * @return addresses Array of contract-level delegates for a given vault and contract */ function getDelegatesForContract(address vault, address contract_) external view returns (address[] memory); /** * @notice Returns an array of contract-level delegates for a given vault's token * @param vault The cold wallet who issued the delegation * @param contract_ The address for the contract holding the token * @param tokenId The token id for the token you're delegating * @return addresses Array of contract-level delegates for a given vault's token */ function getDelegatesForToken(address vault, address contract_, uint256 tokenId) external view returns (address[] memory); /** * @notice Returns all contract-level delegations for a given vault * @param vault The cold wallet who issued the delegations * @return delegations Array of ContractDelegation structs */ function getContractLevelDelegations(address vault) external view returns (ContractDelegation[] memory delegations); /** * @notice Returns all token-level delegations for a given vault * @param vault The cold wallet who issued the delegations * @return delegations Array of TokenDelegation structs */ function getTokenLevelDelegations(address vault) external view returns (TokenDelegation[] memory delegations); /** * @notice Returns true if the address is delegated to act on the entire vault * @param delegate The hotwallet to act on your behalf * @param vault The cold wallet who issued the delegation */ function checkDelegateForAll(address delegate, address vault) external view returns (bool); /** * @notice Returns true if the address is delegated to act on your behalf for a token contract or an entire vault * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param vault The cold wallet who issued the delegation */ function checkDelegateForContract(address delegate, address vault, address contract_) external view returns (bool); /** * @notice Returns true if the address is delegated to act on your behalf for a specific token, the token's contract or an entire vault * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param tokenId The token id for the token you're delegating * @param vault The cold wallet who issued the delegation */ function checkDelegateForToken(address delegate, address vault, address contract_, uint256 tokenId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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 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); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CannotRescueOwnedToken","type":"error"},{"inputs":[],"name":"InsufficientPayment","type":"error"},{"inputs":[],"name":"MustHaveValue","type":"error"},{"inputs":[],"name":"NotPassOwner","type":"error"},{"inputs":[],"name":"OnlyDeployer","type":"error"},{"inputs":[],"name":"OnlySewerPass","type":"error"},{"inputs":[],"name":"PassCurrentlyRented","type":"error"},{"inputs":[],"name":"PassNotAvailable","type":"error"},{"inputs":[],"name":"SewersClosing","type":"error"},{"inputs":[],"name":"FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_SPLITTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEWERS_CLOSING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEWER_PASS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableToRent","outputs":[{"components":[{"internalType":"uint16","name":"passId","type":"uint16"},{"internalType":"address","name":"passOwner","type":"address"},{"internalType":"uint40","name":"purchasePrice","type":"uint40"},{"internalType":"uint32","name":"hourlyRentalPrice","type":"uint32"},{"internalType":"bool","name":"purchaseAllowed","type":"bool"},{"internalType":"bool","name":"rentalAllowed","type":"bool"},{"internalType":"bool","name":"boredPass","type":"bool"},{"internalType":"bool","name":"dogPass","type":"bool"}],"internalType":"struct PlayMyPass.PassData[]","name":"passes","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"passIds","type":"uint256[]"},{"internalType":"bool[]","name":"purchaseAllowed","type":"bool[]"},{"internalType":"uint40[]","name":"purchasePrice","type":"uint40[]"},{"internalType":"uint32[]","name":"hourlyRentalPrice","type":"uint32[]"}],"name":"depositPasses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"myPassesForRent","outputs":[{"components":[{"internalType":"uint16","name":"passId","type":"uint16"},{"internalType":"address","name":"passOwner","type":"address"},{"internalType":"uint40","name":"purchasePrice","type":"uint40"},{"internalType":"uint32","name":"hourlyRentalPrice","type":"uint32"},{"internalType":"bool","name":"purchaseAllowed","type":"bool"},{"internalType":"bool","name":"rentalAllowed","type":"bool"},{"internalType":"bool","name":"boredPass","type":"bool"},{"internalType":"bool","name":"dogPass","type":"bool"}],"internalType":"struct PlayMyPass.PassData[]","name":"passes","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"myPassesRented","outputs":[{"components":[{"internalType":"uint16","name":"passId","type":"uint16"},{"internalType":"address","name":"renter","type":"address"},{"internalType":"uint32","name":"rentalEnd","type":"uint32"},{"internalType":"uint32","name":"hourlyRentalPrice","type":"uint32"},{"internalType":"bool","name":"cannotExtend","type":"bool"},{"internalType":"bool","name":"boredPass","type":"bool"},{"internalType":"bool","name":"dogPass","type":"bool"}],"internalType":"struct PlayMyPass.PassRental[]","name":"rentals","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"renter","type":"address"}],"name":"myRentals","outputs":[{"components":[{"internalType":"uint16","name":"passId","type":"uint16"},{"internalType":"address","name":"renter","type":"address"},{"internalType":"uint32","name":"rentalEnd","type":"uint32"},{"internalType":"uint32","name":"hourlyRentalPrice","type":"uint32"},{"internalType":"bool","name":"cannotExtend","type":"bool"},{"internalType":"bool","name":"boredPass","type":"bool"},{"internalType":"bool","name":"dogPass","type":"bool"}],"internalType":"struct PlayMyPass.PassRental[]","name":"rentals","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"passData","outputs":[{"internalType":"uint16","name":"passId","type":"uint16"},{"internalType":"address","name":"passOwner","type":"address"},{"internalType":"uint40","name":"purchasePrice","type":"uint40"},{"internalType":"uint32","name":"hourlyRentalPrice","type":"uint32"},{"internalType":"bool","name":"purchaseAllowed","type":"bool"},{"internalType":"bool","name":"rentalAllowed","type":"bool"},{"internalType":"bool","name":"boredPass","type":"bool"},{"internalType":"bool","name":"dogPass","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"passId","type":"uint256"}],"name":"purchasePass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"passId","type":"uint256"},{"internalType":"uint256","name":"rentalHours","type":"uint256"}],"name":"rentPass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rentalData","outputs":[{"internalType":"uint16","name":"passId","type":"uint16"},{"internalType":"address","name":"renter","type":"address"},{"internalType":"uint32","name":"rentalEnd","type":"uint32"},{"internalType":"uint32","name":"hourlyRentalPrice","type":"uint32"},{"internalType":"bool","name":"cannotExtend","type":"bool"},{"internalType":"bool","name":"boredPass","type":"bool"},{"internalType":"bool","name":"dogPass","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"bool","name":"erc20","type":"bool"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"sewerpassTokenIds","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"passIds","type":"uint256[]"},{"internalType":"bool[]","name":"purchaseAllowed","type":"bool[]"},{"internalType":"bool[]","name":"rentalAllowed","type":"bool[]"},{"internalType":"uint40[]","name":"purchasePrice","type":"uint40[]"},{"internalType":"uint32[]","name":"hourlyRentalPrice","type":"uint32[]"}],"name":"updatePasses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"passIds","type":"uint256[]"}],"name":"withdrawPasses","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a0604052600280546001600160a01b0319166d76a84fef008cdabe6409d2fe638b17905534801561003057600080fd5b503360805260805161393e6100506000396000611b3b015261393e6000f3fe6080604052600436106101145760003560e01c806351258040116100a0578063a31e4a0311610064578063a31e4a03146103c8578063acfcf9d9146103e8578063c57981b5146104cc578063c8d10f82146104e1578063f621226c1461050157600080fd5b8063512580401461033857806359d79f781461035a5780636969947c1461036d5780636a631c521461038d57806393928fed146103a257600080fd5b8063150b7a02116100e7578063150b7a02146101be5780631c833a6a146101f75780632bed7f0f14610237578063364253e1146102575780633ccfd60b1461032357600080fd5b8063013782611461011957806310a49d791461014f57806312ebbaac1461017c57806314462eda146101a9575b600080fd5b34801561012557600080fd5b506101396101343660046130e2565b610521565b6040516101469190613106565b60405180910390f35b34801561015b57600080fd5b5061016f61016a3660046130e2565b6108ab565b60405161014691906131b5565b34801561018857600080fd5b5061019c6101973660046130e2565b610a2c565b60405161014691906131f9565b6101bc6101b736600461328c565b610ee2565b005b3480156101ca57600080fd5b506101de6101d93660046132a5565b61129d565b6040516001600160e01b03199091168152602001610146565b34801561020357600080fd5b5061021f73da6058bc88947004126089a8a5018c012143237981565b6040516001600160a01b039091168152602001610146565b34801561024357600080fd5b506101bc610252366004613390565b6113ff565b34801561026357600080fd5b506102d261027236600461328c565b6004602052600090815260409020805460019091015461ffff8216916001600160a01b03620100008204169163ffffffff600160b01b8304811692600160d01b81049091169160ff600160f01b8304811692600160f81b90048116911687565b6040805161ffff90981688526001600160a01b03909616602088015263ffffffff9485169587019590955292909116606085015215156080840152151560a0830152151560c082015260e001610146565b34801561032f57600080fd5b506101bc6116c7565b34801561034457600080fd5b5061021f6000805160206138e983398151915281565b6101bc6103683660046133d2565b61170a565b34801561037957600080fd5b506101bc610388366004613402565b611b30565b34801561039957600080fd5b50610139611cf0565b3480156103ae57600080fd5b506103ba6363e2e60081565b604051908152602001610146565b3480156103d457600080fd5b506101bc6103e3366004613443565b612118565b3480156103f457600080fd5b5061046d61040336600461328c565b6003602052600090815260409020805460019091015461ffff821691620100008082046001600160a01b031692600160b01b830464ffffffffff1692600160d81b810463ffffffff1692600160f81b90910460ff9081169281811692610100820483169291041688565b6040805161ffff90991689526001600160a01b03909716602089015264ffffffffff9095169587019590955263ffffffff909216606086015215156080850152151560a084015290151560c0830152151560e082015261010001610146565b3480156104d857600080fd5b506103ba600a81565b3480156104ed57600080fd5b5061019c6104fc3660046130e2565b61253b565b34801561050d57600080fd5b506101bc61051c366004613507565b6129bb565b604080516103e8808252617d20820190925260609160009190816020015b61054761304d565b81526020019060019003908161053f579050506040516310a49d7960e01b81523060048201819052919250600091906310a49d7990602401600060405180830381865afa15801561059c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105c4919081019061360e565b9050600080805b83518110156107f6576105f7878583815181106105ea576105ea6136cc565b6020026020010151612dd9565b156107e45760036000858381518110610612576106126136cc565b602090810291909101810151825281810192909252604090810160002081516101008082018452825461ffff81168352620100008082046001600160a01b031696840196909652600160b01b810464ffffffffff1694830194909452600160d81b840463ffffffff166060830152600160f81b90930460ff90811615156080830152600190920154808316151560a08301529283048216151560c08201529290910416151560e082015285518690859081106106d0576106d06136cc565b60200260200101819052506000805160206138e98339815191526001600160a01b0316638411a8f685838151811061070a5761070a6136cc565b60200260200101516040518263ffffffff1660e01b815260040161073091815260200190565b606060405180830381865afa15801561074d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077191906136e2565b905050809250506002821185848151811061078e5761078e6136cc565b602090810291909101015190151560c0909101526107ad600283613726565b6000148584815181106107c2576107c26136cc565b602090810291909101015190151560e090910152826107e081613750565b9350505b806107ee81613750565b9150506105cb565b508167ffffffffffffffff811115610810576108106135f8565b60405190808252806020026020018201604052801561084957816020015b61083661304d565b81526020019060019003908161082e5790505b50945060005b828110156108a157848181518110610869576108696136cc565b6020026020010151868281518110610883576108836136cc565b6020026020010181905250808061089990613750565b91505061084f565b5050505050919050565b6040516370a0823160e01b81526001600160a01b03821660048201526060906000906000805160206138e9833981519152906370a0823190602401602060405180830381865afa158015610903573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109279190613769565b90508067ffffffffffffffff811115610942576109426135f8565b60405190808252806020026020018201604052801561096b578160200160208202803683370190505b50915060005b81811015610a2557604051632f745c5960e01b81526001600160a01b0385166004820152602481018290526000805160206138e983398151915290632f745c5990604401602060405180830381865afa1580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190613769565b838281518110610a0857610a086136cc565b602090810291909101015280610a1d81613750565b915050610971565b5050919050565b604080516103e8808252617d20820190925260609160009190816020015b610a52613091565b815260200190600190039081610a4a579050506040516310a49d7960e01b81523060048201819052919250600091906310a49d7990602401600060405180830381865afa158015610aa7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610acf919081019061360e565b9050600080805b8351811015610e37574260046000868481518110610af657610af66136cc565b602090810291909101810151825281019190915260400160002054600160b01b900463ffffffff1610801590610b735750866001600160a01b031660046000868481518110610b4757610b476136cc565b6020908102919091018101518252810191909152604001600020546201000090046001600160a01b0316145b15610e255760046000858381518110610b8e57610b8e6136cc565b6020908102919091018101518252818101929092526040908101600020815160e081018352815461ffff811682526001600160a01b03620100008204169482019490945263ffffffff600160b01b8504811693820193909352600160d01b8404909216606083015260ff600160f01b8404811615156080840152600160f81b9093048316151560a083015260010154909116151560c08201528551869085908110610c3b57610c3b6136cc565b602002602001018190525060036000858381518110610c5c57610c5c6136cc565b60200260200101518152602001908152602001600020600001601b9054906101000a900463ffffffff16858481518110610c9857610c986136cc565b60200260200101516060019063ffffffff16908163ffffffff168152505060036000858381518110610ccc57610ccc6136cc565b6020026020010151815260200190815260200160002060010160009054906101000a900460ff1615858481518110610d0657610d066136cc565b602002602001015160800190151590811515815250506000805160206138e98339815191526001600160a01b0316638411a8f6858381518110610d4b57610d4b6136cc565b60200260200101516040518263ffffffff1660e01b8152600401610d7191815260200190565b606060405180830381865afa158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db291906136e2565b9050508092505060028211858481518110610dcf57610dcf6136cc565b602090810291909101015190151560a090910152610dee600283613726565b600014858481518110610e0357610e036136cc565b602090810291909101015190151560c09091015282610e2181613750565b9350505b80610e2f81613750565b915050610ad6565b508167ffffffffffffffff811115610e5157610e516135f8565b604051908082528060200260200182016040528015610e8a57816020015b610e77613091565b815260200190600190039081610e6f5790505b50945060005b828110156108a157848181518110610eaa57610eaa6136cc565b6020026020010151868281518110610ec457610ec46136cc565b60200260200101819052508080610eda90613750565b915050610e90565b60008181526003602090815260409182902082516101008082018552825461ffff81168352620100008082046001600160a01b031695840195909552600160b01b810464ffffffffff1695830195909552600160d81b850463ffffffff166060830152600160f81b90940460ff908116151560808301819052600190930154808216151560a08401529485048116151560c083015292909304909116151560e0830152610fa257604051630de56a4b60e31b815260040160405180910390fd5b600082815260046020908152604091829020825160e081018452815461ffff811682526001600160a01b036201000082041693820184905263ffffffff600160b01b8204811695830195909552600160d01b8104909416606082015260ff600160f01b8504811615156080830152600160f81b9094048416151560a0820152600190910154909216151560c08301523314801590611049575042816040015163ffffffff16115b1561106a576040516001622b8c6360e21b0319815260040160405180910390fd5b60208101516001600160a01b0316156110f857600254602082015160405163537a5c3d60e01b81526001600160a01b039092169163537a5c3d916110c5916000805160206138e9833981519152908890600090600401613782565b600060405180830381600087803b1580156110df57600080fd5b505af11580156110f3573d6000803e3d6000fd5b505050505b6111118260200151836040015164ffffffffff16612e9f565b6000838152600360205260408082208254815461ffff90911661ffff198083168217845585546001600160b01b031990931690911762010000928390046001600160a01b0316830217808455855464ffffffffff60b01b198216600160b01b9182900464ffffffffff169091029081178555865468ffffffffffffffffff60b01b1990921663ffffffff60d81b1990911617600160d81b9182900463ffffffff169091021780845594546001600160f81b03909516600160f81b9586900460ff908116151590960217835560018054938101805460ff198116958816151595861782558254931661ff001990951694909417610100928390048716151590920291909117808455905462ff000019909116908290049094161515029290921790915551632142170760e11b81526000805160206138e9833981519152906342842e0e90611266903090339088906004016137ab565b600060405180830381600087803b15801561128057600080fd5b505af1158015611294573d6000803e3d6000fd5b50505050505050565b6000336000805160206138e9833981519152146112cd5760405163121dd14560e21b815260040160405180910390fd5b6001600160a01b03861630146113ed576112e561304d565b61ffff85811682526001600160a01b038781166020808501918252600089815260039091526040908190208551815493519287015160608801516080890151929097166001600160b01b031990951694909417620100009390951683029490941768ffffffffffffffffff60b01b1916600160b01b64ffffffffff9094169390930263ffffffff60d81b191692909217600160d81b63ffffffff90951694909402939093176001600160f81b0316600160f81b9215159290920291909117815560a08301516001909101805460c085015160e09095015161ffff1990911692151561ff00191692909217610100941515949094029390931762ff000019169015159091021790555b50630a85bd0160e11b95945050505050565b6000805b828110156116c15761142d33858584818110611421576114216136cc565b90506020020135612dd9565b61144a57604051636061778f60e11b815260040160405180910390fd5b4260046000868685818110611461576114616136cc565b6020908102929092013583525081019190915260400160002054600160b01b900463ffffffff16106114a9576040516001622b8c6360e21b0319815260040160405180910390fd5b600360008585848181106114bf576114bf6136cc565b90506020020135815260200190815260200160002060000160029054906101000a90046001600160a01b03169150600060036000868685818110611505576115056136cc565b602090810292909201358352508101919091526040016000208154815461ffff90911661ffff198083168217845584546001600160b01b031990931690911762010000928390046001600160a01b0316830217808455845464ffffffffff60b01b198216600160b01b9182900464ffffffffff169091029081178555855468ffffffffffffffffff60b01b1990921663ffffffff60d81b1990911617600160d81b9182900463ffffffff169091021780845584546001600160f81b03909116600160f81b9182900460ff90811615159092021784556001948501805495909401805460ff198116968316151596871782558554931661ff001990961695909517610100928390048216151590920291909117808555925462ff00001990931692829004161515021790556000805160206138e98339815191526342842e0e3084878786818110611657576116576136cc565b905060200201356040518463ffffffff1660e01b815260040161167c939291906137ab565b600060405180830381600087803b15801561169657600080fd5b505af11580156116aa573d6000803e3d6000fd5b5050505080806116b990613750565b915050611403565b50505050565b60405173da6058bc88947004126089a8a5018c0121432379904780156108fc02916000818181858888f19350505050158015611707573d6000803e3d6000fd5b50565b60008281526003602090815260409182902082516101008082018552825461ffff81168352620100008082046001600160a01b031695840195909552600160b01b810464ffffffffff1695830195909552600160d81b850463ffffffff166060830152600160f81b90940460ff90811615156080830152600190920154808316151560a083018190529481048316151560c08301529290920416151560e0820152906117c957604051630de56a4b60e31b815260040160405180910390fd5b600083815260046020908152604091829020825160e08101845281546001600160a01b03620100008204169382019390935263ffffffff600160b01b84048116948201859052600160d01b840416606082015260ff600160f01b8404811615156080830152600160f81b9093048316151560a0820152600190910154909116151560c082015261ffff85168152904211156119a45760208101516001600160a01b031633146119785760208101516001600160a01b03161561190057600254602082015160405163537a5c3d60e01b81526001600160a01b039092169163537a5c3d916118cd916000805160206138e9833981519152908990600090600401613782565b600060405180830381600087803b1580156118e757600080fd5b505af11580156118fb573d6000803e3d6000fd5b505050505b60025460405163537a5c3d60e01b81526001600160a01b039091169063537a5c3d906119459033906000805160206138e9833981519152908990600190600401613782565b600060405180830381600087803b15801561195f57600080fd5b505af1158015611973573d6000803e3d6000fd5b505050505b33602082015261198a83610e106137cf565b61199490426137e6565b63ffffffff166040820152611a08565b336001600160a01b031681602001516001600160a01b0316036119ec576119cd83610e106137cf565b816040018181516119de91906137f9565b63ffffffff16905250611a08565b6040516001622b8c6360e21b0319815260040160405180910390fd5b6363e2e600816040015163ffffffff161115611a3757604051635960c63760e01b815260040160405180910390fd5b611a508260200151836060015163ffffffff1685612ec6565b6000938452600460209081526040948590208251815492840151968401516060850151608086015160a087015161ffff9094166001600160b01b031990961695909517620100006001600160a01b03909a16999099029890981767ffffffffffffffff60b01b1916600160b01b63ffffffff9283160263ffffffff60d01b191617600160d01b9190981602969096176001600160f01b0316600160f01b921515929092026001600160f81b031691909117600160f81b9515159590950294909417845560c001516001909301805460ff1916931515939093179092555050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611b795760405163618bbdd560e01b815260040160405180910390fd5b8115611c60576040516370a0823160e01b81523060048201526001600160a01b0384169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf19190613769565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611c3c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c1919061381d565b6001600160a01b0383166000805160206138e9833981519152148015611ca257506000818152600360205260409020546201000090046001600160a01b031615155b15611cc057604051630cc63f9960e21b815260040160405180910390fd5b6040516323b872dd60e01b81526001600160a01b038416906323b872dd90611266903090339086906004016137ab565b604080516103e8808252617d20820190925260609160009190816020015b611d1661304d565b815260200190600190039081611d0e579050506040516310a49d7960e01b81523060048201819052919250600091906310a49d7990602401600060405180830381865afa158015611d6b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d93919081019061360e565b9050600080805b83518110156120655760036000858381518110611db957611db96136cc565b60209081029190910181015182528101919091526040016000206001015460ff1680611e1e575060036000858381518110611df657611df66136cc565b60200260200101518152602001908152602001600020600001601f9054906101000a900460ff165b8015611e6657504260046000868481518110611e3c57611e3c6136cc565b602090810291909101810151825281019190915260400160002054600160b01b900463ffffffff16105b156120535760036000858381518110611e8157611e816136cc565b602090810291909101810151825281810192909252604090810160002081516101008082018452825461ffff81168352620100008082046001600160a01b031696840196909652600160b01b810464ffffffffff1694830194909452600160d81b840463ffffffff166060830152600160f81b90930460ff90811615156080830152600190920154808316151560a08301529283048216151560c08201529290910416151560e08201528551869085908110611f3f57611f3f6136cc565b60200260200101819052506000805160206138e98339815191526001600160a01b0316638411a8f6858381518110611f7957611f796136cc565b60200260200101516040518263ffffffff1660e01b8152600401611f9f91815260200190565b606060405180830381865afa158015611fbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe091906136e2565b9050508092505060028211858481518110611ffd57611ffd6136cc565b602090810291909101015190151560c09091015261201c600283613726565b600014858481518110612031576120316136cc565b602090810291909101015190151560e0909101528261204f81613750565b9350505b8061205d81613750565b915050611d9a565b508167ffffffffffffffff81111561207f5761207f6135f8565b6040519080825280602002602001820160405280156120b857816020015b6120a561304d565b81526020019060019003908161209d5790505b50945060005b82811015612110578481815181106120d8576120d86136cc565b60200260200101518682815181106120f2576120f26136cc565b6020026020010181905250808061210890613750565b9150506120be565b505050505090565b868514801561212657508483145b801561213157508281145b61213a57600080fd5b61214261304d565b336020820152600160a082015260005b8881101561252f57336000805160206138e9833981519152636352211e8c8c85818110612181576121816136cc565b905060200201356040518263ffffffff1660e01b81526004016121a691815260200190565b602060405180830381865afa1580156121c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e7919061383a565b6001600160a01b03161461220e57604051636061778f60e11b815260040160405180910390fd5b878782818110612220576122206136cc565b90506020020160208101906122359190613857565b801561226c575085858281811061224e5761224e6136cc565b90506020020160208101906122639190613874565b64ffffffffff16155b1561228a5760405163b4a4ea5f60e01b815260040160405180910390fd5b83838281811061229c5761229c6136cc565b90506020020160208101906122b1919061389b565b63ffffffff166000036122d75760405163b4a4ea5f60e01b815260040160405180910390fd5b8989828181106122e9576122e96136cc565b602002919091013561ffff1683525087878281811061230a5761230a6136cc565b905060200201602081019061231f9190613857565b15156080830152858582818110612338576123386136cc565b905060200201602081019061234d9190613874565b64ffffffffff16604083015283838281811061236b5761236b6136cc565b9050602002016020810190612380919061389b565b63ffffffff16606083015281600360008c8c858181106123a2576123a26136cc565b602090810292909201358352508181019290925260409081016000208351815493850151928501516060860151608087015161ffff9093166001600160b01b031990961695909517620100006001600160a01b0390951685021768ffffffffffffffffff60b01b1916600160b01b64ffffffffff9092169190910263ffffffff60d81b191617600160d81b63ffffffff90951694909402939093176001600160f81b0316600160f81b9315159390930292909217825560a08301516001909201805460c085015160e09095015161ffff1990911693151561ff00191693909317610100941515949094029390931762ff00001916911515021790556000805160206138e98339815191526342842e0e33308d8d868181106124c5576124c56136cc565b905060200201356040518463ffffffff1660e01b81526004016124ea939291906137ab565b600060405180830381600087803b15801561250457600080fd5b505af1158015612518573d6000803e3d6000fd5b50505050808061252790613750565b915050612152565b50505050505050505050565b604080516103e8808252617d20820190925260609160009190816020015b612561613091565b815260200190600190039081612559579050506040516310a49d7960e01b81523060048201819052919250600091906310a49d7990602401600060405180830381865afa1580156125b6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125de919081019061360e565b9050600080805b8351811015612910574260046000868481518110612605576126056136cc565b602090810291909101810151825281019190915260400160002054600160b01b900463ffffffff161080159061264c575061264c878583815181106105ea576105ea6136cc565b156128fe5760046000858381518110612667576126676136cc565b6020908102919091018101518252818101929092526040908101600020815160e081018352815461ffff811682526001600160a01b03620100008204169482019490945263ffffffff600160b01b8504811693820193909352600160d01b8404909216606083015260ff600160f01b8404811615156080840152600160f81b9093048316151560a083015260010154909116151560c08201528551869085908110612714576127146136cc565b602002602001018190525060036000858381518110612735576127356136cc565b60200260200101518152602001908152602001600020600001601b9054906101000a900463ffffffff16858481518110612771576127716136cc565b60200260200101516060019063ffffffff16908163ffffffff1681525050600360008583815181106127a5576127a56136cc565b6020026020010151815260200190815260200160002060010160009054906101000a900460ff16158584815181106127df576127df6136cc565b602002602001015160800190151590811515815250506000805160206138e98339815191526001600160a01b0316638411a8f6858381518110612824576128246136cc565b60200260200101516040518263ffffffff1660e01b815260040161284a91815260200190565b606060405180830381865afa158015612867573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288b91906136e2565b90505080925050600282118584815181106128a8576128a86136cc565b602090810291909101015190151560a0909101526128c7600283613726565b6000148584815181106128dc576128dc6136cc565b602090810291909101015190151560c090910152826128fa81613750565b9350505b8061290881613750565b9150506125e5565b508167ffffffffffffffff81111561292a5761292a6135f8565b60405190808252806020026020018201604052801561296357816020015b612950613091565b8152602001906001900390816129485790505b50945060005b828110156108a157848181518110612983576129836136cc565b602002602001015186828151811061299d5761299d6136cc565b602002602001018190525080806129b390613750565b915050612969565b88851480156129c957508487145b80156129d457508683145b80156129df57508281145b6129e857600080fd5b6129f061304d565b60005b8a811015612dcb57600360008d8d84818110612a1157612a116136cc565b6020908102929092013583525081810192909252604090810160002081516101008082018452825461ffff81168352620100008082046001600160a01b031696840196909652600160b01b810464ffffffffff1694830194909452600160d81b840463ffffffff166060830152600160f81b90930460ff90811615156080830152600190920154808316151560a08301529283048216151560c08201529290910416151560e08201529150612ad2338d8d84818110611421576114216136cc565b612aef57604051636061778f60e11b815260040160405180910390fd5b898982818110612b0157612b016136cc565b9050602002016020810190612b169190613857565b8015612b4d5750858582818110612b2f57612b2f6136cc565b9050602002016020810190612b449190613874565b64ffffffffff16155b15612b6b5760405163b4a4ea5f60e01b815260040160405180910390fd5b878782818110612b7d57612b7d6136cc565b9050602002016020810190612b929190613857565b8015612bc85750838382818110612bab57612bab6136cc565b9050602002016020810190612bc0919061389b565b63ffffffff16155b15612be65760405163b4a4ea5f60e01b815260040160405180910390fd5b898982818110612bf857612bf86136cc565b9050602002016020810190612c0d9190613857565b15156080830152878782818110612c2657612c266136cc565b9050602002016020810190612c3b9190613857565b151560a0830152858582818110612c5457612c546136cc565b9050602002016020810190612c699190613874565b64ffffffffff166040830152838382818110612c8757612c876136cc565b9050602002016020810190612c9c919061389b565b63ffffffff16606083015281600360008e8e85818110612cbe57612cbe6136cc565b602090810292909201358352508181019290925260409081016000208351815493850151928501516060860151608087015161ffff9093166001600160b01b031990961695909517620100006001600160a01b0390951685021768ffffffffffffffffff60b01b1916600160b01b64ffffffffff9092169190910263ffffffff60d81b191617600160d81b63ffffffff90951694909402939093176001600160f81b0316600160f81b9315159390930292909217825560a08301516001909201805460c085015160e09095015161ffff1990911693151561ff00191693909317610100941515949094029390931762ff000019169115150217905580612dc381613750565b9150506129f3565b505050505050505050505050565b6000818152600360205260408120546001600160a01b03620100009091048116908416811480612e955750600254604051631574d39f60e31b81526001600160a01b03868116600483015283811660248301526000805160206138e98339815191526044830152606482018690529091169063aba69cf890608401602060405180830381865afa158015612e71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e95919061381d565b9150505b92915050565b612ead81633b9aca006137cf565b9050612eb881612ef5565b612ec28282612f54565b5050565b6000612ed282846137cf565b612ee090633b9aca006137cf565b9050612eeb81612ef5565b6116c18482612f54565b80341015612f165760405163cd1c886760e01b815260040160405180910390fd5b8034111561170757336108fc612f2c83346138c1565b6040518115909202916000818181858888f19350505050158015612ec2573d6000803e3d6000fd5b60006064612f63600a846137cf565b612f6d91906138d4565b90506000612f7b82846138c1565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114612fca576040519150601f19603f3d011682016040523d82523d6000602084013e612fcf565b606091505b5050905080612fdd57600080fd5b60405173da6058bc88947004126089a8a5018c0121432379908490600081818185875af1925050503d8060008114613031576040519150601f19603f3d011682016040523d82523d6000602084013e613036565b606091505b5050809150508061304657600080fd5b5050505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6001600160a01b038116811461170757600080fd5b6000602082840312156130f457600080fd5b81356130ff816130cd565b9392505050565b602080825282518282018190526000919060409081850190868401855b828110156131a8578151805161ffff168552868101516001600160a01b0316878601528581015164ffffffffff168686015260608082015163ffffffff169086015260808082015115159086015260a08082015115159086015260c08082015115159086015260e0908101511515908501526101009093019290850190600101613123565b5091979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156131ed578351835292840192918401916001016131d1565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156131a8578151805161ffff168552868101516001600160a01b0316878601528581015163ffffffff908116878701526060808301519091169086015260808082015115159086015260a08082015115159086015260c09081015115159085015260e09093019290850190600101613216565b60006020828403121561329e57600080fd5b5035919050565b6000806000806000608086880312156132bd57600080fd5b85356132c8816130cd565b945060208601356132d8816130cd565b935060408601359250606086013567ffffffffffffffff808211156132fc57600080fd5b818801915088601f83011261331057600080fd5b81358181111561331f57600080fd5b89602082850101111561333157600080fd5b9699959850939650602001949392505050565b60008083601f84011261335657600080fd5b50813567ffffffffffffffff81111561336e57600080fd5b6020830191508360208260051b850101111561338957600080fd5b9250929050565b600080602083850312156133a357600080fd5b823567ffffffffffffffff8111156133ba57600080fd5b6133c685828601613344565b90969095509350505050565b600080604083850312156133e557600080fd5b50508035926020909101359150565b801515811461170757600080fd5b60008060006060848603121561341757600080fd5b8335613422816130cd565b92506020840135613432816133f4565b929592945050506040919091013590565b6000806000806000806000806080898b03121561345f57600080fd5b883567ffffffffffffffff8082111561347757600080fd5b6134838c838d01613344565b909a50985060208b013591508082111561349c57600080fd5b6134a88c838d01613344565b909850965060408b01359150808211156134c157600080fd5b6134cd8c838d01613344565b909650945060608b01359150808211156134e657600080fd5b506134f38b828c01613344565b999c989b5096995094979396929594505050565b60008060008060008060008060008060a08b8d03121561352657600080fd5b8a3567ffffffffffffffff8082111561353e57600080fd5b61354a8e838f01613344565b909c509a5060208d013591508082111561356357600080fd5b61356f8e838f01613344565b909a50985060408d013591508082111561358857600080fd5b6135948e838f01613344565b909850965060608d01359150808211156135ad57600080fd5b6135b98e838f01613344565b909650945060808d01359150808211156135d257600080fd5b506135df8d828e01613344565b915080935050809150509295989b9194979a5092959850565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561362157600080fd5b825167ffffffffffffffff8082111561363957600080fd5b818501915085601f83011261364d57600080fd5b81518181111561365f5761365f6135f8565b8060051b604051601f19603f83011681018181108582111715613684576136846135f8565b6040529182528482019250838101850191888311156136a257600080fd5b938501935b828510156136c0578451845293850193928501926136a7565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b6000806000606084860312156136f757600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052601260045260246000fd5b60008261373557613735613710565b500690565b634e487b7160e01b600052601160045260246000fd5b6000600182016137625761376261373a565b5060010190565b60006020828403121561377b57600080fd5b5051919050565b6001600160a01b0394851681529290931660208301526040820152901515606082015260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b8082028115828204841417612e9957612e9961373a565b80820180821115612e9957612e9961373a565b63ffffffff8181168382160190808211156138165761381661373a565b5092915050565b60006020828403121561382f57600080fd5b81516130ff816133f4565b60006020828403121561384c57600080fd5b81516130ff816130cd565b60006020828403121561386957600080fd5b81356130ff816133f4565b60006020828403121561388657600080fd5b813564ffffffffff811681146130ff57600080fd5b6000602082840312156138ad57600080fd5b813563ffffffff811681146130ff57600080fd5b81810381811115612e9957612e9961373a565b6000826138e3576138e3613710565b50049056fe000000000000000000000000764aeebcf425d56800ef2c84f2578689415a2daaa26469706673582212202fd4628219312a2c71531d7fd38b445acece8d0c44cf6c65eca60eb20041b94964736f6c63430008110033
Deployed Bytecode
0x6080604052600436106101145760003560e01c806351258040116100a0578063a31e4a0311610064578063a31e4a03146103c8578063acfcf9d9146103e8578063c57981b5146104cc578063c8d10f82146104e1578063f621226c1461050157600080fd5b8063512580401461033857806359d79f781461035a5780636969947c1461036d5780636a631c521461038d57806393928fed146103a257600080fd5b8063150b7a02116100e7578063150b7a02146101be5780631c833a6a146101f75780632bed7f0f14610237578063364253e1146102575780633ccfd60b1461032357600080fd5b8063013782611461011957806310a49d791461014f57806312ebbaac1461017c57806314462eda146101a9575b600080fd5b34801561012557600080fd5b506101396101343660046130e2565b610521565b6040516101469190613106565b60405180910390f35b34801561015b57600080fd5b5061016f61016a3660046130e2565b6108ab565b60405161014691906131b5565b34801561018857600080fd5b5061019c6101973660046130e2565b610a2c565b60405161014691906131f9565b6101bc6101b736600461328c565b610ee2565b005b3480156101ca57600080fd5b506101de6101d93660046132a5565b61129d565b6040516001600160e01b03199091168152602001610146565b34801561020357600080fd5b5061021f73da6058bc88947004126089a8a5018c012143237981565b6040516001600160a01b039091168152602001610146565b34801561024357600080fd5b506101bc610252366004613390565b6113ff565b34801561026357600080fd5b506102d261027236600461328c565b6004602052600090815260409020805460019091015461ffff8216916001600160a01b03620100008204169163ffffffff600160b01b8304811692600160d01b81049091169160ff600160f01b8304811692600160f81b90048116911687565b6040805161ffff90981688526001600160a01b03909616602088015263ffffffff9485169587019590955292909116606085015215156080840152151560a0830152151560c082015260e001610146565b34801561032f57600080fd5b506101bc6116c7565b34801561034457600080fd5b5061021f6000805160206138e983398151915281565b6101bc6103683660046133d2565b61170a565b34801561037957600080fd5b506101bc610388366004613402565b611b30565b34801561039957600080fd5b50610139611cf0565b3480156103ae57600080fd5b506103ba6363e2e60081565b604051908152602001610146565b3480156103d457600080fd5b506101bc6103e3366004613443565b612118565b3480156103f457600080fd5b5061046d61040336600461328c565b6003602052600090815260409020805460019091015461ffff821691620100008082046001600160a01b031692600160b01b830464ffffffffff1692600160d81b810463ffffffff1692600160f81b90910460ff9081169281811692610100820483169291041688565b6040805161ffff90991689526001600160a01b03909716602089015264ffffffffff9095169587019590955263ffffffff909216606086015215156080850152151560a084015290151560c0830152151560e082015261010001610146565b3480156104d857600080fd5b506103ba600a81565b3480156104ed57600080fd5b5061019c6104fc3660046130e2565b61253b565b34801561050d57600080fd5b506101bc61051c366004613507565b6129bb565b604080516103e8808252617d20820190925260609160009190816020015b61054761304d565b81526020019060019003908161053f579050506040516310a49d7960e01b81523060048201819052919250600091906310a49d7990602401600060405180830381865afa15801561059c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105c4919081019061360e565b9050600080805b83518110156107f6576105f7878583815181106105ea576105ea6136cc565b6020026020010151612dd9565b156107e45760036000858381518110610612576106126136cc565b602090810291909101810151825281810192909252604090810160002081516101008082018452825461ffff81168352620100008082046001600160a01b031696840196909652600160b01b810464ffffffffff1694830194909452600160d81b840463ffffffff166060830152600160f81b90930460ff90811615156080830152600190920154808316151560a08301529283048216151560c08201529290910416151560e082015285518690859081106106d0576106d06136cc565b60200260200101819052506000805160206138e98339815191526001600160a01b0316638411a8f685838151811061070a5761070a6136cc565b60200260200101516040518263ffffffff1660e01b815260040161073091815260200190565b606060405180830381865afa15801561074d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077191906136e2565b905050809250506002821185848151811061078e5761078e6136cc565b602090810291909101015190151560c0909101526107ad600283613726565b6000148584815181106107c2576107c26136cc565b602090810291909101015190151560e090910152826107e081613750565b9350505b806107ee81613750565b9150506105cb565b508167ffffffffffffffff811115610810576108106135f8565b60405190808252806020026020018201604052801561084957816020015b61083661304d565b81526020019060019003908161082e5790505b50945060005b828110156108a157848181518110610869576108696136cc565b6020026020010151868281518110610883576108836136cc565b6020026020010181905250808061089990613750565b91505061084f565b5050505050919050565b6040516370a0823160e01b81526001600160a01b03821660048201526060906000906000805160206138e9833981519152906370a0823190602401602060405180830381865afa158015610903573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109279190613769565b90508067ffffffffffffffff811115610942576109426135f8565b60405190808252806020026020018201604052801561096b578160200160208202803683370190505b50915060005b81811015610a2557604051632f745c5960e01b81526001600160a01b0385166004820152602481018290526000805160206138e983398151915290632f745c5990604401602060405180830381865afa1580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190613769565b838281518110610a0857610a086136cc565b602090810291909101015280610a1d81613750565b915050610971565b5050919050565b604080516103e8808252617d20820190925260609160009190816020015b610a52613091565b815260200190600190039081610a4a579050506040516310a49d7960e01b81523060048201819052919250600091906310a49d7990602401600060405180830381865afa158015610aa7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610acf919081019061360e565b9050600080805b8351811015610e37574260046000868481518110610af657610af66136cc565b602090810291909101810151825281019190915260400160002054600160b01b900463ffffffff1610801590610b735750866001600160a01b031660046000868481518110610b4757610b476136cc565b6020908102919091018101518252810191909152604001600020546201000090046001600160a01b0316145b15610e255760046000858381518110610b8e57610b8e6136cc565b6020908102919091018101518252818101929092526040908101600020815160e081018352815461ffff811682526001600160a01b03620100008204169482019490945263ffffffff600160b01b8504811693820193909352600160d01b8404909216606083015260ff600160f01b8404811615156080840152600160f81b9093048316151560a083015260010154909116151560c08201528551869085908110610c3b57610c3b6136cc565b602002602001018190525060036000858381518110610c5c57610c5c6136cc565b60200260200101518152602001908152602001600020600001601b9054906101000a900463ffffffff16858481518110610c9857610c986136cc565b60200260200101516060019063ffffffff16908163ffffffff168152505060036000858381518110610ccc57610ccc6136cc565b6020026020010151815260200190815260200160002060010160009054906101000a900460ff1615858481518110610d0657610d066136cc565b602002602001015160800190151590811515815250506000805160206138e98339815191526001600160a01b0316638411a8f6858381518110610d4b57610d4b6136cc565b60200260200101516040518263ffffffff1660e01b8152600401610d7191815260200190565b606060405180830381865afa158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db291906136e2565b9050508092505060028211858481518110610dcf57610dcf6136cc565b602090810291909101015190151560a090910152610dee600283613726565b600014858481518110610e0357610e036136cc565b602090810291909101015190151560c09091015282610e2181613750565b9350505b80610e2f81613750565b915050610ad6565b508167ffffffffffffffff811115610e5157610e516135f8565b604051908082528060200260200182016040528015610e8a57816020015b610e77613091565b815260200190600190039081610e6f5790505b50945060005b828110156108a157848181518110610eaa57610eaa6136cc565b6020026020010151868281518110610ec457610ec46136cc565b60200260200101819052508080610eda90613750565b915050610e90565b60008181526003602090815260409182902082516101008082018552825461ffff81168352620100008082046001600160a01b031695840195909552600160b01b810464ffffffffff1695830195909552600160d81b850463ffffffff166060830152600160f81b90940460ff908116151560808301819052600190930154808216151560a08401529485048116151560c083015292909304909116151560e0830152610fa257604051630de56a4b60e31b815260040160405180910390fd5b600082815260046020908152604091829020825160e081018452815461ffff811682526001600160a01b036201000082041693820184905263ffffffff600160b01b8204811695830195909552600160d01b8104909416606082015260ff600160f01b8504811615156080830152600160f81b9094048416151560a0820152600190910154909216151560c08301523314801590611049575042816040015163ffffffff16115b1561106a576040516001622b8c6360e21b0319815260040160405180910390fd5b60208101516001600160a01b0316156110f857600254602082015160405163537a5c3d60e01b81526001600160a01b039092169163537a5c3d916110c5916000805160206138e9833981519152908890600090600401613782565b600060405180830381600087803b1580156110df57600080fd5b505af11580156110f3573d6000803e3d6000fd5b505050505b6111118260200151836040015164ffffffffff16612e9f565b6000838152600360205260408082208254815461ffff90911661ffff198083168217845585546001600160b01b031990931690911762010000928390046001600160a01b0316830217808455855464ffffffffff60b01b198216600160b01b9182900464ffffffffff169091029081178555865468ffffffffffffffffff60b01b1990921663ffffffff60d81b1990911617600160d81b9182900463ffffffff169091021780845594546001600160f81b03909516600160f81b9586900460ff908116151590960217835560018054938101805460ff198116958816151595861782558254931661ff001990951694909417610100928390048716151590920291909117808455905462ff000019909116908290049094161515029290921790915551632142170760e11b81526000805160206138e9833981519152906342842e0e90611266903090339088906004016137ab565b600060405180830381600087803b15801561128057600080fd5b505af1158015611294573d6000803e3d6000fd5b50505050505050565b6000336000805160206138e9833981519152146112cd5760405163121dd14560e21b815260040160405180910390fd5b6001600160a01b03861630146113ed576112e561304d565b61ffff85811682526001600160a01b038781166020808501918252600089815260039091526040908190208551815493519287015160608801516080890151929097166001600160b01b031990951694909417620100009390951683029490941768ffffffffffffffffff60b01b1916600160b01b64ffffffffff9094169390930263ffffffff60d81b191692909217600160d81b63ffffffff90951694909402939093176001600160f81b0316600160f81b9215159290920291909117815560a08301516001909101805460c085015160e09095015161ffff1990911692151561ff00191692909217610100941515949094029390931762ff000019169015159091021790555b50630a85bd0160e11b95945050505050565b6000805b828110156116c15761142d33858584818110611421576114216136cc565b90506020020135612dd9565b61144a57604051636061778f60e11b815260040160405180910390fd5b4260046000868685818110611461576114616136cc565b6020908102929092013583525081019190915260400160002054600160b01b900463ffffffff16106114a9576040516001622b8c6360e21b0319815260040160405180910390fd5b600360008585848181106114bf576114bf6136cc565b90506020020135815260200190815260200160002060000160029054906101000a90046001600160a01b03169150600060036000868685818110611505576115056136cc565b602090810292909201358352508101919091526040016000208154815461ffff90911661ffff198083168217845584546001600160b01b031990931690911762010000928390046001600160a01b0316830217808455845464ffffffffff60b01b198216600160b01b9182900464ffffffffff169091029081178555855468ffffffffffffffffff60b01b1990921663ffffffff60d81b1990911617600160d81b9182900463ffffffff169091021780845584546001600160f81b03909116600160f81b9182900460ff90811615159092021784556001948501805495909401805460ff198116968316151596871782558554931661ff001990961695909517610100928390048216151590920291909117808555925462ff00001990931692829004161515021790556000805160206138e98339815191526342842e0e3084878786818110611657576116576136cc565b905060200201356040518463ffffffff1660e01b815260040161167c939291906137ab565b600060405180830381600087803b15801561169657600080fd5b505af11580156116aa573d6000803e3d6000fd5b5050505080806116b990613750565b915050611403565b50505050565b60405173da6058bc88947004126089a8a5018c0121432379904780156108fc02916000818181858888f19350505050158015611707573d6000803e3d6000fd5b50565b60008281526003602090815260409182902082516101008082018552825461ffff81168352620100008082046001600160a01b031695840195909552600160b01b810464ffffffffff1695830195909552600160d81b850463ffffffff166060830152600160f81b90940460ff90811615156080830152600190920154808316151560a083018190529481048316151560c08301529290920416151560e0820152906117c957604051630de56a4b60e31b815260040160405180910390fd5b600083815260046020908152604091829020825160e08101845281546001600160a01b03620100008204169382019390935263ffffffff600160b01b84048116948201859052600160d01b840416606082015260ff600160f01b8404811615156080830152600160f81b9093048316151560a0820152600190910154909116151560c082015261ffff85168152904211156119a45760208101516001600160a01b031633146119785760208101516001600160a01b03161561190057600254602082015160405163537a5c3d60e01b81526001600160a01b039092169163537a5c3d916118cd916000805160206138e9833981519152908990600090600401613782565b600060405180830381600087803b1580156118e757600080fd5b505af11580156118fb573d6000803e3d6000fd5b505050505b60025460405163537a5c3d60e01b81526001600160a01b039091169063537a5c3d906119459033906000805160206138e9833981519152908990600190600401613782565b600060405180830381600087803b15801561195f57600080fd5b505af1158015611973573d6000803e3d6000fd5b505050505b33602082015261198a83610e106137cf565b61199490426137e6565b63ffffffff166040820152611a08565b336001600160a01b031681602001516001600160a01b0316036119ec576119cd83610e106137cf565b816040018181516119de91906137f9565b63ffffffff16905250611a08565b6040516001622b8c6360e21b0319815260040160405180910390fd5b6363e2e600816040015163ffffffff161115611a3757604051635960c63760e01b815260040160405180910390fd5b611a508260200151836060015163ffffffff1685612ec6565b6000938452600460209081526040948590208251815492840151968401516060850151608086015160a087015161ffff9094166001600160b01b031990961695909517620100006001600160a01b03909a16999099029890981767ffffffffffffffff60b01b1916600160b01b63ffffffff9283160263ffffffff60d01b191617600160d01b9190981602969096176001600160f01b0316600160f01b921515929092026001600160f81b031691909117600160f81b9515159590950294909417845560c001516001909301805460ff1916931515939093179092555050565b336001600160a01b037f000000000000000000000000f57e485905f5f7de581a1dcae0411f9b86da8f511614611b795760405163618bbdd560e01b815260040160405180910390fd5b8115611c60576040516370a0823160e01b81523060048201526001600160a01b0384169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf19190613769565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611c3c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c1919061381d565b6001600160a01b0383166000805160206138e9833981519152148015611ca257506000818152600360205260409020546201000090046001600160a01b031615155b15611cc057604051630cc63f9960e21b815260040160405180910390fd5b6040516323b872dd60e01b81526001600160a01b038416906323b872dd90611266903090339086906004016137ab565b604080516103e8808252617d20820190925260609160009190816020015b611d1661304d565b815260200190600190039081611d0e579050506040516310a49d7960e01b81523060048201819052919250600091906310a49d7990602401600060405180830381865afa158015611d6b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d93919081019061360e565b9050600080805b83518110156120655760036000858381518110611db957611db96136cc565b60209081029190910181015182528101919091526040016000206001015460ff1680611e1e575060036000858381518110611df657611df66136cc565b60200260200101518152602001908152602001600020600001601f9054906101000a900460ff165b8015611e6657504260046000868481518110611e3c57611e3c6136cc565b602090810291909101810151825281019190915260400160002054600160b01b900463ffffffff16105b156120535760036000858381518110611e8157611e816136cc565b602090810291909101810151825281810192909252604090810160002081516101008082018452825461ffff81168352620100008082046001600160a01b031696840196909652600160b01b810464ffffffffff1694830194909452600160d81b840463ffffffff166060830152600160f81b90930460ff90811615156080830152600190920154808316151560a08301529283048216151560c08201529290910416151560e08201528551869085908110611f3f57611f3f6136cc565b60200260200101819052506000805160206138e98339815191526001600160a01b0316638411a8f6858381518110611f7957611f796136cc565b60200260200101516040518263ffffffff1660e01b8152600401611f9f91815260200190565b606060405180830381865afa158015611fbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe091906136e2565b9050508092505060028211858481518110611ffd57611ffd6136cc565b602090810291909101015190151560c09091015261201c600283613726565b600014858481518110612031576120316136cc565b602090810291909101015190151560e0909101528261204f81613750565b9350505b8061205d81613750565b915050611d9a565b508167ffffffffffffffff81111561207f5761207f6135f8565b6040519080825280602002602001820160405280156120b857816020015b6120a561304d565b81526020019060019003908161209d5790505b50945060005b82811015612110578481815181106120d8576120d86136cc565b60200260200101518682815181106120f2576120f26136cc565b6020026020010181905250808061210890613750565b9150506120be565b505050505090565b868514801561212657508483145b801561213157508281145b61213a57600080fd5b61214261304d565b336020820152600160a082015260005b8881101561252f57336000805160206138e9833981519152636352211e8c8c85818110612181576121816136cc565b905060200201356040518263ffffffff1660e01b81526004016121a691815260200190565b602060405180830381865afa1580156121c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e7919061383a565b6001600160a01b03161461220e57604051636061778f60e11b815260040160405180910390fd5b878782818110612220576122206136cc565b90506020020160208101906122359190613857565b801561226c575085858281811061224e5761224e6136cc565b90506020020160208101906122639190613874565b64ffffffffff16155b1561228a5760405163b4a4ea5f60e01b815260040160405180910390fd5b83838281811061229c5761229c6136cc565b90506020020160208101906122b1919061389b565b63ffffffff166000036122d75760405163b4a4ea5f60e01b815260040160405180910390fd5b8989828181106122e9576122e96136cc565b602002919091013561ffff1683525087878281811061230a5761230a6136cc565b905060200201602081019061231f9190613857565b15156080830152858582818110612338576123386136cc565b905060200201602081019061234d9190613874565b64ffffffffff16604083015283838281811061236b5761236b6136cc565b9050602002016020810190612380919061389b565b63ffffffff16606083015281600360008c8c858181106123a2576123a26136cc565b602090810292909201358352508181019290925260409081016000208351815493850151928501516060860151608087015161ffff9093166001600160b01b031990961695909517620100006001600160a01b0390951685021768ffffffffffffffffff60b01b1916600160b01b64ffffffffff9092169190910263ffffffff60d81b191617600160d81b63ffffffff90951694909402939093176001600160f81b0316600160f81b9315159390930292909217825560a08301516001909201805460c085015160e09095015161ffff1990911693151561ff00191693909317610100941515949094029390931762ff00001916911515021790556000805160206138e98339815191526342842e0e33308d8d868181106124c5576124c56136cc565b905060200201356040518463ffffffff1660e01b81526004016124ea939291906137ab565b600060405180830381600087803b15801561250457600080fd5b505af1158015612518573d6000803e3d6000fd5b50505050808061252790613750565b915050612152565b50505050505050505050565b604080516103e8808252617d20820190925260609160009190816020015b612561613091565b815260200190600190039081612559579050506040516310a49d7960e01b81523060048201819052919250600091906310a49d7990602401600060405180830381865afa1580156125b6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125de919081019061360e565b9050600080805b8351811015612910574260046000868481518110612605576126056136cc565b602090810291909101810151825281019190915260400160002054600160b01b900463ffffffff161080159061264c575061264c878583815181106105ea576105ea6136cc565b156128fe5760046000858381518110612667576126676136cc565b6020908102919091018101518252818101929092526040908101600020815160e081018352815461ffff811682526001600160a01b03620100008204169482019490945263ffffffff600160b01b8504811693820193909352600160d01b8404909216606083015260ff600160f01b8404811615156080840152600160f81b9093048316151560a083015260010154909116151560c08201528551869085908110612714576127146136cc565b602002602001018190525060036000858381518110612735576127356136cc565b60200260200101518152602001908152602001600020600001601b9054906101000a900463ffffffff16858481518110612771576127716136cc565b60200260200101516060019063ffffffff16908163ffffffff1681525050600360008583815181106127a5576127a56136cc565b6020026020010151815260200190815260200160002060010160009054906101000a900460ff16158584815181106127df576127df6136cc565b602002602001015160800190151590811515815250506000805160206138e98339815191526001600160a01b0316638411a8f6858381518110612824576128246136cc565b60200260200101516040518263ffffffff1660e01b815260040161284a91815260200190565b606060405180830381865afa158015612867573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288b91906136e2565b90505080925050600282118584815181106128a8576128a86136cc565b602090810291909101015190151560a0909101526128c7600283613726565b6000148584815181106128dc576128dc6136cc565b602090810291909101015190151560c090910152826128fa81613750565b9350505b8061290881613750565b9150506125e5565b508167ffffffffffffffff81111561292a5761292a6135f8565b60405190808252806020026020018201604052801561296357816020015b612950613091565b8152602001906001900390816129485790505b50945060005b828110156108a157848181518110612983576129836136cc565b602002602001015186828151811061299d5761299d6136cc565b602002602001018190525080806129b390613750565b915050612969565b88851480156129c957508487145b80156129d457508683145b80156129df57508281145b6129e857600080fd5b6129f061304d565b60005b8a811015612dcb57600360008d8d84818110612a1157612a116136cc565b6020908102929092013583525081810192909252604090810160002081516101008082018452825461ffff81168352620100008082046001600160a01b031696840196909652600160b01b810464ffffffffff1694830194909452600160d81b840463ffffffff166060830152600160f81b90930460ff90811615156080830152600190920154808316151560a08301529283048216151560c08201529290910416151560e08201529150612ad2338d8d84818110611421576114216136cc565b612aef57604051636061778f60e11b815260040160405180910390fd5b898982818110612b0157612b016136cc565b9050602002016020810190612b169190613857565b8015612b4d5750858582818110612b2f57612b2f6136cc565b9050602002016020810190612b449190613874565b64ffffffffff16155b15612b6b5760405163b4a4ea5f60e01b815260040160405180910390fd5b878782818110612b7d57612b7d6136cc565b9050602002016020810190612b929190613857565b8015612bc85750838382818110612bab57612bab6136cc565b9050602002016020810190612bc0919061389b565b63ffffffff16155b15612be65760405163b4a4ea5f60e01b815260040160405180910390fd5b898982818110612bf857612bf86136cc565b9050602002016020810190612c0d9190613857565b15156080830152878782818110612c2657612c266136cc565b9050602002016020810190612c3b9190613857565b151560a0830152858582818110612c5457612c546136cc565b9050602002016020810190612c699190613874565b64ffffffffff166040830152838382818110612c8757612c876136cc565b9050602002016020810190612c9c919061389b565b63ffffffff16606083015281600360008e8e85818110612cbe57612cbe6136cc565b602090810292909201358352508181019290925260409081016000208351815493850151928501516060860151608087015161ffff9093166001600160b01b031990961695909517620100006001600160a01b0390951685021768ffffffffffffffffff60b01b1916600160b01b64ffffffffff9092169190910263ffffffff60d81b191617600160d81b63ffffffff90951694909402939093176001600160f81b0316600160f81b9315159390930292909217825560a08301516001909201805460c085015160e09095015161ffff1990911693151561ff00191693909317610100941515949094029390931762ff000019169115150217905580612dc381613750565b9150506129f3565b505050505050505050505050565b6000818152600360205260408120546001600160a01b03620100009091048116908416811480612e955750600254604051631574d39f60e31b81526001600160a01b03868116600483015283811660248301526000805160206138e98339815191526044830152606482018690529091169063aba69cf890608401602060405180830381865afa158015612e71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e95919061381d565b9150505b92915050565b612ead81633b9aca006137cf565b9050612eb881612ef5565b612ec28282612f54565b5050565b6000612ed282846137cf565b612ee090633b9aca006137cf565b9050612eeb81612ef5565b6116c18482612f54565b80341015612f165760405163cd1c886760e01b815260040160405180910390fd5b8034111561170757336108fc612f2c83346138c1565b6040518115909202916000818181858888f19350505050158015612ec2573d6000803e3d6000fd5b60006064612f63600a846137cf565b612f6d91906138d4565b90506000612f7b82846138c1565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114612fca576040519150601f19603f3d011682016040523d82523d6000602084013e612fcf565b606091505b5050905080612fdd57600080fd5b60405173da6058bc88947004126089a8a5018c0121432379908490600081818185875af1925050503d8060008114613031576040519150601f19603f3d011682016040523d82523d6000602084013e613036565b606091505b5050809150508061304657600080fd5b5050505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6001600160a01b038116811461170757600080fd5b6000602082840312156130f457600080fd5b81356130ff816130cd565b9392505050565b602080825282518282018190526000919060409081850190868401855b828110156131a8578151805161ffff168552868101516001600160a01b0316878601528581015164ffffffffff168686015260608082015163ffffffff169086015260808082015115159086015260a08082015115159086015260c08082015115159086015260e0908101511515908501526101009093019290850190600101613123565b5091979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156131ed578351835292840192918401916001016131d1565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156131a8578151805161ffff168552868101516001600160a01b0316878601528581015163ffffffff908116878701526060808301519091169086015260808082015115159086015260a08082015115159086015260c09081015115159085015260e09093019290850190600101613216565b60006020828403121561329e57600080fd5b5035919050565b6000806000806000608086880312156132bd57600080fd5b85356132c8816130cd565b945060208601356132d8816130cd565b935060408601359250606086013567ffffffffffffffff808211156132fc57600080fd5b818801915088601f83011261331057600080fd5b81358181111561331f57600080fd5b89602082850101111561333157600080fd5b9699959850939650602001949392505050565b60008083601f84011261335657600080fd5b50813567ffffffffffffffff81111561336e57600080fd5b6020830191508360208260051b850101111561338957600080fd5b9250929050565b600080602083850312156133a357600080fd5b823567ffffffffffffffff8111156133ba57600080fd5b6133c685828601613344565b90969095509350505050565b600080604083850312156133e557600080fd5b50508035926020909101359150565b801515811461170757600080fd5b60008060006060848603121561341757600080fd5b8335613422816130cd565b92506020840135613432816133f4565b929592945050506040919091013590565b6000806000806000806000806080898b03121561345f57600080fd5b883567ffffffffffffffff8082111561347757600080fd5b6134838c838d01613344565b909a50985060208b013591508082111561349c57600080fd5b6134a88c838d01613344565b909850965060408b01359150808211156134c157600080fd5b6134cd8c838d01613344565b909650945060608b01359150808211156134e657600080fd5b506134f38b828c01613344565b999c989b5096995094979396929594505050565b60008060008060008060008060008060a08b8d03121561352657600080fd5b8a3567ffffffffffffffff8082111561353e57600080fd5b61354a8e838f01613344565b909c509a5060208d013591508082111561356357600080fd5b61356f8e838f01613344565b909a50985060408d013591508082111561358857600080fd5b6135948e838f01613344565b909850965060608d01359150808211156135ad57600080fd5b6135b98e838f01613344565b909650945060808d01359150808211156135d257600080fd5b506135df8d828e01613344565b915080935050809150509295989b9194979a5092959850565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561362157600080fd5b825167ffffffffffffffff8082111561363957600080fd5b818501915085601f83011261364d57600080fd5b81518181111561365f5761365f6135f8565b8060051b604051601f19603f83011681018181108582111715613684576136846135f8565b6040529182528482019250838101850191888311156136a257600080fd5b938501935b828510156136c0578451845293850193928501926136a7565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b6000806000606084860312156136f757600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052601260045260246000fd5b60008261373557613735613710565b500690565b634e487b7160e01b600052601160045260246000fd5b6000600182016137625761376261373a565b5060010190565b60006020828403121561377b57600080fd5b5051919050565b6001600160a01b0394851681529290931660208301526040820152901515606082015260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b8082028115828204841417612e9957612e9961373a565b80820180821115612e9957612e9961373a565b63ffffffff8181168382160190808211156138165761381661373a565b5092915050565b60006020828403121561382f57600080fd5b81516130ff816133f4565b60006020828403121561384c57600080fd5b81516130ff816130cd565b60006020828403121561386957600080fd5b81356130ff816133f4565b60006020828403121561388657600080fd5b813564ffffffffff811681146130ff57600080fd5b6000602082840312156138ad57600080fd5b813563ffffffff811681146130ff57600080fd5b81810381811115612e9957612e9961373a565b6000826138e3576138e3613710565b50049056fe000000000000000000000000764aeebcf425d56800ef2c84f2578689415a2daaa26469706673582212202fd4628219312a2c71531d7fd38b445acece8d0c44cf6c65eca60eb20041b94964736f6c63430008110033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.