Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,589 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Add Lore | 24132321 | 19 days ago | IN | 0 ETH | 0.00028431 | ||||
| Add Lore | 24132303 | 19 days ago | IN | 0 ETH | 0.00031991 | ||||
| Add Lore | 24122653 | 21 days ago | IN | 0 ETH | 0.0000071 | ||||
| Add Lore | 24122652 | 21 days ago | IN | 0 ETH | 0.00000886 | ||||
| Add Lore | 23938097 | 46 days ago | IN | 0 ETH | 0.00000425 | ||||
| Add Lore | 23230639 | 145 days ago | IN | 0 ETH | 0.00002991 | ||||
| Add Lore | 23082140 | 166 days ago | IN | 0 ETH | 0.00018688 | ||||
| Add Lore | 23064817 | 169 days ago | IN | 0 ETH | 0.00016482 | ||||
| Add Lore | 23059637 | 169 days ago | IN | 0 ETH | 0.00034893 | ||||
| Add Lore | 23059471 | 169 days ago | IN | 0 ETH | 0.00034275 | ||||
| Add Lore | 23049934 | 171 days ago | IN | 0 ETH | 0.00031735 | ||||
| Add Lore | 23036416 | 173 days ago | IN | 0 ETH | 0.00065281 | ||||
| Add Lore | 23034995 | 173 days ago | IN | 0 ETH | 0.0006601 | ||||
| Add Lore | 22979342 | 181 days ago | IN | 0 ETH | 0.00008428 | ||||
| Add Lore | 22979341 | 181 days ago | IN | 0 ETH | 0.00006633 | ||||
| Add Lore | 22979051 | 181 days ago | IN | 0 ETH | 0.00034066 | ||||
| Add Lore | 22979041 | 181 days ago | IN | 0 ETH | 0.00034204 | ||||
| Add Lore | 22979039 | 181 days ago | IN | 0 ETH | 0.00034463 | ||||
| Add Lore | 22971269 | 182 days ago | IN | 0 ETH | 0.00034233 | ||||
| Add Lore | 22957424 | 184 days ago | IN | 0 ETH | 0.00032845 | ||||
| Add Lore | 22956016 | 184 days ago | IN | 0 ETH | 0.0001123 | ||||
| Add Lore | 22890250 | 193 days ago | IN | 0 ETH | 0.00184369 | ||||
| Add Lore | 22846197 | 199 days ago | IN | 0 ETH | 0.00047188 | ||||
| Add Lore | 22846195 | 199 days ago | IN | 0 ETH | 0.00037481 | ||||
| Add Lore | 22846123 | 199 days ago | IN | 0 ETH | 0.00056316 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BookOfLore
Compiler Version
v0.8.0+commit.c7dfd78e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@///@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@///////////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@////////////////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@////////////////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@////////....../////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@////////....../////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@///////////....../////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//////..... /////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//////..... /////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@****** ....../////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@****** ....../////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@////// //////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//// //////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#### ######@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/////(((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................*****@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................*****@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................***********@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................***********@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................***********......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................***********......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......................*****......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......................*****......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......................*****......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................***********@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................***********@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......................*****@@@@@@@@@@@@(((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......................*****@@@@@@@@(((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......................*****@@@@@@(((((((((@@@@@((((((((@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......................*****@@@@@@(((((((((@@@@@@@@(((((@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........,,,,,,,,,,,*****%%%%%%((((((@@@@@@@@@@@(((((@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........****************((((((((((((@@@@@@@@@(((((((@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@############,,,,,,,,,,,***********/////((((((%%%%%%@@@@@%%%%(((((%%@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@**********************************(((((((((((@@@@@@@@@@@((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@**********************************(((((((((((@@@@@@@@@@@((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@((((((****************(((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@((((((****************(((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(((((((((((((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(((((((((((((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
pragma solidity ^0.8.0;
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';
import '@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol';
/**
* @title The Book of Lore
*/
contract BookOfLore is Ownable, EIP712 {
struct Lore {
address creator;
uint256 parentLoreId;
bool nsfw;
bool struck;
string loreMetadataURI;
}
// tokenContract tokenId loreId
mapping(address => mapping(uint256 => Lore[])) public tokenLore;
mapping(address => bool) public loreTokenContractAllowlist;
mapping(address => bool) public scribeAllowlist;
event LoreAdded(address tokenContract, uint256 tokenId, uint256 loreIdx);
event LoreUpdated(address tokenContract, uint256 tokenId, uint256 loreIdx);
event LoreStruck(address tokenContract, uint256 tokenId, uint256 loreIdx);
modifier onlyAllowedTokenContract(address tokenContract) {
require(
loreTokenContractAllowlist[tokenContract],
'tokenContract is not on the allowlist'
);
_;
}
constructor() EIP712('BookOfLore', '1') {}
function numLore(address tokenContract, uint256 tokenId)
public
view
returns (uint256)
{
return tokenLore[tokenContract][tokenId].length;
}
function loreFor(address tokenContract, uint256 tokenId)
public
view
returns (Lore[] memory)
{
return tokenLore[tokenContract][tokenId];
}
function loreAt(
address tokenContract,
uint256 tokenId,
uint256 startIdx,
uint256 endIdx
) public view returns (Lore[] memory) {
Lore[] memory l = new Lore[](endIdx - startIdx + 1);
uint256 length = endIdx - startIdx + 1;
for (uint256 i = 0; i < length; i++) {
l[i] = tokenLore[tokenContract][tokenId][startIdx + i];
}
return l;
}
function setLoreTokenAllowlist(address tokenContract, bool isListed)
public
onlyOwner
{
loreTokenContractAllowlist[tokenContract] = isListed;
}
function setScribeAllowlist(address scribeAddress, bool isScribe)
public
onlyOwner
{
scribeAllowlist[scribeAddress] = isScribe;
}
function addLore(
address tokenContract,
uint256 tokenId,
uint256 parentLoreId,
bool nsfw,
string memory loreMetadataURI
) public onlyAllowedTokenContract(tokenContract) {
address tokenOwner = IERC721(tokenContract).ownerOf(tokenId);
require(
tokenOwner == _msgSender(),
'Owner: caller is not the token owner'
);
tokenLore[tokenContract][tokenId].push(
Lore(_msgSender(), parentLoreId, nsfw, false, loreMetadataURI)
);
emit LoreAdded(
tokenContract,
tokenId,
tokenLore[tokenContract][tokenId].length - 1
);
}
function addLoreWithSignature(
bytes memory signature,
address tokenContract,
uint256 tokenId,
uint256 loreId,
uint256 parentLoreId,
bool nsfw,
string memory loreMetadataURI
) public onlyAllowedTokenContract(tokenContract) {
// construct an expected hash, given the parameters
bytes32 digest = _hashTypedDataV4(
keccak256(
abi.encode(
keccak256(
'AddLore(address tokenContract,uint256 tokenId,uint256 loreId,uint256 parentLoreId,bool nsfw,string loreMetadataURI)'
),
tokenContract,
tokenId,
loreId, // acts as nonce
parentLoreId,
nsfw,
keccak256(bytes(loreMetadataURI)) // tricky!
)
)
);
// now recover the signer from the provided signature
address signer = ECDSA.recover(digest, signature);
// make sure the recover extracted a signer, but beware, because this
// can return non-zero for some invalid cases (apparently?)
require(signer != address(0), 'ECDSA: invalid signature');
// get the owner of this wizard
address tokenOwner = IERC721(tokenContract).ownerOf(tokenId);
require(
signer == tokenOwner,
'addLoreWithSignature: signature is not the current token owner'
);
require(
numLore(tokenContract, tokenId) == loreId,
'addLoreWithSignature: loreId is stale'
);
tokenLore[tokenContract][tokenId].push(
Lore(signer, parentLoreId, nsfw, false, loreMetadataURI)
);
emit LoreAdded(
tokenContract,
tokenId,
tokenLore[tokenContract][tokenId].length - 1
);
}
/**
* A Scribe is a contract that is allowed to write Lore *if* the transaction
* originated from the token owner. For example, The Great Burning may write
* the death of a Wizard and the inception of their Soul
*/
function addLoreWithScribe(
address tokenContract,
uint256 tokenId,
uint256 parentLoreId,
bool nsfw,
string memory loreMetadataURI
) public onlyAllowedTokenContract(tokenContract) {
require(scribeAllowlist[_msgSender()], 'sender is not a Scribe');
address tokenOwner = IERC721(tokenContract).ownerOf(tokenId);
require(
tokenOwner == tx.origin, // ! - note that msg.sender must be a Scribe for this to work
'Owner: tx.origin is not the token owner'
);
tokenLore[tokenContract][tokenId].push(
// we credit this lore to the Scribe, not the token owner
Lore(_msgSender(), parentLoreId, nsfw, false, loreMetadataURI)
);
emit LoreAdded(
tokenContract,
tokenId,
tokenLore[tokenContract][tokenId].length - 1
);
}
function updateLoreMetadataURI(
address tokenContract,
uint256 tokenId,
uint256 loreIdx,
string memory newLoreMetadataURI
) public onlyAllowedTokenContract(tokenContract) {
// is lore creator
require(
tokenLore[tokenContract][tokenId][loreIdx].creator == _msgSender(),
'Owner: caller is not the Lore creator'
);
// holds wizard currently
address tokenOwner = IERC721(tokenContract).ownerOf(tokenId);
require(
tokenOwner == _msgSender(),
'Owner: caller is not the token owner'
);
tokenLore[tokenContract][tokenId][loreIdx]
.loreMetadataURI = newLoreMetadataURI;
emit LoreUpdated(tokenContract, tokenId, loreIdx);
}
function updateLoreNSFW(
address tokenContract,
uint256 tokenId,
uint256 loreIdx,
bool newNSFW
) public onlyAllowedTokenContract(tokenContract) {
address tokenOwner = IERC721(tokenContract).ownerOf(tokenId);
require(
(tokenLore[tokenContract][tokenId][loreIdx].creator ==
_msgSender() &&
tokenOwner == _msgSender()) || (owner() == _msgSender()),
'Owner: caller is neither the Lore creator nor the Lore Master'
);
tokenLore[tokenContract][tokenId][loreIdx].nsfw = newNSFW;
emit LoreUpdated(tokenContract, tokenId, loreIdx);
}
function strikeLore(
address tokenContract,
uint256 tokenId,
uint256 loreIdx,
bool newStruck
) public onlyAllowedTokenContract(tokenContract) {
address tokenOwner = IERC721(tokenContract).ownerOf(tokenId);
require(
(tokenLore[tokenContract][tokenId][loreIdx].creator ==
_msgSender() &&
tokenOwner == _msgSender()) || (owner() == _msgSender()),
'Owner: caller is neither the Lore creator nor the Lore Master'
);
tokenLore[tokenContract][tokenId][loreIdx].struck = newStruck;
emit LoreStruck(tokenContract, tokenId, loreIdx);
}
function domainSeparator() external view returns (bytes32) {
return _domainSeparatorV4();
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_setOwner(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
// Check the signature length
// - case 65: r,s,v signature (standard)
// - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return recover(hash, v, r, s);
} else if (signature.length == 64) {
bytes32 r;
bytes32 vs;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
vs := mload(add(signature, 0x40))
}
return recover(hash, r, vs);
} else {
revert("ECDSA: invalid signature length");
}
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
bytes32 s;
uint8 v;
assembly {
s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
v := add(shr(255, vs), 27)
}
return recover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`, `r` and `s` signature fields separately.
*/
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
require(
uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0,
"ECDSA: invalid signature 's' value"
);
require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
require(signer != address(0), "ECDSA: invalid signature");
return signer;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
/**
* @dev Returns an Ethereum Signed Typed Data, created from a
* `domainSeparator` and a `structHash`. This produces hash corresponding
* to the one signed with the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
* JSON-RPC method as part of EIP-712.
*
* See {recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./ECDSA.sol";
/**
* @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
*
* The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
* thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
* they need in their contracts using a combination of `abi.encode` and `keccak256`.
*
* This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
* scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
* ({_hashTypedDataV4}).
*
* The implementation of the domain separator was designed to be as efficient as possible while still properly updating
* the chain id to protect against replay attacks on an eventual fork of the chain.
*
* NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
* https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
*
* _Available since v3.4._
*/
abstract contract EIP712 {
/* solhint-disable var-name-mixedcase */
// Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
// invalidate the cached domain separator if the chain id changes.
bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
uint256 private immutable _CACHED_CHAIN_ID;
bytes32 private immutable _HASHED_NAME;
bytes32 private immutable _HASHED_VERSION;
bytes32 private immutable _TYPE_HASH;
/* solhint-enable var-name-mixedcase */
/**
* @dev Initializes the domain separator and parameter caches.
*
* The meaning of `name` and `version` is specified in
* https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
*
* - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
* - `version`: the current major version of the signing domain.
*
* NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
* contract upgrade].
*/
constructor(string memory name, string memory version) {
bytes32 hashedName = keccak256(bytes(name));
bytes32 hashedVersion = keccak256(bytes(version));
bytes32 typeHash = keccak256(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
);
_HASHED_NAME = hashedName;
_HASHED_VERSION = hashedVersion;
_CACHED_CHAIN_ID = block.chainid;
_CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
_TYPE_HASH = typeHash;
}
/**
* @dev Returns the domain separator for the current chain.
*/
function _domainSeparatorV4() internal view returns (bytes32) {
if (block.chainid == _CACHED_CHAIN_ID) {
return _CACHED_DOMAIN_SEPARATOR;
} else {
return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
}
}
function _buildDomainSeparator(
bytes32 typeHash,
bytes32 nameHash,
bytes32 versionHash
) private view returns (bytes32) {
return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
}
/**
* @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
* function returns the hash of the fully encoded EIP712 message for this domain.
*
* This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
*
* ```solidity
* bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
* keccak256("Mail(address to,string contents)"),
* mailTo,
* keccak256(bytes(mailContents))
* )));
* address signer = ECDSA.recover(digest, signature);
* ```
*/
function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loreIdx","type":"uint256"}],"name":"LoreAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loreIdx","type":"uint256"}],"name":"LoreStruck","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loreIdx","type":"uint256"}],"name":"LoreUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"parentLoreId","type":"uint256"},{"internalType":"bool","name":"nsfw","type":"bool"},{"internalType":"string","name":"loreMetadataURI","type":"string"}],"name":"addLore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"parentLoreId","type":"uint256"},{"internalType":"bool","name":"nsfw","type":"bool"},{"internalType":"string","name":"loreMetadataURI","type":"string"}],"name":"addLoreWithScribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"loreId","type":"uint256"},{"internalType":"uint256","name":"parentLoreId","type":"uint256"},{"internalType":"bool","name":"nsfw","type":"bool"},{"internalType":"string","name":"loreMetadataURI","type":"string"}],"name":"addLoreWithSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"startIdx","type":"uint256"},{"internalType":"uint256","name":"endIdx","type":"uint256"}],"name":"loreAt","outputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"parentLoreId","type":"uint256"},{"internalType":"bool","name":"nsfw","type":"bool"},{"internalType":"bool","name":"struck","type":"bool"},{"internalType":"string","name":"loreMetadataURI","type":"string"}],"internalType":"struct BookOfLore.Lore[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"loreFor","outputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"parentLoreId","type":"uint256"},{"internalType":"bool","name":"nsfw","type":"bool"},{"internalType":"bool","name":"struck","type":"bool"},{"internalType":"string","name":"loreMetadataURI","type":"string"}],"internalType":"struct BookOfLore.Lore[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"loreTokenContractAllowlist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"numLore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"scribeAllowlist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"bool","name":"isListed","type":"bool"}],"name":"setLoreTokenAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"scribeAddress","type":"address"},{"internalType":"bool","name":"isScribe","type":"bool"}],"name":"setScribeAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"loreIdx","type":"uint256"},{"internalType":"bool","name":"newStruck","type":"bool"}],"name":"strikeLore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenLore","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"parentLoreId","type":"uint256"},{"internalType":"bool","name":"nsfw","type":"bool"},{"internalType":"bool","name":"struck","type":"bool"},{"internalType":"string","name":"loreMetadataURI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"loreIdx","type":"uint256"},{"internalType":"string","name":"newLoreMetadataURI","type":"string"}],"name":"updateLoreMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"loreIdx","type":"uint256"},{"internalType":"bool","name":"newNSFW","type":"bool"}],"name":"updateLoreNSFW","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6101206040523480156200001257600080fd5b506040518060400160405280600a815260200169426f6f6b4f664c6f726560b01b815250604051806040016040528060018152602001603160f81b8152506200006a62000064620000cc60201b60201c565b620000d0565b815160208084019190912082519183019190912060c082905260e08190524660a0527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ba81848462000120565b60805261010052506200018892505050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600083838346306040516020016200013d9594939291906200015c565b6040516020818303038152906040528051906020012090509392505050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60805160a05160c05160e05161010051612463620001cd600039600061174d0152600061178f0152600061176e015260006116fb0152600061172401526124636000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806398e91529116100a2578063d87dd50011610071578063d87dd5001461023b578063ea76b8bd1461024e578063f2fde38b14610261578063f6545ec514610274578063f698da251461029857610116565b806398e91529146101ef5780639fe3220c14610202578063c272a2c114610215578063cfc245011461022857610116565b80635a746d7d116100e95780635a746d7d1461018c578063715018a61461019f578063723b0763146101a75780638da5cb5b146101c7578063938a6a41146101dc57610116565b806304bf4a211461011b5780630e25de40146101305780631a491e3a146101595780634639dc5714610179575b600080fd5b61012e610129366004611b05565b6102a0565b005b61014361013e366004611cb2565b610313565b6040516101509190611e7e565b60405180910390f35b61016c610167366004611acd565b610537565b6040516101509190611f1d565b61012e610187366004611b05565b61054c565b61014361019a366004611b39565b6105b6565b61012e610709565b6101ba6101b5366004611b39565b610754565b6040516101509190611f28565b6101cf61077c565b6040516101509190611e07565b61012e6101ea366004611c51565b61078c565b61012e6101fd366004611b98565b6109b5565b61012e610210366004611b98565b610be7565b61016c610223366004611acd565b610e19565b61012e610236366004611bdf565b610e2e565b61012e610249366004611cec565b6110bb565b61012e61025c366004611bdf565b6113ab565b61012e61026f366004611acd565b61149e565b610287610282366004611b64565b61150f565b604051610150959493929190611e1b565b6101ba611605565b6102a8611614565b6001600160a01b03166102b961077c565b6001600160a01b0316146102e85760405162461bcd60e51b81526004016102df90612260565b60405180910390fd5b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b60606000610321848461237f565b61032c906001612367565b67ffffffffffffffff81111561035257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561038b57816020015b610378611947565b8152602001906001900390816103705790505b509050600061039a858561237f565b6103a5906001612367565b905060005b8181101561052b576001600160a01b03881660009081526001602090815260408083208a845290915290206103df8288612367565b815481106103fd57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160a081018252600490930290910180546001600160a01b03168352600181015493830193909352600283015460ff8082161515928401929092526101009004161515606082015260038201805491929160808401919061046b90612396565b80601f016020809104026020016040519081016040528092919081815260200182805461049790612396565b80156104e45780601f106104b9576101008083540402835291602001916104e4565b820191906000526020600020905b8154815290600101906020018083116104c757829003601f168201915b50505050508152505083828151811061050d57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080610523906123d1565b9150506103aa565b50909695505050505050565b60026020526000908152604090205460ff1681565b610554611614565b6001600160a01b031661056561077c565b6001600160a01b03161461058b5760405162461bcd60e51b81526004016102df90612260565b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b6001600160a01b03821660009081526001602090815260408083208484528252808320805482518185028101850190935280835260609492939192909184015b828210156106fc5760008481526020908190206040805160a0810182526004860290920180546001600160a01b03168352600181015493830193909352600283015460ff8082161515928401929092526101009004161515606082015260038201805491929160808401919061066b90612396565b80601f016020809104026020016040519081016040528092919081815260200182805461069790612396565b80156106e45780601f106106b9576101008083540402835291602001916106e4565b820191906000526020600020905b8154815290600101906020018083116106c757829003601f168201915b505050505081525050815260200190600101906105f6565b5050505090505b92915050565b610711611614565b6001600160a01b031661072261077c565b6001600160a01b0316146107485760405162461bcd60e51b81526004016102df90612260565b6107526000611618565b565b6001600160a01b03919091166000908152600160209081526040808320938352929052205490565b6000546001600160a01b03165b90565b6001600160a01b038416600090815260026020526040902054849060ff166107c65760405162461bcd60e51b81526004016102df906122c5565b6107ce611614565b6001600160a01b0386811660009081526001602090815260408083208984529091529020805492909116918590811061081757634e487b7160e01b600052603260045260246000fd5b60009182526020909120600490910201546001600160a01b03161461084e5760405162461bcd60e51b81526004016102df90612153565b6040516331a9108f60e11b81526000906001600160a01b03871690636352211e9061087d908890600401611f28565b60206040518083038186803b15801561089557600080fd5b505afa1580156108a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108cd9190611ae9565b90506108d7611614565b6001600160a01b0316816001600160a01b0316146109075760405162461bcd60e51b81526004016102df90612198565b6001600160a01b0386166000908152600160209081526040808320888452909152902080548491908690811061094d57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600402016003019080519060200190610971929190611983565b507f651b516a6c18e276c39e293fc63842f42c41fcfda43edb72e46e66454c38f8198686866040516109a593929190611e5d565b60405180910390a1505050505050565b6001600160a01b038416600090815260026020526040902054849060ff166109ef5760405162461bcd60e51b81526004016102df906122c5565b6040516331a9108f60e11b81526000906001600160a01b03871690636352211e90610a1e908890600401611f28565b60206040518083038186803b158015610a3657600080fd5b505afa158015610a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6e9190611ae9565b9050610a78611614565b6001600160a01b0387811660009081526001602090815260408083208a845290915290208054929091169186908110610ac157634e487b7160e01b600052603260045260246000fd5b60009182526020909120600490910201546001600160a01b0316148015610b005750610aeb611614565b6001600160a01b0316816001600160a01b0316145b80610b2a5750610b0e611614565b6001600160a01b0316610b1f61077c565b6001600160a01b0316145b610b465760405162461bcd60e51b81526004016102df90612032565b6001600160a01b03861660009081526001602090815260408083208884529091529020805484919086908110610b8c57634e487b7160e01b600052603260045260246000fd5b906000526020600020906004020160020160006101000a81548160ff0219169083151502179055507f651b516a6c18e276c39e293fc63842f42c41fcfda43edb72e46e66454c38f8198686866040516109a593929190611e5d565b6001600160a01b038416600090815260026020526040902054849060ff16610c215760405162461bcd60e51b81526004016102df906122c5565b6040516331a9108f60e11b81526000906001600160a01b03871690636352211e90610c50908890600401611f28565b60206040518083038186803b158015610c6857600080fd5b505afa158015610c7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca09190611ae9565b9050610caa611614565b6001600160a01b0387811660009081526001602090815260408083208a845290915290208054929091169186908110610cf357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600490910201546001600160a01b0316148015610d325750610d1d611614565b6001600160a01b0316816001600160a01b0316145b80610d5c5750610d40611614565b6001600160a01b0316610d5161077c565b6001600160a01b0316145b610d785760405162461bcd60e51b81526004016102df90612032565b6001600160a01b03861660009081526001602090815260408083208884529091529020805484919086908110610dbe57634e487b7160e01b600052603260045260246000fd5b906000526020600020906004020160020160016101000a81548160ff0219169083151502179055507f4413e2dcebea319d21644448dc47e1690fbb06c569f44bda426d293a027b9b198686866040516109a593929190611e5d565b60036020526000908152604090205460ff1681565b6001600160a01b038516600090815260026020526040902054859060ff16610e685760405162461bcd60e51b81526004016102df906122c5565b60036000610e74611614565b6001600160a01b0316815260208101919091526040016000205460ff16610ead5760405162461bcd60e51b81526004016102df90612295565b6040516331a9108f60e11b81526000906001600160a01b03881690636352211e90610edc908990600401611f28565b60206040518083038186803b158015610ef457600080fd5b505afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2c9190611ae9565b90506001600160a01b0381163214610f565760405162461bcd60e51b81526004016102df9061208f565b6001600160a01b038716600090815260016020908152604080832089845290915290819020815160a081019092529080610f8e611614565b6001600160a01b03908116825260208083018a90528815156040808501919091526000606080860182905260809586018b9052875460018082018a5598835291849020875160049093020180546001600160a01b0319169290951691909117845585830151968401969096558401516002830180549686015160ff199097169115159190911761ff0019166101009615159690960295909517909455908201518051929391926110449260038501920190611983565b5050506001600160a01b03871660009081526001602081815260408084208a8552909152909120547f7d97fb6e760200f3410aed6b36eae3b465593a033da403c0d89d9e91f9b8cb42918991899161109b9161237f565b6040516110aa93929190611e5d565b60405180910390a150505050505050565b6001600160a01b038616600090815260026020526040902054869060ff166110f55760405162461bcd60e51b81526004016102df906122c5565b60006111597f65ec70d7edfe4b6cd9678cd8845a2e5989f6f7aeafe07b59e688ae169fdee9ef8989898989898051906020012060405160200161113e9796959493929190611f31565b60405160208183030381529060405280519060200120611668565b90506000611167828b611683565b90506001600160a01b03811661118f5760405162461bcd60e51b81526004016102df90611fb6565b6040516331a9108f60e11b81526000906001600160a01b038b1690636352211e906111be908c90600401611f28565b60206040518083038186803b1580156111d657600080fd5b505afa1580156111ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120e9190611ae9565b9050806001600160a01b0316826001600160a01b0316146112415760405162461bcd60e51b81526004016102df9061230a565b8761124c8b8b610754565b146112695760405162461bcd60e51b81526004016102df90611fed565b6001600160a01b038a811660009081526001602081815260408084208e85528252808420815160a08101835288871681528084018e81528d151593820193845260608201878152608083018e81528454808901865594895297869020835160049095020180546001600160a01b0319169490991693909317885551948701949094559051600286018054925160ff199093169115159190911761ff001916610100921515929092029190911790559151805191939261133092600385019290910190611983565b5050506001600160a01b038a1660009081526001602081815260408084208d8552909152909120547f7d97fb6e760200f3410aed6b36eae3b465593a033da403c0d89d9e91f9b8cb42918c918c916113879161237f565b60405161139693929190611e5d565b60405180910390a15050505050505050505050565b6001600160a01b038516600090815260026020526040902054859060ff166113e55760405162461bcd60e51b81526004016102df906122c5565b6040516331a9108f60e11b81526000906001600160a01b03881690636352211e90611414908990600401611f28565b60206040518083038186803b15801561142c57600080fd5b505afa158015611440573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114649190611ae9565b905061146e611614565b6001600160a01b0316816001600160a01b031614610f565760405162461bcd60e51b81526004016102df90612198565b6114a6611614565b6001600160a01b03166114b761077c565b6001600160a01b0316146114dd5760405162461bcd60e51b81526004016102df90612260565b6001600160a01b0381166115035760405162461bcd60e51b81526004016102df9061210d565b61150c81611618565b50565b6001602052826000526040600020602052816000526040600020818154811061153757600080fd5b600091825260209091206004909102018054600182015460028301546003840180546001600160a01b03909416975091955060ff808216955061010090910416929161158290612396565b80601f01602080910402602001604051908101604052809291908181526020018280546115ae90612396565b80156115fb5780601f106115d0576101008083540402835291602001916115fb565b820191906000526020600020905b8154815290600101906020018083116115de57829003601f168201915b5050505050905085565b600061160f6116f7565b905090565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061167b6116756116f7565b836117ba565b90505b919050565b60008151604114156116b75760208201516040830151606084015160001a6116ad868285856117ed565b9350505050610703565b8151604014156116df57602082015160408301516116d68583836118e3565b92505050610703565b60405162461bcd60e51b81526004016102df906120d6565b60007f000000000000000000000000000000000000000000000000000000000000000046141561174857507f0000000000000000000000000000000000000000000000000000000000000000610789565b6117b37f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061190d565b9050610789565b600082826040516020016117cf929190611dec565b60405160208183030381529060405280519060200120905092915050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561182f5760405162461bcd60e51b81526004016102df906121dc565b8360ff16601b148061184457508360ff16601c145b6118605760405162461bcd60e51b81526004016102df9061221e565b6000600186868686604051600081526020016040526040516118859493929190611f98565b6020604051602081039080840390855afa1580156118a7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166118da5760405162461bcd60e51b81526004016102df90611fb6565b95945050505050565b60006001600160ff1b03821660ff83901c601b01611903868287856117ed565b9695505050505050565b60008383834630604051602001611928959493929190611f6c565b6040516020818303038152906040528051906020012090509392505050565b6040518060a0016040528060006001600160a01b0316815260200160008152602001600015158152602001600015158152602001606081525090565b82805461198f90612396565b90600052602060002090601f0160209004810192826119b157600085556119f7565b82601f106119ca57805160ff19168380011785556119f7565b828001600101855582156119f7579182015b828111156119f75782518255916020019190600101906119dc565b50611a03929150611a07565b5090565b5b80821115611a035760008155600101611a08565b600067ffffffffffffffff80841115611a3757611a37612402565b604051601f8501601f191681016020018281118282101715611a5b57611a5b612402565b604052848152915081838501861015611a7357600080fd5b8484602083013760006020868301015250509392505050565b803561167e81612418565b8035801515811461167e57600080fd5b600082601f830112611ab7578081fd5b611ac683833560208501611a1c565b9392505050565b600060208284031215611ade578081fd5b8135611ac681612418565b600060208284031215611afa578081fd5b8151611ac681612418565b60008060408385031215611b17578081fd5b8235611b2281612418565b9150611b3060208401611a97565b90509250929050565b60008060408385031215611b4b578182fd5b8235611b5681612418565b946020939093013593505050565b600080600060608486031215611b78578081fd5b8335611b8381612418565b95602085013595506040909401359392505050565b60008060008060808587031215611bad578081fd5b8435611bb881612418565b93506020850135925060408501359150611bd460608601611a97565b905092959194509250565b600080600080600060a08688031215611bf6578081fd5b8535611c0181612418565b94506020860135935060408601359250611c1d60608701611a97565b9150608086013567ffffffffffffffff811115611c38578182fd5b611c4488828901611aa7565b9150509295509295909350565b60008060008060808587031215611c66578384fd5b8435611c7181612418565b93506020850135925060408501359150606085013567ffffffffffffffff811115611c9a578182fd5b611ca687828801611aa7565b91505092959194509250565b60008060008060808587031215611cc7578384fd5b8435611cd281612418565b966020860135965060408601359560600135945092505050565b600080600080600080600060e0888a031215611d06578182fd5b873567ffffffffffffffff80821115611d1d578384fd5b818a0191508a601f830112611d30578384fd5b611d3f8b833560208501611a1c565b9850611d4d60208b01611a8c565b975060408a0135965060608a0135955060808a01359450611d7060a08b01611a97565b935060c08a0135915080821115611d85578283fd5b50611d928a828b01611aa7565b91505092959891949750929550565b60008151808452815b81811015611dc657602081850181015186830182015201611daa565b81811115611dd75782602083870101525b50601f01601f19169290920160200192915050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b600060018060a01b03871682528560208301528415156040830152831515606083015260a06080830152611e5260a0830184611da1565b979650505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b60208082528251828201819052600091906040908185019080840286018301878501865b83811015611f0f57888303603f19018552815180516001600160a01b0316845287810151888501528681015115158785015260608082015115159085015260809081015160a091850182905290611efb81860183611da1565b968901969450505090860190600101611ea2565b509098975050505050505050565b901515815260200190565b90815260200190565b9687526001600160a01b03959095166020870152604086019390935260608501919091526080840152151560a083015260c082015260e00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b93845260ff9290921660208401526040830152606082015260800190565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526025908201527f6164644c6f7265576974685369676e61747572653a206c6f72654964206973206040820152647374616c6560d81b606082015260800190565b6020808252603d908201527f4f776e65723a2063616c6c6572206973206e65697468657220746865204c6f7260408201527f652063726561746f72206e6f7220746865204c6f7265204d6173746572000000606082015260800190565b60208082526027908201527f4f776e65723a2074782e6f726967696e206973206e6f742074686520746f6b65604082015266371037bbb732b960c91b606082015260800190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526025908201527f4f776e65723a2063616c6c6572206973206e6f7420746865204c6f726520637260408201526432b0ba37b960d91b606082015260800190565b60208082526024908201527f4f776e65723a2063616c6c6572206973206e6f742074686520746f6b656e206f6040820152633bb732b960e11b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526016908201527573656e646572206973206e6f7420612053637269626560501b604082015260600190565b60208082526025908201527f746f6b656e436f6e7472616374206973206e6f74206f6e2074686520616c6c6f6040820152641ddb1a5cdd60da1b606082015260800190565b6020808252603e908201527f6164644c6f7265576974685369676e61747572653a207369676e61747572652060408201527f6973206e6f74207468652063757272656e7420746f6b656e206f776e65720000606082015260800190565b6000821982111561237a5761237a6123ec565b500190565b600082821015612391576123916123ec565b500390565b6002810460018216806123aa57607f821691505b602082108114156123cb57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156123e5576123e56123ec565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461150c57600080fdfea26469706673582212204ee1789c80bc1cb1732c991b67f98fb9f109a12b4a9865f855f6fc0638e8104364736f6c63430008000033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101165760003560e01c806398e91529116100a2578063d87dd50011610071578063d87dd5001461023b578063ea76b8bd1461024e578063f2fde38b14610261578063f6545ec514610274578063f698da251461029857610116565b806398e91529146101ef5780639fe3220c14610202578063c272a2c114610215578063cfc245011461022857610116565b80635a746d7d116100e95780635a746d7d1461018c578063715018a61461019f578063723b0763146101a75780638da5cb5b146101c7578063938a6a41146101dc57610116565b806304bf4a211461011b5780630e25de40146101305780631a491e3a146101595780634639dc5714610179575b600080fd5b61012e610129366004611b05565b6102a0565b005b61014361013e366004611cb2565b610313565b6040516101509190611e7e565b60405180910390f35b61016c610167366004611acd565b610537565b6040516101509190611f1d565b61012e610187366004611b05565b61054c565b61014361019a366004611b39565b6105b6565b61012e610709565b6101ba6101b5366004611b39565b610754565b6040516101509190611f28565b6101cf61077c565b6040516101509190611e07565b61012e6101ea366004611c51565b61078c565b61012e6101fd366004611b98565b6109b5565b61012e610210366004611b98565b610be7565b61016c610223366004611acd565b610e19565b61012e610236366004611bdf565b610e2e565b61012e610249366004611cec565b6110bb565b61012e61025c366004611bdf565b6113ab565b61012e61026f366004611acd565b61149e565b610287610282366004611b64565b61150f565b604051610150959493929190611e1b565b6101ba611605565b6102a8611614565b6001600160a01b03166102b961077c565b6001600160a01b0316146102e85760405162461bcd60e51b81526004016102df90612260565b60405180910390fd5b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b60606000610321848461237f565b61032c906001612367565b67ffffffffffffffff81111561035257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561038b57816020015b610378611947565b8152602001906001900390816103705790505b509050600061039a858561237f565b6103a5906001612367565b905060005b8181101561052b576001600160a01b03881660009081526001602090815260408083208a845290915290206103df8288612367565b815481106103fd57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160a081018252600490930290910180546001600160a01b03168352600181015493830193909352600283015460ff8082161515928401929092526101009004161515606082015260038201805491929160808401919061046b90612396565b80601f016020809104026020016040519081016040528092919081815260200182805461049790612396565b80156104e45780601f106104b9576101008083540402835291602001916104e4565b820191906000526020600020905b8154815290600101906020018083116104c757829003601f168201915b50505050508152505083828151811061050d57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080610523906123d1565b9150506103aa565b50909695505050505050565b60026020526000908152604090205460ff1681565b610554611614565b6001600160a01b031661056561077c565b6001600160a01b03161461058b5760405162461bcd60e51b81526004016102df90612260565b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b6001600160a01b03821660009081526001602090815260408083208484528252808320805482518185028101850190935280835260609492939192909184015b828210156106fc5760008481526020908190206040805160a0810182526004860290920180546001600160a01b03168352600181015493830193909352600283015460ff8082161515928401929092526101009004161515606082015260038201805491929160808401919061066b90612396565b80601f016020809104026020016040519081016040528092919081815260200182805461069790612396565b80156106e45780601f106106b9576101008083540402835291602001916106e4565b820191906000526020600020905b8154815290600101906020018083116106c757829003601f168201915b505050505081525050815260200190600101906105f6565b5050505090505b92915050565b610711611614565b6001600160a01b031661072261077c565b6001600160a01b0316146107485760405162461bcd60e51b81526004016102df90612260565b6107526000611618565b565b6001600160a01b03919091166000908152600160209081526040808320938352929052205490565b6000546001600160a01b03165b90565b6001600160a01b038416600090815260026020526040902054849060ff166107c65760405162461bcd60e51b81526004016102df906122c5565b6107ce611614565b6001600160a01b0386811660009081526001602090815260408083208984529091529020805492909116918590811061081757634e487b7160e01b600052603260045260246000fd5b60009182526020909120600490910201546001600160a01b03161461084e5760405162461bcd60e51b81526004016102df90612153565b6040516331a9108f60e11b81526000906001600160a01b03871690636352211e9061087d908890600401611f28565b60206040518083038186803b15801561089557600080fd5b505afa1580156108a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108cd9190611ae9565b90506108d7611614565b6001600160a01b0316816001600160a01b0316146109075760405162461bcd60e51b81526004016102df90612198565b6001600160a01b0386166000908152600160209081526040808320888452909152902080548491908690811061094d57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600402016003019080519060200190610971929190611983565b507f651b516a6c18e276c39e293fc63842f42c41fcfda43edb72e46e66454c38f8198686866040516109a593929190611e5d565b60405180910390a1505050505050565b6001600160a01b038416600090815260026020526040902054849060ff166109ef5760405162461bcd60e51b81526004016102df906122c5565b6040516331a9108f60e11b81526000906001600160a01b03871690636352211e90610a1e908890600401611f28565b60206040518083038186803b158015610a3657600080fd5b505afa158015610a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6e9190611ae9565b9050610a78611614565b6001600160a01b0387811660009081526001602090815260408083208a845290915290208054929091169186908110610ac157634e487b7160e01b600052603260045260246000fd5b60009182526020909120600490910201546001600160a01b0316148015610b005750610aeb611614565b6001600160a01b0316816001600160a01b0316145b80610b2a5750610b0e611614565b6001600160a01b0316610b1f61077c565b6001600160a01b0316145b610b465760405162461bcd60e51b81526004016102df90612032565b6001600160a01b03861660009081526001602090815260408083208884529091529020805484919086908110610b8c57634e487b7160e01b600052603260045260246000fd5b906000526020600020906004020160020160006101000a81548160ff0219169083151502179055507f651b516a6c18e276c39e293fc63842f42c41fcfda43edb72e46e66454c38f8198686866040516109a593929190611e5d565b6001600160a01b038416600090815260026020526040902054849060ff16610c215760405162461bcd60e51b81526004016102df906122c5565b6040516331a9108f60e11b81526000906001600160a01b03871690636352211e90610c50908890600401611f28565b60206040518083038186803b158015610c6857600080fd5b505afa158015610c7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca09190611ae9565b9050610caa611614565b6001600160a01b0387811660009081526001602090815260408083208a845290915290208054929091169186908110610cf357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600490910201546001600160a01b0316148015610d325750610d1d611614565b6001600160a01b0316816001600160a01b0316145b80610d5c5750610d40611614565b6001600160a01b0316610d5161077c565b6001600160a01b0316145b610d785760405162461bcd60e51b81526004016102df90612032565b6001600160a01b03861660009081526001602090815260408083208884529091529020805484919086908110610dbe57634e487b7160e01b600052603260045260246000fd5b906000526020600020906004020160020160016101000a81548160ff0219169083151502179055507f4413e2dcebea319d21644448dc47e1690fbb06c569f44bda426d293a027b9b198686866040516109a593929190611e5d565b60036020526000908152604090205460ff1681565b6001600160a01b038516600090815260026020526040902054859060ff16610e685760405162461bcd60e51b81526004016102df906122c5565b60036000610e74611614565b6001600160a01b0316815260208101919091526040016000205460ff16610ead5760405162461bcd60e51b81526004016102df90612295565b6040516331a9108f60e11b81526000906001600160a01b03881690636352211e90610edc908990600401611f28565b60206040518083038186803b158015610ef457600080fd5b505afa158015610f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2c9190611ae9565b90506001600160a01b0381163214610f565760405162461bcd60e51b81526004016102df9061208f565b6001600160a01b038716600090815260016020908152604080832089845290915290819020815160a081019092529080610f8e611614565b6001600160a01b03908116825260208083018a90528815156040808501919091526000606080860182905260809586018b9052875460018082018a5598835291849020875160049093020180546001600160a01b0319169290951691909117845585830151968401969096558401516002830180549686015160ff199097169115159190911761ff0019166101009615159690960295909517909455908201518051929391926110449260038501920190611983565b5050506001600160a01b03871660009081526001602081815260408084208a8552909152909120547f7d97fb6e760200f3410aed6b36eae3b465593a033da403c0d89d9e91f9b8cb42918991899161109b9161237f565b6040516110aa93929190611e5d565b60405180910390a150505050505050565b6001600160a01b038616600090815260026020526040902054869060ff166110f55760405162461bcd60e51b81526004016102df906122c5565b60006111597f65ec70d7edfe4b6cd9678cd8845a2e5989f6f7aeafe07b59e688ae169fdee9ef8989898989898051906020012060405160200161113e9796959493929190611f31565b60405160208183030381529060405280519060200120611668565b90506000611167828b611683565b90506001600160a01b03811661118f5760405162461bcd60e51b81526004016102df90611fb6565b6040516331a9108f60e11b81526000906001600160a01b038b1690636352211e906111be908c90600401611f28565b60206040518083038186803b1580156111d657600080fd5b505afa1580156111ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120e9190611ae9565b9050806001600160a01b0316826001600160a01b0316146112415760405162461bcd60e51b81526004016102df9061230a565b8761124c8b8b610754565b146112695760405162461bcd60e51b81526004016102df90611fed565b6001600160a01b038a811660009081526001602081815260408084208e85528252808420815160a08101835288871681528084018e81528d151593820193845260608201878152608083018e81528454808901865594895297869020835160049095020180546001600160a01b0319169490991693909317885551948701949094559051600286018054925160ff199093169115159190911761ff001916610100921515929092029190911790559151805191939261133092600385019290910190611983565b5050506001600160a01b038a1660009081526001602081815260408084208d8552909152909120547f7d97fb6e760200f3410aed6b36eae3b465593a033da403c0d89d9e91f9b8cb42918c918c916113879161237f565b60405161139693929190611e5d565b60405180910390a15050505050505050505050565b6001600160a01b038516600090815260026020526040902054859060ff166113e55760405162461bcd60e51b81526004016102df906122c5565b6040516331a9108f60e11b81526000906001600160a01b03881690636352211e90611414908990600401611f28565b60206040518083038186803b15801561142c57600080fd5b505afa158015611440573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114649190611ae9565b905061146e611614565b6001600160a01b0316816001600160a01b031614610f565760405162461bcd60e51b81526004016102df90612198565b6114a6611614565b6001600160a01b03166114b761077c565b6001600160a01b0316146114dd5760405162461bcd60e51b81526004016102df90612260565b6001600160a01b0381166115035760405162461bcd60e51b81526004016102df9061210d565b61150c81611618565b50565b6001602052826000526040600020602052816000526040600020818154811061153757600080fd5b600091825260209091206004909102018054600182015460028301546003840180546001600160a01b03909416975091955060ff808216955061010090910416929161158290612396565b80601f01602080910402602001604051908101604052809291908181526020018280546115ae90612396565b80156115fb5780601f106115d0576101008083540402835291602001916115fb565b820191906000526020600020905b8154815290600101906020018083116115de57829003601f168201915b5050505050905085565b600061160f6116f7565b905090565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600061167b6116756116f7565b836117ba565b90505b919050565b60008151604114156116b75760208201516040830151606084015160001a6116ad868285856117ed565b9350505050610703565b8151604014156116df57602082015160408301516116d68583836118e3565b92505050610703565b60405162461bcd60e51b81526004016102df906120d6565b60007f000000000000000000000000000000000000000000000000000000000000000146141561174857507f39fabd3c488dd00ba5b987d31775e82b2bc1d73130f792d24a414c33324557d4610789565b6117b37f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f13108d17a159ce509907c2583ca1a99a9dce359c2561a51e1918e4fdbf6359eb7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc661190d565b9050610789565b600082826040516020016117cf929190611dec565b60405160208183030381529060405280519060200120905092915050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561182f5760405162461bcd60e51b81526004016102df906121dc565b8360ff16601b148061184457508360ff16601c145b6118605760405162461bcd60e51b81526004016102df9061221e565b6000600186868686604051600081526020016040526040516118859493929190611f98565b6020604051602081039080840390855afa1580156118a7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166118da5760405162461bcd60e51b81526004016102df90611fb6565b95945050505050565b60006001600160ff1b03821660ff83901c601b01611903868287856117ed565b9695505050505050565b60008383834630604051602001611928959493929190611f6c565b6040516020818303038152906040528051906020012090509392505050565b6040518060a0016040528060006001600160a01b0316815260200160008152602001600015158152602001600015158152602001606081525090565b82805461198f90612396565b90600052602060002090601f0160209004810192826119b157600085556119f7565b82601f106119ca57805160ff19168380011785556119f7565b828001600101855582156119f7579182015b828111156119f75782518255916020019190600101906119dc565b50611a03929150611a07565b5090565b5b80821115611a035760008155600101611a08565b600067ffffffffffffffff80841115611a3757611a37612402565b604051601f8501601f191681016020018281118282101715611a5b57611a5b612402565b604052848152915081838501861015611a7357600080fd5b8484602083013760006020868301015250509392505050565b803561167e81612418565b8035801515811461167e57600080fd5b600082601f830112611ab7578081fd5b611ac683833560208501611a1c565b9392505050565b600060208284031215611ade578081fd5b8135611ac681612418565b600060208284031215611afa578081fd5b8151611ac681612418565b60008060408385031215611b17578081fd5b8235611b2281612418565b9150611b3060208401611a97565b90509250929050565b60008060408385031215611b4b578182fd5b8235611b5681612418565b946020939093013593505050565b600080600060608486031215611b78578081fd5b8335611b8381612418565b95602085013595506040909401359392505050565b60008060008060808587031215611bad578081fd5b8435611bb881612418565b93506020850135925060408501359150611bd460608601611a97565b905092959194509250565b600080600080600060a08688031215611bf6578081fd5b8535611c0181612418565b94506020860135935060408601359250611c1d60608701611a97565b9150608086013567ffffffffffffffff811115611c38578182fd5b611c4488828901611aa7565b9150509295509295909350565b60008060008060808587031215611c66578384fd5b8435611c7181612418565b93506020850135925060408501359150606085013567ffffffffffffffff811115611c9a578182fd5b611ca687828801611aa7565b91505092959194509250565b60008060008060808587031215611cc7578384fd5b8435611cd281612418565b966020860135965060408601359560600135945092505050565b600080600080600080600060e0888a031215611d06578182fd5b873567ffffffffffffffff80821115611d1d578384fd5b818a0191508a601f830112611d30578384fd5b611d3f8b833560208501611a1c565b9850611d4d60208b01611a8c565b975060408a0135965060608a0135955060808a01359450611d7060a08b01611a97565b935060c08a0135915080821115611d85578283fd5b50611d928a828b01611aa7565b91505092959891949750929550565b60008151808452815b81811015611dc657602081850181015186830182015201611daa565b81811115611dd75782602083870101525b50601f01601f19169290920160200192915050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b600060018060a01b03871682528560208301528415156040830152831515606083015260a06080830152611e5260a0830184611da1565b979650505050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b60208082528251828201819052600091906040908185019080840286018301878501865b83811015611f0f57888303603f19018552815180516001600160a01b0316845287810151888501528681015115158785015260608082015115159085015260809081015160a091850182905290611efb81860183611da1565b968901969450505090860190600101611ea2565b509098975050505050505050565b901515815260200190565b90815260200190565b9687526001600160a01b03959095166020870152604086019390935260608501919091526080840152151560a083015260c082015260e00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b93845260ff9290921660208401526040830152606082015260800190565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526025908201527f6164644c6f7265576974685369676e61747572653a206c6f72654964206973206040820152647374616c6560d81b606082015260800190565b6020808252603d908201527f4f776e65723a2063616c6c6572206973206e65697468657220746865204c6f7260408201527f652063726561746f72206e6f7220746865204c6f7265204d6173746572000000606082015260800190565b60208082526027908201527f4f776e65723a2074782e6f726967696e206973206e6f742074686520746f6b65604082015266371037bbb732b960c91b606082015260800190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526025908201527f4f776e65723a2063616c6c6572206973206e6f7420746865204c6f726520637260408201526432b0ba37b960d91b606082015260800190565b60208082526024908201527f4f776e65723a2063616c6c6572206973206e6f742074686520746f6b656e206f6040820152633bb732b960e11b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526016908201527573656e646572206973206e6f7420612053637269626560501b604082015260600190565b60208082526025908201527f746f6b656e436f6e7472616374206973206e6f74206f6e2074686520616c6c6f6040820152641ddb1a5cdd60da1b606082015260800190565b6020808252603e908201527f6164644c6f7265576974685369676e61747572653a207369676e61747572652060408201527f6973206e6f74207468652063757272656e7420746f6b656e206f776e65720000606082015260800190565b6000821982111561237a5761237a6123ec565b500190565b600082821015612391576123916123ec565b500390565b6002810460018216806123aa57607f821691505b602082108114156123cb57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156123e5576123e56123ec565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461150c57600080fdfea26469706673582212204ee1789c80bc1cb1732c991b67f98fb9f109a12b4a9865f855f6fc0638e8104364736f6c63430008000033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.