More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,075 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Safe Transfer Fr... | 15790490 | 336 days ago | IN | 0 ETH | 0.00000008 | ||||
| Safe Transfer Fr... | 15790428 | 336 days ago | IN | 0 ETH | 0.00000008 | ||||
| Safe Transfer Fr... | 15790408 | 336 days ago | IN | 0 ETH | 0.00000008 | ||||
| Safe Transfer Fr... | 15790376 | 336 days ago | IN | 0 ETH | 0.00000008 | ||||
| Safe Transfer Fr... | 15790349 | 336 days ago | IN | 0 ETH | 0.00000008 | ||||
| Safe Transfer Fr... | 15790331 | 336 days ago | IN | 0 ETH | 0.00000008 | ||||
| Safe Transfer Fr... | 15790262 | 336 days ago | IN | 0 ETH | 0.00000008 | ||||
| Safe Transfer Fr... | 15790233 | 336 days ago | IN | 0 ETH | 0.00000009 | ||||
| Safe Transfer Fr... | 15790174 | 336 days ago | IN | 0 ETH | 0.00000009 | ||||
| Set Approval For... | 7891040 | 518 days ago | IN | 0 ETH | 0.00000008 | ||||
| Set Approval For... | 3158396 | 628 days ago | IN | 0 ETH | 0.00001023 | ||||
| Mint | 613133 | 687 days ago | IN | 0.0007 ETH | 0.00035198 | ||||
| Tend Bar | 611732 | 687 days ago | IN | 0 ETH | 0.00009588 | ||||
| Mint | 611041 | 687 days ago | IN | 0.0007 ETH | 0.00007675 | ||||
| Withdraw | 610968 | 687 days ago | IN | 0 ETH | 0.00009766 | ||||
| Claim Gas | 610940 | 687 days ago | IN | 0 ETH | 0.00009798 | ||||
| Mint | 610137 | 687 days ago | IN | 0.0007 ETH | 0.00007641 | ||||
| Tend Bar | 608823 | 687 days ago | IN | 0 ETH | 0.00010098 | ||||
| Tend Bar | 608816 | 687 days ago | IN | 0 ETH | 0.00010164 | ||||
| Mint | 608262 | 687 days ago | IN | 0.0007 ETH | 0.00007389 | ||||
| Tend Bar | 607161 | 687 days ago | IN | 0 ETH | 0.00010791 | ||||
| Mint | 606427 | 687 days ago | IN | 0.0007 ETH | 0.00031597 | ||||
| Mint | 606419 | 687 days ago | IN | 0.0007 ETH | 0.00031386 | ||||
| Mint | 606373 | 687 days ago | IN | 0.0007 ETH | 0.00029733 | ||||
| Mint | 606373 | 687 days ago | IN | 0.0007 ETH | 0.00029782 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 613133 | 687 days ago | 0.0002 ETH | ||||
| 611041 | 687 days ago | 0.0002 ETH | ||||
| 610968 | 687 days ago | 0.89080763 ETH | ||||
| 610137 | 687 days ago | 0.0002 ETH | ||||
| 608262 | 687 days ago | 0.0002 ETH | ||||
| 606427 | 687 days ago | 0.0002 ETH | ||||
| 606419 | 687 days ago | 0.0002 ETH | ||||
| 606373 | 687 days ago | 0.0002 ETH | ||||
| 606373 | 687 days ago | 0.0002 ETH | ||||
| 606373 | 687 days ago | 0.0002 ETH | ||||
| 606373 | 687 days ago | 0.0002 ETH | ||||
| 606373 | 687 days ago | 0.0002 ETH | ||||
| 604537 | 687 days ago | 0.0002 ETH | ||||
| 602862 | 687 days ago | 0.0002 ETH | ||||
| 600868 | 687 days ago | 0.0002 ETH | ||||
| 599491 | 687 days ago | 0.0002 ETH | ||||
| 598390 | 687 days ago | 0.0002 ETH | ||||
| 597186 | 687 days ago | 0.0002 ETH | ||||
| 595983 | 687 days ago | 0.0002 ETH | ||||
| 594879 | 687 days ago | 0.0002 ETH | ||||
| 594878 | 687 days ago | 0.0002 ETH | ||||
| 594878 | 687 days ago | 0.0002 ETH | ||||
| 593577 | 687 days ago | 0.0002 ETH | ||||
| 592286 | 687 days ago | 0.0002 ETH | ||||
| 592285 | 687 days ago | 0.0002 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import {DefaultOperatorFilterer} from "./filter/DefaultOperatorFilterer.sol";
interface IBlast{
function configureAutomaticYield() external;
function configureClaimableGas() external;
function configureGovernor(address governor) external;
function claimGasAtMinClaimRate(
address contractAddress,
address recipient,
uint256 minClaimRateBips
) external returns (uint256);
}
interface IBlastPoints{
function configurePointsOperator(address operator) external;
}
contract LastCall is DefaultOperatorFilterer, ERC1155, ERC1155Supply, ERC1155Burnable, ReentrancyGuard, Ownable{
string public name = "Last Call on Blast";
string public symbol = "LAST CALL";
/// last call constants
uint256 public constant DURATION = 1500; /// Duration of the game's timer
uint256 public constant IYKYK = 17; /// IYKYK
uint256 public constant REDEEMABLE_DRINK_ID = 19; // burn 15 unique tokens to have this token id
uint256 public constant DRINK_18_PRICE = 69 ether; /// the game's only 1:1
/// blast contract address so we can interface with it, upgradeable if needed
address public blastContractAddress = 0x4300000000000000000000000000000000000002;
/// blast contract address for points API so we can interface with it, upgradeable if needed
/// this address is testnet so we will update once we have the mainnet addy
address public blastPointsAddress = 0x2fc95838c71e76ec69ff817983BFf17c710F34E0;
/// drink 18 can only be minted once: it's the game's only 1 of 1
bool public drink18Minted;
/// keep track of the last block a token was minted
uint256 public lastMintBlock = block.number;
/// keep track of when the game was started
uint256 public gameStartBlock = 0;
/// the amount required to generate a mint
uint256 public minimumTip = 0.0005 ether;
/// the amount required to for a chance at a random mint
uint256 public generousTip = 0.015 ether;
/// the amount of the tip that goes to the bartender
uint256 public bartenderTip = 0.0002 ether;
/// the amount required to reopen the bar and claim the bartender role
uint256 public barOpenFee = 1 ether;
/// keep track of bartenders who have abused their privlidges
mapping (address => bool) public bannedBarTenders;
/// the current bartender, starts with the contract
address public barTender;
/// track if the bartender was appointed or paid to be bartender
uint256 public barTenderFeePaid;
/// keep track of the bartenders and how much they've been paid
mapping (address => uint256) public barTenderTips;
/// the last time the bartender poured a drink
uint256 public mostRecentPour;
/// used in randomization logic
uint256 private nonce;
/// event to emit any time a new drink is minted
event Mint(address indexed _mintedTo, uint256 indexed _idMinted);
/// event to emit any time the bar is re-opened
event BarOpened(address indexed _newBarTender);
/// cast blast contract so we can interface with it here
/// can change this address if needed later on mainnet
IBlast public BLAST = IBlast(blastContractAddress);
IBlastPoints public BLAST_POINTS = IBlastPoints(blastPointsAddress);
/// initialize the contract with a metadata uri
constructor(string memory _uri) ERC1155(_uri) {
_setURI(_uri);
/// set the gas mode to claimable
BLAST.configureClaimableGas();
// configure automatic yield so the contract balance grows automatically
BLAST.configureAutomaticYield();
/// mint an initial set of tokens to the contract creator
for (uint256 i = 1; i <= 15; ++i) {
_mint(msg.sender, i, 1, "");
}
_mint(msg.sender, IYKYK, 1, "");
_mint(msg.sender, 19, 1, "");
}
/// @dev set the URI to your base URI here, don't forget the {id} param.
function setURI(string memory newuri) external onlyOwner {
_setURI(newuri);
}
/// @dev update the amount of ether we consider a "generous tip"
function setGenerousTip(uint256 _amount) external onlyOwner {
generousTip = _amount;
}
/// @dev update the amount of ether we consider a "minimum tip"
function setMinimumTip(uint256 _amount) external onlyOwner {
minimumTip = _amount;
}
/// @dev update the amount of ether we'll tip the bartender on each mint
function setBarTenderTip(uint256 _amount) external onlyOwner {
bartenderTip = _amount;
}
/// @dev reopen the bar and make the address that opened it the new bartender
function reopenBar() external payable nonReentrant {
/// ensure the game has been started before
require(gameStartBlock > 0, "game hasn't started yet");
/// it costs eth to reopen the bar and become the bartender
require(msg.value == barOpenFee, "wrong amount sent");
/// ensure that the game timer is currently expired
require(timerExpired(), "the bar is currently open");
/// check to see if the address is banned
require(!bannedBarTenders[msg.sender], "this address is banned");
/// reset the timer to reopen the bar
_resetTimer();
/// reset the game start block
gameStartBlock = block.number;
/// set the new bartender
barTender = msg.sender;
/// reset the amount of tips the bartender has collected
barTenderTips[msg.sender] = 0;
/// the bartender paid to open the bar, they weren't appointed
barTenderFeePaid = barOpenFee;
/// emit the event and announce the newest bartender
emit BarOpened(msg.sender);
}
/// @dev this function exists to prevent abuse and can only be called by
/// the contract owner. this should only be used to thwart a malicious bartender
function bounceBarTender(bool _ban) external onlyOwner {
/// optionally, ban the address from being a bartender again
bannedBarTenders[barTender] = _ban;
/// if the bartender paid for the spot and they haven't earned enough tips
/// refund them the difference because we're kicking them out
if (
barTenderFeePaid > 0 &&
barTenderTips[barTender] < barTenderFeePaid
){
/// calculate the refund
uint256 refund = barTenderFeePaid - barTenderTips[barTender];
/// send the refund
(bool success, ) = barTender.call{value: refund}("");
require(success, "failed to send ETH");
}
/// set the owner as the bartender again
barTender = address(msg.sender);
/// note that the new bartender did not pay a fee
barTenderFeePaid = 0;
}
/// @dev this function lets the contract owner appoint a bartender if there isn't one
function appointBarTender(address _appointee) external onlyOwner {
/// only the owner can appoint another bartender during an active game
if (barTender != owner()){
require(timerExpired(), "someone is already tending the bar");
}
/// start a new game
gameStartBlock = block.number;
/// reset the game timer
_resetTimer();
/// set the appointee as the bartender
barTender = _appointee;
/// note that the bartender did not pay a fee
barTenderFeePaid = 0;
/// reset the amount of tips the bartender has collected
barTenderTips[_appointee] = 0;
/// emit the event and announce the newest bartender
emit BarOpened(_appointee);
}
/// @dev starts the game for the first time, can only be called once
function startGame() external onlyOwner {
/// the game can only be started once
require(gameStartBlock == 0, "The game cannot be started again");
/// set the owner as the bartender
barTender = msg.sender;
/// mark the start of the game
gameStartBlock = block.number;
/// start the game timer
_resetTimer();
/// emit the event and announce the newest bartender
emit BarOpened(msg.sender);
}
/// @dev resets the game's timer to the current block
function _resetTimer() internal {
lastMintBlock = block.number;
}
/// @dev a function to randomize drink selection for generous tips and the bartending function
function _kindaRandom(uint256 _max) internal returns (uint256) {
uint256 kindaRandomnumber = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, nonce))) % _max;
nonce++;
return kindaRandomnumber;
}
/// @dev check to see if the timer has expired
function timerExpired() public view returns (bool){
uint256 elapsed = block.number - lastMintBlock;
return DURATION < elapsed;
}
/// @dev a special function that can be called once per duration.
/// this privilidge is exclusive to the bartender and costs nothing.
/// the function will randomize a drink selection and send it to the recipient.
/// @param _toAddress the address the bartender is sending a drink to
function tendBar(address _toAddress) public nonReentrant {
/// the current bartender is the only one who can call this function
require (msg.sender == barTender, "only the bartender or owner can tend the bar");
/// ensure that the game timer isn't expired
require(!timerExpired(), "the game timer is expired");
/// the duration of the game controls how often the bartender can call this function
require (mostRecentPour < block.number - DURATION, "too soon, try later");
/// tending the bar mints a random drink from the collection
uint256 drink_to_mint = _kindaRandom(15) + 1;
/// set the most recent pour to the current block
mostRecentPour = block.number;
/// every time the bartender mints a free drink
/// count the mint to reduce the amount owed for a refund
barTenderTips[msg.sender] += generousTip;
_mintDrink(_toAddress, drink_to_mint);
}
/// iykyk
function iykyk(address _toAddress) public onlyOwner {
_mintDrink(_toAddress, IYKYK);
}
/// mint the game's only 1 of 1
/// this costs 69 eth but comes with some special privlidges
/// this function allows the minter to become the bartender
function mintDrink18() external payable {
require(msg.value == DRINK_18_PRICE, "must send 69 ETH");
require(!drink18Minted, "no Remaining Supply");
/// the game can only be started once
require(gameStartBlock > 0, "the bar has never been opened");
/// set the the buyer as the bartender when they purchase this drink
barTender = msg.sender;
/// set the bar tender fee paid to the bar open fee
barTenderFeePaid = barOpenFee;
/// reset the game start block
gameStartBlock = block.number;
/// mark the drink as minted... this can only be done once
drink18Minted = true;
/// serve the only 1:1 in the collection
_mintDrink(msg.sender, 18);
/// emit the event and announce the newest bartender
emit BarOpened(msg.sender);
}
/**
* @notice it's cheap to buy a drink at the bar.
* The closer a drink is minted to the timer going to zero, the rarer it will be
*/
function mint() external payable nonReentrant {
/// require the tip threshold is met
require(msg.value >= minimumTip + bartenderTip, "send a higher tip");
/// tip the current bartender if it's not the owner
if (barTender != owner()){
/// keep track of bartender tips
barTenderTips[barTender] += bartenderTip;
/// send the bartender their tip
(bool success, ) = barTender.call{value: bartenderTip}("");
require(success, "failed to send ETH");
}
_mintDrink(msg.sender, _idToMint());
}
/// @dev function to mint drinks
/// @param _toAddress the address that will receive the drink
/// @param _id the id of the drink to mint
function _mintDrink(address _toAddress, uint256 _id) internal {
/// ensure the game is active
require(gameStartBlock > 0, "the game is not open yet");
/// reset the timer
_resetTimer();
/// mint the token
_mint(_toAddress, _id, 1, "");
emit Mint(_toAddress, _id);
}
/// @dev we determine which drink to mint based on the countdown timer.
/// every 100 blocks, a new drink is available.
function _idToMint() internal returns (uint256) {
/// determine the drink's id based on the current round
uint256 id = 15 - (currentRound()/100);
/// if generous tip, random roll a drink
if (msg.value >= generousTip){
/// determine the random drink to mint
id = _kindaRandom(15) + 1;
}
return id;
}
/// @dev calculate the current round, starting at 1500 down to 0
/// the call fails if the timer is expired
function currentRound() public view returns (uint256) {
/// calculate how much time has passed since the last mint
uint256 elapsed = block.number - lastMintBlock;
require(!timerExpired(), "The timer has expired");
return DURATION - elapsed;
}
/// @dev burn a full set of unique token ids for one final "boss" token
/// @param ids of the tokens to burn, each must be unique and within a range of 1-18
function burnToRedeem(uint256[] calldata ids) external nonReentrant {
/// ensure that exactly the required number of items (15) are submitted to burn
require(ids.length == 15, "Wrong number of tokens submitted");
/// keep track of which tokens were submitted to prevent dupes
/// all tokens are eligible but only 15 are needed
uint256[] memory tokens = new uint256[](19);
uint256[] memory values = new uint256[](15);
/// loop over each of the 15 ids submitted to burn
for (uint256 i; i <= 14; ++i) {
/// ensure the token id is between 1 and 18
require(ids[i] >= 1 && ids[i] <= 18, "Token not eligible");
/// ensure that the token is not already in the list
require(tokens[ids[i]] == 0, "Each token must be unique");
/// mark the token as "used" so we prevent duplicates from being used
tokens[ids[i]] = 1;
/// tell the burn function to burn 1 of this specific id
values[i] = 1;
}
/// burn the set of tokens and exchange them for a new one
_burnBatch(msg.sender, ids, values);
/// mint the special drink
_mint(msg.sender, REDEEMABLE_DRINK_ID, 1, "");
/// if the timer is expired, start the game again
/// don't do this if the timer is running to avoid disrupting other players
if (timerExpired()){
_resetTimer();
}
/// emit the mint event for this specific token
emit Mint(msg.sender, REDEEMABLE_DRINK_ID);
}
/// @dev allows the owner to withdraw the funds in this contract
function withdraw(address payable _recipient, uint256 _amountToWithdraw) external onlyOwner {
/// ensure we have enough escrow to refund the bartender
uint256 bartenderEscrow;
if (barTenderTips[barTender] < barTenderFeePaid){
bartenderEscrow = barTenderFeePaid - barTenderTips[barTender];
}
/// check to ensure we don't overdraw and leave enough
/// for bartender to be refunded if they're bounced
require (_amountToWithdraw <= address(this).balance - bartenderEscrow, "withdrawl exceeds current limit");
/// attempt to withdraw the specified amount
(bool success, ) = _recipient.call{value: _amountToWithdraw}("");
require(success, "withdrawl failed");
}
/// @dev update the blast contract address to configure yield and gas
function setBlastContract(address _address) external onlyOwner {
// Set the new contract address
blastContractAddress = _address;
}
/// @dev update the blast contract address for points
function setBlastPointsContract(address _address) external onlyOwner {
// Set the new contract address
blastPointsAddress = _address;
}
/// @dev sets the operator for points api
function blastSetPointsOperator(address _address) external onlyOwner {
BLAST_POINTS.configurePointsOperator(_address);
}
/// @dev sets the contract's governor. once the governor is set,
/// this contract will lose the ability to configure itself.
/// @param _address the address of the new governor for blast functionality
function blastConfigureGovernor(address _address) external onlyOwner {
BLAST.configureGovernor(_address);
}
/// @dev claim this contract's gas at the specified bips
/// @param _recipient the adddress that will recieive the gas claimed
/// @param _minClaimRateBips threshold claim rate in bips (e.g. 8000 for 80%)
function claimGas(address _recipient, uint256 _minClaimRateBips) external onlyOwner {
BLAST.claimGasAtMinClaimRate(address(this), _recipient, _minClaimRateBips);
}
/// @dev leaving in legacy OS operator filter code below... just in case
function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
super.setApprovalForAll(operator, approved);
}
function safeTransferFrom(address from, address to, uint256 tokenId, uint256 amount, bytes memory data)
public
override
onlyAllowedOperator(from)
{
super.safeTransferFrom(from, to, tokenId, amount, data);
}
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) public virtual override onlyAllowedOperator(from) {
super.safeBatchTransferFrom(from, to, ids, amounts, data);
}
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal override(ERC1155, ERC1155Supply) {
super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
}
// Receive Ether
receive() external payable {}
// Fallback
fallback() external payable {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/ERC1155.sol)
pragma solidity ^0.8.0;
import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./extensions/IERC1155MetadataURI.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/introspection/ERC165.sol";
/**
* @dev Implementation of the basic standard multi-token.
* See https://eips.ethereum.org/EIPS/eip-1155
* Originally based on code by Enjin: https://github.com/enjin/erc-1155
*
* _Available since v3.1._
*/
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
using Address for address;
// Mapping from token ID to account balances
mapping(uint256 => mapping(address => uint256)) private _balances;
// Mapping from account to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
// Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
string private _uri;
/**
* @dev See {_setURI}.
*/
constructor(string memory uri_) {
_setURI(uri_);
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC1155).interfaceId ||
interfaceId == type(IERC1155MetadataURI).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC1155MetadataURI-uri}.
*
* This implementation returns the same URI for *all* token types. It relies
* on the token type ID substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* Clients calling this function must replace the `\{id\}` substring with the
* actual token type ID.
*/
function uri(uint256) public view virtual override returns (string memory) {
return _uri;
}
/**
* @dev See {IERC1155-balanceOf}.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
require(account != address(0), "ERC1155: address zero is not a valid owner");
return _balances[id][account];
}
/**
* @dev See {IERC1155-balanceOfBatch}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(
address[] memory accounts,
uint256[] memory ids
) public view virtual override returns (uint256[] memory) {
require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");
uint256[] memory batchBalances = new uint256[](accounts.length);
for (uint256 i = 0; i < accounts.length; ++i) {
batchBalances[i] = balanceOf(accounts[i], ids[i]);
}
return batchBalances;
}
/**
* @dev See {IERC1155-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC1155-isApprovedForAll}.
*/
function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
return _operatorApprovals[account][operator];
}
/**
* @dev See {IERC1155-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) public virtual override {
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not token owner or approved"
);
_safeTransferFrom(from, to, id, amount, data);
}
/**
* @dev See {IERC1155-safeBatchTransferFrom}.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) public virtual override {
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not token owner or approved"
);
_safeBatchTransferFrom(from, to, ids, amounts, data);
}
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function _safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: transfer to the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, from, to, ids, amounts, data);
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
unchecked {
_balances[id][from] = fromBalance - amount;
}
_balances[id][to] += amount;
emit TransferSingle(operator, from, to, id, amount);
_afterTokenTransfer(operator, from, to, ids, amounts, data);
_doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function _safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
require(to != address(0), "ERC1155: transfer to the zero address");
address operator = _msgSender();
_beforeTokenTransfer(operator, from, to, ids, amounts, data);
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
unchecked {
_balances[id][from] = fromBalance - amount;
}
_balances[id][to] += amount;
}
emit TransferBatch(operator, from, to, ids, amounts);
_afterTokenTransfer(operator, from, to, ids, amounts, data);
_doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
}
/**
* @dev Sets a new URI for all token types, by relying on the token type ID
* substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* By this mechanism, any occurrence of the `\{id\}` substring in either the
* URI or any of the amounts in the JSON file at said URI will be replaced by
* clients with the token type ID.
*
* For example, the `https://token-cdn-domain/\{id\}.json` URI would be
* interpreted by clients as
* `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
* for token type ID 0x4cce0.
*
* See {uri}.
*
* Because these URIs cannot be meaningfully represented by the {URI} event,
* this function emits no events.
*/
function _setURI(string memory newuri) internal virtual {
_uri = newuri;
}
/**
* @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
_balances[id][to] += amount;
emit TransferSingle(operator, address(0), to, id, amount);
_afterTokenTransfer(operator, address(0), to, ids, amounts, data);
_doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function _mintBatch(
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
for (uint256 i = 0; i < ids.length; i++) {
_balances[ids[i]][to] += amounts[i];
}
emit TransferBatch(operator, address(0), to, ids, amounts);
_afterTokenTransfer(operator, address(0), to, ids, amounts, data);
_doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
}
/**
* @dev Destroys `amount` tokens of token type `id` from `from`
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `from` must have at least `amount` tokens of token type `id`.
*/
function _burn(address from, uint256 id, uint256 amount) internal virtual {
require(from != address(0), "ERC1155: burn from the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
unchecked {
_balances[id][from] = fromBalance - amount;
}
emit TransferSingle(operator, from, address(0), id, amount);
_afterTokenTransfer(operator, from, address(0), ids, amounts, "");
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
*/
function _burnBatch(address from, uint256[] memory ids, uint256[] memory amounts) internal virtual {
require(from != address(0), "ERC1155: burn from the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");
for (uint256 i = 0; i < ids.length; i++) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
unchecked {
_balances[id][from] = fromBalance - amount;
}
}
emit TransferBatch(operator, from, address(0), ids, amounts);
_afterTokenTransfer(operator, from, address(0), ids, amounts, "");
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
require(owner != operator, "ERC1155: setting approval status for self");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning, as well as batched variants.
*
* The same hook is called on both single and batched variants. For single
* transfers, the length of the `ids` and `amounts` arrays will be 1.
*
* Calling conditions (for each `id` and `amount` pair):
*
* - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* of token type `id` will be transferred to `to`.
* - When `from` is zero, `amount` tokens of token type `id` will be minted
* for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
* will be burned.
* - `from` and `to` are never both zero.
* - `ids` and `amounts` have the same, non-zero length.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {}
/**
* @dev Hook that is called after any token transfer. This includes minting
* and burning, as well as batched variants.
*
* The same hook is called on both single and batched variants. For single
* transfers, the length of the `id` and `amount` arrays will be 1.
*
* Calling conditions (for each `id` and `amount` pair):
*
* - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* of token type `id` will be transferred to `to`.
* - When `from` is zero, `amount` tokens of token type `id` will be minted
* for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
* will be burned.
* - `from` and `to` are never both zero.
* - `ids` and `amounts` have the same, non-zero length.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {}
function _doSafeTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) private {
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
if (response != IERC1155Receiver.onERC1155Received.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non-ERC1155Receiver implementer");
}
}
}
function _doSafeBatchTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) private {
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
bytes4 response
) {
if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non-ERC1155Receiver implementer");
}
}
}
function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
uint256[] memory array = new uint256[](1);
array[0] = element;
return array;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/extensions/ERC1155Burnable.sol)
pragma solidity ^0.8.0;
import "../ERC1155.sol";
/**
* @dev Extension of {ERC1155} that allows token holders to destroy both their
* own tokens and those that they have been approved to use.
*
* _Available since v3.1._
*/
abstract contract ERC1155Burnable is ERC1155 {
function burn(address account, uint256 id, uint256 value) public virtual {
require(
account == _msgSender() || isApprovedForAll(account, _msgSender()),
"ERC1155: caller is not token owner or approved"
);
_burn(account, id, value);
}
function burnBatch(address account, uint256[] memory ids, uint256[] memory values) public virtual {
require(
account == _msgSender() || isApprovedForAll(account, _msgSender()),
"ERC1155: caller is not token owner or approved"
);
_burnBatch(account, ids, values);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)
pragma solidity ^0.8.0;
import "../ERC1155.sol";
/**
* @dev Extension of ERC1155 that adds tracking of total supply per id.
*
* Useful for scenarios where Fungible and Non-fungible tokens have to be
* clearly identified. Note: While a totalSupply of 1 might mean the
* corresponding is an NFT, there is no guarantees that no other token with the
* same id are not going to be minted.
*/
abstract contract ERC1155Supply is ERC1155 {
mapping(uint256 => uint256) private _totalSupply;
/**
* @dev Total amount of tokens in with a given id.
*/
function totalSupply(uint256 id) public view virtual returns (uint256) {
return _totalSupply[id];
}
/**
* @dev Indicates whether any token exist with a given id, or not.
*/
function exists(uint256 id) public view virtual returns (bool) {
return ERC1155Supply.totalSupply(id) > 0;
}
/**
* @dev See {ERC1155-_beforeTokenTransfer}.
*/
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual override {
super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
if (from == address(0)) {
for (uint256 i = 0; i < ids.length; ++i) {
_totalSupply[ids[i]] += amounts[i];
}
}
if (to == address(0)) {
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 supply = _totalSupply[id];
require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
unchecked {
_totalSupply[id] = supply - amount;
}
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)
pragma solidity ^0.8.0;
import "../IERC1155.sol";
/**
* @dev Interface of the optional ERC1155MetadataExtension interface, as defined
* in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
*
* _Available since v3.1._
*/
interface IERC1155MetadataURI is IERC1155 {
/**
* @dev Returns the URI for token type `id`.
*
* If the `\{id\}` substring is present in the URI, it must be replaced by
* clients with the actual token type ID.
*/
function uri(uint256 id) external view returns (string memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(
address[] calldata accounts,
uint256[] calldata ids
) external view returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev _Available since v3.1._
*/
interface IERC1155Receiver is IERC165 {
/**
* @dev Handles the receipt of a single ERC1155 token type. This function is
* called at the end of a `safeTransferFrom` after the balance has been updated.
*
* NOTE: To accept the transfer, this must return
* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
* (i.e. 0xf23a6e61, or its own function selector).
*
* @param operator The address which initiated the transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param id The ID of the token being transferred
* @param value The amount of tokens being transferred
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
* @dev Handles the receipt of a multiple ERC1155 token types. This function
* is called at the end of a `safeBatchTransferFrom` after the balances have
* been updated.
*
* NOTE: To accept the transfer(s), this must return
* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
* (i.e. 0xbc197c81, or its own function selector).
*
* @param operator The address which initiated the batch transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param ids An array containing ids of each token being transferred (order and length must match values array)
* @param values An array containing amounts of each token being transferred (order and length must match ids array)
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import {OperatorFilterer} from "./OperatorFilterer.sol";
/**
* @title DefaultOperatorFilterer
* @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
*/
abstract contract DefaultOperatorFilterer is OperatorFilterer {
address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);
constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
interface IOperatorFilterRegistry {
function isOperatorAllowed(address registrant, address operator) external view returns (bool);
function register(address registrant) external;
function registerAndSubscribe(address registrant, address subscription) external;
function registerAndCopyEntries(address registrant, address registrantToCopy) external;
function unregister(address addr) external;
function updateOperator(address registrant, address operator, bool filtered) external;
function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
function subscribe(address registrant, address registrantToSubscribe) external;
function unsubscribe(address registrant, bool copyExistingEntries) external;
function subscriptionOf(address addr) external returns (address registrant);
function subscribers(address registrant) external returns (address[] memory);
function subscriberAt(address registrant, uint256 index) external returns (address);
function copyEntriesOf(address registrant, address registrantToCopy) external;
function isOperatorFiltered(address registrant, address operator) external returns (bool);
function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
function filteredOperators(address addr) external returns (address[] memory);
function filteredCodeHashes(address addr) external returns (bytes32[] memory);
function filteredOperatorAt(address registrant, uint256 index) external returns (address);
function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
function isRegistered(address addr) external returns (bool);
function codeHashOf(address addr) external returns (bytes32);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";
/**
* @title OperatorFilterer
* @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
* registrant's entries in the OperatorFilterRegistry.
* @dev This smart contract is meant to be inherited by token contracts so they can use the following:
* - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
* - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
*/
abstract contract OperatorFilterer {
error OperatorNotAllowed(address operator);
IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);
constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
// If an inheriting token contract is deployed to a network without the registry deployed, the modifier
// will not revert, but the contract will need to be registered with the registry once it is deployed in
// order for the modifier to filter addresses.
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
if (subscribe) {
OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
} else {
if (subscriptionOrRegistrantToCopy != address(0)) {
OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
} else {
OPERATOR_FILTER_REGISTRY.register(address(this));
}
}
}
}
modifier onlyAllowedOperator(address from) virtual {
// Allow spending tokens from addresses with balance
// Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
// from an EOA.
if (from != msg.sender) {
_checkFilterOperator(msg.sender);
}
_;
}
modifier onlyAllowedOperatorApproval(address operator) virtual {
_checkFilterOperator(operator);
_;
}
function _checkFilterOperator(address operator) internal view virtual {
// Check registry code length to facilitate testing in environments without a deployed registry.
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
revert OperatorNotAllowed(operator);
}
}
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_newBarTender","type":"address"}],"name":"BarOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_mintedTo","type":"address"},{"indexed":true,"internalType":"uint256","name":"_idMinted","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"BLAST","outputs":[{"internalType":"contract IBlast","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLAST_POINTS","outputs":[{"internalType":"contract IBlastPoints","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DRINK_18_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IYKYK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REDEEMABLE_DRINK_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_appointee","type":"address"}],"name":"appointBarTender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bannedBarTenders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"barOpenFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"barTender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"barTenderFeePaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"barTenderTips","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bartenderTip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"blastConfigureGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blastContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blastPointsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"blastSetPointsOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_ban","type":"bool"}],"name":"bounceBarTender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"burnToRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_minClaimRateBips","type":"uint256"}],"name":"claimGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"drink18Minted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generousTip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toAddress","type":"address"}],"name":"iykyk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastMintBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintDrink18","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mostRecentPour","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reopenBar","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setBarTenderTip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setBlastContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setBlastPointsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setGenerousTip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMinimumTip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toAddress","type":"address"}],"name":"tendBar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timerExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amountToWithdraw","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c0604052601260809081527113185cdd0810d85b1b081bdb88109b185cdd60721b60a052600690620000339082620009f3565b50604080518082019091526009815268131054d50810d0531360ba1b6020820152600790620000639082620009f3565b50600880547343000000000000000000000000000000000000026001600160a01b0319918216811790925560098054732fc95838c71e76ec69ff817983bff17c710f34e0908316811790915543600a556000600b556601c6bf52634000600c5566354a6ba7a18000600d5565b5e620f48000600e55670de0b6b3a7640000600f556016805483169093179092556017805490911690911790553480156200010957600080fd5b506040516200476c3803806200476c8339810160408190526200012c9162000b14565b80733cc6cdda760b79bafa08df41ecfa224f810dceb660016daaeb6d7670e522a718067333cd4e3b1562000289578015620001d757604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620001b857600080fd5b505af1158015620001cd573d6000803e3d6000fd5b5050505062000289565b6001600160a01b03821615620002285760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016200019d565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200026f57600080fd5b505af115801562000284573d6000803e3d6000fd5b505050505b50620002979050816200041d565b506001600455620002a8336200042f565b620002b3816200041d565b601660009054906101000a90046001600160a01b03166001600160a01b0316634e606c476040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200030457600080fd5b505af115801562000319573d6000803e3d6000fd5b50505050601660009054906101000a90046001600160a01b03166001600160a01b0316637114177a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200036e57600080fd5b505af115801562000383573d6000803e3d6000fd5b506001925050505b600f8111620003cb57620003b833826001604051806020016040528060008152506200048160201b60201c565b620003c38162000bcc565b90506200038b565b50620003f13360116001604051806020016040528060008152506200048160201b60201c565b620004163360136001604051806020016040528060008152506200048160201b60201c565b5062000d83565b60026200042b8282620009f3565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416620004e75760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084015b60405180910390fd5b336000620004f585620005b4565b905060006200050485620005b4565b9050620005178360008985858962000602565b6000868152602081815260408083206001600160a01b038b168452909152812080548792906200054990849062000be8565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4620005ab836000898989896200061a565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110620005f157620005f162000c04565b602090810291909101015292915050565b62000612868686868686620007d2565b505050505050565b6001600160a01b0384163b15620006125760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619062000661908990899088908890889060040162000c48565b6020604051808303816000875af19250505080156200069f575060408051601f3d908101601f191682019092526200069c9181019062000c8f565b60015b6200075f57620006ae62000cc2565b806308c379a003620006ee5750620006c562000cdf565b80620006d25750620006f0565b8060405162461bcd60e51b8152600401620004de919062000d6e565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401620004de565b6001600160e01b0319811663f23a6e6160e01b14620005ab5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401620004de565b6001600160a01b0385166200085b5760005b8351811015620008595782818151811062000803576200080362000c04565b60200260200101516003600086848151811062000824576200082462000c04565b6020026020010151815260200190815260200160002060008282546200084b919062000be8565b9091555050600101620007e4565b505b6001600160a01b038416620006125760005b8351811015620005ab5760008482815181106200088e576200088e62000c04565b602002602001015190506000848381518110620008af57620008af62000c04565b6020026020010151905060006003600084815260200190815260200160002054905081811015620009345760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401620004de565b600092835260036020526040909220910390556001016200086d565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200097b57607f821691505b6020821081036200099c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620009ee576000816000526020600020601f850160051c81016020861015620009cd5750805b601f850160051c820191505b818110156200061257828155600101620009d9565b505050565b81516001600160401b0381111562000a0f5762000a0f62000950565b62000a278162000a20845462000966565b84620009a2565b602080601f83116001811462000a5f576000841562000a465750858301515b600019600386901b1c1916600185901b17855562000612565b600085815260208120601f198616915b8281101562000a905788860151825594840194600190910190840162000a6f565b508582101562000aaf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b601f8201601f191681016001600160401b038111828210171562000ae75762000ae762000950565b6040525050565b60005b8381101562000b0b57818101518382015260200162000af1565b50506000910152565b60006020828403121562000b2757600080fd5b81516001600160401b038082111562000b3f57600080fd5b818401915084601f83011262000b5457600080fd5b81518181111562000b695762000b6962000950565b604051915062000b84601f8201601f19166020018362000abf565b80825285602082850101111562000b9a57600080fd5b62000bad81602084016020860162000aee565b50949350505050565b634e487b7160e01b600052601160045260246000fd5b60006001820162000be15762000be162000bb6565b5060010190565b8082018082111562000bfe5762000bfe62000bb6565b92915050565b634e487b7160e01b600052603260045260246000fd5b6000815180845262000c3481602086016020860162000aee565b601f01601f19169290920160200192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009062000c849083018462000c1a565b979650505050505050565b60006020828403121562000ca257600080fd5b81516001600160e01b03198116811462000cbb57600080fd5b9392505050565b600060033d111562000cdc5760046000803e5060005160e01c5b90565b600060443d101562000cee5790565b6040516003193d81016004833e81513d6001600160401b03808311602484018310171562000d1e57505050505090565b828501915081518181111562000d375750505050505090565b843d870101602082850101111562000d525750505050505090565b62000d636020828601018762000abf565b509095945050505050565b60208152600062000cbb602083018462000c1a565b6139d98062000d936000396000f3fe60806040526004361061035f5760003560e01c806383f0885a116101c4578063c1b3433c116100f6578063f02dcca61161009a578063f4a2fff71161006c578063f4a2fff714610a25578063f5298aca14610a3b578063f6f38eed14610a5b578063f7da660614610a7b57005b8063f02dcca6146109af578063f242432a146109c5578063f2fde38b146109e5578063f3fef3a314610a0557005b8063d65ab5f2116100d3578063d65ab5f21461091b578063dd8bbad314610930578063e5cfcaf814610946578063e985e9c51461096657005b8063c1b3433c146108bb578063c3494563146108db578063c8d6054f146108fb57005b806397d7577611610168578063b80095541161013a578063b800955414610846578063bd144af614610866578063bd85b0391461086e578063c147c6671461089b57005b806397d75776146107db5780639cf5c3f5146107fb578063a22cb46514610811578063a2e9a0011461083157005b8063924ab61e116101a1578063924ab61e146107565780639383e3601461078657806395d89b41146107a657806396423694146107bb57005b806383f0885a146106f65780638a19c8bc146107235780638da5cb5b1461073857005b8063291d3baf1161029d5780634e1273f4116102415780636b20c454116102135780636b20c454146106815780636b68a70a146106a1578063715018a6146106c15780638268e333146106d657005b80634e1273f4146105fa5780634f558e79146106275780635a9566c11461065657806365998b541461066c57005b80633804c73d1161027a5780633804c73d1461058c578063399721b6146105a257806341f43434146105b85780634b8f9025146105da57005b8063291d3baf1461052b5780632eb2c2d61461054c5780632fedb13e1461056c57005b80630e89341c1161030457806317ee2196116102e157806317ee2196146104c05780631be05289146104e05780631ebc4499146104f657806327943fc71461050b57005b80630e89341c14610482578063115fb024146104a25780631249c58b146104b857005b806305bafd921161033d57806305bafd92146103eb57806306fdde031461040b5780630884a8251461042d578063095f363c1461044a57005b8062fdd58e1461036857806301ffc9a71461039b57806302fe5305146103cb57005b3661036657005b005b34801561037457600080fd5b50610388610383366004612d74565b610a83565b6040519081526020015b60405180910390f35b3480156103a757600080fd5b506103bb6103b6366004612db6565b610b1c565b6040519015158152602001610392565b3480156103d757600080fd5b506103666103e6366004612e7b565b610b6c565b3480156103f757600080fd5b50610366610406366004612d74565b610b80565b34801561041757600080fd5b50610420610c0a565b6040516103929190612f12565b34801561043957600080fd5b506103886803bd913e6c1df4000081565b34801561045657600080fd5b5060095461046a906001600160a01b031681565b6040516001600160a01b039091168152602001610392565b34801561048e57600080fd5b5061042061049d366004612f25565b610c98565b3480156104ae57600080fd5b5061038860145481565b610366610d2c565b3480156104cc57600080fd5b506103666104db366004612f25565b610e8a565b3480156104ec57600080fd5b506103886105dc81565b34801561050257600080fd5b50610388601181565b34801561051757600080fd5b50610366610526366004612f3e565b610e97565b34801561053757600080fd5b506009546103bb90600160a01b900460ff1681565b34801561055857600080fd5b50610366610567366004613015565b610ec1565b34801561057857600080fd5b50610366610587366004612f3e565b610ef0565b34801561059857600080fd5b50610388600b5481565b3480156105ae57600080fd5b50610388600c5481565b3480156105c457600080fd5b5061046a6daaeb6d7670e522a718067333cd4e81565b3480156105e657600080fd5b5060175461046a906001600160a01b031681565b34801561060657600080fd5b5061061a6106153660046130c3565b610fd9565b60405161039291906131cc565b34801561063357600080fd5b506103bb610642366004612f25565b600090815260036020526040902054151590565b34801561066257600080fd5b50610388600d5481565b34801561067857600080fd5b506103bb6110fb565b34801561068d57600080fd5b5061036661069c3660046131df565b611116565b3480156106ad57600080fd5b506103666106bc366004612f3e565b611159565b3480156106cd57600080fd5b506103666112d1565b3480156106e257600080fd5b506103666106f1366004612f3e565b6112e3565b34801561070257600080fd5b50610388610711366004612f3e565b60136020526000908152604090205481565b34801561072f57600080fd5b5061038861130d565b34801561074457600080fd5b506005546001600160a01b031661046a565b34801561076257600080fd5b506103bb610771366004612f3e565b60106020526000908152604090205460ff1681565b34801561079257600080fd5b506103666107a1366004612f3e565b61137f565b3480156107b257600080fd5b50610420611392565b3480156107c757600080fd5b506103666107d6366004612f3e565b61139f565b3480156107e757600080fd5b5060165461046a906001600160a01b031681565b34801561080757600080fd5b50610388600a5481565b34801561081d57600080fd5b5061036661082c366004613263565b61140a565b34801561083d57600080fd5b50610388601381565b34801561085257600080fd5b50610366610861366004612f25565b61141e565b61036661142b565b34801561087a57600080fd5b50610388610889366004612f25565b60009081526003602052604090205490565b3480156108a757600080fd5b506103666108b6366004612f3e565b611583565b3480156108c757600080fd5b506103666108d6366004612f25565b6115bd565b3480156108e757600080fd5b506103666108f636600461329c565b6115ca565b34801561090757600080fd5b506103666109163660046132b9565b61170b565b34801561092757600080fd5b506103666119d5565b34801561093c57600080fd5b5061038860125481565b34801561095257600080fd5b5060085461046a906001600160a01b031681565b34801561097257600080fd5b506103bb61098136600461332e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156109bb57600080fd5b50610388600e5481565b3480156109d157600080fd5b506103666109e036600461335c565b611a4c565b3480156109f157600080fd5b50610366610a00366004612f3e565b611a73565b348015610a1157600080fd5b50610366610a20366004612d74565b611ae9565b348015610a3157600080fd5b50610388600f5481565b348015610a4757600080fd5b50610366610a563660046133c5565b611c37565b348015610a6757600080fd5b5060115461046a906001600160a01b031681565b610366611c7a565b60006001600160a01b038316610af35760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b1480610b4d57506001600160e01b031982166303a24d0760e21b145b80610b1657506301ffc9a760e01b6001600160e01b0319831614610b16565b610b74611e2f565b610b7d81611e89565b50565b610b88611e2f565b601654604051630951888f60e01b81523060048201526001600160a01b0384811660248301526044820184905290911690630951888f906064016020604051808303816000875af1158015610be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0591906133fa565b505050565b60068054610c1790613413565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4390613413565b8015610c905780601f10610c6557610100808354040283529160200191610c90565b820191906000526020600020905b815481529060010190602001808311610c7357829003601f168201915b505050505081565b606060028054610ca790613413565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd390613413565b8015610d205780601f10610cf557610100808354040283529160200191610d20565b820191906000526020600020905b815481529060010190602001808311610d0357829003601f168201915b50505050509050919050565b610d34611e95565b600e54600c54610d449190613463565b341015610d875760405162461bcd60e51b8152602060048201526011602482015270073656e642061206869676865722074697607c1b6044820152606401610aea565b6005546011546001600160a01b03908116911614610e6d57600e546011546001600160a01b031660009081526013602052604081208054909190610dcc908490613463565b9091555050601154600e546040516000926001600160a01b031691908381818185875af1925050503d8060008114610e20576040519150601f19603f3d011682016040523d82523d6000602084013e610e25565b606091505b5050905080610e6b5760405162461bcd60e51b81526020600482015260126024820152710ccc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610aea565b505b610e7e33610e79611eee565b611f38565b610e886001600455565b565b610e92611e2f565b600c55565b610e9f611e2f565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b846001600160a01b0381163314610edb57610edb33611fe9565b610ee886868686866120a2565b505050505050565b610ef8611e2f565b6005546011546001600160a01b03908116911614610f6f57610f186110fb565b610f6f5760405162461bcd60e51b815260206004820152602260248201527f736f6d656f6e6520697320616c72656164792074656e64696e6720746865206260448201526130b960f11b6064820152608401610aea565b43600b55610f7c43600a55565b601180546001600160a01b0319166001600160a01b0383169081179091556000601281905581815260136020526040808220829055517f4ad6a7e506c46281359526f1cae1cc3ec279c88daf39592fea2089970b0127159190a250565b6060815183511461103e5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610aea565b6000835167ffffffffffffffff81111561105a5761105a612dda565b604051908082528060200260200182016040528015611083578160200160208202803683370190505b50905060005b84518110156110f3576110ce8582815181106110a7576110a7613476565b60200260200101518583815181106110c1576110c1613476565b6020026020010151610a83565b8282815181106110e0576110e0613476565b6020908102919091010152600101611089565b509392505050565b600080600a544361110c919061348c565b6105dc1092915050565b6001600160a01b03831633148061113257506111328333610981565b61114e5760405162461bcd60e51b8152600401610aea9061349f565b610c058383836120e7565b611161611e95565b6011546001600160a01b031633146111d05760405162461bcd60e51b815260206004820152602c60248201527f6f6e6c79207468652062617274656e646572206f72206f776e65722063616e2060448201526b3a32b732103a3432903130b960a11b6064820152608401610aea565b6111d86110fb565b156112255760405162461bcd60e51b815260206004820152601960248201527f7468652067616d652074696d65722069732065787069726564000000000000006044820152606401610aea565b6112316105dc4361348c565b601454106112775760405162461bcd60e51b81526020600482015260136024820152723a37b79039b7b7b716103a393c903630ba32b960691b6044820152606401610aea565b6000611283600f612279565b61128e906001613463565b43601455600d54336000908152601360205260408120805493945091926112b6908490613463565b909155506112c690508282611f38565b50610b7d6001600455565b6112d9611e2f565b610e8860006122f8565b6112eb611e2f565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600080600a544361131e919061348c565b90506113286110fb565b1561136d5760405162461bcd60e51b8152602060048201526015602482015274151a19481d1a5b595c881a185cc8195e1c1a5c9959605a1b6044820152606401610aea565b611379816105dc61348c565b91505090565b611387611e2f565b610b7d816011611f38565b60078054610c1790613413565b6113a7611e2f565b601654604051631d70c8d360e31b81526001600160a01b0383811660048301529091169063eb864698906024015b600060405180830381600087803b1580156113ef57600080fd5b505af1158015611403573d6000803e3d6000fd5b5050505050565b8161141481611fe9565b610c05838361234a565b611426611e2f565b600e55565b6803bd913e6c1df4000034146114765760405162461bcd60e51b815260206004820152601060248201526f0daeae6e840e6cadcc8406c72408aa8960831b6044820152606401610aea565b600954600160a01b900460ff16156114c65760405162461bcd60e51b81526020600482015260136024820152726e6f2052656d61696e696e6720537570706c7960681b6044820152606401610aea565b6000600b54116115185760405162461bcd60e51b815260206004820152601d60248201527f7468652062617220686173206e65766572206265656e206f70656e65640000006044820152606401610aea565b601180546001600160a01b03191633908117909155600f54601290815543600b556009805460ff60a01b1916600160a01b1790556115569190611f38565b60405133907f4ad6a7e506c46281359526f1cae1cc3ec279c88daf39592fea2089970b01271590600090a2565b61158b611e2f565b6017546040516336b91f2b60e01b81526001600160a01b038381166004830152909116906336b91f2b906024016113d5565b6115c5611e2f565b600d55565b6115d2611e2f565b6011546001600160a01b03166000908152601060205260409020805460ff19168215151790556012541580159061162457506012546011546001600160a01b0316600090815260136020526040902054105b156116f1576011546001600160a01b0316600090815260136020526040812054601254611651919061348c565b6011546040519192506000916001600160a01b039091169083908381818185875af1925050503d80600081146116a3576040519150601f19603f3d011682016040523d82523d6000602084013e6116a8565b606091505b50509050806116ee5760405162461bcd60e51b81526020600482015260126024820152710ccc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610aea565b50505b50601180546001600160a01b031916331790556000601255565b611713611e95565b600f81146117635760405162461bcd60e51b815260206004820181905260248201527f57726f6e67206e756d626572206f6620746f6b656e73207375626d69747465646044820152606401610aea565b60408051601380825261028082019092526000916020820161026080368337505060408051600f80825261020082019092529293506000929150602082016101e08036833701905050905060005b600e81116119245760018585838181106117cd576117cd613476565b90506020020135101580156117fb575060128585838181106117f1576117f1613476565b9050602002013511155b61183c5760405162461bcd60e51b8152602060048201526012602482015271546f6b656e206e6f7420656c696769626c6560701b6044820152606401610aea565b8285858381811061184f5761184f613476565b905060200201358151811061186657611866613476565b60200260200101516000146118bd5760405162461bcd60e51b815260206004820152601960248201527f4561636820746f6b656e206d75737420626520756e69717565000000000000006044820152606401610aea565b6001838686848181106118d2576118d2613476565b90506020020135815181106118e9576118e9613476565b602002602001018181525050600182828151811061190957611909613476565b602090810291909101015261191d816134ed565b90506117b1565b50611964338585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508692506120e7915050565b611981336013600160405180602001604052806000815250612355565b6119896110fb565b156119975761199743600a55565b60405160139033907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a350506119d16001600455565b5050565b6119dd611e2f565b600b5415611a2d5760405162461bcd60e51b815260206004820181905260248201527f5468652067616d652063616e6e6f74206265207374617274656420616761696e6044820152606401610aea565b601180546001600160a01b0319163317905543600b5561155643600a55565b846001600160a01b0381163314611a6657611a6633611fe9565b610ee88686868686612478565b611a7b611e2f565b6001600160a01b038116611ae05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aea565b610b7d816122f8565b611af1611e2f565b6012546011546001600160a01b031660009081526013602052604081205490911115611b42576011546001600160a01b0316600090815260136020526040902054601254611b3f919061348c565b90505b611b4c814761348c565b821115611b9b5760405162461bcd60e51b815260206004820152601f60248201527f77697468647261776c20657863656564732063757272656e74206c696d6974006044820152606401610aea565b6000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114611be8576040519150601f19603f3d011682016040523d82523d6000602084013e611bed565b606091505b5050905080611c315760405162461bcd60e51b815260206004820152601060248201526f1dda5d1a191c985ddb0819985a5b195960821b6044820152606401610aea565b50505050565b6001600160a01b038316331480611c535750611c538333610981565b611c6f5760405162461bcd60e51b8152600401610aea9061349f565b610c058383836124bd565b611c82611e95565b6000600b5411611cd45760405162461bcd60e51b815260206004820152601760248201527f67616d65206861736e27742073746172746564207965740000000000000000006044820152606401610aea565b600f543414611d195760405162461bcd60e51b81526020600482015260116024820152701ddc9bdb99c8185b5bdd5b9d081cd95b9d607a1b6044820152606401610aea565b611d216110fb565b611d6d5760405162461bcd60e51b815260206004820152601960248201527f746865206261722069732063757272656e746c79206f70656e000000000000006044820152606401610aea565b3360009081526010602052604090205460ff1615611dc65760405162461bcd60e51b81526020600482015260166024820152751d1a1a5cc81859191c995cdcc81a5cc818985b9b995960521b6044820152606401610aea565b611dcf43600a55565b43600b55601180546001600160a01b03191633908117909155600081815260136020526040808220829055600f54601255517f4ad6a7e506c46281359526f1cae1cc3ec279c88daf39592fea2089970b0127159190a2610e886001600455565b6005546001600160a01b03163314610e885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aea565b60026119d1828261354e565b600260045403611ee75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610aea565b6002600455565b6000806064611efb61130d565b611f059190613624565b611f1090600f61348c565b9050600d543410611f3357611f25600f612279565b611f30906001613463565b90505b919050565b6000600b5411611f8a5760405162461bcd60e51b815260206004820152601860248201527f7468652067616d65206973206e6f74206f70656e2079657400000000000000006044820152606401610aea565b611f9343600a55565b611faf8282600160405180602001604052806000815250612355565b60405181906001600160a01b038416907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a35050565b6daaeb6d7670e522a718067333cd4e3b15610b7d57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207a9190613638565b610b7d57604051633b79c77360e21b81526001600160a01b0382166004820152602401610aea565b6001600160a01b0385163314806120be57506120be8533610981565b6120da5760405162461bcd60e51b8152600401610aea9061349f565b61140385858585856125d5565b6001600160a01b03831661210d5760405162461bcd60e51b8152600401610aea90613655565b805182511461212e5760405162461bcd60e51b8152600401610aea90613698565b600033905061215181856000868660405180602001604052806000815250612770565b60005b835181101561220c57600084828151811061217157612171613476565b60200260200101519050600084838151811061218f5761218f613476565b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156121df5760405162461bcd60e51b8152600401610aea906136e0565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055600101612154565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161225d929190613724565b60405180910390a4604080516020810190915260009052611c31565b6000808242336015546040516020016122b79392919092835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6040516020818303038152906040528051906020012060001c6122da9190613752565b6015805491925060006122ec836134ed565b90915550909392505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6119d133838361277e565b6001600160a01b0384166123b55760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610aea565b3360006123c18561285e565b905060006123ce8561285e565b90506123df83600089858589612770565b6000868152602081815260408083206001600160a01b038b1684529091528120805487929061240f908490613463565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461246f836000898989896128a9565b50505050505050565b6001600160a01b03851633148061249457506124948533610981565b6124b05760405162461bcd60e51b8152600401610aea9061349f565b6114038585858585612a04565b6001600160a01b0383166124e35760405162461bcd60e51b8152600401610aea90613655565b3360006124ef8461285e565b905060006124fc8461285e565b905061251c83876000858560405180602001604052806000815250612770565b6000858152602081815260408083206001600160a01b038a1684529091529020548481101561255d5760405162461bcd60e51b8152600401610aea906136e0565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091526000905261246f565b81518351146125f65760405162461bcd60e51b8152600401610aea90613698565b6001600160a01b03841661261c5760405162461bcd60e51b8152600401610aea90613766565b3361262b818787878787612770565b60005b845181101561270a57600085828151811061264b5761264b613476565b60200260200101519050600085838151811061266957612669613476565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156126b95760405162461bcd60e51b8152600401610aea906137ab565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906126f6908490613463565b90915550506001909301925061262e915050565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161275a929190613724565b60405180910390a4610ee8818787878787612b3c565b610ee8868686868686612bf7565b816001600160a01b0316836001600160a01b0316036127f15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610aea565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061289857612898613476565b602090810291909101015292915050565b6001600160a01b0384163b15610ee85760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906128ed90899089908890889088906004016137f5565b6020604051808303816000875af1925050508015612928575060408051601f3d908101601f191682019092526129259181019061383a565b60015b6129d457612934613857565b806308c379a00361296d5750612948613873565b80612953575061296f565b8060405162461bcd60e51b8152600401610aea9190612f12565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610aea565b6001600160e01b0319811663f23a6e6160e01b1461246f5760405162461bcd60e51b8152600401610aea906138fd565b6001600160a01b038416612a2a5760405162461bcd60e51b8152600401610aea90613766565b336000612a368561285e565b90506000612a438561285e565b9050612a53838989858589612770565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015612a945760405162461bcd60e51b8152600401610aea906137ab565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612ad1908490613463565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612b31848a8a8a8a8a6128a9565b505050505050505050565b6001600160a01b0384163b15610ee85760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612b809089908990889088908890600401613945565b6020604051808303816000875af1925050508015612bbb575060408051601f3d908101601f19168201909252612bb89181019061383a565b60015b612bc757612934613857565b6001600160e01b0319811663bc197c8160e01b1461246f5760405162461bcd60e51b8152600401610aea906138fd565b6001600160a01b038516612c755760005b8351811015612c7357828181518110612c2357612c23613476565b602002602001015160036000868481518110612c4157612c41613476565b602002602001015181526020019081526020016000206000828254612c669190613463565b9091555050600101612c08565b505b6001600160a01b038416610ee85760005b835181101561246f576000848281518110612ca357612ca3613476565b602002602001015190506000848381518110612cc157612cc1613476565b6020026020010151905060006003600084815260200190815260200160002054905081811015612d445760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610aea565b60009283526003602052604090922091039055600101612c86565b6001600160a01b0381168114610b7d57600080fd5b60008060408385031215612d8757600080fd5b8235612d9281612d5f565b946020939093013593505050565b6001600160e01b031981168114610b7d57600080fd5b600060208284031215612dc857600080fd5b8135612dd381612da0565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715612e1657612e16612dda565b6040525050565b600067ffffffffffffffff831115612e3757612e37612dda565b604051612e4e601f8501601f191660200182612df0565b809150838152848484011115612e6357600080fd5b83836020830137600060208583010152509392505050565b600060208284031215612e8d57600080fd5b813567ffffffffffffffff811115612ea457600080fd5b8201601f81018413612eb557600080fd5b612ec484823560208401612e1d565b949350505050565b6000815180845260005b81811015612ef257602081850181015186830182015201612ed6565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612dd36020830184612ecc565b600060208284031215612f3757600080fd5b5035919050565b600060208284031215612f5057600080fd5b8135612dd381612d5f565b600067ffffffffffffffff821115612f7557612f75612dda565b5060051b60200190565b600082601f830112612f9057600080fd5b81356020612f9d82612f5b565b604051612faa8282612df0565b80915083815260208101915060208460051b870101935086841115612fce57600080fd5b602086015b84811015612fea5780358352918301918301612fd3565b509695505050505050565b600082601f83011261300657600080fd5b612dd383833560208501612e1d565b600080600080600060a0868803121561302d57600080fd5b853561303881612d5f565b9450602086013561304881612d5f565b9350604086013567ffffffffffffffff8082111561306557600080fd5b61307189838a01612f7f565b9450606088013591508082111561308757600080fd5b61309389838a01612f7f565b935060808801359150808211156130a957600080fd5b506130b688828901612ff5565b9150509295509295909350565b600080604083850312156130d657600080fd5b823567ffffffffffffffff808211156130ee57600080fd5b818501915085601f83011261310257600080fd5b8135602061310f82612f5b565b60405161311c8282612df0565b83815260059390931b850182019282810191508984111561313c57600080fd5b948201945b8386101561316357853561315481612d5f565b82529482019490820190613141565b9650508601359250508082111561317957600080fd5b5061318685828601612f7f565b9150509250929050565b60008151808452602080850194506020840160005b838110156131c1578151875295820195908201906001016131a5565b509495945050505050565b602081526000612dd36020830184613190565b6000806000606084860312156131f457600080fd5b83356131ff81612d5f565b9250602084013567ffffffffffffffff8082111561321c57600080fd5b61322887838801612f7f565b9350604086013591508082111561323e57600080fd5b5061324b86828701612f7f565b9150509250925092565b8015158114610b7d57600080fd5b6000806040838503121561327657600080fd5b823561328181612d5f565b9150602083013561329181613255565b809150509250929050565b6000602082840312156132ae57600080fd5b8135612dd381613255565b600080602083850312156132cc57600080fd5b823567ffffffffffffffff808211156132e457600080fd5b818501915085601f8301126132f857600080fd5b81358181111561330757600080fd5b8660208260051b850101111561331c57600080fd5b60209290920196919550909350505050565b6000806040838503121561334157600080fd5b823561334c81612d5f565b9150602083013561329181612d5f565b600080600080600060a0868803121561337457600080fd5b853561337f81612d5f565b9450602086013561338f81612d5f565b93506040860135925060608601359150608086013567ffffffffffffffff8111156133b957600080fd5b6130b688828901612ff5565b6000806000606084860312156133da57600080fd5b83356133e581612d5f565b95602085013595506040909401359392505050565b60006020828403121561340c57600080fd5b5051919050565b600181811c9082168061342757607f821691505b60208210810361344757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b1657610b1661344d565b634e487b7160e01b600052603260045260246000fd5b81810381811115610b1657610b1661344d565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b6000600182016134ff576134ff61344d565b5060010190565b601f821115610c05576000816000526020600020601f850160051c8101602086101561352f5750805b601f850160051c820191505b81811015610ee85782815560010161353b565b815167ffffffffffffffff81111561356857613568612dda565b61357c816135768454613413565b84613506565b602080601f8311600181146135b157600084156135995750858301515b600019600386901b1c1916600185901b178555610ee8565b600085815260208120601f198616915b828110156135e0578886015182559484019460019091019084016135c1565b50858210156135fe5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b6000826136335761363361360e565b500490565b60006020828403121561364a57600080fd5b8151612dd381613255565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6040815260006137376040830185613190565b82810360208401526137498185613190565b95945050505050565b6000826137615761376161360e565b500690565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061382f90830184612ecc565b979650505050505050565b60006020828403121561384c57600080fd5b8151612dd381612da0565b600060033d11156138705760046000803e5060005160e01c5b90565b600060443d10156138815790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156138b157505050505090565b82850191508151818111156138c95750505050505090565b843d87010160208285010111156138e35750505050505090565b6138f260208286010187612df0565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061397190830186613190565b82810360608401526139838186613190565b905082810360808401526139978185612ecc565b9897505050505050505056fea264697066735822122049488afd72ae758fd76733751bd22ee583ef821ed951206a4b1494fbae3e845e64736f6c634300081800330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004568747470733a2f2f6d657461646174612e6172746c61622e78797a2f30313835326466622d333836372d383331352d396133332d3234656531623461383766382f7b69647d000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061035f5760003560e01c806383f0885a116101c4578063c1b3433c116100f6578063f02dcca61161009a578063f4a2fff71161006c578063f4a2fff714610a25578063f5298aca14610a3b578063f6f38eed14610a5b578063f7da660614610a7b57005b8063f02dcca6146109af578063f242432a146109c5578063f2fde38b146109e5578063f3fef3a314610a0557005b8063d65ab5f2116100d3578063d65ab5f21461091b578063dd8bbad314610930578063e5cfcaf814610946578063e985e9c51461096657005b8063c1b3433c146108bb578063c3494563146108db578063c8d6054f146108fb57005b806397d7577611610168578063b80095541161013a578063b800955414610846578063bd144af614610866578063bd85b0391461086e578063c147c6671461089b57005b806397d75776146107db5780639cf5c3f5146107fb578063a22cb46514610811578063a2e9a0011461083157005b8063924ab61e116101a1578063924ab61e146107565780639383e3601461078657806395d89b41146107a657806396423694146107bb57005b806383f0885a146106f65780638a19c8bc146107235780638da5cb5b1461073857005b8063291d3baf1161029d5780634e1273f4116102415780636b20c454116102135780636b20c454146106815780636b68a70a146106a1578063715018a6146106c15780638268e333146106d657005b80634e1273f4146105fa5780634f558e79146106275780635a9566c11461065657806365998b541461066c57005b80633804c73d1161027a5780633804c73d1461058c578063399721b6146105a257806341f43434146105b85780634b8f9025146105da57005b8063291d3baf1461052b5780632eb2c2d61461054c5780632fedb13e1461056c57005b80630e89341c1161030457806317ee2196116102e157806317ee2196146104c05780631be05289146104e05780631ebc4499146104f657806327943fc71461050b57005b80630e89341c14610482578063115fb024146104a25780631249c58b146104b857005b806305bafd921161033d57806305bafd92146103eb57806306fdde031461040b5780630884a8251461042d578063095f363c1461044a57005b8062fdd58e1461036857806301ffc9a71461039b57806302fe5305146103cb57005b3661036657005b005b34801561037457600080fd5b50610388610383366004612d74565b610a83565b6040519081526020015b60405180910390f35b3480156103a757600080fd5b506103bb6103b6366004612db6565b610b1c565b6040519015158152602001610392565b3480156103d757600080fd5b506103666103e6366004612e7b565b610b6c565b3480156103f757600080fd5b50610366610406366004612d74565b610b80565b34801561041757600080fd5b50610420610c0a565b6040516103929190612f12565b34801561043957600080fd5b506103886803bd913e6c1df4000081565b34801561045657600080fd5b5060095461046a906001600160a01b031681565b6040516001600160a01b039091168152602001610392565b34801561048e57600080fd5b5061042061049d366004612f25565b610c98565b3480156104ae57600080fd5b5061038860145481565b610366610d2c565b3480156104cc57600080fd5b506103666104db366004612f25565b610e8a565b3480156104ec57600080fd5b506103886105dc81565b34801561050257600080fd5b50610388601181565b34801561051757600080fd5b50610366610526366004612f3e565b610e97565b34801561053757600080fd5b506009546103bb90600160a01b900460ff1681565b34801561055857600080fd5b50610366610567366004613015565b610ec1565b34801561057857600080fd5b50610366610587366004612f3e565b610ef0565b34801561059857600080fd5b50610388600b5481565b3480156105ae57600080fd5b50610388600c5481565b3480156105c457600080fd5b5061046a6daaeb6d7670e522a718067333cd4e81565b3480156105e657600080fd5b5060175461046a906001600160a01b031681565b34801561060657600080fd5b5061061a6106153660046130c3565b610fd9565b60405161039291906131cc565b34801561063357600080fd5b506103bb610642366004612f25565b600090815260036020526040902054151590565b34801561066257600080fd5b50610388600d5481565b34801561067857600080fd5b506103bb6110fb565b34801561068d57600080fd5b5061036661069c3660046131df565b611116565b3480156106ad57600080fd5b506103666106bc366004612f3e565b611159565b3480156106cd57600080fd5b506103666112d1565b3480156106e257600080fd5b506103666106f1366004612f3e565b6112e3565b34801561070257600080fd5b50610388610711366004612f3e565b60136020526000908152604090205481565b34801561072f57600080fd5b5061038861130d565b34801561074457600080fd5b506005546001600160a01b031661046a565b34801561076257600080fd5b506103bb610771366004612f3e565b60106020526000908152604090205460ff1681565b34801561079257600080fd5b506103666107a1366004612f3e565b61137f565b3480156107b257600080fd5b50610420611392565b3480156107c757600080fd5b506103666107d6366004612f3e565b61139f565b3480156107e757600080fd5b5060165461046a906001600160a01b031681565b34801561080757600080fd5b50610388600a5481565b34801561081d57600080fd5b5061036661082c366004613263565b61140a565b34801561083d57600080fd5b50610388601381565b34801561085257600080fd5b50610366610861366004612f25565b61141e565b61036661142b565b34801561087a57600080fd5b50610388610889366004612f25565b60009081526003602052604090205490565b3480156108a757600080fd5b506103666108b6366004612f3e565b611583565b3480156108c757600080fd5b506103666108d6366004612f25565b6115bd565b3480156108e757600080fd5b506103666108f636600461329c565b6115ca565b34801561090757600080fd5b506103666109163660046132b9565b61170b565b34801561092757600080fd5b506103666119d5565b34801561093c57600080fd5b5061038860125481565b34801561095257600080fd5b5060085461046a906001600160a01b031681565b34801561097257600080fd5b506103bb61098136600461332e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156109bb57600080fd5b50610388600e5481565b3480156109d157600080fd5b506103666109e036600461335c565b611a4c565b3480156109f157600080fd5b50610366610a00366004612f3e565b611a73565b348015610a1157600080fd5b50610366610a20366004612d74565b611ae9565b348015610a3157600080fd5b50610388600f5481565b348015610a4757600080fd5b50610366610a563660046133c5565b611c37565b348015610a6757600080fd5b5060115461046a906001600160a01b031681565b610366611c7a565b60006001600160a01b038316610af35760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b1480610b4d57506001600160e01b031982166303a24d0760e21b145b80610b1657506301ffc9a760e01b6001600160e01b0319831614610b16565b610b74611e2f565b610b7d81611e89565b50565b610b88611e2f565b601654604051630951888f60e01b81523060048201526001600160a01b0384811660248301526044820184905290911690630951888f906064016020604051808303816000875af1158015610be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0591906133fa565b505050565b60068054610c1790613413565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4390613413565b8015610c905780601f10610c6557610100808354040283529160200191610c90565b820191906000526020600020905b815481529060010190602001808311610c7357829003601f168201915b505050505081565b606060028054610ca790613413565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd390613413565b8015610d205780601f10610cf557610100808354040283529160200191610d20565b820191906000526020600020905b815481529060010190602001808311610d0357829003601f168201915b50505050509050919050565b610d34611e95565b600e54600c54610d449190613463565b341015610d875760405162461bcd60e51b8152602060048201526011602482015270073656e642061206869676865722074697607c1b6044820152606401610aea565b6005546011546001600160a01b03908116911614610e6d57600e546011546001600160a01b031660009081526013602052604081208054909190610dcc908490613463565b9091555050601154600e546040516000926001600160a01b031691908381818185875af1925050503d8060008114610e20576040519150601f19603f3d011682016040523d82523d6000602084013e610e25565b606091505b5050905080610e6b5760405162461bcd60e51b81526020600482015260126024820152710ccc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610aea565b505b610e7e33610e79611eee565b611f38565b610e886001600455565b565b610e92611e2f565b600c55565b610e9f611e2f565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b846001600160a01b0381163314610edb57610edb33611fe9565b610ee886868686866120a2565b505050505050565b610ef8611e2f565b6005546011546001600160a01b03908116911614610f6f57610f186110fb565b610f6f5760405162461bcd60e51b815260206004820152602260248201527f736f6d656f6e6520697320616c72656164792074656e64696e6720746865206260448201526130b960f11b6064820152608401610aea565b43600b55610f7c43600a55565b601180546001600160a01b0319166001600160a01b0383169081179091556000601281905581815260136020526040808220829055517f4ad6a7e506c46281359526f1cae1cc3ec279c88daf39592fea2089970b0127159190a250565b6060815183511461103e5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610aea565b6000835167ffffffffffffffff81111561105a5761105a612dda565b604051908082528060200260200182016040528015611083578160200160208202803683370190505b50905060005b84518110156110f3576110ce8582815181106110a7576110a7613476565b60200260200101518583815181106110c1576110c1613476565b6020026020010151610a83565b8282815181106110e0576110e0613476565b6020908102919091010152600101611089565b509392505050565b600080600a544361110c919061348c565b6105dc1092915050565b6001600160a01b03831633148061113257506111328333610981565b61114e5760405162461bcd60e51b8152600401610aea9061349f565b610c058383836120e7565b611161611e95565b6011546001600160a01b031633146111d05760405162461bcd60e51b815260206004820152602c60248201527f6f6e6c79207468652062617274656e646572206f72206f776e65722063616e2060448201526b3a32b732103a3432903130b960a11b6064820152608401610aea565b6111d86110fb565b156112255760405162461bcd60e51b815260206004820152601960248201527f7468652067616d652074696d65722069732065787069726564000000000000006044820152606401610aea565b6112316105dc4361348c565b601454106112775760405162461bcd60e51b81526020600482015260136024820152723a37b79039b7b7b716103a393c903630ba32b960691b6044820152606401610aea565b6000611283600f612279565b61128e906001613463565b43601455600d54336000908152601360205260408120805493945091926112b6908490613463565b909155506112c690508282611f38565b50610b7d6001600455565b6112d9611e2f565b610e8860006122f8565b6112eb611e2f565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600080600a544361131e919061348c565b90506113286110fb565b1561136d5760405162461bcd60e51b8152602060048201526015602482015274151a19481d1a5b595c881a185cc8195e1c1a5c9959605a1b6044820152606401610aea565b611379816105dc61348c565b91505090565b611387611e2f565b610b7d816011611f38565b60078054610c1790613413565b6113a7611e2f565b601654604051631d70c8d360e31b81526001600160a01b0383811660048301529091169063eb864698906024015b600060405180830381600087803b1580156113ef57600080fd5b505af1158015611403573d6000803e3d6000fd5b5050505050565b8161141481611fe9565b610c05838361234a565b611426611e2f565b600e55565b6803bd913e6c1df4000034146114765760405162461bcd60e51b815260206004820152601060248201526f0daeae6e840e6cadcc8406c72408aa8960831b6044820152606401610aea565b600954600160a01b900460ff16156114c65760405162461bcd60e51b81526020600482015260136024820152726e6f2052656d61696e696e6720537570706c7960681b6044820152606401610aea565b6000600b54116115185760405162461bcd60e51b815260206004820152601d60248201527f7468652062617220686173206e65766572206265656e206f70656e65640000006044820152606401610aea565b601180546001600160a01b03191633908117909155600f54601290815543600b556009805460ff60a01b1916600160a01b1790556115569190611f38565b60405133907f4ad6a7e506c46281359526f1cae1cc3ec279c88daf39592fea2089970b01271590600090a2565b61158b611e2f565b6017546040516336b91f2b60e01b81526001600160a01b038381166004830152909116906336b91f2b906024016113d5565b6115c5611e2f565b600d55565b6115d2611e2f565b6011546001600160a01b03166000908152601060205260409020805460ff19168215151790556012541580159061162457506012546011546001600160a01b0316600090815260136020526040902054105b156116f1576011546001600160a01b0316600090815260136020526040812054601254611651919061348c565b6011546040519192506000916001600160a01b039091169083908381818185875af1925050503d80600081146116a3576040519150601f19603f3d011682016040523d82523d6000602084013e6116a8565b606091505b50509050806116ee5760405162461bcd60e51b81526020600482015260126024820152710ccc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610aea565b50505b50601180546001600160a01b031916331790556000601255565b611713611e95565b600f81146117635760405162461bcd60e51b815260206004820181905260248201527f57726f6e67206e756d626572206f6620746f6b656e73207375626d69747465646044820152606401610aea565b60408051601380825261028082019092526000916020820161026080368337505060408051600f80825261020082019092529293506000929150602082016101e08036833701905050905060005b600e81116119245760018585838181106117cd576117cd613476565b90506020020135101580156117fb575060128585838181106117f1576117f1613476565b9050602002013511155b61183c5760405162461bcd60e51b8152602060048201526012602482015271546f6b656e206e6f7420656c696769626c6560701b6044820152606401610aea565b8285858381811061184f5761184f613476565b905060200201358151811061186657611866613476565b60200260200101516000146118bd5760405162461bcd60e51b815260206004820152601960248201527f4561636820746f6b656e206d75737420626520756e69717565000000000000006044820152606401610aea565b6001838686848181106118d2576118d2613476565b90506020020135815181106118e9576118e9613476565b602002602001018181525050600182828151811061190957611909613476565b602090810291909101015261191d816134ed565b90506117b1565b50611964338585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508692506120e7915050565b611981336013600160405180602001604052806000815250612355565b6119896110fb565b156119975761199743600a55565b60405160139033907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a350506119d16001600455565b5050565b6119dd611e2f565b600b5415611a2d5760405162461bcd60e51b815260206004820181905260248201527f5468652067616d652063616e6e6f74206265207374617274656420616761696e6044820152606401610aea565b601180546001600160a01b0319163317905543600b5561155643600a55565b846001600160a01b0381163314611a6657611a6633611fe9565b610ee88686868686612478565b611a7b611e2f565b6001600160a01b038116611ae05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aea565b610b7d816122f8565b611af1611e2f565b6012546011546001600160a01b031660009081526013602052604081205490911115611b42576011546001600160a01b0316600090815260136020526040902054601254611b3f919061348c565b90505b611b4c814761348c565b821115611b9b5760405162461bcd60e51b815260206004820152601f60248201527f77697468647261776c20657863656564732063757272656e74206c696d6974006044820152606401610aea565b6000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114611be8576040519150601f19603f3d011682016040523d82523d6000602084013e611bed565b606091505b5050905080611c315760405162461bcd60e51b815260206004820152601060248201526f1dda5d1a191c985ddb0819985a5b195960821b6044820152606401610aea565b50505050565b6001600160a01b038316331480611c535750611c538333610981565b611c6f5760405162461bcd60e51b8152600401610aea9061349f565b610c058383836124bd565b611c82611e95565b6000600b5411611cd45760405162461bcd60e51b815260206004820152601760248201527f67616d65206861736e27742073746172746564207965740000000000000000006044820152606401610aea565b600f543414611d195760405162461bcd60e51b81526020600482015260116024820152701ddc9bdb99c8185b5bdd5b9d081cd95b9d607a1b6044820152606401610aea565b611d216110fb565b611d6d5760405162461bcd60e51b815260206004820152601960248201527f746865206261722069732063757272656e746c79206f70656e000000000000006044820152606401610aea565b3360009081526010602052604090205460ff1615611dc65760405162461bcd60e51b81526020600482015260166024820152751d1a1a5cc81859191c995cdcc81a5cc818985b9b995960521b6044820152606401610aea565b611dcf43600a55565b43600b55601180546001600160a01b03191633908117909155600081815260136020526040808220829055600f54601255517f4ad6a7e506c46281359526f1cae1cc3ec279c88daf39592fea2089970b0127159190a2610e886001600455565b6005546001600160a01b03163314610e885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aea565b60026119d1828261354e565b600260045403611ee75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610aea565b6002600455565b6000806064611efb61130d565b611f059190613624565b611f1090600f61348c565b9050600d543410611f3357611f25600f612279565b611f30906001613463565b90505b919050565b6000600b5411611f8a5760405162461bcd60e51b815260206004820152601860248201527f7468652067616d65206973206e6f74206f70656e2079657400000000000000006044820152606401610aea565b611f9343600a55565b611faf8282600160405180602001604052806000815250612355565b60405181906001600160a01b038416907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a35050565b6daaeb6d7670e522a718067333cd4e3b15610b7d57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207a9190613638565b610b7d57604051633b79c77360e21b81526001600160a01b0382166004820152602401610aea565b6001600160a01b0385163314806120be57506120be8533610981565b6120da5760405162461bcd60e51b8152600401610aea9061349f565b61140385858585856125d5565b6001600160a01b03831661210d5760405162461bcd60e51b8152600401610aea90613655565b805182511461212e5760405162461bcd60e51b8152600401610aea90613698565b600033905061215181856000868660405180602001604052806000815250612770565b60005b835181101561220c57600084828151811061217157612171613476565b60200260200101519050600084838151811061218f5761218f613476565b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156121df5760405162461bcd60e51b8152600401610aea906136e0565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055600101612154565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161225d929190613724565b60405180910390a4604080516020810190915260009052611c31565b6000808242336015546040516020016122b79392919092835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6040516020818303038152906040528051906020012060001c6122da9190613752565b6015805491925060006122ec836134ed565b90915550909392505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6119d133838361277e565b6001600160a01b0384166123b55760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610aea565b3360006123c18561285e565b905060006123ce8561285e565b90506123df83600089858589612770565b6000868152602081815260408083206001600160a01b038b1684529091528120805487929061240f908490613463565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461246f836000898989896128a9565b50505050505050565b6001600160a01b03851633148061249457506124948533610981565b6124b05760405162461bcd60e51b8152600401610aea9061349f565b6114038585858585612a04565b6001600160a01b0383166124e35760405162461bcd60e51b8152600401610aea90613655565b3360006124ef8461285e565b905060006124fc8461285e565b905061251c83876000858560405180602001604052806000815250612770565b6000858152602081815260408083206001600160a01b038a1684529091529020548481101561255d5760405162461bcd60e51b8152600401610aea906136e0565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091526000905261246f565b81518351146125f65760405162461bcd60e51b8152600401610aea90613698565b6001600160a01b03841661261c5760405162461bcd60e51b8152600401610aea90613766565b3361262b818787878787612770565b60005b845181101561270a57600085828151811061264b5761264b613476565b60200260200101519050600085838151811061266957612669613476565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156126b95760405162461bcd60e51b8152600401610aea906137ab565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906126f6908490613463565b90915550506001909301925061262e915050565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161275a929190613724565b60405180910390a4610ee8818787878787612b3c565b610ee8868686868686612bf7565b816001600160a01b0316836001600160a01b0316036127f15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610aea565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061289857612898613476565b602090810291909101015292915050565b6001600160a01b0384163b15610ee85760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906128ed90899089908890889088906004016137f5565b6020604051808303816000875af1925050508015612928575060408051601f3d908101601f191682019092526129259181019061383a565b60015b6129d457612934613857565b806308c379a00361296d5750612948613873565b80612953575061296f565b8060405162461bcd60e51b8152600401610aea9190612f12565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610aea565b6001600160e01b0319811663f23a6e6160e01b1461246f5760405162461bcd60e51b8152600401610aea906138fd565b6001600160a01b038416612a2a5760405162461bcd60e51b8152600401610aea90613766565b336000612a368561285e565b90506000612a438561285e565b9050612a53838989858589612770565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015612a945760405162461bcd60e51b8152600401610aea906137ab565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290612ad1908490613463565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612b31848a8a8a8a8a6128a9565b505050505050505050565b6001600160a01b0384163b15610ee85760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612b809089908990889088908890600401613945565b6020604051808303816000875af1925050508015612bbb575060408051601f3d908101601f19168201909252612bb89181019061383a565b60015b612bc757612934613857565b6001600160e01b0319811663bc197c8160e01b1461246f5760405162461bcd60e51b8152600401610aea906138fd565b6001600160a01b038516612c755760005b8351811015612c7357828181518110612c2357612c23613476565b602002602001015160036000868481518110612c4157612c41613476565b602002602001015181526020019081526020016000206000828254612c669190613463565b9091555050600101612c08565b505b6001600160a01b038416610ee85760005b835181101561246f576000848281518110612ca357612ca3613476565b602002602001015190506000848381518110612cc157612cc1613476565b6020026020010151905060006003600084815260200190815260200160002054905081811015612d445760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610aea565b60009283526003602052604090922091039055600101612c86565b6001600160a01b0381168114610b7d57600080fd5b60008060408385031215612d8757600080fd5b8235612d9281612d5f565b946020939093013593505050565b6001600160e01b031981168114610b7d57600080fd5b600060208284031215612dc857600080fd5b8135612dd381612da0565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715612e1657612e16612dda565b6040525050565b600067ffffffffffffffff831115612e3757612e37612dda565b604051612e4e601f8501601f191660200182612df0565b809150838152848484011115612e6357600080fd5b83836020830137600060208583010152509392505050565b600060208284031215612e8d57600080fd5b813567ffffffffffffffff811115612ea457600080fd5b8201601f81018413612eb557600080fd5b612ec484823560208401612e1d565b949350505050565b6000815180845260005b81811015612ef257602081850181015186830182015201612ed6565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612dd36020830184612ecc565b600060208284031215612f3757600080fd5b5035919050565b600060208284031215612f5057600080fd5b8135612dd381612d5f565b600067ffffffffffffffff821115612f7557612f75612dda565b5060051b60200190565b600082601f830112612f9057600080fd5b81356020612f9d82612f5b565b604051612faa8282612df0565b80915083815260208101915060208460051b870101935086841115612fce57600080fd5b602086015b84811015612fea5780358352918301918301612fd3565b509695505050505050565b600082601f83011261300657600080fd5b612dd383833560208501612e1d565b600080600080600060a0868803121561302d57600080fd5b853561303881612d5f565b9450602086013561304881612d5f565b9350604086013567ffffffffffffffff8082111561306557600080fd5b61307189838a01612f7f565b9450606088013591508082111561308757600080fd5b61309389838a01612f7f565b935060808801359150808211156130a957600080fd5b506130b688828901612ff5565b9150509295509295909350565b600080604083850312156130d657600080fd5b823567ffffffffffffffff808211156130ee57600080fd5b818501915085601f83011261310257600080fd5b8135602061310f82612f5b565b60405161311c8282612df0565b83815260059390931b850182019282810191508984111561313c57600080fd5b948201945b8386101561316357853561315481612d5f565b82529482019490820190613141565b9650508601359250508082111561317957600080fd5b5061318685828601612f7f565b9150509250929050565b60008151808452602080850194506020840160005b838110156131c1578151875295820195908201906001016131a5565b509495945050505050565b602081526000612dd36020830184613190565b6000806000606084860312156131f457600080fd5b83356131ff81612d5f565b9250602084013567ffffffffffffffff8082111561321c57600080fd5b61322887838801612f7f565b9350604086013591508082111561323e57600080fd5b5061324b86828701612f7f565b9150509250925092565b8015158114610b7d57600080fd5b6000806040838503121561327657600080fd5b823561328181612d5f565b9150602083013561329181613255565b809150509250929050565b6000602082840312156132ae57600080fd5b8135612dd381613255565b600080602083850312156132cc57600080fd5b823567ffffffffffffffff808211156132e457600080fd5b818501915085601f8301126132f857600080fd5b81358181111561330757600080fd5b8660208260051b850101111561331c57600080fd5b60209290920196919550909350505050565b6000806040838503121561334157600080fd5b823561334c81612d5f565b9150602083013561329181612d5f565b600080600080600060a0868803121561337457600080fd5b853561337f81612d5f565b9450602086013561338f81612d5f565b93506040860135925060608601359150608086013567ffffffffffffffff8111156133b957600080fd5b6130b688828901612ff5565b6000806000606084860312156133da57600080fd5b83356133e581612d5f565b95602085013595506040909401359392505050565b60006020828403121561340c57600080fd5b5051919050565b600181811c9082168061342757607f821691505b60208210810361344757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b1657610b1661344d565b634e487b7160e01b600052603260045260246000fd5b81810381811115610b1657610b1661344d565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b6000600182016134ff576134ff61344d565b5060010190565b601f821115610c05576000816000526020600020601f850160051c8101602086101561352f5750805b601f850160051c820191505b81811015610ee85782815560010161353b565b815167ffffffffffffffff81111561356857613568612dda565b61357c816135768454613413565b84613506565b602080601f8311600181146135b157600084156135995750858301515b600019600386901b1c1916600185901b178555610ee8565b600085815260208120601f198616915b828110156135e0578886015182559484019460019091019084016135c1565b50858210156135fe5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b6000826136335761363361360e565b500490565b60006020828403121561364a57600080fd5b8151612dd381613255565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6040815260006137376040830185613190565b82810360208401526137498185613190565b95945050505050565b6000826137615761376161360e565b500690565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061382f90830184612ecc565b979650505050505050565b60006020828403121561384c57600080fd5b8151612dd381612da0565b600060033d11156138705760046000803e5060005160e01c5b90565b600060443d10156138815790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156138b157505050505090565b82850191508151818111156138c95750505050505090565b843d87010160208285010111156138e35750505050505090565b6138f260208286010187612df0565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061397190830186613190565b82810360608401526139838186613190565b905082810360808401526139978185612ecc565b9897505050505050505056fea264697066735822122049488afd72ae758fd76733751bd22ee583ef821ed951206a4b1494fbae3e845e64736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004568747470733a2f2f6d657461646174612e6172746c61622e78797a2f30313835326466622d333836372d383331352d396133332d3234656531623461383766382f7b69647d000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _uri (string): https://metadata.artlab.xyz/01852dfb-3867-8315-9a33-24ee1b4a87f8/{id}
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000045
Arg [2] : 68747470733a2f2f6d657461646174612e6172746c61622e78797a2f30313835
Arg [3] : 326466622d333836372d383331352d396133332d323465653162346138376638
Arg [4] : 2f7b69647d000000000000000000000000000000000000000000000000000000
Net Worth in USD
Net Worth in ETH
Token Allocations
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| BLAST | 100.00% | $2,900.52 | 0.0010594 | $3.07 |
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.