Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 50 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Safe Transfer Fr... | 24032790 | 89 days ago | IN | 0 ETH | 0.00001652 | ||||
| Safe Transfer Fr... | 21974389 | 377 days ago | IN | 0 ETH | 0.00063535 | ||||
| Safe Transfer Fr... | 21974358 | 377 days ago | IN | 0 ETH | 0.00047598 | ||||
| Safe Transfer Fr... | 21974337 | 377 days ago | IN | 0 ETH | 0.00056949 | ||||
| Safe Transfer Fr... | 21974263 | 377 days ago | IN | 0 ETH | 0.00056405 | ||||
| Safe Transfer Fr... | 21974202 | 377 days ago | IN | 0 ETH | 0.00063148 | ||||
| Safe Transfer Fr... | 21974191 | 377 days ago | IN | 0 ETH | 0.0006634 | ||||
| Set Approval For... | 21816953 | 399 days ago | IN | 0 ETH | 0.00010094 | ||||
| Withdraw | 20761338 | 546 days ago | IN | 0 ETH | 0.000728 | ||||
| Wrap | 20742721 | 549 days ago | IN | 0 ETH | 0.00234272 | ||||
| Wrap | 20742720 | 549 days ago | IN | 0 ETH | 0.00236417 | ||||
| Wrap | 20742330 | 549 days ago | IN | 0 ETH | 0.0014062 | ||||
| Wrap | 20742327 | 549 days ago | IN | 0 ETH | 0.00156003 | ||||
| Set Approval For... | 20742174 | 549 days ago | IN | 0 ETH | 0.00012299 | ||||
| Wrap | 20742002 | 549 days ago | IN | 0 ETH | 0.00092705 | ||||
| Wrap | 20742002 | 549 days ago | IN | 0 ETH | 0.00094161 | ||||
| Wrap | 20734926 | 550 days ago | IN | 0 ETH | 0.00009448 | ||||
| Wrap | 20734921 | 550 days ago | IN | 0 ETH | 0.00006426 | ||||
| Wrap | 20734901 | 550 days ago | IN | 0 ETH | 0.00008166 | ||||
| Wrap | 20734877 | 550 days ago | IN | 0 ETH | 0.00006458 | ||||
| Wrap | 20734842 | 550 days ago | IN | 0 ETH | 0.00080619 | ||||
| Wrap | 20734840 | 550 days ago | IN | 0 ETH | 0.00081593 | ||||
| Wrap | 20734838 | 550 days ago | IN | 0 ETH | 0.0009161 | ||||
| Wrap | 20734838 | 550 days ago | IN | 0 ETH | 0.00096971 | ||||
| Wrap | 20727849 | 551 days ago | IN | 0 ETH | 0.00183053 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 20761338 | 546 days ago | 0.48 ETH | ||||
| Transfer | 20742721 | 549 days ago | 0.015 ETH | ||||
| Transfer | 20742720 | 549 days ago | 0.015 ETH | ||||
| Transfer | 20742330 | 549 days ago | 0.015 ETH | ||||
| Transfer | 20742327 | 549 days ago | 0.015 ETH | ||||
| Transfer | 20742002 | 549 days ago | 0.05 ETH | ||||
| Transfer | 20742002 | 549 days ago | 0.1 ETH | ||||
| Transfer | 20734842 | 550 days ago | 0.015 ETH | ||||
| Transfer | 20734840 | 550 days ago | 0.015 ETH | ||||
| Transfer | 20734838 | 550 days ago | 0.05 ETH | ||||
| Transfer | 20734838 | 550 days ago | 0.1 ETH | ||||
| Transfer | 20727849 | 551 days ago | 0.015 ETH | ||||
| Transfer | 20727813 | 551 days ago | 0.015 ETH | ||||
| Transfer | 20727764 | 551 days ago | 0.015 ETH | ||||
| Transfer | 20727761 | 551 days ago | 0.015 ETH | ||||
| Transfer | 20727759 | 551 days ago | 0.015 ETH | ||||
| Transfer | 20727757 | 551 days ago | 0.015 ETH | ||||
| Transfer | 20727682 | 551 days ago | 0.015 ETH | ||||
| Transfer | 20727679 | 551 days ago | 0.015 ETH | ||||
| Transfer | 20727676 | 551 days ago | 0.05 ETH | ||||
| Transfer | 20727676 | 551 days ago | 0.1 ETH | ||||
| Transfer | 20720522 | 552 days ago | 0.015 ETH | ||||
| Transfer | 20720519 | 552 days ago | 0.05 ETH | ||||
| Transfer | 20720519 | 552 days ago | 0.1 ETH | ||||
| Transfer | 20713372 | 553 days ago | 0.015 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TradFiLinesAnimation
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import {ERC721} from "solady/src/tokens/ERC721.sol";
import {Ownable} from "solady/src/auth/Ownable.sol";
import "./Strings.sol";
interface TradFiRendererAnimation {
function renderFromSeed(uint256[] memory seedsAndInfo) external view returns(string memory svg);
}
interface TradFiLines {
function ownerOf(uint256 tokenId) external view returns(address);
function isApprovedForAll(address owner, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function tokenIdToSeed(uint256 seed) external view returns(uint256);
function tokenIdToCount(uint256 seed) external view returns(uint256);
}
interface TradFiLinesColor {
function ownerOf(uint256 tokenId) external view returns(address);
function isApprovedForAll(address owner, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function tokenIdToSeed(uint256 tokenId) external view returns(uint256);
function tokenIdToCount(uint256 tokenId) external view returns(uint256);
function tokenIdToPlacement(uint256 tokenId) external view returns(uint256);
function colorTokenIdToSeed(uint256 tokenId) external view returns(uint256);
}
interface CircuitBreaker {
function isHalted() external view returns(bool halted);
function revertOnHalted() external view;
}
interface BokkyPooBahsDateTimeContract {
function timestampToDateTime(uint timestamp) external returns (uint year, uint month, uint day, uint hour, uint minute, uint second);
function timestampFromDateTime(uint year, uint month, uint day, uint hour, uint minute, uint second) external returns (uint timestamp);
function isWeekEnd(uint timestamp) external returns (bool weekEnd);
function getMonth(uint timestamp) external returns (uint month);
function getDay(uint timestamp) external returns (uint day);
function subHours(uint timestamp, uint _hours) external returns (uint newTimestamp);
function getDayOfWeek(uint timestamp) external returns (uint dayOfWeek);
}
contract TradFiLinesAnimation is ERC721, Ownable {
mapping (uint => uint) public tokenIdToCount;
mapping (uint => uint) public tokenIdToSeed;
mapping (uint => uint) public tokenIdToSeedAnimation;
mapping (uint => uint) public tokenIdToPlacement;
mapping (uint => uint) public dayToPlace;
bool public prizesActive = true;
bool public renderersLocked;
TradFiRendererAnimation public tfrm;
TradFiLinesColor public tflColor;
TradFiLines public tfl;
BokkyPooBahsDateTimeContract public bpbdtc;
CircuitBreaker public cb;
bool public circuitBreakerActive = true;
string public _name = "TradFiLines-A";
string public _symbol = "TFL-A";
constructor(address tradFiRenderer, address tradFiLines, address tradFiLinesColor, address circuitBreakerAddress, address bokkyPooBahsDateTimeContractAddress) {
_initializeOwner(msg.sender);
tfrm = TradFiRendererAnimation(tradFiRenderer);
tflColor = TradFiLinesColor(tradFiLinesColor);
tfl = TradFiLines(tradFiLines);
cb = CircuitBreaker(circuitBreakerAddress);
bpbdtc = BokkyPooBahsDateTimeContract(bokkyPooBahsDateTimeContractAddress);
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function onERC721Received(
address,
address,
uint256,
bytes memory
) public virtual returns (bytes4) {
return this.onERC721Received.selector;
}
function setPrizes(bool prizesBool) external onlyOwner {
prizesActive = prizesBool;
}
function setCircuitBreaker(bool cbBool) external onlyOwner {
circuitBreakerActive = cbBool;
}
bool public isDST = true;
uint public hoursToSub = 4;
function adjustDST() external {
uint timestamp = bpbdtc.subHours(block.timestamp, hoursToSub);
uint month = bpbdtc.getMonth(timestamp);
if(month > 3 && month < 11) {
isDST = true;
} else {
uint day = bpbdtc.getDayOfWeek(timestamp);
uint dayOfMonth = bpbdtc.getDay(timestamp);
if(month == 3) {
if(dayOfMonth > 14) {
isDST = true;
} else if(dayOfMonth < 8) {
isDST = false;
} else {
if((dayOfMonth - day - 7) < 1) {
isDST = false;
} else {
isDST = true;
}
}
}
if(month == 11) {
if(dayOfMonth > 7) {
isDST = false;
} else {
if((dayOfMonth - day) < 1) {
isDST = true;
} else {
isDST = false;
}
}
}
}
if(isDST) {
hoursToSub = 4;
} else {
hoursToSub = 5;
}
}
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721) {
require(isWithinOpeningHours(), "Outside regular trading hours");
if(circuitBreakerActive) {
require(!cb.isHalted(), "Circuit breaker triggered: Transfer functionality has been halted.");
}
tokenIdToCount[tokenId] += 1;
super._beforeTokenTransfer(from, to, tokenId);
}
function swapTFR(address tradFiRenderer) public onlyOwner {
require(!renderersLocked, "Can't swap renderers anymore");
tfrm = TradFiRendererAnimation(tradFiRenderer);
}
function lockRenderers() public onlyOwner {
renderersLocked = true;
}
function getAdjustedTimestamp() public returns(uint timestamp) {
return bpbdtc.subHours(block.timestamp, hoursToSub);
}
function isTradingOpen() public returns(bool){
return isWithinOpeningHours() && !cb.isHalted();
}
function isWithinOpeningHours() public returns(bool){
uint timestamp = getAdjustedTimestamp();
bool weekend = bpbdtc.isWeekEnd(timestamp);
uint hour;
uint year;
uint month;
uint day;
uint minute;
(year, month, day, hour, minute, ) = bpbdtc.timestampToDateTime(timestamp);
if(weekend) {
return false;
}
if(hour < 9 || hour > 15) {
return false;
}
if(hour == 9 && minute < 30) {
return false;
}
return true;
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) {
return super.supportsInterface(interfaceId);
}
receive() external payable {}
function wrap(uint tokenToWrap) external {
uint timestamp = getAdjustedTimestamp();
uint year;
uint month;
uint day;
(year, month, day, , , ) = bpbdtc.timestampToDateTime(timestamp);
tokenIdToCount[tokenToWrap] = tflColor.tokenIdToCount(tokenToWrap);
tflColor.safeTransferFrom(msg.sender, address(this), tokenToWrap);
if(tokenIdToSeedAnimation[tokenToWrap] == 0 ) {
tokenIdToSeedAnimation[tokenToWrap] = uint(keccak256(abi.encodePacked(blockhash(block.number-1),tokenToWrap)));
}
if(tokenIdToPlacement[tokenToWrap] == 0) {
uint place = dayToPlace[day + month * 100 + year * 10000] += 1;
tokenIdToPlacement[tokenToWrap] = place;
if(prizesActive) {
uint prize = 0;
if(place == 1) {
prize = 0.10 ether;
} else if(place == 2) {
prize = 0.05 ether;
} else {
prize = 0.015 ether;
}
if(prize > 0 && address(this).balance >= prize) {
(bool sent, bytes memory data) = payable(msg.sender).call{value: prize}("");
require(sent, "Failed to send Ether");
}
}
}
_mint(msg.sender, tokenToWrap);
}
function tokenURI(uint256 _tokenId)
public
view
override
returns (string memory)
{
require(
_exists(_tokenId),
"ERC721Metadata: URI query for nonexistent token"
);
uint256 seed = tfl.tokenIdToSeed(_tokenId);
uint256 colorSeed = tflColor.colorTokenIdToSeed(_tokenId);
uint256[] memory seedsAndInfo = new uint[](7);
seedsAndInfo[0] = seed;
seedsAndInfo[1] = colorSeed;
seedsAndInfo[2] = tokenIdToSeedAnimation[_tokenId];
seedsAndInfo[3] = tokenIdToCount[_tokenId];
seedsAndInfo[4] = _tokenId;
seedsAndInfo[5] = tflColor.tokenIdToPlacement(_tokenId);
seedsAndInfo[6] = tokenIdToPlacement[_tokenId];
return
string(
abi.encodePacked(
tfrm.renderFromSeed(seedsAndInfo)
)
);
}
function withdraw() public onlyOwner {
uint balance = address(this).balance;
payable(msg.sender).call{value: balance}("");
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/// @notice Simple single owner authorization mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)
///
/// @dev Note:
/// This implementation does NOT auto-initialize the owner to `msg.sender`.
/// You MUST call the `_initializeOwner` in the constructor / initializer.
///
/// While the ownable portion follows
/// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,
/// the nomenclature for the 2-step ownership handover may be unique to this codebase.
abstract contract Ownable {
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CUSTOM ERRORS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The caller is not authorized to call the function.
error Unauthorized();
/// @dev The `newOwner` cannot be the zero address.
error NewOwnerIsZeroAddress();
/// @dev The `pendingOwner` does not have a valid handover request.
error NoHandoverRequest();
/// @dev Cannot double-initialize.
error AlreadyInitialized();
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* EVENTS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The ownership is transferred from `oldOwner` to `newOwner`.
/// This event is intentionally kept the same as OpenZeppelin's Ownable to be
/// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173),
/// despite it not being as lightweight as a single argument event.
event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);
/// @dev An ownership handover to `pendingOwner` has been requested.
event OwnershipHandoverRequested(address indexed pendingOwner);
/// @dev The ownership handover to `pendingOwner` has been canceled.
event OwnershipHandoverCanceled(address indexed pendingOwner);
/// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`.
uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;
/// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`.
uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;
/// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`.
uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* STORAGE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The owner slot is given by:
/// `bytes32(~uint256(uint32(bytes4(keccak256("_OWNER_SLOT_NOT")))))`.
/// It is intentionally chosen to be a high value
/// to avoid collision with lower slots.
/// The choice of manual storage layout is to enable compatibility
/// with both regular and upgradeable contracts.
bytes32 internal constant _OWNER_SLOT =
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927;
/// The ownership handover slot of `newOwner` is given by:
/// ```
/// mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED))
/// let handoverSlot := keccak256(0x00, 0x20)
/// ```
/// It stores the expiry timestamp of the two-step ownership handover.
uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Override to return true to make `_initializeOwner` prevent double-initialization.
function _guardInitializeOwner() internal pure virtual returns (bool guard) {}
/// @dev Initializes the owner directly without authorization guard.
/// This function must be called upon initialization,
/// regardless of whether the contract is upgradeable or not.
/// This is to enable generalization to both regular and upgradeable contracts,
/// and to save gas in case the initial owner is not the caller.
/// For performance reasons, this function will not check if there
/// is an existing owner.
function _initializeOwner(address newOwner) internal virtual {
if (_guardInitializeOwner()) {
/// @solidity memory-safe-assembly
assembly {
let ownerSlot := _OWNER_SLOT
if sload(ownerSlot) {
mstore(0x00, 0x0dc149f0) // `AlreadyInitialized()`.
revert(0x1c, 0x04)
}
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Store the new value.
sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
}
} else {
/// @solidity memory-safe-assembly
assembly {
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Store the new value.
sstore(_OWNER_SLOT, newOwner)
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
}
}
}
/// @dev Sets the owner directly without authorization guard.
function _setOwner(address newOwner) internal virtual {
if (_guardInitializeOwner()) {
/// @solidity memory-safe-assembly
assembly {
let ownerSlot := _OWNER_SLOT
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
// Store the new value.
sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
}
} else {
/// @solidity memory-safe-assembly
assembly {
let ownerSlot := _OWNER_SLOT
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
// Store the new value.
sstore(ownerSlot, newOwner)
}
}
}
/// @dev Throws if the sender is not the owner.
function _checkOwner() internal view virtual {
/// @solidity memory-safe-assembly
assembly {
// If the caller is not the stored owner, revert.
if iszero(eq(caller(), sload(_OWNER_SLOT))) {
mstore(0x00, 0x82b42900) // `Unauthorized()`.
revert(0x1c, 0x04)
}
}
}
/// @dev Returns how long a two-step ownership handover is valid for in seconds.
/// Override to return a different value if needed.
/// Made internal to conserve bytecode. Wrap it in a public function if needed.
function _ownershipHandoverValidFor() internal view virtual returns (uint64) {
return 48 * 3600;
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* PUBLIC UPDATE FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Allows the owner to transfer the ownership to `newOwner`.
function transferOwnership(address newOwner) public payable virtual onlyOwner {
/// @solidity memory-safe-assembly
assembly {
if iszero(shl(96, newOwner)) {
mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`.
revert(0x1c, 0x04)
}
}
_setOwner(newOwner);
}
/// @dev Allows the owner to renounce their ownership.
function renounceOwnership() public payable virtual onlyOwner {
_setOwner(address(0));
}
/// @dev Request a two-step ownership handover to the caller.
/// The request will automatically expire in 48 hours (172800 seconds) by default.
function requestOwnershipHandover() public payable virtual {
unchecked {
uint256 expires = block.timestamp + _ownershipHandoverValidFor();
/// @solidity memory-safe-assembly
assembly {
// Compute and set the handover slot to `expires`.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), expires)
// Emit the {OwnershipHandoverRequested} event.
log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
}
}
}
/// @dev Cancels the two-step ownership handover to the caller, if any.
function cancelOwnershipHandover() public payable virtual {
/// @solidity memory-safe-assembly
assembly {
// Compute and set the handover slot to 0.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), 0)
// Emit the {OwnershipHandoverCanceled} event.
log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
}
}
/// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`.
/// Reverts if there is no existing ownership handover requested by `pendingOwner`.
function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner {
/// @solidity memory-safe-assembly
assembly {
// Compute and set the handover slot to 0.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
let handoverSlot := keccak256(0x0c, 0x20)
// If the handover does not exist, or has expired.
if gt(timestamp(), sload(handoverSlot)) {
mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`.
revert(0x1c, 0x04)
}
// Set the handover slot to 0.
sstore(handoverSlot, 0)
}
_setOwner(pendingOwner);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* PUBLIC READ FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns the owner of the contract.
function owner() public view virtual returns (address result) {
/// @solidity memory-safe-assembly
assembly {
result := sload(_OWNER_SLOT)
}
}
/// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.
function ownershipHandoverExpiresAt(address pendingOwner)
public
view
virtual
returns (uint256 result)
{
/// @solidity memory-safe-assembly
assembly {
// Compute the handover slot.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
// Load the handover slot.
result := sload(keccak256(0x0c, 0x20))
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* MODIFIERS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Marks a function as only callable by the owner.
modifier onlyOwner() virtual {
_checkOwner();
_;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/// @notice Simple ERC721 implementation with storage hitchhiking.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC721.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721/ERC721.sol)
///
/// @dev Note:
/// - The ERC721 standard allows for self-approvals.
/// For performance, this implementation WILL NOT revert for such actions.
/// Please add any checks with overrides if desired.
/// - For performance, methods are made payable where permitted by the ERC721 standard.
/// - The `safeTransfer` functions use the identity precompile (0x4)
/// to copy memory internally.
///
/// If you are overriding:
/// - NEVER violate the ERC721 invariant:
/// the balance of an owner MUST always be equal to their number of ownership slots.
/// The transfer functions do not have an underflow guard for user token balances.
/// - Make sure all variables written to storage are properly cleaned
// (e.g. the bool value for `isApprovedForAll` MUST be either 1 or 0 under the hood).
/// - Check that the overridden function is actually used in the function you want to
/// change the behavior of. Much of the code has been manually inlined for performance.
abstract contract ERC721 {
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CONSTANTS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev An account can hold up to 4294967295 tokens.
uint256 internal constant _MAX_ACCOUNT_BALANCE = 0xffffffff;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CUSTOM ERRORS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Only the token owner or an approved account can manage the token.
error NotOwnerNorApproved();
/// @dev The token does not exist.
error TokenDoesNotExist();
/// @dev The token already exists.
error TokenAlreadyExists();
/// @dev Cannot query the balance for the zero address.
error BalanceQueryForZeroAddress();
/// @dev Cannot mint or transfer to the zero address.
error TransferToZeroAddress();
/// @dev The token must be owned by `from`.
error TransferFromIncorrectOwner();
/// @dev The recipient's balance has overflowed.
error AccountBalanceOverflow();
/// @dev Cannot safely transfer to a contract that does not implement
/// the ERC721Receiver interface.
error TransferToNonERC721ReceiverImplementer();
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* EVENTS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Emitted when token `id` is transferred from `from` to `to`.
event Transfer(address indexed from, address indexed to, uint256 indexed id);
/// @dev Emitted when `owner` enables `account` to manage the `id` token.
event Approval(address indexed owner, address indexed account, uint256 indexed id);
/// @dev Emitted when `owner` enables or disables `operator` to manage all of their tokens.
event ApprovalForAll(address indexed owner, address indexed operator, bool isApproved);
/// @dev `keccak256(bytes("Transfer(address,address,uint256)"))`.
uint256 private constant _TRANSFER_EVENT_SIGNATURE =
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
/// @dev `keccak256(bytes("Approval(address,address,uint256)"))`.
uint256 private constant _APPROVAL_EVENT_SIGNATURE =
0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925;
/// @dev `keccak256(bytes("ApprovalForAll(address,address,bool)"))`.
uint256 private constant _APPROVAL_FOR_ALL_EVENT_SIGNATURE =
0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* STORAGE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The ownership data slot of `id` is given by:
/// ```
/// mstore(0x00, id)
/// mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
/// let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
/// ```
/// Bits Layout:
/// - [0..159] `addr`
/// - [160..255] `extraData`
///
/// The approved address slot is given by: `add(1, ownershipSlot)`.
///
/// See: https://notes.ethereum.org/%40vbuterin/verkle_tree_eip
///
/// The balance slot of `owner` is given by:
/// ```
/// mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
/// mstore(0x00, owner)
/// let balanceSlot := keccak256(0x0c, 0x1c)
/// ```
/// Bits Layout:
/// - [0..31] `balance`
/// - [32..255] `aux`
///
/// The `operator` approval slot of `owner` is given by:
/// ```
/// mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, operator))
/// mstore(0x00, owner)
/// let operatorApprovalSlot := keccak256(0x0c, 0x30)
/// ```
uint256 private constant _ERC721_MASTER_SLOT_SEED = 0x7d8825530a5a2e7a << 192;
/// @dev Pre-shifted and pre-masked constant.
uint256 private constant _ERC721_MASTER_SLOT_SEED_MASKED = 0x0a5a2e7a00000000;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* ERC721 METADATA */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns the token collection name.
function name() public view virtual returns (string memory);
/// @dev Returns the token collection symbol.
function symbol() public view virtual returns (string memory);
/// @dev Returns the Uniform Resource Identifier (URI) for token `id`.
function tokenURI(uint256 id) public view virtual returns (string memory);
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* ERC721 */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns the owner of token `id`.
///
/// Requirements:
/// - Token `id` must exist.
function ownerOf(uint256 id) public view virtual returns (address result) {
result = _ownerOf(id);
/// @solidity memory-safe-assembly
assembly {
if iszero(result) {
mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
revert(0x1c, 0x04)
}
}
}
/// @dev Returns the number of tokens owned by `owner`.
///
/// Requirements:
/// - `owner` must not be the zero address.
function balanceOf(address owner) public view virtual returns (uint256 result) {
/// @solidity memory-safe-assembly
assembly {
// Revert if the `owner` is the zero address.
if iszero(owner) {
mstore(0x00, 0x8f4eb604) // `BalanceQueryForZeroAddress()`.
revert(0x1c, 0x04)
}
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
mstore(0x00, owner)
result := and(sload(keccak256(0x0c, 0x1c)), _MAX_ACCOUNT_BALANCE)
}
}
/// @dev Returns the account approved to manage token `id`.
///
/// Requirements:
/// - Token `id` must exist.
function getApproved(uint256 id) public view virtual returns (address result) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
if iszero(shl(96, sload(ownershipSlot))) {
mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
revert(0x1c, 0x04)
}
result := sload(add(1, ownershipSlot))
}
}
/// @dev Sets `account` as the approved account to manage token `id`.
///
/// Requirements:
/// - Token `id` must exist.
/// - The caller must be the owner of the token,
/// or an approved operator for the token owner.
///
/// Emits an {Approval} event.
function approve(address account, uint256 id) public payable virtual {
_approve(msg.sender, account, id);
}
/// @dev Returns whether `operator` is approved to manage the tokens of `owner`.
function isApprovedForAll(address owner, address operator)
public
view
virtual
returns (bool result)
{
/// @solidity memory-safe-assembly
assembly {
mstore(0x1c, operator)
mstore(0x08, _ERC721_MASTER_SLOT_SEED_MASKED)
mstore(0x00, owner)
result := sload(keccak256(0x0c, 0x30))
}
}
/// @dev Sets whether `operator` is approved to manage the tokens of the caller.
///
/// Emits an {ApprovalForAll} event.
function setApprovalForAll(address operator, bool isApproved) public virtual {
/// @solidity memory-safe-assembly
assembly {
// Convert to 0 or 1.
isApproved := iszero(iszero(isApproved))
// Update the `isApproved` for (`msg.sender`, `operator`).
mstore(0x1c, operator)
mstore(0x08, _ERC721_MASTER_SLOT_SEED_MASKED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x30), isApproved)
// Emit the {ApprovalForAll} event.
mstore(0x00, isApproved)
// forgefmt: disable-next-item
log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, caller(), shr(96, shl(96, operator)))
}
}
/// @dev Transfers token `id` from `from` to `to`.
///
/// Requirements:
///
/// - Token `id` must exist.
/// - `from` must be the owner of the token.
/// - `to` cannot be the zero address.
/// - The caller must be the owner of the token, or be approved to manage the token.
///
/// Emits a {Transfer} event.
function transferFrom(address from, address to, uint256 id) public payable virtual {
_beforeTokenTransfer(from, to, id);
/// @solidity memory-safe-assembly
assembly {
// Clear the upper 96 bits.
let bitmaskAddress := shr(96, not(0))
from := and(bitmaskAddress, from)
to := and(bitmaskAddress, to)
// Load the ownership data.
mstore(0x00, id)
mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, caller()))
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
let ownershipPacked := sload(ownershipSlot)
let owner := and(bitmaskAddress, ownershipPacked)
// Revert if the token does not exist, or if `from` is not the owner.
if iszero(mul(owner, eq(owner, from))) {
// `TokenDoesNotExist()`, `TransferFromIncorrectOwner()`.
mstore(shl(2, iszero(owner)), 0xceea21b6a1148100)
revert(0x1c, 0x04)
}
// Load, check, and update the token approval.
{
mstore(0x00, from)
let approvedAddress := sload(add(1, ownershipSlot))
// Revert if the caller is not the owner, nor approved.
if iszero(or(eq(caller(), from), eq(caller(), approvedAddress))) {
if iszero(sload(keccak256(0x0c, 0x30))) {
mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
revert(0x1c, 0x04)
}
}
// Delete the approved address if any.
if approvedAddress { sstore(add(1, ownershipSlot), 0) }
}
// Update with the new owner.
sstore(ownershipSlot, xor(ownershipPacked, xor(from, to)))
// Decrement the balance of `from`.
{
let fromBalanceSlot := keccak256(0x0c, 0x1c)
sstore(fromBalanceSlot, sub(sload(fromBalanceSlot), 1))
}
// Increment the balance of `to`.
{
mstore(0x00, to)
let toBalanceSlot := keccak256(0x0c, 0x1c)
let toBalanceSlotPacked := add(sload(toBalanceSlot), 1)
// Revert if `to` is the zero address, or if the account balance overflows.
if iszero(mul(to, and(toBalanceSlotPacked, _MAX_ACCOUNT_BALANCE))) {
// `TransferToZeroAddress()`, `AccountBalanceOverflow()`.
mstore(shl(2, iszero(to)), 0xea553b3401336cea)
revert(0x1c, 0x04)
}
sstore(toBalanceSlot, toBalanceSlotPacked)
}
// Emit the {Transfer} event.
log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, from, to, id)
}
_afterTokenTransfer(from, to, id);
}
/// @dev Equivalent to `safeTransferFrom(from, to, id, "")`.
function safeTransferFrom(address from, address to, uint256 id) public payable virtual {
transferFrom(from, to, id);
if (_hasCode(to)) _checkOnERC721Received(from, to, id, "");
}
/// @dev Transfers token `id` from `from` to `to`.
///
/// Requirements:
///
/// - Token `id` must exist.
/// - `from` must be the owner of the token.
/// - `to` cannot be the zero address.
/// - The caller must be the owner of the token, or be approved to manage the token.
/// - If `to` refers to a smart contract, it must implement
/// {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
///
/// Emits a {Transfer} event.
function safeTransferFrom(address from, address to, uint256 id, bytes calldata data)
public
payable
virtual
{
transferFrom(from, to, id);
if (_hasCode(to)) _checkOnERC721Received(from, to, id, data);
}
/// @dev Returns true if this contract implements the interface defined by `interfaceId`.
/// See: https://eips.ethereum.org/EIPS/eip-165
/// This function call must use less than 30000 gas.
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool result) {
/// @solidity memory-safe-assembly
assembly {
let s := shr(224, interfaceId)
// ERC165: 0x01ffc9a7, ERC721: 0x80ac58cd, ERC721Metadata: 0x5b5e139f.
result := or(or(eq(s, 0x01ffc9a7), eq(s, 0x80ac58cd)), eq(s, 0x5b5e139f))
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL QUERY FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns if token `id` exists.
function _exists(uint256 id) internal view virtual returns (bool result) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
result := iszero(iszero(shl(96, sload(add(id, add(id, keccak256(0x00, 0x20)))))))
}
}
/// @dev Returns the owner of token `id`.
/// Returns the zero address instead of reverting if the token does not exist.
function _ownerOf(uint256 id) internal view virtual returns (address result) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
result := shr(96, shl(96, sload(add(id, add(id, keccak256(0x00, 0x20))))))
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL DATA HITCHHIKING FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
// For performance, no events are emitted for the hitchhiking setters.
// Please emit your own events if required.
/// @dev Returns the auxiliary data for `owner`.
/// Minting, transferring, burning the tokens of `owner` will not change the auxiliary data.
/// Auxiliary data can be set for any address, even if it does not have any tokens.
function _getAux(address owner) internal view virtual returns (uint224 result) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
mstore(0x00, owner)
result := shr(32, sload(keccak256(0x0c, 0x1c)))
}
}
/// @dev Set the auxiliary data for `owner` to `value`.
/// Minting, transferring, burning the tokens of `owner` will not change the auxiliary data.
/// Auxiliary data can be set for any address, even if it does not have any tokens.
function _setAux(address owner, uint224 value) internal virtual {
/// @solidity memory-safe-assembly
assembly {
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
mstore(0x00, owner)
let balanceSlot := keccak256(0x0c, 0x1c)
let packed := sload(balanceSlot)
sstore(balanceSlot, xor(packed, shl(32, xor(value, shr(32, packed)))))
}
}
/// @dev Returns the extra data for token `id`.
/// Minting, transferring, burning a token will not change the extra data.
/// The extra data can be set on a non-existent token.
function _getExtraData(uint256 id) internal view virtual returns (uint96 result) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
result := shr(160, sload(add(id, add(id, keccak256(0x00, 0x20)))))
}
}
/// @dev Sets the extra data for token `id` to `value`.
/// Minting, transferring, burning a token will not change the extra data.
/// The extra data can be set on a non-existent token.
function _setExtraData(uint256 id, uint96 value) internal virtual {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
let packed := sload(ownershipSlot)
sstore(ownershipSlot, xor(packed, shl(160, xor(value, shr(160, packed)))))
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL MINT FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Mints token `id` to `to`.
///
/// Requirements:
///
/// - Token `id` must not exist.
/// - `to` cannot be the zero address.
///
/// Emits a {Transfer} event.
function _mint(address to, uint256 id) internal virtual {
_beforeTokenTransfer(address(0), to, id);
/// @solidity memory-safe-assembly
assembly {
// Clear the upper 96 bits.
to := shr(96, shl(96, to))
// Load the ownership data.
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
let ownershipPacked := sload(ownershipSlot)
// Revert if the token already exists.
if shl(96, ownershipPacked) {
mstore(0x00, 0xc991cbb1) // `TokenAlreadyExists()`.
revert(0x1c, 0x04)
}
// Update with the owner.
sstore(ownershipSlot, or(ownershipPacked, to))
// Increment the balance of the owner.
{
mstore(0x00, to)
let balanceSlot := keccak256(0x0c, 0x1c)
let balanceSlotPacked := add(sload(balanceSlot), 1)
// Revert if `to` is the zero address, or if the account balance overflows.
if iszero(mul(to, and(balanceSlotPacked, _MAX_ACCOUNT_BALANCE))) {
// `TransferToZeroAddress()`, `AccountBalanceOverflow()`.
mstore(shl(2, iszero(to)), 0xea553b3401336cea)
revert(0x1c, 0x04)
}
sstore(balanceSlot, balanceSlotPacked)
}
// Emit the {Transfer} event.
log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, 0, to, id)
}
_afterTokenTransfer(address(0), to, id);
}
/// @dev Mints token `id` to `to`, and updates the extra data for token `id` to `value`.
/// Does NOT check if token `id` already exists (assumes `id` is auto-incrementing).
///
/// Requirements:
///
/// - `to` cannot be the zero address.
///
/// Emits a {Transfer} event.
function _mintAndSetExtraDataUnchecked(address to, uint256 id, uint96 value) internal virtual {
_beforeTokenTransfer(address(0), to, id);
/// @solidity memory-safe-assembly
assembly {
// Clear the upper 96 bits.
to := shr(96, shl(96, to))
// Update with the owner and extra data.
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
sstore(add(id, add(id, keccak256(0x00, 0x20))), or(shl(160, value), to))
// Increment the balance of the owner.
{
mstore(0x00, to)
let balanceSlot := keccak256(0x0c, 0x1c)
let balanceSlotPacked := add(sload(balanceSlot), 1)
// Revert if `to` is the zero address, or if the account balance overflows.
if iszero(mul(to, and(balanceSlotPacked, _MAX_ACCOUNT_BALANCE))) {
// `TransferToZeroAddress()`, `AccountBalanceOverflow()`.
mstore(shl(2, iszero(to)), 0xea553b3401336cea)
revert(0x1c, 0x04)
}
sstore(balanceSlot, balanceSlotPacked)
}
// Emit the {Transfer} event.
log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, 0, to, id)
}
_afterTokenTransfer(address(0), to, id);
}
/// @dev Equivalent to `_safeMint(to, id, "")`.
function _safeMint(address to, uint256 id) internal virtual {
_safeMint(to, id, "");
}
/// @dev Mints token `id` to `to`.
///
/// Requirements:
///
/// - Token `id` must not exist.
/// - `to` cannot be the zero address.
/// - If `to` refers to a smart contract, it must implement
/// {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
///
/// Emits a {Transfer} event.
function _safeMint(address to, uint256 id, bytes memory data) internal virtual {
_mint(to, id);
if (_hasCode(to)) _checkOnERC721Received(address(0), to, id, data);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL BURN FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Equivalent to `_burn(address(0), id)`.
function _burn(uint256 id) internal virtual {
_burn(address(0), id);
}
/// @dev Destroys token `id`, using `by`.
///
/// Requirements:
///
/// - Token `id` must exist.
/// - If `by` is not the zero address,
/// it must be the owner of the token, or be approved to manage the token.
///
/// Emits a {Transfer} event.
function _burn(address by, uint256 id) internal virtual {
address owner = ownerOf(id);
_beforeTokenTransfer(owner, address(0), id);
/// @solidity memory-safe-assembly
assembly {
// Clear the upper 96 bits.
by := shr(96, shl(96, by))
// Load the ownership data.
mstore(0x00, id)
mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, by))
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
let ownershipPacked := sload(ownershipSlot)
// Reload the owner in case it is changed in `_beforeTokenTransfer`.
owner := shr(96, shl(96, ownershipPacked))
// Revert if the token does not exist.
if iszero(owner) {
mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
revert(0x1c, 0x04)
}
// Load and check the token approval.
{
mstore(0x00, owner)
let approvedAddress := sload(add(1, ownershipSlot))
// If `by` is not the zero address, do the authorization check.
// Revert if the `by` is not the owner, nor approved.
if iszero(or(iszero(by), or(eq(by, owner), eq(by, approvedAddress)))) {
if iszero(sload(keccak256(0x0c, 0x30))) {
mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
revert(0x1c, 0x04)
}
}
// Delete the approved address if any.
if approvedAddress { sstore(add(1, ownershipSlot), 0) }
}
// Clear the owner.
sstore(ownershipSlot, xor(ownershipPacked, owner))
// Decrement the balance of `owner`.
{
let balanceSlot := keccak256(0x0c, 0x1c)
sstore(balanceSlot, sub(sload(balanceSlot), 1))
}
// Emit the {Transfer} event.
log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, owner, 0, id)
}
_afterTokenTransfer(owner, address(0), id);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL APPROVAL FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns whether `account` is the owner of token `id`, or is approved to manage it.
///
/// Requirements:
/// - Token `id` must exist.
function _isApprovedOrOwner(address account, uint256 id)
internal
view
virtual
returns (bool result)
{
/// @solidity memory-safe-assembly
assembly {
result := 1
// Clear the upper 96 bits.
account := shr(96, shl(96, account))
// Load the ownership data.
mstore(0x00, id)
mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, account))
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
let owner := shr(96, shl(96, sload(ownershipSlot)))
// Revert if the token does not exist.
if iszero(owner) {
mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
revert(0x1c, 0x04)
}
// Check if `account` is the `owner`.
if iszero(eq(account, owner)) {
mstore(0x00, owner)
// Check if `account` is approved to manage the token.
if iszero(sload(keccak256(0x0c, 0x30))) {
result := eq(account, sload(add(1, ownershipSlot)))
}
}
}
}
/// @dev Returns the account approved to manage token `id`.
/// Returns the zero address instead of reverting if the token does not exist.
function _getApproved(uint256 id) internal view virtual returns (address result) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
result := sload(add(1, add(id, add(id, keccak256(0x00, 0x20)))))
}
}
/// @dev Equivalent to `_approve(address(0), account, id)`.
function _approve(address account, uint256 id) internal virtual {
_approve(address(0), account, id);
}
/// @dev Sets `account` as the approved account to manage token `id`, using `by`.
///
/// Requirements:
/// - Token `id` must exist.
/// - If `by` is not the zero address, `by` must be the owner
/// or an approved operator for the token owner.
///
/// Emits a {Approval} event.
function _approve(address by, address account, uint256 id) internal virtual {
assembly {
// Clear the upper 96 bits.
let bitmaskAddress := shr(96, not(0))
account := and(bitmaskAddress, account)
by := and(bitmaskAddress, by)
// Load the owner of the token.
mstore(0x00, id)
mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, by))
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
let owner := and(bitmaskAddress, sload(ownershipSlot))
// Revert if the token does not exist.
if iszero(owner) {
mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
revert(0x1c, 0x04)
}
// If `by` is not the zero address, do the authorization check.
// Revert if `by` is not the owner, nor approved.
if iszero(or(iszero(by), eq(by, owner))) {
mstore(0x00, owner)
if iszero(sload(keccak256(0x0c, 0x30))) {
mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
revert(0x1c, 0x04)
}
}
// Sets `account` as the approved account to manage `id`.
sstore(add(1, ownershipSlot), account)
// Emit the {Approval} event.
log4(codesize(), 0x00, _APPROVAL_EVENT_SIGNATURE, owner, account, id)
}
}
/// @dev Approve or remove the `operator` as an operator for `by`,
/// without authorization checks.
///
/// Emits an {ApprovalForAll} event.
function _setApprovalForAll(address by, address operator, bool isApproved) internal virtual {
/// @solidity memory-safe-assembly
assembly {
// Clear the upper 96 bits.
by := shr(96, shl(96, by))
operator := shr(96, shl(96, operator))
// Convert to 0 or 1.
isApproved := iszero(iszero(isApproved))
// Update the `isApproved` for (`by`, `operator`).
mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, operator))
mstore(0x00, by)
sstore(keccak256(0x0c, 0x30), isApproved)
// Emit the {ApprovalForAll} event.
mstore(0x00, isApproved)
log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, by, operator)
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL TRANSFER FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Equivalent to `_transfer(address(0), from, to, id)`.
function _transfer(address from, address to, uint256 id) internal virtual {
_transfer(address(0), from, to, id);
}
/// @dev Transfers token `id` from `from` to `to`.
///
/// Requirements:
///
/// - Token `id` must exist.
/// - `from` must be the owner of the token.
/// - `to` cannot be the zero address.
/// - If `by` is not the zero address,
/// it must be the owner of the token, or be approved to manage the token.
///
/// Emits a {Transfer} event.
function _transfer(address by, address from, address to, uint256 id) internal virtual {
_beforeTokenTransfer(from, to, id);
/// @solidity memory-safe-assembly
assembly {
// Clear the upper 96 bits.
let bitmaskAddress := shr(96, not(0))
from := and(bitmaskAddress, from)
to := and(bitmaskAddress, to)
by := and(bitmaskAddress, by)
// Load the ownership data.
mstore(0x00, id)
mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, by))
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
let ownershipPacked := sload(ownershipSlot)
let owner := and(bitmaskAddress, ownershipPacked)
// Revert if the token does not exist, or if `from` is not the owner.
if iszero(mul(owner, eq(owner, from))) {
// `TokenDoesNotExist()`, `TransferFromIncorrectOwner()`.
mstore(shl(2, iszero(owner)), 0xceea21b6a1148100)
revert(0x1c, 0x04)
}
// Load, check, and update the token approval.
{
mstore(0x00, from)
let approvedAddress := sload(add(1, ownershipSlot))
// If `by` is not the zero address, do the authorization check.
// Revert if the `by` is not the owner, nor approved.
if iszero(or(iszero(by), or(eq(by, from), eq(by, approvedAddress)))) {
if iszero(sload(keccak256(0x0c, 0x30))) {
mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
revert(0x1c, 0x04)
}
}
// Delete the approved address if any.
if approvedAddress { sstore(add(1, ownershipSlot), 0) }
}
// Update with the new owner.
sstore(ownershipSlot, xor(ownershipPacked, xor(from, to)))
// Decrement the balance of `from`.
{
let fromBalanceSlot := keccak256(0x0c, 0x1c)
sstore(fromBalanceSlot, sub(sload(fromBalanceSlot), 1))
}
// Increment the balance of `to`.
{
mstore(0x00, to)
let toBalanceSlot := keccak256(0x0c, 0x1c)
let toBalanceSlotPacked := add(sload(toBalanceSlot), 1)
// Revert if `to` is the zero address, or if the account balance overflows.
if iszero(mul(to, and(toBalanceSlotPacked, _MAX_ACCOUNT_BALANCE))) {
// `TransferToZeroAddress()`, `AccountBalanceOverflow()`.
mstore(shl(2, iszero(to)), 0xea553b3401336cea)
revert(0x1c, 0x04)
}
sstore(toBalanceSlot, toBalanceSlotPacked)
}
// Emit the {Transfer} event.
log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, from, to, id)
}
_afterTokenTransfer(from, to, id);
}
/// @dev Equivalent to `_safeTransfer(from, to, id, "")`.
function _safeTransfer(address from, address to, uint256 id) internal virtual {
_safeTransfer(from, to, id, "");
}
/// @dev Transfers token `id` from `from` to `to`.
///
/// Requirements:
///
/// - Token `id` must exist.
/// - `from` must be the owner of the token.
/// - `to` cannot be the zero address.
/// - The caller must be the owner of the token, or be approved to manage the token.
/// - If `to` refers to a smart contract, it must implement
/// {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
///
/// Emits a {Transfer} event.
function _safeTransfer(address from, address to, uint256 id, bytes memory data)
internal
virtual
{
_transfer(address(0), from, to, id);
if (_hasCode(to)) _checkOnERC721Received(from, to, id, data);
}
/// @dev Equivalent to `_safeTransfer(by, from, to, id, "")`.
function _safeTransfer(address by, address from, address to, uint256 id) internal virtual {
_safeTransfer(by, from, to, id, "");
}
/// @dev Transfers token `id` from `from` to `to`.
///
/// Requirements:
///
/// - Token `id` must exist.
/// - `from` must be the owner of the token.
/// - `to` cannot be the zero address.
/// - If `by` is not the zero address,
/// it must be the owner of the token, or be approved to manage the token.
/// - If `to` refers to a smart contract, it must implement
/// {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
///
/// Emits a {Transfer} event.
function _safeTransfer(address by, address from, address to, uint256 id, bytes memory data)
internal
virtual
{
_transfer(by, from, to, id);
if (_hasCode(to)) _checkOnERC721Received(from, to, id, data);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* HOOKS FOR OVERRIDING */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Hook that is called before any token transfers, including minting and burning.
function _beforeTokenTransfer(address from, address to, uint256 id) internal virtual {}
/// @dev Hook that is called after any token transfers, including minting and burning.
function _afterTokenTransfer(address from, address to, uint256 id) internal virtual {}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* PRIVATE HELPERS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns if `a` has bytecode of non-zero length.
function _hasCode(address a) private view returns (bool result) {
/// @solidity memory-safe-assembly
assembly {
result := extcodesize(a) // Can handle dirty upper bits.
}
}
/// @dev Perform a call to invoke {IERC721Receiver-onERC721Received} on `to`.
/// Reverts if the target does not support the function correctly.
function _checkOnERC721Received(address from, address to, uint256 id, bytes memory data)
private
{
/// @solidity memory-safe-assembly
assembly {
// Prepare the calldata.
let m := mload(0x40)
let onERC721ReceivedSelector := 0x150b7a02
mstore(m, onERC721ReceivedSelector)
mstore(add(m, 0x20), caller()) // The `operator`, which is always `msg.sender`.
mstore(add(m, 0x40), shr(96, shl(96, from)))
mstore(add(m, 0x60), id)
mstore(add(m, 0x80), 0x80)
let n := mload(data)
mstore(add(m, 0xa0), n)
if n { pop(staticcall(gas(), 4, add(data, 0x20), n, add(m, 0xc0), n)) }
// Revert if the call reverts.
if iszero(call(gas(), to, 0, add(m, 0x1c), add(n, 0xa4), m, 0x20)) {
if returndatasize() {
// Bubble up the revert if the call reverts.
returndatacopy(m, 0x00, returndatasize())
revert(m, returndatasize())
}
}
// Load the returndata and compare it.
if iszero(eq(mload(m), shl(224, onERC721ReceivedSelector))) {
mstore(0x00, 0xd1a57ed6) // `TransferToNonERC721ReceiverImplementer()`.
revert(0x1c, 0x04)
}
}
}
}{
"evmVersion": "paris",
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"tradFiRenderer","type":"address"},{"internalType":"address","name":"tradFiLines","type":"address"},{"internalType":"address","name":"tradFiLinesColor","type":"address"},{"internalType":"address","name":"circuitBreakerAddress","type":"address"},{"internalType":"address","name":"bokkyPooBahsDateTimeContractAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccountBalanceOverflow","type":"error"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"NotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TokenAlreadyExists","type":"error"},{"inputs":[],"name":"TokenDoesNotExist","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"isApproved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustDST","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bpbdtc","outputs":[{"internalType":"contract BokkyPooBahsDateTimeContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cb","outputs":[{"internalType":"contract CircuitBreaker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circuitBreakerActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dayToPlace","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdjustedTimestamp","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hoursToSub","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDST","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isWithinOpeningHours","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockRenderers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prizesActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renderersLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"isApproved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"cbBool","type":"bool"}],"name":"setCircuitBreaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"prizesBool","type":"bool"}],"name":"setPrizes","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":[{"internalType":"address","name":"tradFiRenderer","type":"address"}],"name":"swapTFR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tfl","outputs":[{"internalType":"contract TradFiLines","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tflColor","outputs":[{"internalType":"contract TradFiLinesColor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tfrm","outputs":[{"internalType":"contract TradFiRendererAnimation","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToPlacement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToSeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToSeedAnimation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenToWrap","type":"uint256"}],"name":"wrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526001600560006101000a81548160ff0219169083151502179055506001600960146101000a81548160ff0219169083151502179055506040518060400160405280600d81526020017f5472616446694c696e65732d4100000000000000000000000000000000000000815250600a9081620000809190620005e1565b506040518060400160405280600581526020017f54464c2d41000000000000000000000000000000000000000000000000000000815250600b9081620000c79190620005e1565b506001600c60006101000a81548160ff0219169083151502179055506004600d55348015620000f557600080fd5b50604051620042613803806200426183398181016040528101906200011b919062000732565b6200012c336200027c60201b60201c565b84600560026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050620007ba565b6200028c6200036260201b60201c565b156200030a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927805415620002c957630dc149f06000526004601cfd5b8160601b60601c9150811560ff1b821781558160007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3506200035f565b8060601b60601c9050807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a35b50565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003e957607f821691505b602082108103620003ff57620003fe620003a1565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004697fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200042a565b6200047586836200042a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004c2620004bc620004b6846200048d565b62000497565b6200048d565b9050919050565b6000819050919050565b620004de83620004a1565b620004f6620004ed82620004c9565b84845462000437565b825550505050565b600090565b6200050d620004fe565b6200051a818484620004d3565b505050565b5b8181101562000542576200053660008262000503565b60018101905062000520565b5050565b601f82111562000591576200055b8162000405565b62000566846200041a565b8101602085101562000576578190505b6200058e62000585856200041a565b8301826200051f565b50505b505050565b600082821c905092915050565b6000620005b66000198460080262000596565b1980831691505092915050565b6000620005d18383620005a3565b9150826002028217905092915050565b620005ec8262000367565b67ffffffffffffffff81111562000608576200060762000372565b5b620006148254620003d0565b6200062182828562000546565b600060209050601f83116001811462000659576000841562000644578287015190505b620006508582620005c3565b865550620006c0565b601f198416620006698662000405565b60005b8281101562000693578489015182556001820191506020850194506020810190506200066c565b86831015620006b35784890151620006af601f891682620005a3565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006fa82620006cd565b9050919050565b6200070c81620006ed565b81146200071857600080fd5b50565b6000815190506200072c8162000701565b92915050565b600080600080600060a08688031215620007515762000750620006c8565b5b600062000761888289016200071b565b955050602062000774888289016200071b565b945050604062000787888289016200071b565b93505060606200079a888289016200071b565b9250506080620007ad888289016200071b565b9150509295509295909350565b613a9780620007ca6000396000f3fe6080604052600436106102975760003560e01c80638d6fc9a01161015a578063dce9e6f7116100c1578063f04e283e1161007a578063f04e283e146109a6578063f2fde38b146109c2578063f609844d146109de578063f9134e6814610a09578063f917ff7614610a46578063fee81cf414610a5d5761029e565b8063dce9e6f714610882578063e589ee67146108ad578063e985e9c5146108d8578063ea598cb014610915578063ebb409541461093e578063ef8bfddb146109695761029e565b8063b09f126611610113578063b09f12661461076b578063b88d4fde14610796578063c1c88042146107b2578063c87b56dd146107dd578063d14963c61461081a578063d28d8852146108575761029e565b80638d6fc9a01461065b5780638da5cb5b1461068457806390ec5dd1146106af57806395d89b41146106da578063a22cb46514610705578063a4580fe41461072e5761029e565b806342842e0e116101fe5780636c62ecca116101b75780636c62ecca1461056a5780636dd805161461058157806370a08231146105ac578063715018a6146105e957806375e91691146105f35780637ea3f9aa146106305761029e565b806342842e0e1461048857806353e6351e146104a457806354d1f13d146104cf57806356a060a2146104d95780636352211e14610504578063664dd3e6146105415761029e565b80631c6ebf86116102505780631c6ebf86146103cc57806323b872dd146103f757806325692962146104135780633b4d0bd21461041d5780633ccfd60b14610448578063425064491461045f5761029e565b806301ffc9a7146102a357806306fdde03146102e0578063081812fc1461030b578063095ea7b31461034857806309e3934214610364578063150b7a021461038f5761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102ca60048036038101906102c59190612a28565b610a9a565b6040516102d79190612a70565b60405180910390f35b3480156102ec57600080fd5b506102f5610aac565b6040516103029190612b1b565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d9190612b73565b610b3e565b60405161033f9190612be1565b60405180910390f35b610362600480360381019061035d9190612c28565b610b95565b005b34801561037057600080fd5b50610379610ba4565b6040516103869190612cc7565b60405180910390f35b34801561039b57600080fd5b506103b660048036038101906103b19190612e17565b610bca565b6040516103c39190612ea9565b60405180910390f35b3480156103d857600080fd5b506103e1610bde565b6040516103ee9190612ee5565b60405180910390f35b610411600480360381019061040c9190612f00565b610c04565b005b61041b610d36565b005b34801561042957600080fd5b50610432610d8a565b60405161043f9190612a70565b60405180910390f35b34801561045457600080fd5b5061045d610d9d565b005b34801561046b57600080fd5b5061048660048036038101906104819190612f7f565b610e16565b005b6104a2600480360381019061049d9190612f00565b610e3b565b005b3480156104b057600080fd5b506104b9610e75565b6040516104c69190612a70565b60405180910390f35b6104d7610e88565b005b3480156104e557600080fd5b506104ee610ec4565b6040516104fb9190612a70565b60405180910390f35b34801561051057600080fd5b5061052b60048036038101906105269190612b73565b610f6d565b6040516105389190612be1565b60405180910390f35b34801561054d57600080fd5b5061056860048036038101906105639190612fac565b610f92565b005b34801561057657600080fd5b5061057f61102e565b005b34801561058d57600080fd5b5061059661145c565b6040516105a39190612a70565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612fac565b61146f565b6040516105e09190612fe8565b60405180910390f35b6105f16114bf565b005b3480156105ff57600080fd5b5061061a60048036038101906106159190612b73565b6114d3565b6040516106279190612fe8565b60405180910390f35b34801561063c57600080fd5b506106456114eb565b6040516106529190613024565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d9190612f7f565b611511565b005b34801561069057600080fd5b50610699611536565b6040516106a69190612be1565b60405180910390f35b3480156106bb57600080fd5b506106c461155f565b6040516106d19190612fe8565b60405180910390f35b3480156106e657600080fd5b506106ef611565565b6040516106fc9190612b1b565b60405180910390f35b34801561071157600080fd5b5061072c6004803603810190610727919061303f565b6115f7565b005b34801561073a57600080fd5b5061075560048036038101906107509190612b73565b61164d565b6040516107629190612fe8565b60405180910390f35b34801561077757600080fd5b50610780611665565b60405161078d9190612b1b565b60405180910390f35b6107b060048036038101906107ab91906130df565b6116f3565b005b3480156107be57600080fd5b506107c7611764565b6040516107d49190613188565b60405180910390f35b3480156107e957600080fd5b5061080460048036038101906107ff9190612b73565b61178a565b6040516108119190612b1b565b60405180910390f35b34801561082657600080fd5b50610841600480360381019061083c9190612b73565b611be6565b60405161084e9190612fe8565b60405180910390f35b34801561086357600080fd5b5061086c611bfe565b6040516108799190612b1b565b60405180910390f35b34801561088e57600080fd5b50610897611c8c565b6040516108a49190612a70565b60405180910390f35b3480156108b957600080fd5b506108c2611e64565b6040516108cf9190612fe8565b60405180910390f35b3480156108e457600080fd5b506108ff60048036038101906108fa91906131a3565b611f0c565b60405161090c9190612a70565b60405180910390f35b34801561092157600080fd5b5061093c60048036038101906109379190612b73565b611f30565b005b34801561094a57600080fd5b5061095361235d565b6040516109609190613204565b60405180910390f35b34801561097557600080fd5b50610990600480360381019061098b9190612b73565b612383565b60405161099d9190612fe8565b60405180910390f35b6109c060048036038101906109bb9190612fac565b61239b565b005b6109dc60048036038101906109d79190612fac565b6123dc565b005b3480156109ea57600080fd5b506109f3612406565b604051610a009190612a70565b60405180910390f35b348015610a1557600080fd5b50610a306004803603810190610a2b9190612b73565b612419565b604051610a3d9190612fe8565b60405180910390f35b348015610a5257600080fd5b50610a5b612431565b005b348015610a6957600080fd5b50610a846004803603810190610a7f9190612fac565b612456565b604051610a919190612fe8565b60405180910390f35b6000610aa582612471565b9050919050565b6060600a8054610abb9061324e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae79061324e565b8015610b345780601f10610b0957610100808354040283529160200191610b34565b820191906000526020600020905b815481529060010190602001808311610b1757829003601f168201915b5050505050905090565b6000816000527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c52602060002082018201805460601b610b885763ceea21b66000526004601cfd5b8060010154915050919050565b610ba0338383612496565b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600063150b7a0260e01b9050949350505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c0f83838361254d565b60001960601c8381169350828116925081600052337f7d8825530a5a2e7a00000000000000000000000000000000000000000000000017601c5260206000208201820180548083168681148102610c755767ceea21b6a1148100811560021b526004601cfd5b86600052826001015480331488331417610ca2576030600c2054610ca157634b6e7f186000526004601cfd5b5b8015610cb057600084600101555b5085871882188355601c600c20600181540381555085600052601c600c20600181540163ffffffff81168802610cf55767ea553b3401336cea881560021b526004601cfd5b80825550508486887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600038a450505050610d318383836126b5565b505050565b6000610d406126ba565b67ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b600c60009054906101000a900460ff1681565b610da56126c5565b60004790503373ffffffffffffffffffffffffffffffffffffffff1681604051610dce906132b0565b60006040518083038185875af1925050503d8060008114610e0b576040519150601f19603f3d011682016040523d82523d6000602084013e610e10565b606091505b50505050565b610e1e6126c5565b80600960146101000a81548160ff02191690831515021790555050565b610e46838383610c04565b610e4f826126fd565b15610e7057610e6f83838360405180602001604052806000815250612708565b5b505050565b600560009054906101000a900460ff1681565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b6000610ece611c8c565b8015610f685750600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7ff15846040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6691906132da565b155b905090565b6000610f7882612795565b905080610f8d5763ceea21b66000526004601cfd5b919050565b610f9a6126c5565b600560019054906101000a900460ff1615610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe190613353565b60405180910390fd5b80600560026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166250155342600d546040518363ffffffff1660e01b815260040161108e929190613373565b6020604051808303816000875af11580156110ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d191906133b1565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a324ad24836040518263ffffffff1660e01b81526004016111309190612fe8565b6020604051808303816000875af115801561114f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117391906133b1565b90506003811180156111855750600b81105b156111aa576001600c60006101000a81548160ff02191690831515021790555061142d565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166322f8a2b8846040518263ffffffff1660e01b81526004016112079190612fe8565b6020604051808303816000875af1158015611226573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124a91906133b1565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166365c72840856040518263ffffffff1660e01b81526004016112a99190612fe8565b6020604051808303816000875af11580156112c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ec91906133b1565b9050600383036113a757600e81111561131f576001600c60006101000a81548160ff0219169083151502179055506113a6565b6008811015611348576000600c60006101000a81548160ff0219169083151502179055506113a5565b600160078383611358919061340d565b611362919061340d565b1015611388576000600c60006101000a81548160ff0219169083151502179055506113a4565b6001600c60006101000a81548160ff0219169083151502179055505b5b5b5b600b830361142a5760078111156113d8576000600c60006101000a81548160ff021916908315150217905550611429565b600182826113e6919061340d565b101561140c576001600c60006101000a81548160ff021916908315150217905550611428565b6000600c60006101000a81548160ff0219169083151502179055505b5b5b50505b600c60009054906101000a900460ff161561144f576004600d81905550611458565b6005600d819055505b5050565b600560019054906101000a900460ff1681565b60008161148457638f4eb6046000526004601cfd5b7f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c528160005263ffffffff601c600c2054169050919050565b6114c76126c5565b6114d160006127d6565b565b60016020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115196126c5565b80600560006101000a81548160ff02191690831515021790555050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754905090565b600d5481565b6060600b80546115749061324e565b80601f01602080910402602001604051908101604052809291908181526020018280546115a09061324e565b80156115ed5780601f106115c2576101008083540402835291602001916115ed565b820191906000526020600020905b8154815290600101906020018083116115d057829003601f168201915b5050505050905090565b801515905081601c52670a5a2e7a0000000060085233600052806030600c2055806000528160601b60601c337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206000a35050565b60036020528060005260406000206000915090505481565b600b80546116729061324e565b80601f016020809104026020016040519081016040528092919081815260200182805461169e9061324e565b80156116eb5780601f106116c0576101008083540402835291602001916116eb565b820191906000526020600020905b8154815290600101906020018083116116ce57829003601f168201915b505050505081565b6116fe858585610c04565b611707846126fd565b1561175d5761175c85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612708565b5b5050505050565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606117958261289e565b6117d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cb906134b3565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166375e91691846040518263ffffffff1660e01b81526004016118319190612fe8565b602060405180830381865afa15801561184e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187291906133b1565b90506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630a88d98b856040518263ffffffff1660e01b81526004016118d19190612fe8565b602060405180830381865afa1580156118ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191291906133b1565b90506000600767ffffffffffffffff81111561193157611930612cec565b5b60405190808252806020026020018201604052801561195f5781602001602082028036833780820191505090505b5090508281600081518110611977576119766134d3565b5b6020026020010181815250508181600181518110611998576119976134d3565b5b6020026020010181815250506002600086815260200190815260200160002054816002815181106119cc576119cb6134d3565b5b60200260200101818152505060008086815260200190815260200160002054816003815181106119ff576119fe6134d3565b5b6020026020010181815250508481600481518110611a2057611a1f6134d3565b5b602002602001018181525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a4580fe4866040518263ffffffff1660e01b8152600401611a879190612fe8565b602060405180830381865afa158015611aa4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac891906133b1565b81600581518110611adc57611adb6134d3565b5b602002602001018181525050600360008681526020019081526020016000205481600681518110611b1057611b0f6134d3565b5b602002602001018181525050600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cdeb732b826040518263ffffffff1660e01b8152600401611b7791906135c0565b600060405180830381865afa158015611b94573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bbd9190613683565b604051602001611bcd9190613708565b6040516020818303038152906040529350505050919050565b60026020528060005260406000206000915090505481565b600a8054611c0b9061324e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c379061324e565b8015611c845780601f10611c5957610100808354040283529160200191611c84565b820191906000526020600020905b815481529060010190602001808311611c6757829003601f168201915b505050505081565b600080611c97611e64565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634371c465836040518263ffffffff1660e01b8152600401611cf69190612fe8565b6020604051808303816000875af1158015611d15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3991906132da565b90506000806000806000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ea1c1690886040518263ffffffff1660e01b8152600401611d9e9190612fe8565b60c0604051808303816000875af1158015611dbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de1919061371f565b5080955081995082965083975084985050505050508515611e0c576000975050505050505050611e61565b6009851080611e1b5750600f85115b15611e30576000975050505050505050611e61565b600985148015611e405750601e81105b15611e55576000975050505050505050611e61565b60019750505050505050505b90565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166250155342600d546040518363ffffffff1660e01b8152600401611ec4929190613373565b6020604051808303816000875af1158015611ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0791906133b1565b905090565b600081601c52670a5a2e7a00000000600852826000526030600c2054905092915050565b6000611f3a611e64565b90506000806000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ea1c1690856040518263ffffffff1660e01b8152600401611f9c9190612fe8565b60c0604051808303816000875af1158015611fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdf919061371f565b909150905050809350819450829550505050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f9134e68866040518263ffffffff1660e01b815260040161204c9190612fe8565b602060405180830381865afa158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d91906133b1565b60008087815260200190815260200160002081905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330886040518463ffffffff1660e01b8152600401612102939291906137ac565b600060405180830381600087803b15801561211c57600080fd5b505af1158015612130573d6000803e3d6000fd5b5050505060006002600087815260200190815260200160002054036121a05760014361215c919061340d565b408560405160200161216f92919061382f565b6040516020818303038152906040528051906020012060001c60026000878152602001908152602001600020819055505b600060036000878152602001908152602001600020540361234c576000600160046000612710876121d1919061385b565b6064876121de919061385b565b866121e9919061389d565b6121f3919061389d565b81526020019081526020016000206000828254612210919061389d565b9250508190559050806003600088815260200190815260200160002081905550600560009054906101000a900460ff161561234a5760006001820361225f5767016345785d8a00009050612282565b600282036122765766b1a2bc2ec500009050612281565b66354a6ba7a1800090505b5b6000811180156122925750804710155b15612348576000803373ffffffffffffffffffffffffffffffffffffffff16836040516122be906132b0565b60006040518083038185875af1925050503d80600081146122fb576040519150601f19603f3d011682016040523d82523d6000602084013e612300565b606091505b509150915081612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233c9061391d565b60405180910390fd5b50505b505b505b61235633866128de565b5050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60046020528060005260406000206000915090505481565b6123a36126c5565b63389a75e1600c52806000526020600c2080544211156123cb57636f5e88186000526004601cfd5b60008155506123d9816127d6565b50565b6123e46126c5565b8060601b6123fa57637448fbae6000526004601cfd5b612403816127d6565b50565b600960149054906101000a900460ff1681565b60006020528060005260406000206000915090505481565b6124396126c5565b6001600560016101000a81548160ff021916908315150217905550565b600063389a75e1600c52816000526020600c20549050919050565b60008160e01c635b5e139f81146380ac58cd82146301ffc9a783141717915050919050565b60001960601c8281169250838116935081600052837f7d8825530a5a2e7a00000000000000000000000000000000000000000000000017601c5260206000208201820180548216806124f05763ceea21b66000526004601cfd5b80861486151761251757806000526030600c205461251657634b6e7f186000526004601cfd5b5b8482600101558385827f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600038a4505050505050565b612555611c8c565b612594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258b90613989565b60405180910390fd5b600960149054906101000a900460ff161561267b57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7ff15846040518163ffffffff1660e01b8152600401602060405180830381865afa158015612616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263a91906132da565b1561267a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267190613a41565b60405180910390fd5b5b6001600080838152602001908152602001600020600082825461269e919061389d565b925050819055506126b08383836129b2565b505050565b505050565b60006202a300905090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275433146126fb576382b429006000526004601cfd5b565b6000813b9050919050565b60405163150b7a028082523360208301528560601b60601c604083015283606083015260808083015282518060a0840152801561274f578060c08401826020870160045afa505b60208360a48301601c860160008a5af1612773573d15612772573d6000843e3d83fd5b5b8160e01b83511461278c5763d1a57ed66000526004601cfd5b50505050505050565b6000816000527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c526020600020820182015460601b60601c9050919050565b6127de6129b7565b15612844577fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278160601b60601c91508181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3811560ff1b821781555061289b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278160601b60601c91508181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3818155505b50565b6000816000527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c526020600020820182015460601b15159050919050565b6128ea6000838361254d565b8160601b60601c9150806000527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260206000208101810180548060601b1561293d5763c991cbb16000526004601cfd5b838117825583600052601c600c20600181540163ffffffff811686026129725767ea553b3401336cea861560021b526004601cfd5b8082555050828460007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600038a450506129ae600083836126b5565b5050565b505050565b600090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a05816129d0565b8114612a1057600080fd5b50565b600081359050612a22816129fc565b92915050565b600060208284031215612a3e57612a3d6129c6565b5b6000612a4c84828501612a13565b91505092915050565b60008115159050919050565b612a6a81612a55565b82525050565b6000602082019050612a856000830184612a61565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ac5578082015181840152602081019050612aaa565b60008484015250505050565b6000601f19601f8301169050919050565b6000612aed82612a8b565b612af78185612a96565b9350612b07818560208601612aa7565b612b1081612ad1565b840191505092915050565b60006020820190508181036000830152612b358184612ae2565b905092915050565b6000819050919050565b612b5081612b3d565b8114612b5b57600080fd5b50565b600081359050612b6d81612b47565b92915050565b600060208284031215612b8957612b886129c6565b5b6000612b9784828501612b5e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bcb82612ba0565b9050919050565b612bdb81612bc0565b82525050565b6000602082019050612bf66000830184612bd2565b92915050565b612c0581612bc0565b8114612c1057600080fd5b50565b600081359050612c2281612bfc565b92915050565b60008060408385031215612c3f57612c3e6129c6565b5b6000612c4d85828601612c13565b9250506020612c5e85828601612b5e565b9150509250929050565b6000819050919050565b6000612c8d612c88612c8384612ba0565b612c68565b612ba0565b9050919050565b6000612c9f82612c72565b9050919050565b6000612cb182612c94565b9050919050565b612cc181612ca6565b82525050565b6000602082019050612cdc6000830184612cb8565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d2482612ad1565b810181811067ffffffffffffffff82111715612d4357612d42612cec565b5b80604052505050565b6000612d566129bc565b9050612d628282612d1b565b919050565b600067ffffffffffffffff821115612d8257612d81612cec565b5b612d8b82612ad1565b9050602081019050919050565b82818337600083830152505050565b6000612dba612db584612d67565b612d4c565b905082815260208101848484011115612dd657612dd5612ce7565b5b612de1848285612d98565b509392505050565b600082601f830112612dfe57612dfd612ce2565b5b8135612e0e848260208601612da7565b91505092915050565b60008060008060808587031215612e3157612e306129c6565b5b6000612e3f87828801612c13565b9450506020612e5087828801612c13565b9350506040612e6187828801612b5e565b925050606085013567ffffffffffffffff811115612e8257612e816129cb565b5b612e8e87828801612de9565b91505092959194509250565b612ea3816129d0565b82525050565b6000602082019050612ebe6000830184612e9a565b92915050565b6000612ecf82612c94565b9050919050565b612edf81612ec4565b82525050565b6000602082019050612efa6000830184612ed6565b92915050565b600080600060608486031215612f1957612f186129c6565b5b6000612f2786828701612c13565b9350506020612f3886828701612c13565b9250506040612f4986828701612b5e565b9150509250925092565b612f5c81612a55565b8114612f6757600080fd5b50565b600081359050612f7981612f53565b92915050565b600060208284031215612f9557612f946129c6565b5b6000612fa384828501612f6a565b91505092915050565b600060208284031215612fc257612fc16129c6565b5b6000612fd084828501612c13565b91505092915050565b612fe281612b3d565b82525050565b6000602082019050612ffd6000830184612fd9565b92915050565b600061300e82612c94565b9050919050565b61301e81613003565b82525050565b60006020820190506130396000830184613015565b92915050565b60008060408385031215613056576130556129c6565b5b600061306485828601612c13565b925050602061307585828601612f6a565b9150509250929050565b600080fd5b600080fd5b60008083601f84011261309f5761309e612ce2565b5b8235905067ffffffffffffffff8111156130bc576130bb61307f565b5b6020830191508360018202830111156130d8576130d7613084565b5b9250929050565b6000806000806000608086880312156130fb576130fa6129c6565b5b600061310988828901612c13565b955050602061311a88828901612c13565b945050604061312b88828901612b5e565b935050606086013567ffffffffffffffff81111561314c5761314b6129cb565b5b61315888828901613089565b92509250509295509295909350565b600061317282612c94565b9050919050565b61318281613167565b82525050565b600060208201905061319d6000830184613179565b92915050565b600080604083850312156131ba576131b96129c6565b5b60006131c885828601612c13565b92505060206131d985828601612c13565b9150509250929050565b60006131ee82612c94565b9050919050565b6131fe816131e3565b82525050565b600060208201905061321960008301846131f5565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061326657607f821691505b6020821081036132795761327861321f565b5b50919050565b600081905092915050565b50565b600061329a60008361327f565b91506132a58261328a565b600082019050919050565b60006132bb8261328d565b9150819050919050565b6000815190506132d481612f53565b92915050565b6000602082840312156132f0576132ef6129c6565b5b60006132fe848285016132c5565b91505092915050565b7f43616e277420737761702072656e64657265727320616e796d6f726500000000600082015250565b600061333d601c83612a96565b915061334882613307565b602082019050919050565b6000602082019050818103600083015261336c81613330565b9050919050565b60006040820190506133886000830185612fd9565b6133956020830184612fd9565b9392505050565b6000815190506133ab81612b47565b92915050565b6000602082840312156133c7576133c66129c6565b5b60006133d58482850161339c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061341882612b3d565b915061342383612b3d565b925082820390508181111561343b5761343a6133de565b5b92915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061349d602f83612a96565b91506134a882613441565b604082019050919050565b600060208201905081810360008301526134cc81613490565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61353781612b3d565b82525050565b6000613549838361352e565b60208301905092915050565b6000602082019050919050565b600061356d82613502565b613577818561350d565b93506135828361351e565b8060005b838110156135b357815161359a888261353d565b97506135a583613555565b925050600181019050613586565b5085935050505092915050565b600060208201905081810360008301526135da8184613562565b905092915050565b600067ffffffffffffffff8211156135fd576135fc612cec565b5b61360682612ad1565b9050602081019050919050565b6000613626613621846135e2565b612d4c565b90508281526020810184848401111561364257613641612ce7565b5b61364d848285612aa7565b509392505050565b600082601f83011261366a57613669612ce2565b5b815161367a848260208601613613565b91505092915050565b600060208284031215613699576136986129c6565b5b600082015167ffffffffffffffff8111156136b7576136b66129cb565b5b6136c384828501613655565b91505092915050565b600081905092915050565b60006136e282612a8b565b6136ec81856136cc565b93506136fc818560208601612aa7565b80840191505092915050565b600061371482846136d7565b915081905092915050565b60008060008060008060c0878903121561373c5761373b6129c6565b5b600061374a89828a0161339c565b965050602061375b89828a0161339c565b955050604061376c89828a0161339c565b945050606061377d89828a0161339c565b935050608061378e89828a0161339c565b92505060a061379f89828a0161339c565b9150509295509295509295565b60006060820190506137c16000830186612bd2565b6137ce6020830185612bd2565b6137db6040830184612fd9565b949350505050565b6000819050919050565b6000819050919050565b613808613803826137e3565b6137ed565b82525050565b6000819050919050565b61382961382482612b3d565b61380e565b82525050565b600061383b82856137f7565b60208201915061384b8284613818565b6020820191508190509392505050565b600061386682612b3d565b915061387183612b3d565b925082820261387f81612b3d565b91508282048414831517613896576138956133de565b5b5092915050565b60006138a882612b3d565b91506138b383612b3d565b92508282019050808211156138cb576138ca6133de565b5b92915050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b6000613907601483612a96565b9150613912826138d1565b602082019050919050565b60006020820190508181036000830152613936816138fa565b9050919050565b7f4f75747369646520726567756c61722074726164696e6720686f757273000000600082015250565b6000613973601d83612a96565b915061397e8261393d565b602082019050919050565b600060208201905081810360008301526139a281613966565b9050919050565b7f4369726375697420627265616b6572207472696767657265643a205472616e7360008201527f6665722066756e6374696f6e616c69747920686173206265656e2068616c746560208201527f642e000000000000000000000000000000000000000000000000000000000000604082015250565b6000613a2b604283612a96565b9150613a36826139a9565b606082019050919050565b60006020820190508181036000830152613a5a81613a1e565b905091905056fea264697066735822122098314be511f08d386f104297820034143a15993c57189bb0397a2a614d79f66664736f6c63430008180033000000000000000000000000648c6326135fcde9bd3f712514dafe85afdd14980000000000000000000000004d04bba7f5ea45ac59769a1095762467b1157cc4000000000000000000000000d6b228d9eb4b7129de0dac548e06a381dd1c912e000000000000000000000000100f7ce4ec5f3d8038bf8615bdc3b86873364536000000000000000000000000392859b2aa50cd5d6e9b2bbc7661dd026318ae56
Deployed Bytecode
0x6080604052600436106102975760003560e01c80638d6fc9a01161015a578063dce9e6f7116100c1578063f04e283e1161007a578063f04e283e146109a6578063f2fde38b146109c2578063f609844d146109de578063f9134e6814610a09578063f917ff7614610a46578063fee81cf414610a5d5761029e565b8063dce9e6f714610882578063e589ee67146108ad578063e985e9c5146108d8578063ea598cb014610915578063ebb409541461093e578063ef8bfddb146109695761029e565b8063b09f126611610113578063b09f12661461076b578063b88d4fde14610796578063c1c88042146107b2578063c87b56dd146107dd578063d14963c61461081a578063d28d8852146108575761029e565b80638d6fc9a01461065b5780638da5cb5b1461068457806390ec5dd1146106af57806395d89b41146106da578063a22cb46514610705578063a4580fe41461072e5761029e565b806342842e0e116101fe5780636c62ecca116101b75780636c62ecca1461056a5780636dd805161461058157806370a08231146105ac578063715018a6146105e957806375e91691146105f35780637ea3f9aa146106305761029e565b806342842e0e1461048857806353e6351e146104a457806354d1f13d146104cf57806356a060a2146104d95780636352211e14610504578063664dd3e6146105415761029e565b80631c6ebf86116102505780631c6ebf86146103cc57806323b872dd146103f757806325692962146104135780633b4d0bd21461041d5780633ccfd60b14610448578063425064491461045f5761029e565b806301ffc9a7146102a357806306fdde03146102e0578063081812fc1461030b578063095ea7b31461034857806309e3934214610364578063150b7a021461038f5761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102ca60048036038101906102c59190612a28565b610a9a565b6040516102d79190612a70565b60405180910390f35b3480156102ec57600080fd5b506102f5610aac565b6040516103029190612b1b565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d9190612b73565b610b3e565b60405161033f9190612be1565b60405180910390f35b610362600480360381019061035d9190612c28565b610b95565b005b34801561037057600080fd5b50610379610ba4565b6040516103869190612cc7565b60405180910390f35b34801561039b57600080fd5b506103b660048036038101906103b19190612e17565b610bca565b6040516103c39190612ea9565b60405180910390f35b3480156103d857600080fd5b506103e1610bde565b6040516103ee9190612ee5565b60405180910390f35b610411600480360381019061040c9190612f00565b610c04565b005b61041b610d36565b005b34801561042957600080fd5b50610432610d8a565b60405161043f9190612a70565b60405180910390f35b34801561045457600080fd5b5061045d610d9d565b005b34801561046b57600080fd5b5061048660048036038101906104819190612f7f565b610e16565b005b6104a2600480360381019061049d9190612f00565b610e3b565b005b3480156104b057600080fd5b506104b9610e75565b6040516104c69190612a70565b60405180910390f35b6104d7610e88565b005b3480156104e557600080fd5b506104ee610ec4565b6040516104fb9190612a70565b60405180910390f35b34801561051057600080fd5b5061052b60048036038101906105269190612b73565b610f6d565b6040516105389190612be1565b60405180910390f35b34801561054d57600080fd5b5061056860048036038101906105639190612fac565b610f92565b005b34801561057657600080fd5b5061057f61102e565b005b34801561058d57600080fd5b5061059661145c565b6040516105a39190612a70565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612fac565b61146f565b6040516105e09190612fe8565b60405180910390f35b6105f16114bf565b005b3480156105ff57600080fd5b5061061a60048036038101906106159190612b73565b6114d3565b6040516106279190612fe8565b60405180910390f35b34801561063c57600080fd5b506106456114eb565b6040516106529190613024565b60405180910390f35b34801561066757600080fd5b50610682600480360381019061067d9190612f7f565b611511565b005b34801561069057600080fd5b50610699611536565b6040516106a69190612be1565b60405180910390f35b3480156106bb57600080fd5b506106c461155f565b6040516106d19190612fe8565b60405180910390f35b3480156106e657600080fd5b506106ef611565565b6040516106fc9190612b1b565b60405180910390f35b34801561071157600080fd5b5061072c6004803603810190610727919061303f565b6115f7565b005b34801561073a57600080fd5b5061075560048036038101906107509190612b73565b61164d565b6040516107629190612fe8565b60405180910390f35b34801561077757600080fd5b50610780611665565b60405161078d9190612b1b565b60405180910390f35b6107b060048036038101906107ab91906130df565b6116f3565b005b3480156107be57600080fd5b506107c7611764565b6040516107d49190613188565b60405180910390f35b3480156107e957600080fd5b5061080460048036038101906107ff9190612b73565b61178a565b6040516108119190612b1b565b60405180910390f35b34801561082657600080fd5b50610841600480360381019061083c9190612b73565b611be6565b60405161084e9190612fe8565b60405180910390f35b34801561086357600080fd5b5061086c611bfe565b6040516108799190612b1b565b60405180910390f35b34801561088e57600080fd5b50610897611c8c565b6040516108a49190612a70565b60405180910390f35b3480156108b957600080fd5b506108c2611e64565b6040516108cf9190612fe8565b60405180910390f35b3480156108e457600080fd5b506108ff60048036038101906108fa91906131a3565b611f0c565b60405161090c9190612a70565b60405180910390f35b34801561092157600080fd5b5061093c60048036038101906109379190612b73565b611f30565b005b34801561094a57600080fd5b5061095361235d565b6040516109609190613204565b60405180910390f35b34801561097557600080fd5b50610990600480360381019061098b9190612b73565b612383565b60405161099d9190612fe8565b60405180910390f35b6109c060048036038101906109bb9190612fac565b61239b565b005b6109dc60048036038101906109d79190612fac565b6123dc565b005b3480156109ea57600080fd5b506109f3612406565b604051610a009190612a70565b60405180910390f35b348015610a1557600080fd5b50610a306004803603810190610a2b9190612b73565b612419565b604051610a3d9190612fe8565b60405180910390f35b348015610a5257600080fd5b50610a5b612431565b005b348015610a6957600080fd5b50610a846004803603810190610a7f9190612fac565b612456565b604051610a919190612fe8565b60405180910390f35b6000610aa582612471565b9050919050565b6060600a8054610abb9061324e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae79061324e565b8015610b345780601f10610b0957610100808354040283529160200191610b34565b820191906000526020600020905b815481529060010190602001808311610b1757829003601f168201915b5050505050905090565b6000816000527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c52602060002082018201805460601b610b885763ceea21b66000526004601cfd5b8060010154915050919050565b610ba0338383612496565b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600063150b7a0260e01b9050949350505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c0f83838361254d565b60001960601c8381169350828116925081600052337f7d8825530a5a2e7a00000000000000000000000000000000000000000000000017601c5260206000208201820180548083168681148102610c755767ceea21b6a1148100811560021b526004601cfd5b86600052826001015480331488331417610ca2576030600c2054610ca157634b6e7f186000526004601cfd5b5b8015610cb057600084600101555b5085871882188355601c600c20600181540381555085600052601c600c20600181540163ffffffff81168802610cf55767ea553b3401336cea881560021b526004601cfd5b80825550508486887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600038a450505050610d318383836126b5565b505050565b6000610d406126ba565b67ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b600c60009054906101000a900460ff1681565b610da56126c5565b60004790503373ffffffffffffffffffffffffffffffffffffffff1681604051610dce906132b0565b60006040518083038185875af1925050503d8060008114610e0b576040519150601f19603f3d011682016040523d82523d6000602084013e610e10565b606091505b50505050565b610e1e6126c5565b80600960146101000a81548160ff02191690831515021790555050565b610e46838383610c04565b610e4f826126fd565b15610e7057610e6f83838360405180602001604052806000815250612708565b5b505050565b600560009054906101000a900460ff1681565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b6000610ece611c8c565b8015610f685750600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7ff15846040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6691906132da565b155b905090565b6000610f7882612795565b905080610f8d5763ceea21b66000526004601cfd5b919050565b610f9a6126c5565b600560019054906101000a900460ff1615610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe190613353565b60405180910390fd5b80600560026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166250155342600d546040518363ffffffff1660e01b815260040161108e929190613373565b6020604051808303816000875af11580156110ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d191906133b1565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a324ad24836040518263ffffffff1660e01b81526004016111309190612fe8565b6020604051808303816000875af115801561114f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117391906133b1565b90506003811180156111855750600b81105b156111aa576001600c60006101000a81548160ff02191690831515021790555061142d565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166322f8a2b8846040518263ffffffff1660e01b81526004016112079190612fe8565b6020604051808303816000875af1158015611226573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124a91906133b1565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166365c72840856040518263ffffffff1660e01b81526004016112a99190612fe8565b6020604051808303816000875af11580156112c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ec91906133b1565b9050600383036113a757600e81111561131f576001600c60006101000a81548160ff0219169083151502179055506113a6565b6008811015611348576000600c60006101000a81548160ff0219169083151502179055506113a5565b600160078383611358919061340d565b611362919061340d565b1015611388576000600c60006101000a81548160ff0219169083151502179055506113a4565b6001600c60006101000a81548160ff0219169083151502179055505b5b5b5b600b830361142a5760078111156113d8576000600c60006101000a81548160ff021916908315150217905550611429565b600182826113e6919061340d565b101561140c576001600c60006101000a81548160ff021916908315150217905550611428565b6000600c60006101000a81548160ff0219169083151502179055505b5b5b50505b600c60009054906101000a900460ff161561144f576004600d81905550611458565b6005600d819055505b5050565b600560019054906101000a900460ff1681565b60008161148457638f4eb6046000526004601cfd5b7f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c528160005263ffffffff601c600c2054169050919050565b6114c76126c5565b6114d160006127d6565b565b60016020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115196126c5565b80600560006101000a81548160ff02191690831515021790555050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754905090565b600d5481565b6060600b80546115749061324e565b80601f01602080910402602001604051908101604052809291908181526020018280546115a09061324e565b80156115ed5780601f106115c2576101008083540402835291602001916115ed565b820191906000526020600020905b8154815290600101906020018083116115d057829003601f168201915b5050505050905090565b801515905081601c52670a5a2e7a0000000060085233600052806030600c2055806000528160601b60601c337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206000a35050565b60036020528060005260406000206000915090505481565b600b80546116729061324e565b80601f016020809104026020016040519081016040528092919081815260200182805461169e9061324e565b80156116eb5780601f106116c0576101008083540402835291602001916116eb565b820191906000526020600020905b8154815290600101906020018083116116ce57829003601f168201915b505050505081565b6116fe858585610c04565b611707846126fd565b1561175d5761175c85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612708565b5b5050505050565b600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606117958261289e565b6117d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cb906134b3565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166375e91691846040518263ffffffff1660e01b81526004016118319190612fe8565b602060405180830381865afa15801561184e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187291906133b1565b90506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630a88d98b856040518263ffffffff1660e01b81526004016118d19190612fe8565b602060405180830381865afa1580156118ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191291906133b1565b90506000600767ffffffffffffffff81111561193157611930612cec565b5b60405190808252806020026020018201604052801561195f5781602001602082028036833780820191505090505b5090508281600081518110611977576119766134d3565b5b6020026020010181815250508181600181518110611998576119976134d3565b5b6020026020010181815250506002600086815260200190815260200160002054816002815181106119cc576119cb6134d3565b5b60200260200101818152505060008086815260200190815260200160002054816003815181106119ff576119fe6134d3565b5b6020026020010181815250508481600481518110611a2057611a1f6134d3565b5b602002602001018181525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a4580fe4866040518263ffffffff1660e01b8152600401611a879190612fe8565b602060405180830381865afa158015611aa4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac891906133b1565b81600581518110611adc57611adb6134d3565b5b602002602001018181525050600360008681526020019081526020016000205481600681518110611b1057611b0f6134d3565b5b602002602001018181525050600560029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cdeb732b826040518263ffffffff1660e01b8152600401611b7791906135c0565b600060405180830381865afa158015611b94573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611bbd9190613683565b604051602001611bcd9190613708565b6040516020818303038152906040529350505050919050565b60026020528060005260406000206000915090505481565b600a8054611c0b9061324e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c379061324e565b8015611c845780601f10611c5957610100808354040283529160200191611c84565b820191906000526020600020905b815481529060010190602001808311611c6757829003601f168201915b505050505081565b600080611c97611e64565b90506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634371c465836040518263ffffffff1660e01b8152600401611cf69190612fe8565b6020604051808303816000875af1158015611d15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3991906132da565b90506000806000806000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ea1c1690886040518263ffffffff1660e01b8152600401611d9e9190612fe8565b60c0604051808303816000875af1158015611dbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de1919061371f565b5080955081995082965083975084985050505050508515611e0c576000975050505050505050611e61565b6009851080611e1b5750600f85115b15611e30576000975050505050505050611e61565b600985148015611e405750601e81105b15611e55576000975050505050505050611e61565b60019750505050505050505b90565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166250155342600d546040518363ffffffff1660e01b8152600401611ec4929190613373565b6020604051808303816000875af1158015611ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0791906133b1565b905090565b600081601c52670a5a2e7a00000000600852826000526030600c2054905092915050565b6000611f3a611e64565b90506000806000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ea1c1690856040518263ffffffff1660e01b8152600401611f9c9190612fe8565b60c0604051808303816000875af1158015611fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdf919061371f565b909150905050809350819450829550505050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f9134e68866040518263ffffffff1660e01b815260040161204c9190612fe8565b602060405180830381865afa158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d91906133b1565b60008087815260200190815260200160002081905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330886040518463ffffffff1660e01b8152600401612102939291906137ac565b600060405180830381600087803b15801561211c57600080fd5b505af1158015612130573d6000803e3d6000fd5b5050505060006002600087815260200190815260200160002054036121a05760014361215c919061340d565b408560405160200161216f92919061382f565b6040516020818303038152906040528051906020012060001c60026000878152602001908152602001600020819055505b600060036000878152602001908152602001600020540361234c576000600160046000612710876121d1919061385b565b6064876121de919061385b565b866121e9919061389d565b6121f3919061389d565b81526020019081526020016000206000828254612210919061389d565b9250508190559050806003600088815260200190815260200160002081905550600560009054906101000a900460ff161561234a5760006001820361225f5767016345785d8a00009050612282565b600282036122765766b1a2bc2ec500009050612281565b66354a6ba7a1800090505b5b6000811180156122925750804710155b15612348576000803373ffffffffffffffffffffffffffffffffffffffff16836040516122be906132b0565b60006040518083038185875af1925050503d80600081146122fb576040519150601f19603f3d011682016040523d82523d6000602084013e612300565b606091505b509150915081612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233c9061391d565b60405180910390fd5b50505b505b505b61235633866128de565b5050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60046020528060005260406000206000915090505481565b6123a36126c5565b63389a75e1600c52806000526020600c2080544211156123cb57636f5e88186000526004601cfd5b60008155506123d9816127d6565b50565b6123e46126c5565b8060601b6123fa57637448fbae6000526004601cfd5b612403816127d6565b50565b600960149054906101000a900460ff1681565b60006020528060005260406000206000915090505481565b6124396126c5565b6001600560016101000a81548160ff021916908315150217905550565b600063389a75e1600c52816000526020600c20549050919050565b60008160e01c635b5e139f81146380ac58cd82146301ffc9a783141717915050919050565b60001960601c8281169250838116935081600052837f7d8825530a5a2e7a00000000000000000000000000000000000000000000000017601c5260206000208201820180548216806124f05763ceea21b66000526004601cfd5b80861486151761251757806000526030600c205461251657634b6e7f186000526004601cfd5b5b8482600101558385827f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600038a4505050505050565b612555611c8c565b612594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258b90613989565b60405180910390fd5b600960149054906101000a900460ff161561267b57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7ff15846040518163ffffffff1660e01b8152600401602060405180830381865afa158015612616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263a91906132da565b1561267a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267190613a41565b60405180910390fd5b5b6001600080838152602001908152602001600020600082825461269e919061389d565b925050819055506126b08383836129b2565b505050565b505050565b60006202a300905090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275433146126fb576382b429006000526004601cfd5b565b6000813b9050919050565b60405163150b7a028082523360208301528560601b60601c604083015283606083015260808083015282518060a0840152801561274f578060c08401826020870160045afa505b60208360a48301601c860160008a5af1612773573d15612772573d6000843e3d83fd5b5b8160e01b83511461278c5763d1a57ed66000526004601cfd5b50505050505050565b6000816000527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c526020600020820182015460601b60601c9050919050565b6127de6129b7565b15612844577fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278160601b60601c91508181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3811560ff1b821781555061289b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278160601b60601c91508181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3818155505b50565b6000816000527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c526020600020820182015460601b15159050919050565b6128ea6000838361254d565b8160601b60601c9150806000527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260206000208101810180548060601b1561293d5763c991cbb16000526004601cfd5b838117825583600052601c600c20600181540163ffffffff811686026129725767ea553b3401336cea861560021b526004601cfd5b8082555050828460007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600038a450506129ae600083836126b5565b5050565b505050565b600090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a05816129d0565b8114612a1057600080fd5b50565b600081359050612a22816129fc565b92915050565b600060208284031215612a3e57612a3d6129c6565b5b6000612a4c84828501612a13565b91505092915050565b60008115159050919050565b612a6a81612a55565b82525050565b6000602082019050612a856000830184612a61565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ac5578082015181840152602081019050612aaa565b60008484015250505050565b6000601f19601f8301169050919050565b6000612aed82612a8b565b612af78185612a96565b9350612b07818560208601612aa7565b612b1081612ad1565b840191505092915050565b60006020820190508181036000830152612b358184612ae2565b905092915050565b6000819050919050565b612b5081612b3d565b8114612b5b57600080fd5b50565b600081359050612b6d81612b47565b92915050565b600060208284031215612b8957612b886129c6565b5b6000612b9784828501612b5e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bcb82612ba0565b9050919050565b612bdb81612bc0565b82525050565b6000602082019050612bf66000830184612bd2565b92915050565b612c0581612bc0565b8114612c1057600080fd5b50565b600081359050612c2281612bfc565b92915050565b60008060408385031215612c3f57612c3e6129c6565b5b6000612c4d85828601612c13565b9250506020612c5e85828601612b5e565b9150509250929050565b6000819050919050565b6000612c8d612c88612c8384612ba0565b612c68565b612ba0565b9050919050565b6000612c9f82612c72565b9050919050565b6000612cb182612c94565b9050919050565b612cc181612ca6565b82525050565b6000602082019050612cdc6000830184612cb8565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d2482612ad1565b810181811067ffffffffffffffff82111715612d4357612d42612cec565b5b80604052505050565b6000612d566129bc565b9050612d628282612d1b565b919050565b600067ffffffffffffffff821115612d8257612d81612cec565b5b612d8b82612ad1565b9050602081019050919050565b82818337600083830152505050565b6000612dba612db584612d67565b612d4c565b905082815260208101848484011115612dd657612dd5612ce7565b5b612de1848285612d98565b509392505050565b600082601f830112612dfe57612dfd612ce2565b5b8135612e0e848260208601612da7565b91505092915050565b60008060008060808587031215612e3157612e306129c6565b5b6000612e3f87828801612c13565b9450506020612e5087828801612c13565b9350506040612e6187828801612b5e565b925050606085013567ffffffffffffffff811115612e8257612e816129cb565b5b612e8e87828801612de9565b91505092959194509250565b612ea3816129d0565b82525050565b6000602082019050612ebe6000830184612e9a565b92915050565b6000612ecf82612c94565b9050919050565b612edf81612ec4565b82525050565b6000602082019050612efa6000830184612ed6565b92915050565b600080600060608486031215612f1957612f186129c6565b5b6000612f2786828701612c13565b9350506020612f3886828701612c13565b9250506040612f4986828701612b5e565b9150509250925092565b612f5c81612a55565b8114612f6757600080fd5b50565b600081359050612f7981612f53565b92915050565b600060208284031215612f9557612f946129c6565b5b6000612fa384828501612f6a565b91505092915050565b600060208284031215612fc257612fc16129c6565b5b6000612fd084828501612c13565b91505092915050565b612fe281612b3d565b82525050565b6000602082019050612ffd6000830184612fd9565b92915050565b600061300e82612c94565b9050919050565b61301e81613003565b82525050565b60006020820190506130396000830184613015565b92915050565b60008060408385031215613056576130556129c6565b5b600061306485828601612c13565b925050602061307585828601612f6a565b9150509250929050565b600080fd5b600080fd5b60008083601f84011261309f5761309e612ce2565b5b8235905067ffffffffffffffff8111156130bc576130bb61307f565b5b6020830191508360018202830111156130d8576130d7613084565b5b9250929050565b6000806000806000608086880312156130fb576130fa6129c6565b5b600061310988828901612c13565b955050602061311a88828901612c13565b945050604061312b88828901612b5e565b935050606086013567ffffffffffffffff81111561314c5761314b6129cb565b5b61315888828901613089565b92509250509295509295909350565b600061317282612c94565b9050919050565b61318281613167565b82525050565b600060208201905061319d6000830184613179565b92915050565b600080604083850312156131ba576131b96129c6565b5b60006131c885828601612c13565b92505060206131d985828601612c13565b9150509250929050565b60006131ee82612c94565b9050919050565b6131fe816131e3565b82525050565b600060208201905061321960008301846131f5565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061326657607f821691505b6020821081036132795761327861321f565b5b50919050565b600081905092915050565b50565b600061329a60008361327f565b91506132a58261328a565b600082019050919050565b60006132bb8261328d565b9150819050919050565b6000815190506132d481612f53565b92915050565b6000602082840312156132f0576132ef6129c6565b5b60006132fe848285016132c5565b91505092915050565b7f43616e277420737761702072656e64657265727320616e796d6f726500000000600082015250565b600061333d601c83612a96565b915061334882613307565b602082019050919050565b6000602082019050818103600083015261336c81613330565b9050919050565b60006040820190506133886000830185612fd9565b6133956020830184612fd9565b9392505050565b6000815190506133ab81612b47565b92915050565b6000602082840312156133c7576133c66129c6565b5b60006133d58482850161339c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061341882612b3d565b915061342383612b3d565b925082820390508181111561343b5761343a6133de565b5b92915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061349d602f83612a96565b91506134a882613441565b604082019050919050565b600060208201905081810360008301526134cc81613490565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61353781612b3d565b82525050565b6000613549838361352e565b60208301905092915050565b6000602082019050919050565b600061356d82613502565b613577818561350d565b93506135828361351e565b8060005b838110156135b357815161359a888261353d565b97506135a583613555565b925050600181019050613586565b5085935050505092915050565b600060208201905081810360008301526135da8184613562565b905092915050565b600067ffffffffffffffff8211156135fd576135fc612cec565b5b61360682612ad1565b9050602081019050919050565b6000613626613621846135e2565b612d4c565b90508281526020810184848401111561364257613641612ce7565b5b61364d848285612aa7565b509392505050565b600082601f83011261366a57613669612ce2565b5b815161367a848260208601613613565b91505092915050565b600060208284031215613699576136986129c6565b5b600082015167ffffffffffffffff8111156136b7576136b66129cb565b5b6136c384828501613655565b91505092915050565b600081905092915050565b60006136e282612a8b565b6136ec81856136cc565b93506136fc818560208601612aa7565b80840191505092915050565b600061371482846136d7565b915081905092915050565b60008060008060008060c0878903121561373c5761373b6129c6565b5b600061374a89828a0161339c565b965050602061375b89828a0161339c565b955050604061376c89828a0161339c565b945050606061377d89828a0161339c565b935050608061378e89828a0161339c565b92505060a061379f89828a0161339c565b9150509295509295509295565b60006060820190506137c16000830186612bd2565b6137ce6020830185612bd2565b6137db6040830184612fd9565b949350505050565b6000819050919050565b6000819050919050565b613808613803826137e3565b6137ed565b82525050565b6000819050919050565b61382961382482612b3d565b61380e565b82525050565b600061383b82856137f7565b60208201915061384b8284613818565b6020820191508190509392505050565b600061386682612b3d565b915061387183612b3d565b925082820261387f81612b3d565b91508282048414831517613896576138956133de565b5b5092915050565b60006138a882612b3d565b91506138b383612b3d565b92508282019050808211156138cb576138ca6133de565b5b92915050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b6000613907601483612a96565b9150613912826138d1565b602082019050919050565b60006020820190508181036000830152613936816138fa565b9050919050565b7f4f75747369646520726567756c61722074726164696e6720686f757273000000600082015250565b6000613973601d83612a96565b915061397e8261393d565b602082019050919050565b600060208201905081810360008301526139a281613966565b9050919050565b7f4369726375697420627265616b6572207472696767657265643a205472616e7360008201527f6665722066756e6374696f6e616c69747920686173206265656e2068616c746560208201527f642e000000000000000000000000000000000000000000000000000000000000604082015250565b6000613a2b604283612a96565b9150613a36826139a9565b606082019050919050565b60006020820190508181036000830152613a5a81613a1e565b905091905056fea264697066735822122098314be511f08d386f104297820034143a15993c57189bb0397a2a614d79f66664736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000648c6326135fcde9bd3f712514dafe85afdd14980000000000000000000000004d04bba7f5ea45ac59769a1095762467b1157cc4000000000000000000000000d6b228d9eb4b7129de0dac548e06a381dd1c912e000000000000000000000000100f7ce4ec5f3d8038bf8615bdc3b86873364536000000000000000000000000392859b2aa50cd5d6e9b2bbc7661dd026318ae56
-----Decoded View---------------
Arg [0] : tradFiRenderer (address): 0x648C6326135FcdE9BD3F712514dAFe85Afdd1498
Arg [1] : tradFiLines (address): 0x4d04bBA7f5eA45ac59769a1095762467B1157CC4
Arg [2] : tradFiLinesColor (address): 0xd6b228d9Eb4B7129de0DAC548E06a381dd1C912e
Arg [3] : circuitBreakerAddress (address): 0x100F7cE4EC5f3D8038bF8615BdC3b86873364536
Arg [4] : bokkyPooBahsDateTimeContractAddress (address): 0x392859B2AA50cD5D6E9b2BBC7661DD026318AE56
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000648c6326135fcde9bd3f712514dafe85afdd1498
Arg [1] : 0000000000000000000000004d04bba7f5ea45ac59769a1095762467b1157cc4
Arg [2] : 000000000000000000000000d6b228d9eb4b7129de0dac548e06a381dd1c912e
Arg [3] : 000000000000000000000000100f7ce4ec5f3d8038bf8615bdc3b86873364536
Arg [4] : 000000000000000000000000392859b2aa50cd5d6e9b2bbc7661dd026318ae56
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.