Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 113 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Register Nft | 17593131 | 952 days ago | IN | 0 ETH | 0.00473721 | ||||
| Register Nft | 16978421 | 1039 days ago | IN | 0 ETH | 0.00467153 | ||||
| Register Nft | 16978349 | 1039 days ago | IN | 0 ETH | 0.00521144 | ||||
| Register Nft | 16978321 | 1039 days ago | IN | 0 ETH | 0.00423646 | ||||
| Register Nft | 16978260 | 1039 days ago | IN | 0 ETH | 0.00515145 | ||||
| Register Nft | 16978231 | 1039 days ago | IN | 0 ETH | 0.005717 | ||||
| Register Nft | 16978215 | 1039 days ago | IN | 0 ETH | 0.00574758 | ||||
| Register Nft | 16941327 | 1044 days ago | IN | 0 ETH | 0.00469099 | ||||
| Register Nft | 16826844 | 1061 days ago | IN | 0 ETH | 0.00496042 | ||||
| Register Nft | 16693758 | 1079 days ago | IN | 0 ETH | 0.00454227 | ||||
| Register Nft | 16335289 | 1129 days ago | IN | 0 ETH | 0.00266561 | ||||
| Register Nft | 16189264 | 1150 days ago | IN | 0 ETH | 0.00153162 | ||||
| Register Nft | 16177049 | 1151 days ago | IN | 0 ETH | 0.00268574 | ||||
| Register Nft | 16141765 | 1156 days ago | IN | 0 ETH | 0.00204479 | ||||
| Register Nft | 16141757 | 1156 days ago | IN | 0 ETH | 0.00188851 | ||||
| Register Nft | 16141749 | 1156 days ago | IN | 0 ETH | 0.00197701 | ||||
| Register Nft | 16141742 | 1156 days ago | IN | 0 ETH | 0.00210405 | ||||
| Register Nft | 16141700 | 1156 days ago | IN | 0 ETH | 0.00182935 | ||||
| Register Nft | 16141699 | 1156 days ago | IN | 0 ETH | 0.00177746 | ||||
| Register Nft | 16136744 | 1157 days ago | IN | 0 ETH | 0.00165857 | ||||
| Register Nft | 16123332 | 1159 days ago | IN | 0 ETH | 0.00154343 | ||||
| Register Nft | 16077589 | 1165 days ago | IN | 0 ETH | 0.00190407 | ||||
| Register Nft | 15994679 | 1177 days ago | IN | 0 ETH | 0.00134066 | ||||
| Register Nft | 15993925 | 1177 days ago | IN | 0 ETH | 0.00168963 | ||||
| Register Nft | 15969614 | 1180 days ago | IN | 0 ETH | 0.00213085 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RootRegistrar
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.9;
import "./FxBaseRootTunnel.sol";
import "../Maker/NftOwnership.sol";
import "../Royalties/Royalties.sol";
/// @dev This contract lives on the L1 and allows NFT owners to register NFTs that live on the L1.
/// Once ownership is verified, it will send a message up to the contracts on the L2 specifying that
/// the NFT has been registered or unregistered.
/// This is not an upgradeable contract and should not be used with a proxy.
contract RootRegistrar is FxBaseRootTunnel {
bytes32 public constant REGISTER = keccak256("REGISTER");
bytes32 public constant DE_REGISTER = keccak256("DE_REGISTER");
/// @dev the address that deployed this contract is the only one that can update the fxRootTunnel
address public deployer;
/// @dev the address where the registry royalty is deployed
address royaltyRegistry;
/// @param _checkpointManager This is a well known contract deployed by matic that is used to verify messages coming from the L2 down to L1.
/// @param _fxRoot This is a well known contract deployed by matic that will emit the events going from L1 to L2.
/// @dev You must call setFxChildTunnel() with the ChildRegistrar address on the L2 after deployment
constructor(
address _checkpointManager,
address _fxRoot,
address _royaltyRegistry
) FxBaseRootTunnel(_checkpointManager, _fxRoot) {
deployer = msg.sender;
royaltyRegistry = _royaltyRegistry;
}
/// @dev Set fxChildTunnel if not set already
/// Only the deploying account can update this
/// Overrides the function in the base contract
function setFxChildTunnel(address _fxChildTunnel) public override {
require(deployer == msg.sender, "Only deployer");
require(fxChildTunnel == address(0x0), "Already set");
fxChildTunnel = _fxChildTunnel;
}
/// @dev Allows a NFT owner to register the NFT in the protocol on L1
/// Once the ownership is verified a message will be sent to the Child contract
/// on the L2 chain that will trigger a registration there.
function registerNft(
address nftContractAddress,
uint256 nftId,
address creatorAddress,
uint256 creatorSaleBasisPoints,
uint256 optionBits,
string memory ipfsMetadataHash
) external {
// Verify ownership
require(
NftOwnership._verifyOwnership(
nftContractAddress,
nftId,
msg.sender
),
"NFT not owned"
);
// Get the royalties for the creator addresses - use fallback if none set on chain
(
address[] memory addressesArray,
uint256[] memory creatorBasisPointsArray
) = Royalties._getRoyaltyOverride(
royaltyRegistry,
nftContractAddress,
nftId,
creatorAddress,
creatorSaleBasisPoints
);
// REGISTER, encode(owner, chainId, nftContractAddress, nftId, creatorAddress, optionBits, ipfsMetadataHash)
bytes memory message = abi.encode(
REGISTER,
abi.encode(
msg.sender,
block.chainid,
nftContractAddress,
nftId,
addressesArray,
creatorBasisPointsArray,
optionBits,
ipfsMetadataHash
)
);
_sendMessageToChild(message);
}
/// @dev Allows a NFT owner to de-register the NFT in the protocol on L1
/// Once the ownership is verified a message will be sent to the Child contract
/// on the L2 chain that will trigger a desgregistration there.
function deRegisterNft(address nftContractAddress, uint256 nftId) external {
// Verify ownership
require(
NftOwnership._verifyOwnership(
nftContractAddress,
nftId,
msg.sender
),
"NFT not owned"
);
// DERegister, encode(address owner, uint256 chainId, address nftContractAddress, uint256 nftId)
bytes memory message = abi.encode(
DE_REGISTER,
abi.encode(msg.sender, block.chainid, nftContractAddress, nftId)
);
_sendMessageToChild(message);
}
/// @dev NOOP - No messages come from L2 down to L1
function _processMessageFromChild(bytes memory data) internal override {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @author: manifold.xyz
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
/**
* @dev Lookup engine interface
*/
interface IRoyaltyEngineV1 is IERC165 {
/**
* Get the royalty for a given token (address, id) and value amount. Does not cache the bps/amounts. Caches the spec for a given token address
*
* @param tokenAddress - The address of the token
* @param tokenId - The id of the token
* @param value - The value you wish to get the royalty of
*
* returns Two arrays of equal length, royalty recipients and the corresponding amount each recipient should get
*/
function getRoyalty(address tokenAddress, uint256 tokenId, uint256 value) external returns(address payable[] memory recipients, uint256[] memory amounts);
/**
* View only version of getRoyalty
*
* @param tokenAddress - The address of the token
* @param tokenId - The id of the token
* @param value - The value you wish to get the royalty of
*
* returns Two arrays of equal length, royalty recipients and the corresponding amount each recipient should get
*/
function getRoyaltyView(address tokenAddress, uint256 tokenId, uint256 value) external view returns(address payable[] memory recipients, uint256[] memory amounts);
}pragma solidity ^0.8.0;
import { RLPReader } from "./RLPReader.sol";
library ExitPayloadReader {
using RLPReader for bytes;
using RLPReader for RLPReader.RLPItem;
uint8 constant WORD_SIZE = 32;
struct ExitPayload {
RLPReader.RLPItem[] data;
}
struct Receipt {
RLPReader.RLPItem[] data;
bytes raw;
uint256 logIndex;
}
struct Log {
RLPReader.RLPItem data;
RLPReader.RLPItem[] list;
}
struct LogTopics {
RLPReader.RLPItem[] data;
}
// copy paste of private copy() from RLPReader to avoid changing of existing contracts
function copy(uint src, uint dest, uint len) private pure {
if (len == 0) return;
// copy as many word sizes as possible
for (; len >= WORD_SIZE; len -= WORD_SIZE) {
assembly {
mstore(dest, mload(src))
}
src += WORD_SIZE;
dest += WORD_SIZE;
}
// left over bytes. Mask is used to remove unwanted bytes from the word
uint mask = 256 ** (WORD_SIZE - len) - 1;
assembly {
let srcpart := and(mload(src), not(mask)) // zero out src
let destpart := and(mload(dest), mask) // retrieve the bytes
mstore(dest, or(destpart, srcpart))
}
}
function toExitPayload(bytes memory data)
internal
pure
returns (ExitPayload memory)
{
RLPReader.RLPItem[] memory payloadData = data
.toRlpItem()
.toList();
return ExitPayload(payloadData);
}
function getHeaderNumber(ExitPayload memory payload) internal pure returns(uint256) {
return payload.data[0].toUint();
}
function getBlockProof(ExitPayload memory payload) internal pure returns(bytes memory) {
return payload.data[1].toBytes();
}
function getBlockNumber(ExitPayload memory payload) internal pure returns(uint256) {
return payload.data[2].toUint();
}
function getBlockTime(ExitPayload memory payload) internal pure returns(uint256) {
return payload.data[3].toUint();
}
function getTxRoot(ExitPayload memory payload) internal pure returns(bytes32) {
return bytes32(payload.data[4].toUint());
}
function getReceiptRoot(ExitPayload memory payload) internal pure returns(bytes32) {
return bytes32(payload.data[5].toUint());
}
function getReceipt(ExitPayload memory payload) internal pure returns(Receipt memory receipt) {
receipt.raw = payload.data[6].toBytes();
RLPReader.RLPItem memory receiptItem = receipt.raw.toRlpItem();
if (receiptItem.isList()) {
// legacy tx
receipt.data = receiptItem.toList();
} else {
// pop first byte before parsting receipt
bytes memory typedBytes = receipt.raw;
bytes memory result = new bytes(typedBytes.length - 1);
uint256 srcPtr;
uint256 destPtr;
assembly {
srcPtr := add(33, typedBytes)
destPtr := add(0x20, result)
}
copy(srcPtr, destPtr, result.length);
receipt.data = result.toRlpItem().toList();
}
receipt.logIndex = getReceiptLogIndex(payload);
return receipt;
}
function getReceiptProof(ExitPayload memory payload) internal pure returns(bytes memory) {
return payload.data[7].toBytes();
}
function getBranchMaskAsBytes(ExitPayload memory payload) internal pure returns(bytes memory) {
return payload.data[8].toBytes();
}
function getBranchMaskAsUint(ExitPayload memory payload) internal pure returns(uint256) {
return payload.data[8].toUint();
}
function getReceiptLogIndex(ExitPayload memory payload) internal pure returns(uint256) {
return payload.data[9].toUint();
}
// Receipt methods
function toBytes(Receipt memory receipt) internal pure returns(bytes memory) {
return receipt.raw;
}
function getLog(Receipt memory receipt) internal pure returns(Log memory) {
RLPReader.RLPItem memory logData = receipt.data[3].toList()[receipt.logIndex];
return Log(logData, logData.toList());
}
// Log methods
function getEmitter(Log memory log) internal pure returns(address) {
return RLPReader.toAddress(log.list[0]);
}
function getTopics(Log memory log) internal pure returns(LogTopics memory) {
return LogTopics(log.list[1].toList());
}
function getData(Log memory log) internal pure returns(bytes memory) {
return log.list[2].toBytes();
}
function toRlpBytes(Log memory log) internal pure returns(bytes memory) {
return log.data.toRlpBytes();
}
// LogTopics methods
function getField(LogTopics memory topics, uint256 index) internal pure returns(RLPReader.RLPItem memory) {
return topics.data[index];
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library Merkle {
function checkMembership(
bytes32 leaf,
uint256 index,
bytes32 rootHash,
bytes memory proof
) internal pure returns (bool) {
require(proof.length % 32 == 0, "Invalid proof length");
uint256 proofHeight = proof.length / 32;
// Proof of size n means, height of the tree is n+1.
// In a tree of height n+1, max #leafs possible is 2 ^ n
require(index < 2 ** proofHeight, "Leaf index is too big");
bytes32 proofElement;
bytes32 computedHash = leaf;
for (uint256 i = 32; i <= proof.length; i += 32) {
assembly {
proofElement := mload(add(proof, i))
}
if (index % 2 == 0) {
computedHash = keccak256(
abi.encodePacked(computedHash, proofElement)
);
} else {
computedHash = keccak256(
abi.encodePacked(proofElement, computedHash)
);
}
index = index / 2;
}
return computedHash == rootHash;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {RLPReader} from "./RLPReader.sol";
library MerklePatriciaProof {
/*
* @dev Verifies a merkle patricia proof.
* @param value The terminating value in the trie.
* @param encodedPath The path in the trie leading to value.
* @param rlpParentNodes The rlp encoded stack of nodes.
* @param root The root hash of the trie.
* @return The boolean validity of the proof.
*/
function verify(
bytes memory value,
bytes memory encodedPath,
bytes memory rlpParentNodes,
bytes32 root
) internal pure returns (bool) {
RLPReader.RLPItem memory item = RLPReader.toRlpItem(rlpParentNodes);
RLPReader.RLPItem[] memory parentNodes = RLPReader.toList(item);
bytes memory currentNode;
RLPReader.RLPItem[] memory currentNodeList;
bytes32 nodeKey = root;
uint256 pathPtr = 0;
bytes memory path = _getNibbleArray(encodedPath);
if (path.length == 0) {
return false;
}
for (uint256 i = 0; i < parentNodes.length; i++) {
if (pathPtr > path.length) {
return false;
}
currentNode = RLPReader.toRlpBytes(parentNodes[i]);
if (nodeKey != keccak256(currentNode)) {
return false;
}
currentNodeList = RLPReader.toList(parentNodes[i]);
if (currentNodeList.length == 17) {
if (pathPtr == path.length) {
if (
keccak256(RLPReader.toBytes(currentNodeList[16])) ==
keccak256(value)
) {
return true;
} else {
return false;
}
}
uint8 nextPathNibble = uint8(path[pathPtr]);
if (nextPathNibble > 16) {
return false;
}
nodeKey = bytes32(
RLPReader.toUintStrict(currentNodeList[nextPathNibble])
);
pathPtr += 1;
} else if (currentNodeList.length == 2) {
uint256 traversed = _nibblesToTraverse(
RLPReader.toBytes(currentNodeList[0]),
path,
pathPtr
);
if (pathPtr + traversed == path.length) {
//leaf node
if (
keccak256(RLPReader.toBytes(currentNodeList[1])) ==
keccak256(value)
) {
return true;
} else {
return false;
}
}
//extension node
if (traversed == 0) {
return false;
}
pathPtr += traversed;
nodeKey = bytes32(RLPReader.toUintStrict(currentNodeList[1]));
} else {
return false;
}
}
}
function _nibblesToTraverse(
bytes memory encodedPartialPath,
bytes memory path,
uint256 pathPtr
) private pure returns (uint256) {
uint256 len = 0;
// encodedPartialPath has elements that are each two hex characters (1 byte), but partialPath
// and slicedPath have elements that are each one hex character (1 nibble)
bytes memory partialPath = _getNibbleArray(encodedPartialPath);
bytes memory slicedPath = new bytes(partialPath.length);
// pathPtr counts nibbles in path
// partialPath.length is a number of nibbles
for (uint256 i = pathPtr; i < pathPtr + partialPath.length; i++) {
bytes1 pathNibble = path[i];
slicedPath[i - pathPtr] = pathNibble;
}
if (keccak256(partialPath) == keccak256(slicedPath)) {
len = partialPath.length;
} else {
len = 0;
}
return len;
}
// bytes b must be hp encoded
function _getNibbleArray(bytes memory b)
internal
pure
returns (bytes memory)
{
bytes memory nibbles = "";
if (b.length > 0) {
uint8 offset;
uint8 hpNibble = uint8(_getNthNibbleOfBytes(0, b));
if (hpNibble == 1 || hpNibble == 3) {
nibbles = new bytes(b.length * 2 - 1);
bytes1 oddNibble = _getNthNibbleOfBytes(1, b);
nibbles[0] = oddNibble;
offset = 1;
} else {
nibbles = new bytes(b.length * 2 - 2);
offset = 0;
}
for (uint256 i = offset; i < nibbles.length; i++) {
nibbles[i] = _getNthNibbleOfBytes(i - offset + 2, b);
}
}
return nibbles;
}
function _getNthNibbleOfBytes(uint256 n, bytes memory str)
private
pure
returns (bytes1)
{
return
bytes1(
n % 2 == 0 ? uint8(str[n / 2]) / 0x10 : uint8(str[n / 2]) % 0x10
);
}
}/* * @author Hamdi Allam [email protected] * Please reach out with any questions or concerns */ pragma solidity ^0.8.0; library RLPReader { uint8 constant STRING_SHORT_START = 0x80; uint8 constant STRING_LONG_START = 0xb8; uint8 constant LIST_SHORT_START = 0xc0; uint8 constant LIST_LONG_START = 0xf8; uint8 constant WORD_SIZE = 32; struct RLPItem { uint len; uint memPtr; } struct Iterator { RLPItem item; // Item that's being iterated over. uint nextPtr; // Position of the next item in the list. } /* * @dev Returns the next element in the iteration. Reverts if it has not next element. * @param self The iterator. * @return The next element in the iteration. */ function next(Iterator memory self) internal pure returns (RLPItem memory) { require(hasNext(self)); uint ptr = self.nextPtr; uint itemLength = _itemLength(ptr); self.nextPtr = ptr + itemLength; return RLPItem(itemLength, ptr); } /* * @dev Returns true if the iteration has more elements. * @param self The iterator. * @return true if the iteration has more elements. */ function hasNext(Iterator memory self) internal pure returns (bool) { RLPItem memory item = self.item; return self.nextPtr < item.memPtr + item.len; } /* * @param item RLP encoded bytes */ function toRlpItem(bytes memory item) internal pure returns (RLPItem memory) { uint memPtr; assembly { memPtr := add(item, 0x20) } return RLPItem(item.length, memPtr); } /* * @dev Create an iterator. Reverts if item is not a list. * @param self The RLP item. * @return An 'Iterator' over the item. */ function iterator(RLPItem memory self) internal pure returns (Iterator memory) { require(isList(self)); uint ptr = self.memPtr + _payloadOffset(self.memPtr); return Iterator(self, ptr); } /* * @param item RLP encoded bytes */ function rlpLen(RLPItem memory item) internal pure returns (uint) { return item.len; } /* * @param item RLP encoded bytes */ function payloadLen(RLPItem memory item) internal pure returns (uint) { return item.len - _payloadOffset(item.memPtr); } /* * @param item RLP encoded list in bytes */ function toList(RLPItem memory item) internal pure returns (RLPItem[] memory) { require(isList(item)); uint items = numItems(item); RLPItem[] memory result = new RLPItem[](items); uint memPtr = item.memPtr + _payloadOffset(item.memPtr); uint dataLen; for (uint i = 0; i < items; i++) { dataLen = _itemLength(memPtr); result[i] = RLPItem(dataLen, memPtr); memPtr = memPtr + dataLen; } return result; } // @return indicator whether encoded payload is a list. negate this function call for isData. function isList(RLPItem memory item) internal pure returns (bool) { if (item.len == 0) return false; uint8 byte0; uint memPtr = item.memPtr; assembly { byte0 := byte(0, mload(memPtr)) } if (byte0 < LIST_SHORT_START) return false; return true; } /* * @dev A cheaper version of keccak256(toRlpBytes(item)) that avoids copying memory. * @return keccak256 hash of RLP encoded bytes. */ function rlpBytesKeccak256(RLPItem memory item) internal pure returns (bytes32) { uint256 ptr = item.memPtr; uint256 len = item.len; bytes32 result; assembly { result := keccak256(ptr, len) } return result; } function payloadLocation(RLPItem memory item) internal pure returns (uint, uint) { uint offset = _payloadOffset(item.memPtr); uint memPtr = item.memPtr + offset; uint len = item.len - offset; // data length return (memPtr, len); } /* * @dev A cheaper version of keccak256(toBytes(item)) that avoids copying memory. * @return keccak256 hash of the item payload. */ function payloadKeccak256(RLPItem memory item) internal pure returns (bytes32) { (uint memPtr, uint len) = payloadLocation(item); bytes32 result; assembly { result := keccak256(memPtr, len) } return result; } /** RLPItem conversions into data types **/ // @returns raw rlp encoding in bytes function toRlpBytes(RLPItem memory item) internal pure returns (bytes memory) { bytes memory result = new bytes(item.len); if (result.length == 0) return result; uint ptr; assembly { ptr := add(0x20, result) } copy(item.memPtr, ptr, item.len); return result; } // any non-zero byte is considered true function toBoolean(RLPItem memory item) internal pure returns (bool) { require(item.len == 1); uint result; uint memPtr = item.memPtr; assembly { result := byte(0, mload(memPtr)) } return result == 0 ? false : true; } function toAddress(RLPItem memory item) internal pure returns (address) { // 1 byte for the length prefix require(item.len == 21); return address(uint160(toUint(item))); } function toUint(RLPItem memory item) internal pure returns (uint) { require(item.len > 0 && item.len <= 33); uint offset = _payloadOffset(item.memPtr); uint len = item.len - offset; uint result; uint memPtr = item.memPtr + offset; assembly { result := mload(memPtr) // shfit to the correct location if neccesary if lt(len, 32) { result := div(result, exp(256, sub(32, len))) } } return result; } // enforces 32 byte length function toUintStrict(RLPItem memory item) internal pure returns (uint) { // one byte prefix require(item.len == 33); uint result; uint memPtr = item.memPtr + 1; assembly { result := mload(memPtr) } return result; } function toBytes(RLPItem memory item) internal pure returns (bytes memory) { require(item.len > 0); uint offset = _payloadOffset(item.memPtr); uint len = item.len - offset; // data length bytes memory result = new bytes(len); uint destPtr; assembly { destPtr := add(0x20, result) } copy(item.memPtr + offset, destPtr, len); return result; } /* * Private Helpers */ // @return number of payload items inside an encoded list. function numItems(RLPItem memory item) private pure returns (uint) { if (item.len == 0) return 0; uint count = 0; uint currPtr = item.memPtr + _payloadOffset(item.memPtr); uint endPtr = item.memPtr + item.len; while (currPtr < endPtr) { currPtr = currPtr + _itemLength(currPtr); // skip over an item count++; } return count; } // @return entire rlp item byte length function _itemLength(uint memPtr) private pure returns (uint) { uint itemLen; uint byte0; assembly { byte0 := byte(0, mload(memPtr)) } if (byte0 < STRING_SHORT_START) itemLen = 1; else if (byte0 < STRING_LONG_START) itemLen = byte0 - STRING_SHORT_START + 1; else if (byte0 < LIST_SHORT_START) { assembly { let byteLen := sub(byte0, 0xb7) // # of bytes the actual length is memPtr := add(memPtr, 1) // skip over the first byte /* 32 byte word size */ let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to get the len itemLen := add(dataLen, add(byteLen, 1)) } } else if (byte0 < LIST_LONG_START) { itemLen = byte0 - LIST_SHORT_START + 1; } else { assembly { let byteLen := sub(byte0, 0xf7) memPtr := add(memPtr, 1) let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to the correct length itemLen := add(dataLen, add(byteLen, 1)) } } return itemLen; } // @return number of bytes until the data function _payloadOffset(uint memPtr) private pure returns (uint) { uint byte0; assembly { byte0 := byte(0, mload(memPtr)) } if (byte0 < STRING_SHORT_START) return 0; else if (byte0 < STRING_LONG_START || (byte0 >= LIST_SHORT_START && byte0 < LIST_LONG_START)) return 1; else if (byte0 < LIST_SHORT_START) // being explicit return byte0 - (STRING_LONG_START - 1) + 1; else return byte0 - (LIST_LONG_START - 1) + 1; } /* * @param src Pointer to source * @param dest Pointer to destination * @param len Amount of memory to copy from the source */ function copy(uint src, uint dest, uint len) private pure { if (len == 0) return; // copy as many word sizes as possible for (; len >= WORD_SIZE; len -= WORD_SIZE) { assembly { mstore(dest, mload(src)) } src += WORD_SIZE; dest += WORD_SIZE; } if (len == 0) return; // left over bytes. Mask is used to remove unwanted bytes from the word uint mask = 256 ** (WORD_SIZE - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) // zero out src let destpart := and(mload(dest), mask) // retrieve the bytes mstore(dest, or(destpart, srcpart)) } } }
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165Upgradeable.sol";
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155Upgradeable is IERC165Upgradeable {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
external
view
returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165Upgradeable.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721Upgradeable is IERC165Upgradeable {
/**
* @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
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165Upgradeable {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {RLPReader} from "@maticnetwork/fx-portal/contracts/lib/RLPReader.sol";
import {MerklePatriciaProof} from "@maticnetwork/fx-portal/contracts/lib/MerklePatriciaProof.sol";
import {Merkle} from "@maticnetwork/fx-portal/contracts/lib/Merkle.sol";
import "@maticnetwork/fx-portal/contracts/lib/ExitPayloadReader.sol";
/// @title FxBaseRootTunnel
/// @author @maticnetwork
/// @notice This contract is copied from @maticnetwork/fx-portal
/// @dev The only change was to make setFxChildTunnel() virtual
interface IFxStateSender {
function sendMessageToChild(address _receiver, bytes calldata _data)
external;
}
contract ICheckpointManager {
struct HeaderBlock {
bytes32 root;
uint256 start;
uint256 end;
uint256 createdAt;
address proposer;
}
/**
* @notice mapping of checkpoint header numbers to block details
* @dev These checkpoints are submited by plasma contracts
*/
mapping(uint256 => HeaderBlock) public headerBlocks;
}
abstract contract FxBaseRootTunnel {
using RLPReader for RLPReader.RLPItem;
using Merkle for bytes32;
using ExitPayloadReader for bytes;
using ExitPayloadReader for ExitPayloadReader.ExitPayload;
using ExitPayloadReader for ExitPayloadReader.Log;
using ExitPayloadReader for ExitPayloadReader.LogTopics;
using ExitPayloadReader for ExitPayloadReader.Receipt;
// keccak256(MessageSent(bytes))
bytes32 public constant SEND_MESSAGE_EVENT_SIG =
0x8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b036;
// state sender contract
IFxStateSender public fxRoot;
// root chain manager
ICheckpointManager public checkpointManager;
// child tunnel contract which receives and sends messages
address public fxChildTunnel;
// storage to avoid duplicate exits
mapping(bytes32 => bool) public processedExits;
constructor(address _checkpointManager, address _fxRoot) {
checkpointManager = ICheckpointManager(_checkpointManager);
fxRoot = IFxStateSender(_fxRoot);
}
// set fxChildTunnel if not set already
function setFxChildTunnel(address _fxChildTunnel) public virtual {
require(
fxChildTunnel == address(0x0),
"FxBaseRootTunnel: CHILD_TUNNEL_ALREADY_SET"
);
fxChildTunnel = _fxChildTunnel;
}
/**
* @notice Send bytes message to Child Tunnel
* @param message bytes message that will be sent to Child Tunnel
* some message examples -
* abi.encode(tokenId);
* abi.encode(tokenId, tokenMetadata);
* abi.encode(messageType, messageData);
*/
function _sendMessageToChild(bytes memory message) internal {
fxRoot.sendMessageToChild(fxChildTunnel, message);
}
function _validateAndExtractMessage(bytes memory inputData)
internal
returns (bytes memory)
{
ExitPayloadReader.ExitPayload memory payload = inputData
.toExitPayload();
bytes memory branchMaskBytes = payload.getBranchMaskAsBytes();
uint256 blockNumber = payload.getBlockNumber();
// checking if exit has already been processed
// unique exit is identified using hash of (blockNumber, branchMask, receiptLogIndex)
bytes32 exitHash = keccak256(
abi.encodePacked(
blockNumber,
// first 2 nibbles are dropped while generating nibble array
// this allows branch masks that are valid but bypass exitHash check (changing first 2 nibbles only)
// so converting to nibble array and then hashing it
MerklePatriciaProof._getNibbleArray(branchMaskBytes),
payload.getReceiptLogIndex()
)
);
require(
processedExits[exitHash] == false,
"FxRootTunnel: EXIT_ALREADY_PROCESSED"
);
processedExits[exitHash] = true;
ExitPayloadReader.Receipt memory receipt = payload.getReceipt();
ExitPayloadReader.Log memory log = receipt.getLog();
// check child tunnel
require(
fxChildTunnel == log.getEmitter(),
"FxRootTunnel: INVALID_FX_CHILD_TUNNEL"
);
bytes32 receiptRoot = payload.getReceiptRoot();
// verify receipt inclusion
require(
MerklePatriciaProof.verify(
receipt.toBytes(),
branchMaskBytes,
payload.getReceiptProof(),
receiptRoot
),
"FxRootTunnel: INVALID_RECEIPT_PROOF"
);
// verify checkpoint inclusion
_checkBlockMembershipInCheckpoint(
blockNumber,
payload.getBlockTime(),
payload.getTxRoot(),
receiptRoot,
payload.getHeaderNumber(),
payload.getBlockProof()
);
ExitPayloadReader.LogTopics memory topics = log.getTopics();
require(
bytes32(topics.getField(0).toUint()) == SEND_MESSAGE_EVENT_SIG, // topic0 is event sig
"FxRootTunnel: INVALID_SIGNATURE"
);
// received message data
bytes memory message = abi.decode(log.getData(), (bytes)); // event decodes params again, so decoding bytes to get message
return message;
}
function _checkBlockMembershipInCheckpoint(
uint256 blockNumber,
uint256 blockTime,
bytes32 txRoot,
bytes32 receiptRoot,
uint256 headerNumber,
bytes memory blockProof
) private view returns (uint256) {
(
bytes32 headerRoot,
uint256 startBlock,
,
uint256 createdAt,
) = checkpointManager.headerBlocks(headerNumber);
require(
keccak256(
abi.encodePacked(blockNumber, blockTime, txRoot, receiptRoot)
).checkMembership(blockNumber - startBlock, headerRoot, blockProof),
"FxRootTunnel: INVALID_HEADER"
);
return createdAt;
}
/**
* @notice receive message from L2 to L1, validated by proof
* @dev This function verifies if the transaction actually happened on child chain
*
* @param inputData RLP encoded data of the reference tx containing following list of fields
* 0 - headerNumber - Checkpoint header block number containing the reference tx
* 1 - blockProof - Proof that the block header (in the child chain) is a leaf in the submitted merkle root
* 2 - blockNumber - Block number containing the reference tx on child chain
* 3 - blockTime - Reference tx block time
* 4 - txRoot - Transactions root of block
* 5 - receiptRoot - Receipts root of block
* 6 - receipt - Receipt of the reference transaction
* 7 - receiptProof - Merkle proof of the reference receipt
* 8 - branchMask - 32 bits denoting the path of receipt in merkle tree
* 9 - receiptLogIndex - Log Index to read from the receipt
*/
function receiveMessage(bytes memory inputData) public virtual {
bytes memory message = _validateAndExtractMessage(inputData);
_processMessageFromChild(message);
}
/**
* @notice Process message received from Child Tunnel
* @dev function needs to be implemented to handle message as per requirement
* This is called by onStateReceive function.
* Since it is called via a system call, any event will not be emitted during its execution.
* @param message bytes message that was sent from Child Tunnel
*/
function _processMessageFromChild(bytes memory message) internal virtual;
}//SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.9;
import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol";
interface IPunk {
function punkIndexToAddress(uint256 index) external view returns (address);
}
/// @dev This is a library for other contracts to use that need to verify ownership of an NFT on the current chain.
/// Since this only has internal functions, it will be inlined into the calling contract at
/// compile time and does not need to be separately deployed on chain.
library NftOwnership {
/// @dev For the specified NFT, verify it is owned by the potential owner
function _verifyOwnership(
address nftContractAddress,
uint256 nftId,
address potentialOwner
) internal view returns (bool) {
// Try ERC1155
try
IERC1155Upgradeable(nftContractAddress).balanceOf(
potentialOwner,
nftId
)
returns (uint256 balance) {
return balance > 0;
} catch {
// Ignore error
}
// Try ERC721
try IERC721Upgradeable(nftContractAddress).ownerOf(nftId) returns (
address foundOwner
) {
return foundOwner == potentialOwner;
} catch {
// Ignore error
}
// Try CryptoPunk
try IPunk(nftContractAddress).punkIndexToAddress(nftId) returns (
address foundOwner
) {
return foundOwner == potentialOwner;
} catch {
// Ignore error
}
return false;
}
}//SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.9;
import "@manifoldxyz/royalty-registry-solidity/contracts/IRoyaltyEngineV1.sol";
/// @dev This library uses the Royalty Registry to see if royalties are configured for a specified NFT.
/// The Royalty Registry looks at a number of sources to see if the original creator set a royalty
/// configurationon the contract, such as EIP-2981, Manifold, Rarible, etc.
/// See https://royaltyregistry.xyz/ for more details and deployed addresses.
/// The output will be a list of addresses and a value that each should receive.
library Royalties {
/// @dev Validate royalties addresses and amounts arrays
function _validateRoyalties(
address payable[] memory recipients,
uint256[] memory amounts
) internal pure returns (bool) {
// Verify royalties were found
if (recipients.length == 0) {
return false;
}
// Verify array lengths match
if (recipients.length != amounts.length) {
return false;
}
// Calculate the total rewards BP
uint256 totalRewardsBp = 0;
// Verify valid addresses and amounts
for (uint8 i = 0; i < recipients.length; i++) {
if (recipients[i] == address(0x0)) {
return false;
}
if (amounts[i] == 0 || amounts[i] > 10_000) {
return false;
}
totalRewardsBp += amounts[i];
}
// Total rewards across all addresses should not be above 100%
if (totalRewardsBp > 10_000) {
return false;
}
// No issues found, use them
return true;
}
/// @dev Gets the royalties for a specified NFT and uses the fallback values if none are found
/// A sale price of 10,000 will be used as the value to query since the protocol uses basis points
/// to track a percentage of value to send to the creators. (10k basis points = 100%)
function _getRoyaltyOverride(
address royaltyRegistry,
address nftContractAddress,
uint256 nftId,
address fallbackCreator,
uint256 fallbackCreatorBasisPoints
)
internal
view
returns (
address[] memory creators,
uint256[] memory creatorSaleBasisPoints
)
{
// Query the royalty registry
if (royaltyRegistry != address(0x0)) {
// Use 10k to get back basis points
try
IRoyaltyEngineV1(royaltyRegistry).getRoyaltyView(
nftContractAddress,
nftId,
10_000
)
returns (
address payable[] memory recipients,
uint256[] memory amounts
) {
// Check to see if valid results were found
if (_validateRoyalties(recipients, amounts)) {
// Convert to non-payable
// https://github.com/ethereum/solidity/issues/5462
address[] memory convertedAddresses = new address[](
recipients.length
);
for (uint8 i = 0; i < recipients.length; i++) {
convertedAddresses[i] = recipients[i];
}
// Use the valid royalties
return (convertedAddresses, amounts);
}
} catch {
// Ignore an errors
}
}
// None found, use fallback address... address 0x0 means no creator rewards
address[] memory addressesArray = new address[](1);
addressesArray[0] = fallbackCreator;
// Use fallback value, and ensure it is not above 100%
require(fallbackCreatorBasisPoints <= 10_000, "Invalid bp");
uint256[] memory creatorBasisPointsArray = new uint256[](1);
creatorBasisPointsArray[0] = fallbackCreatorBasisPoints;
return (addressesArray, creatorBasisPointsArray);
}
}{
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": [],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_checkpointManager","type":"address"},{"internalType":"address","name":"_fxRoot","type":"address"},{"internalType":"address","name":"_royaltyRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DE_REGISTER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGISTER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEND_MESSAGE_EVENT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkpointManager","outputs":[{"internalType":"contract ICheckpointManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftContractAddress","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"deRegisterNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fxChildTunnel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fxRoot","outputs":[{"internalType":"contract IFxStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedExits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"inputData","type":"bytes"}],"name":"receiveMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftContractAddress","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"address","name":"creatorAddress","type":"address"},{"internalType":"uint256","name":"creatorSaleBasisPoints","type":"uint256"},{"internalType":"uint256","name":"optionBits","type":"uint256"},{"internalType":"string","name":"ipfsMetadataHash","type":"string"}],"name":"registerNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fxChildTunnel","type":"address"}],"name":"setFxChildTunnel","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604051620041bb380380620041bb8339818101604052810190620000379190620001b1565b828281600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506200020d565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000179826200014c565b9050919050565b6200018b816200016c565b81146200019757600080fd5b50565b600081519050620001ab8162000180565b92915050565b600080600060608486031215620001cd57620001cc62000147565b5b6000620001dd868287016200019a565b9350506020620001f0868287016200019a565b925050604062000203868287016200019a565b9150509250925092565b613f9e806200021d6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063c0857ba011610071578063c0857ba01461017b578063c679ff9a14610199578063d5f39488146101b5578063de9b771f146101d3578063e8a28dd7146101f1578063f953cec71461020f576100b4565b80630e387de6146100b957806310325264146100d7578063607f2d42146100f5578063972c492814610125578063aea4e49e14610143578063b7d0ee431461015f575b600080fd5b6100c161022b565b6040516100ce91906126de565b60405180910390f35b6100df610252565b6040516100ec91906126de565b60405180910390f35b61010f600480360381019061010a9190612739565b610276565b60405161011c9190612781565b60405180910390f35b61012d610296565b60405161013a91906127dd565b60405180910390f35b61015d60048036038101906101589190612824565b6102bc565b005b61017960048036038101906101749190612887565b610421565b005b6101836104e4565b6040516101909190612926565b60405180910390f35b6101b360048036038101906101ae9190612a87565b61050a565b005b6101bd610611565b6040516101ca91906127dd565b60405180910390f35b6101db610637565b6040516101e89190612b51565b60405180910390f35b6101f961065b565b60405161020691906126de565b60405180910390f35b61022960048036038101906102249190612c0d565b61067f565b005b7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03660001b81565b7ff98aef635801dfa470eae0492dd6a267cc7e32661957109ef6316bfd8bea371e81565b60036020528060005260406000206000915054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461034c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034390612cb3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146103dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d490612d1f565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61042c828233610699565b61046b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046290612d8b565b60405180910390fd5b60007ff98aef635801dfa470eae0492dd6a267cc7e32661957109ef6316bfd8bea371e334685856040516020016104a59493929190612dba565b6040516020818303038152906040526040516020016104c5929190612e87565b60405160208183030381529060405290506104df816108c3565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610515868633610699565b610554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054b90612d8b565b60405180910390fd5b600080610586600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1689898989610975565b9150915060007f58cc5acb742fd5eb9df21407aed105abca7d37584645d014636aa13c7b7bc38733468b8b87878b8b6040516020016105cc989796959493929190613077565b6040516020818303038152906040526040516020016105ec929190612e87565b6040516020818303038152906040529050610606816108c3565b505050505050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f58cc5acb742fd5eb9df21407aed105abca7d37584645d014636aa13c7b7bc38781565b600061068a82610ca6565b905061069581610fab565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1662fdd58e83856040518363ffffffff1660e01b81526004016106d592919061310a565b60206040518083038186803b1580156106ed57600080fd5b505afa92505050801561071e57506040513d601f19601f8201168201806040525081019061071b9190613148565b60015b61072757610733565b600081119150506108bc565b8373ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b815260040161076c9190613175565b60206040518083038186803b15801561078457600080fd5b505afa9250505080156107b557506040513d601f19601f820116820180604052508101906107b291906131a5565b60015b6107be576107f5565b8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149150506108bc565b8373ffffffffffffffffffffffffffffffffffffffff166358178168846040518263ffffffff1660e01b815260040161082e9190613175565b60206040518083038186803b15801561084657600080fd5b505afa92505050801561087757506040513d601f19601f8201168201806040525081019061087491906131a5565b60015b610880576108b7565b8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149150506108bc565b600090505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b4720477600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016109409291906131d2565b600060405180830381600087803b15801561095a57600080fd5b505af115801561096e573d6000803e3d6000fd5b5050505050565b606080600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610b42578673ffffffffffffffffffffffffffffffffffffffff16633e10401487876127106040518463ffffffff1660e01b81526004016109eb9392919061323d565b60006040518083038186803b158015610a0357600080fd5b505afa925050508015610a3957506040513d6000823e3d601f19601f82011682018060405250810190610a36919061343d565b60015b610a4257610b41565b610a4c8282610fae565b15610b3e576000825167ffffffffffffffff811115610a6e57610a6d61295c565b5b604051908082528060200260200182016040528015610a9c5781602001602082028036833780820191505090505b50905060005b83518160ff161015610b2f57838160ff1681518110610ac457610ac36134b5565b5b6020026020010151828260ff1681518110610ae257610ae16134b5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b2790613520565b915050610aa2565b50808294509450505050610c9c565b50505b5b6000600167ffffffffffffffff811115610b5f57610b5e61295c565b5b604051908082528060200260200182016040528015610b8d5781602001602082028036833780820191505090505b5090508481600081518110610ba557610ba46134b5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612710841115610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1b90613596565b60405180910390fd5b6000600167ffffffffffffffff811115610c4157610c4061295c565b5b604051908082528060200260200182016040528015610c6f5781602001602082028036833780820191505090505b5090508481600081518110610c8757610c866134b5565b5b60200260200101818152505081819350935050505b9550959350505050565b60606000610cb3836110fa565b90506000610cc08261112e565b90506000610ccd8361115f565b9050600081610cdb84611190565b610ce4866113a6565b604051602001610cf693929190613613565b604051602081830303815290604052805190602001209050600015156003600083815260200190815260200160002060009054906101000a900460ff16151514610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c906136be565b60405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000610dac856113d7565b90506000610db9826114fc565b9050610dc481611573565b73ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90613750565b60405180910390fd5b6000610e5e876115a4565b9050610e7c610e6c846115d8565b87610e768a6115e6565b84611617565b610ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb2906137e2565b60405180910390fd5b610ee985610ec88961191d565b610ed18a61194e565b84610edb8c611982565b610ee48d6119b3565b6119e4565b506000610ef583611b3a565b90507f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03660001b610f37610f32600084611b7f90919063ffffffff16565b611bae565b60001b14610f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f719061384e565b60405180910390fd5b6000610f8584611c31565b806020019051810190610f9891906138de565b9050809950505050505050505050919050565b50565b60008083511415610fc257600090506110f4565b8151835114610fd457600090506110f4565b6000805b84518160ff1610156110d957600073ffffffffffffffffffffffffffffffffffffffff16858260ff1681518110611012576110116134b5565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611041576000925050506110f4565b6000848260ff1681518110611059576110586134b5565b5b6020026020010151148061108b5750612710848260ff1681518110611081576110806134b5565b5b6020026020010151115b1561109b576000925050506110f4565b838160ff16815181106110b1576110b06134b5565b5b6020026020010151826110c49190613927565b915080806110d190613520565b915050610fd8565b506127108111156110ee5760009150506110f4565b60019150505b92915050565b611102612644565b600061111561111084611c62565b611c90565b9050604051806020016040528082815250915050919050565b6060611158826000015160088151811061114b5761114a6134b5565b5b6020026020010151611da5565b9050919050565b6000611189826000015160028151811061117c5761117b6134b5565b5b6020026020010151611bae565b9050919050565b6060600060405180602001604052806000815250905060008351111561139d576000806111be600086611e5c565b60f81c905060018160ff1614806111d8575060038160ff16145b156112a2576001600286516111ed919061397d565b6111f791906139d7565b67ffffffffffffffff8111156112105761120f61295c565b5b6040519080825280601f01601f1916602001820160405280156112425781602001600182028036833780820191505090505b5092506000611252600187611e5c565b90508084600081518110611269576112686134b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600192505061130e565b60028086516112b1919061397d565b6112bb91906139d7565b67ffffffffffffffff8111156112d4576112d361295c565b5b6040519080825280601f01601f1916602001820160405280156113065781602001600182028036833780820191505090505b509250600091505b60008260ff1690505b83518110156113995761134460028460ff168361133491906139d7565b61133e9190613927565b87611e5c565b848281518110611357576113566134b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061139190613a0b565b915050611317565b5050505b80915050919050565b60006113d082600001516009815181106113c3576113c26134b5565b5b6020026020010151611bae565b9050919050565b6113df612657565b61140782600001516006815181106113fa576113f96134b5565b5b6020026020010151611da5565b8160200181905250600061141e8260200151611c62565b905061142981611ef4565b156114445761143781611c90565b82600001819052506114e4565b60008260200151905060006001825161145d91906139d7565b67ffffffffffffffff8111156114765761147561295c565b5b6040519080825280601f01601f1916602001820160405280156114a85781602001600182028036833780820191505090505b5090506000808360210191508260200190506114c682828551611f42565b6114d76114d284611c62565b611c90565b8660000181905250505050505b6114ed836113a6565b82604001818152505050919050565b611504612678565b600061152e8360000151600381518110611521576115206134b5565b5b6020026020010151611c90565b836040015181518110611544576115436134b5565b5b60200260200101519050604051806040016040528082815260200161156883611c90565b815250915050919050565b600061159d82602001516000815181106115905761158f6134b5565b5b6020026020010151611fdf565b9050919050565b60006115ce82600001516005815181106115c1576115c06134b5565b5b6020026020010151611bae565b60001b9050919050565b606081602001519050919050565b60606116108260000151600781518110611603576116026134b5565b5b6020026020010151611da5565b9050919050565b60008061162384611c62565b9050600061163082611c90565b905060608060008690506000806116468b611190565b9050600081511415611662576000975050505050505050611915565b60005b865181101561190c57815183111561168857600098505050505050505050611915565b6116ab87828151811061169e5761169d6134b5565b5b6020026020010151612002565b9550858051906020012084146116cc57600098505050505050505050611915565b6116ef8782815181106116e2576116e16134b5565b5b6020026020010151611c90565b94506011855114156117e257815183141561175f578c8051906020012061173086601081518110611723576117226134b5565b5b6020026020010151611da5565b80519060200120141561174e57600198505050505050505050611915565b600098505050505050505050611915565b6000828481518110611774576117736134b5565b5b602001015160f81c60f81b60f81c905060108160ff1611156117a25760009950505050505050505050611915565b6117c8868260ff16815181106117bb576117ba6134b5565b5b6020026020010151612092565b60001b94506001846117da9190613927565b9350506118f9565b6002855114156118e757600061181c61181587600081518110611808576118076134b5565b5b6020026020010151611da5565b84866120c9565b90508251818561182c9190613927565b141561188f578d8051906020012061185e87600181518110611851576118506134b5565b5b6020026020010151611da5565b80519060200120141561187d5760019950505050505050505050611915565b60009950505050505050505050611915565b60008114156118aa5760009950505050505050505050611915565b80846118b69190613927565b93506118dc866001815181106118cf576118ce6134b5565b5b6020026020010151612092565b60001b9450506118f8565b600098505050505050505050611915565b5b808061190490613a0b565b915050611665565b50505050505050505b949350505050565b6000611947826000015160038151811061193a576119396134b5565b5b6020026020010151611bae565b9050919050565b6000611978826000015160048151811061196b5761196a6134b5565b5b6020026020010151611bae565b60001b9050919050565b60006119ac826000015160008151811061199f5761199e6134b5565b5b6020026020010151611bae565b9050919050565b60606119dd82600001516001815181106119d0576119cf6134b5565b5b6020026020010151611da5565b9050919050565b600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166341539d4a876040518263ffffffff1660e01b8152600401611a459190613175565b60a06040518083038186803b158015611a5d57600080fd5b505afa158015611a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a959190613a69565b5093505092509250611aeb828b611aac91906139d7565b84878d8d8d8d604051602001611ac59493929190613b05565b604051602081830303815290604052805190602001206121ff909392919063ffffffff16565b611b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2190613b9f565b60405180910390fd5b8093505050509695505050505050565b611b42612698565b6040518060200160405280611b758460200151600181518110611b6857611b676134b5565b5b6020026020010151611c90565b8152509050919050565b611b876126ab565b82600001518281518110611b9e57611b9d6134b5565b5b6020026020010151905092915050565b6000808260000151118015611bc857506021826000015111155b611bd157600080fd5b6000611be08360200151612370565b90506000818460000151611bf491906139d7565b9050600080838660200151611c099190613927565b9050805191506020831015611c2557826020036101000a820491505b81945050505050919050565b6060611c5b8260200151600281518110611c4e57611c4d6134b5565b5b6020026020010151611da5565b9050919050565b611c6a6126ab565b600060208301905060405180604001604052808451815260200182815250915050919050565b6060611c9b82611ef4565b611ca457600080fd5b6000611caf8361242f565b905060008167ffffffffffffffff811115611ccd57611ccc61295c565b5b604051908082528060200260200182016040528015611d0657816020015b611cf36126ab565b815260200190600190039081611ceb5790505b5090506000611d188560200151612370565b8560200151611d279190613927565b9050600080600090505b84811015611d9857611d42836124bd565b9150604051806040016040528083815260200184815250848281518110611d6c57611d6b6134b5565b5b60200260200101819052508183611d839190613927565b92508080611d9090613a0b565b915050611d31565b5082945050505050919050565b60606000826000015111611db857600080fd5b6000611dc78360200151612370565b90506000818460000151611ddb91906139d7565b905060008167ffffffffffffffff811115611df957611df861295c565b5b6040519080825280601f01601f191660200182016040528015611e2b5781602001600182028036833780820191505090505b5090506000816020019050611e50848760200151611e499190613927565b8285612599565b81945050505050919050565b600080600284611e6c9190613bee565b14611eaf57601082600285611e819190613c1f565b81518110611e9257611e916134b5565b5b602001015160f81c60f81b60f81c611eaa9190613c50565b611ee9565b601082600285611ebf9190613c1f565b81518110611ed057611ecf6134b5565b5b602001015160f81c60f81b60f81c611ee89190613c81565b5b60f81b905092915050565b60008082600001511415611f0b5760009050611f3d565b60008083602001519050805160001a915060c060ff168260ff161015611f3657600092505050611f3d565b6001925050505b919050565b6000811415611f5057611fda565b5b602060ff168110611f9b5782518252602060ff1683611f709190613927565b9250602060ff1682611f829190613927565b9150602060ff1681611f9491906139d7565b9050611f51565b6000600182602060ff16611faf91906139d7565b610100611fbc9190613de5565b611fc691906139d7565b905080198451168184511681811785525050505b505050565b60006015826000015114611ff257600080fd5b611ffb82611bae565b9050919050565b60606000826000015167ffffffffffffffff8111156120245761202361295c565b5b6040519080825280601f01601f1916602001820160405280156120565781602001600182028036833780820191505090505b50905060008151141561206c578091505061208d565b60008160200190506120878460200151828660000151612599565b81925050505b919050565b600060218260000151146120a557600080fd5b600080600184602001516120b99190613927565b9050805191508192505050919050565b6000806000905060006120db86611190565b90506000815167ffffffffffffffff8111156120fa576120f961295c565b5b6040519080825280601f01601f19166020018201604052801561212c5781602001600182028036833780820191505090505b50905060008590505b8251866121429190613927565b8110156121cd57600087828151811061215e5761215d6134b5565b5b602001015160f81c60f81b90508083888461217991906139d7565b8151811061218a576121896134b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505080806121c590613a0b565b915050612135565b508080519060200120828051906020012014156121ed57815192506121f2565b600092505b8293505050509392505050565b600080602083516122109190613bee565b14612250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224790613e7c565b60405180910390fd5b6000602083516122609190613c1f565b905080600261226f9190613de5565b85106122b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a790613ee8565b60405180910390fd5b6000808790506000602090505b8551811161235f5780860151925060006002896122da9190613bee565b14156123105781836040516020016122f3929190613f08565b60405160208183030381529060405280519060200120915061233c565b8282604051602001612323929190613f08565b6040516020818303038152906040528051906020012091505b6002886123499190613c1f565b97506020816123589190613927565b90506122bd565b508581149350505050949350505050565b600080825160001a9050608060ff1681101561239057600091505061242a565b60b860ff168110806123b5575060c060ff1681101580156123b4575060f860ff1681105b5b156123c457600191505061242a565b60c060ff168110156123ff5760018060b86123df9190613f34565b60ff16826123ed91906139d7565b6123f79190613927565b91505061242a565b60018060f861240e9190613f34565b60ff168261241c91906139d7565b6124269190613927565b9150505b919050565b6000808260000151141561244657600090506124b8565b6000806124568460200151612370565b84602001516124659190613927565b905060008460000151856020015161247d9190613927565b90505b808210156124b157612491826124bd565b8261249c9190613927565b915082806124a990613a0b565b935050612480565b8293505050505b919050565b6000806000835160001a9050608060ff168110156124de576001915061258f565b60b860ff1681101561250d576001608060ff16826124fc91906139d7565b6125069190613927565b915061258e565b60c060ff1681101561253d5760b78103600185019450806020036101000a8551046001820181019350505061258d565b60f860ff1681101561256c57600160c060ff168261255b91906139d7565b6125659190613927565b915061258c565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b60008114156125a75761263f565b5b602060ff1681106125f25782518252602060ff16836125c79190613927565b9250602060ff16826125d99190613927565b9150602060ff16816125eb91906139d7565b90506125a8565b60008114156126005761263f565b6000600182602060ff1661261491906139d7565b6101006126219190613de5565b61262b91906139d7565b905080198451168184511681811785525050505b505050565b6040518060200160405280606081525090565b60405180606001604052806060815260200160608152602001600081525090565b604051806040016040528061268b6126ab565b8152602001606081525090565b6040518060200160405280606081525090565b604051806040016040528060008152602001600081525090565b6000819050919050565b6126d8816126c5565b82525050565b60006020820190506126f360008301846126cf565b92915050565b6000604051905090565b600080fd5b600080fd5b612716816126c5565b811461272157600080fd5b50565b6000813590506127338161270d565b92915050565b60006020828403121561274f5761274e612703565b5b600061275d84828501612724565b91505092915050565b60008115159050919050565b61277b81612766565b82525050565b60006020820190506127966000830184612772565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127c78261279c565b9050919050565b6127d7816127bc565b82525050565b60006020820190506127f260008301846127ce565b92915050565b612801816127bc565b811461280c57600080fd5b50565b60008135905061281e816127f8565b92915050565b60006020828403121561283a57612839612703565b5b60006128488482850161280f565b91505092915050565b6000819050919050565b61286481612851565b811461286f57600080fd5b50565b6000813590506128818161285b565b92915050565b6000806040838503121561289e5761289d612703565b5b60006128ac8582860161280f565b92505060206128bd85828601612872565b9150509250929050565b6000819050919050565b60006128ec6128e76128e28461279c565b6128c7565b61279c565b9050919050565b60006128fe826128d1565b9050919050565b6000612910826128f3565b9050919050565b61292081612905565b82525050565b600060208201905061293b6000830184612917565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129948261294b565b810181811067ffffffffffffffff821117156129b3576129b261295c565b5b80604052505050565b60006129c66126f9565b90506129d2828261298b565b919050565b600067ffffffffffffffff8211156129f2576129f161295c565b5b6129fb8261294b565b9050602081019050919050565b82818337600083830152505050565b6000612a2a612a25846129d7565b6129bc565b905082815260208101848484011115612a4657612a45612946565b5b612a51848285612a08565b509392505050565b600082601f830112612a6e57612a6d612941565b5b8135612a7e848260208601612a17565b91505092915050565b60008060008060008060c08789031215612aa457612aa3612703565b5b6000612ab289828a0161280f565b9650506020612ac389828a01612872565b9550506040612ad489828a0161280f565b9450506060612ae589828a01612872565b9350506080612af689828a01612872565b92505060a087013567ffffffffffffffff811115612b1757612b16612708565b5b612b2389828a01612a59565b9150509295509295509295565b6000612b3b826128f3565b9050919050565b612b4b81612b30565b82525050565b6000602082019050612b666000830184612b42565b92915050565b600067ffffffffffffffff821115612b8757612b8661295c565b5b612b908261294b565b9050602081019050919050565b6000612bb0612bab84612b6c565b6129bc565b905082815260208101848484011115612bcc57612bcb612946565b5b612bd7848285612a08565b509392505050565b600082601f830112612bf457612bf3612941565b5b8135612c04848260208601612b9d565b91505092915050565b600060208284031215612c2357612c22612703565b5b600082013567ffffffffffffffff811115612c4157612c40612708565b5b612c4d84828501612bdf565b91505092915050565b600082825260208201905092915050565b7f4f6e6c79206465706c6f79657200000000000000000000000000000000000000600082015250565b6000612c9d600d83612c56565b9150612ca882612c67565b602082019050919050565b60006020820190508181036000830152612ccc81612c90565b9050919050565b7f416c726561647920736574000000000000000000000000000000000000000000600082015250565b6000612d09600b83612c56565b9150612d1482612cd3565b602082019050919050565b60006020820190508181036000830152612d3881612cfc565b9050919050565b7f4e4654206e6f74206f776e656400000000000000000000000000000000000000600082015250565b6000612d75600d83612c56565b9150612d8082612d3f565b602082019050919050565b60006020820190508181036000830152612da481612d68565b9050919050565b612db481612851565b82525050565b6000608082019050612dcf60008301876127ce565b612ddc6020830186612dab565b612de960408301856127ce565b612df66060830184612dab565b95945050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e39578082015181840152602081019050612e1e565b83811115612e48576000848401525b50505050565b6000612e5982612dff565b612e638185612e0a565b9350612e73818560208601612e1b565b612e7c8161294b565b840191505092915050565b6000604082019050612e9c60008301856126cf565b8181036020830152612eae8184612e4e565b90509392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612eec816127bc565b82525050565b6000612efe8383612ee3565b60208301905092915050565b6000602082019050919050565b6000612f2282612eb7565b612f2c8185612ec2565b9350612f3783612ed3565b8060005b83811015612f68578151612f4f8882612ef2565b9750612f5a83612f0a565b925050600181019050612f3b565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612faa81612851565b82525050565b6000612fbc8383612fa1565b60208301905092915050565b6000602082019050919050565b6000612fe082612f75565b612fea8185612f80565b9350612ff583612f91565b8060005b8381101561302657815161300d8882612fb0565b975061301883612fc8565b925050600181019050612ff9565b5085935050505092915050565b600081519050919050565b600061304982613033565b6130538185612c56565b9350613063818560208601612e1b565b61306c8161294b565b840191505092915050565b60006101008201905061308d600083018b6127ce565b61309a602083018a612dab565b6130a760408301896127ce565b6130b46060830188612dab565b81810360808301526130c68187612f17565b905081810360a08301526130da8186612fd5565b90506130e960c0830185612dab565b81810360e08301526130fb818461303e565b90509998505050505050505050565b600060408201905061311f60008301856127ce565b61312c6020830184612dab565b9392505050565b6000815190506131428161285b565b92915050565b60006020828403121561315e5761315d612703565b5b600061316c84828501613133565b91505092915050565b600060208201905061318a6000830184612dab565b92915050565b60008151905061319f816127f8565b92915050565b6000602082840312156131bb576131ba612703565b5b60006131c984828501613190565b91505092915050565b60006040820190506131e760008301856127ce565b81810360208301526131f98184612e4e565b90509392505050565b6000819050919050565b600061322761322261321d84613202565b6128c7565b612851565b9050919050565b6132378161320c565b82525050565b600060608201905061325260008301866127ce565b61325f6020830185612dab565b61326c604083018461322e565b949350505050565b600067ffffffffffffffff82111561328f5761328e61295c565b5b602082029050602081019050919050565b600080fd5b60006132b08261279c565b9050919050565b6132c0816132a5565b81146132cb57600080fd5b50565b6000815190506132dd816132b7565b92915050565b60006132f66132f184613274565b6129bc565b90508083825260208201905060208402830185811115613319576133186132a0565b5b835b81811015613342578061332e88826132ce565b84526020840193505060208101905061331b565b5050509392505050565b600082601f83011261336157613360612941565b5b81516133718482602086016132e3565b91505092915050565b600067ffffffffffffffff8211156133955761339461295c565b5b602082029050602081019050919050565b60006133b96133b48461337a565b6129bc565b905080838252602082019050602084028301858111156133dc576133db6132a0565b5b835b8181101561340557806133f18882613133565b8452602084019350506020810190506133de565b5050509392505050565b600082601f83011261342457613423612941565b5b81516134348482602086016133a6565b91505092915050565b6000806040838503121561345457613453612703565b5b600083015167ffffffffffffffff81111561347257613471612708565b5b61347e8582860161334c565b925050602083015167ffffffffffffffff81111561349f5761349e612708565b5b6134ab8582860161340f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff82169050919050565b600061352b82613513565b915060ff82141561353f5761353e6134e4565b5b600182019050919050565b7f496e76616c696420627000000000000000000000000000000000000000000000600082015250565b6000613580600a83612c56565b915061358b8261354a565b602082019050919050565b600060208201905081810360008301526135af81613573565b9050919050565b6000819050919050565b6135d16135cc82612851565b6135b6565b82525050565b600081905092915050565b60006135ed82612dff565b6135f781856135d7565b9350613607818560208601612e1b565b80840191505092915050565b600061361f82866135c0565b60208201915061362f82856135e2565b915061363b82846135c0565b602082019150819050949350505050565b7f4678526f6f7454756e6e656c3a20455849545f414c52454144595f50524f434560008201527f5353454400000000000000000000000000000000000000000000000000000000602082015250565b60006136a8602483612c56565b91506136b38261364c565b604082019050919050565b600060208201905081810360008301526136d78161369b565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f46585f4348494c445f5460008201527f554e4e454c000000000000000000000000000000000000000000000000000000602082015250565b600061373a602583612c56565b9150613745826136de565b604082019050919050565b600060208201905081810360008301526137698161372d565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f524543454950545f505260008201527f4f4f460000000000000000000000000000000000000000000000000000000000602082015250565b60006137cc602383612c56565b91506137d782613770565b604082019050919050565b600060208201905081810360008301526137fb816137bf565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f5349474e415455524500600082015250565b6000613838601f83612c56565b915061384382613802565b602082019050919050565b600060208201905081810360008301526138678161382b565b9050919050565b600061388161387c84612b6c565b6129bc565b90508281526020810184848401111561389d5761389c612946565b5b6138a8848285612e1b565b509392505050565b600082601f8301126138c5576138c4612941565b5b81516138d584826020860161386e565b91505092915050565b6000602082840312156138f4576138f3612703565b5b600082015167ffffffffffffffff81111561391257613911612708565b5b61391e848285016138b0565b91505092915050565b600061393282612851565b915061393d83612851565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613972576139716134e4565b5b828201905092915050565b600061398882612851565b915061399383612851565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139cc576139cb6134e4565b5b828202905092915050565b60006139e282612851565b91506139ed83612851565b925082821015613a00576139ff6134e4565b5b828203905092915050565b6000613a1682612851565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a4957613a486134e4565b5b600182019050919050565b600081519050613a638161270d565b92915050565b600080600080600060a08688031215613a8557613a84612703565b5b6000613a9388828901613a54565b9550506020613aa488828901613133565b9450506040613ab588828901613133565b9350506060613ac688828901613133565b9250506080613ad788828901613190565b9150509295509295909350565b6000819050919050565b613aff613afa826126c5565b613ae4565b82525050565b6000613b1182876135c0565b602082019150613b2182866135c0565b602082019150613b318285613aee565b602082019150613b418284613aee565b60208201915081905095945050505050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f48454144455200000000600082015250565b6000613b89601c83612c56565b9150613b9482613b53565b602082019050919050565b60006020820190508181036000830152613bb881613b7c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613bf982612851565b9150613c0483612851565b925082613c1457613c13613bbf565b5b828206905092915050565b6000613c2a82612851565b9150613c3583612851565b925082613c4557613c44613bbf565b5b828204905092915050565b6000613c5b82613513565b9150613c6683613513565b925082613c7657613c75613bbf565b5b828206905092915050565b6000613c8c82613513565b9150613c9783613513565b925082613ca757613ca6613bbf565b5b828204905092915050565b60008160011c9050919050565b6000808291508390505b6001851115613d0957808604811115613ce557613ce46134e4565b5b6001851615613cf45780820291505b8081029050613d0285613cb2565b9450613cc9565b94509492505050565b600082613d225760019050613dde565b81613d305760009050613dde565b8160018114613d465760028114613d5057613d7f565b6001915050613dde565b60ff841115613d6257613d616134e4565b5b8360020a915084821115613d7957613d786134e4565b5b50613dde565b5060208310610133831016604e8410600b8410161715613db45782820a905083811115613daf57613dae6134e4565b5b613dde565b613dc18484846001613cbf565b92509050818404811115613dd857613dd76134e4565b5b81810290505b9392505050565b6000613df082612851565b9150613dfb83612851565b9250613e287fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613d12565b905092915050565b7f496e76616c69642070726f6f66206c656e677468000000000000000000000000600082015250565b6000613e66601483612c56565b9150613e7182613e30565b602082019050919050565b60006020820190508181036000830152613e9581613e59565b9050919050565b7f4c65616620696e64657820697320746f6f206269670000000000000000000000600082015250565b6000613ed2601583612c56565b9150613edd82613e9c565b602082019050919050565b60006020820190508181036000830152613f0181613ec5565b9050919050565b6000613f148285613aee565b602082019150613f248284613aee565b6020820191508190509392505050565b6000613f3f82613513565b9150613f4a83613513565b925082821015613f5d57613f5c6134e4565b5b82820390509291505056fea26469706673582212207632d4088aeee4b020a674429d20959bf13acfff284e0c83442f7d002ea2dceb64736f6c6343000809003300000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a20000000000000000000000000385603ab55642cb4dd5de3ae9e306809991804f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063c0857ba011610071578063c0857ba01461017b578063c679ff9a14610199578063d5f39488146101b5578063de9b771f146101d3578063e8a28dd7146101f1578063f953cec71461020f576100b4565b80630e387de6146100b957806310325264146100d7578063607f2d42146100f5578063972c492814610125578063aea4e49e14610143578063b7d0ee431461015f575b600080fd5b6100c161022b565b6040516100ce91906126de565b60405180910390f35b6100df610252565b6040516100ec91906126de565b60405180910390f35b61010f600480360381019061010a9190612739565b610276565b60405161011c9190612781565b60405180910390f35b61012d610296565b60405161013a91906127dd565b60405180910390f35b61015d60048036038101906101589190612824565b6102bc565b005b61017960048036038101906101749190612887565b610421565b005b6101836104e4565b6040516101909190612926565b60405180910390f35b6101b360048036038101906101ae9190612a87565b61050a565b005b6101bd610611565b6040516101ca91906127dd565b60405180910390f35b6101db610637565b6040516101e89190612b51565b60405180910390f35b6101f961065b565b60405161020691906126de565b60405180910390f35b61022960048036038101906102249190612c0d565b61067f565b005b7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03660001b81565b7ff98aef635801dfa470eae0492dd6a267cc7e32661957109ef6316bfd8bea371e81565b60036020528060005260406000206000915054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461034c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034390612cb3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146103dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d490612d1f565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61042c828233610699565b61046b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046290612d8b565b60405180910390fd5b60007ff98aef635801dfa470eae0492dd6a267cc7e32661957109ef6316bfd8bea371e334685856040516020016104a59493929190612dba565b6040516020818303038152906040526040516020016104c5929190612e87565b60405160208183030381529060405290506104df816108c3565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610515868633610699565b610554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054b90612d8b565b60405180910390fd5b600080610586600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1689898989610975565b9150915060007f58cc5acb742fd5eb9df21407aed105abca7d37584645d014636aa13c7b7bc38733468b8b87878b8b6040516020016105cc989796959493929190613077565b6040516020818303038152906040526040516020016105ec929190612e87565b6040516020818303038152906040529050610606816108c3565b505050505050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f58cc5acb742fd5eb9df21407aed105abca7d37584645d014636aa13c7b7bc38781565b600061068a82610ca6565b905061069581610fab565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1662fdd58e83856040518363ffffffff1660e01b81526004016106d592919061310a565b60206040518083038186803b1580156106ed57600080fd5b505afa92505050801561071e57506040513d601f19601f8201168201806040525081019061071b9190613148565b60015b61072757610733565b600081119150506108bc565b8373ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b815260040161076c9190613175565b60206040518083038186803b15801561078457600080fd5b505afa9250505080156107b557506040513d601f19601f820116820180604052508101906107b291906131a5565b60015b6107be576107f5565b8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149150506108bc565b8373ffffffffffffffffffffffffffffffffffffffff166358178168846040518263ffffffff1660e01b815260040161082e9190613175565b60206040518083038186803b15801561084657600080fd5b505afa92505050801561087757506040513d601f19601f8201168201806040525081019061087491906131a5565b60015b610880576108b7565b8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149150506108bc565b600090505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b4720477600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016109409291906131d2565b600060405180830381600087803b15801561095a57600080fd5b505af115801561096e573d6000803e3d6000fd5b5050505050565b606080600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610b42578673ffffffffffffffffffffffffffffffffffffffff16633e10401487876127106040518463ffffffff1660e01b81526004016109eb9392919061323d565b60006040518083038186803b158015610a0357600080fd5b505afa925050508015610a3957506040513d6000823e3d601f19601f82011682018060405250810190610a36919061343d565b60015b610a4257610b41565b610a4c8282610fae565b15610b3e576000825167ffffffffffffffff811115610a6e57610a6d61295c565b5b604051908082528060200260200182016040528015610a9c5781602001602082028036833780820191505090505b50905060005b83518160ff161015610b2f57838160ff1681518110610ac457610ac36134b5565b5b6020026020010151828260ff1681518110610ae257610ae16134b5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610b2790613520565b915050610aa2565b50808294509450505050610c9c565b50505b5b6000600167ffffffffffffffff811115610b5f57610b5e61295c565b5b604051908082528060200260200182016040528015610b8d5781602001602082028036833780820191505090505b5090508481600081518110610ba557610ba46134b5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612710841115610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1b90613596565b60405180910390fd5b6000600167ffffffffffffffff811115610c4157610c4061295c565b5b604051908082528060200260200182016040528015610c6f5781602001602082028036833780820191505090505b5090508481600081518110610c8757610c866134b5565b5b60200260200101818152505081819350935050505b9550959350505050565b60606000610cb3836110fa565b90506000610cc08261112e565b90506000610ccd8361115f565b9050600081610cdb84611190565b610ce4866113a6565b604051602001610cf693929190613613565b604051602081830303815290604052805190602001209050600015156003600083815260200190815260200160002060009054906101000a900460ff16151514610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c906136be565b60405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000610dac856113d7565b90506000610db9826114fc565b9050610dc481611573565b73ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90613750565b60405180910390fd5b6000610e5e876115a4565b9050610e7c610e6c846115d8565b87610e768a6115e6565b84611617565b610ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb2906137e2565b60405180910390fd5b610ee985610ec88961191d565b610ed18a61194e565b84610edb8c611982565b610ee48d6119b3565b6119e4565b506000610ef583611b3a565b90507f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03660001b610f37610f32600084611b7f90919063ffffffff16565b611bae565b60001b14610f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f719061384e565b60405180910390fd5b6000610f8584611c31565b806020019051810190610f9891906138de565b9050809950505050505050505050919050565b50565b60008083511415610fc257600090506110f4565b8151835114610fd457600090506110f4565b6000805b84518160ff1610156110d957600073ffffffffffffffffffffffffffffffffffffffff16858260ff1681518110611012576110116134b5565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611041576000925050506110f4565b6000848260ff1681518110611059576110586134b5565b5b6020026020010151148061108b5750612710848260ff1681518110611081576110806134b5565b5b6020026020010151115b1561109b576000925050506110f4565b838160ff16815181106110b1576110b06134b5565b5b6020026020010151826110c49190613927565b915080806110d190613520565b915050610fd8565b506127108111156110ee5760009150506110f4565b60019150505b92915050565b611102612644565b600061111561111084611c62565b611c90565b9050604051806020016040528082815250915050919050565b6060611158826000015160088151811061114b5761114a6134b5565b5b6020026020010151611da5565b9050919050565b6000611189826000015160028151811061117c5761117b6134b5565b5b6020026020010151611bae565b9050919050565b6060600060405180602001604052806000815250905060008351111561139d576000806111be600086611e5c565b60f81c905060018160ff1614806111d8575060038160ff16145b156112a2576001600286516111ed919061397d565b6111f791906139d7565b67ffffffffffffffff8111156112105761120f61295c565b5b6040519080825280601f01601f1916602001820160405280156112425781602001600182028036833780820191505090505b5092506000611252600187611e5c565b90508084600081518110611269576112686134b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600192505061130e565b60028086516112b1919061397d565b6112bb91906139d7565b67ffffffffffffffff8111156112d4576112d361295c565b5b6040519080825280601f01601f1916602001820160405280156113065781602001600182028036833780820191505090505b509250600091505b60008260ff1690505b83518110156113995761134460028460ff168361133491906139d7565b61133e9190613927565b87611e5c565b848281518110611357576113566134b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061139190613a0b565b915050611317565b5050505b80915050919050565b60006113d082600001516009815181106113c3576113c26134b5565b5b6020026020010151611bae565b9050919050565b6113df612657565b61140782600001516006815181106113fa576113f96134b5565b5b6020026020010151611da5565b8160200181905250600061141e8260200151611c62565b905061142981611ef4565b156114445761143781611c90565b82600001819052506114e4565b60008260200151905060006001825161145d91906139d7565b67ffffffffffffffff8111156114765761147561295c565b5b6040519080825280601f01601f1916602001820160405280156114a85781602001600182028036833780820191505090505b5090506000808360210191508260200190506114c682828551611f42565b6114d76114d284611c62565b611c90565b8660000181905250505050505b6114ed836113a6565b82604001818152505050919050565b611504612678565b600061152e8360000151600381518110611521576115206134b5565b5b6020026020010151611c90565b836040015181518110611544576115436134b5565b5b60200260200101519050604051806040016040528082815260200161156883611c90565b815250915050919050565b600061159d82602001516000815181106115905761158f6134b5565b5b6020026020010151611fdf565b9050919050565b60006115ce82600001516005815181106115c1576115c06134b5565b5b6020026020010151611bae565b60001b9050919050565b606081602001519050919050565b60606116108260000151600781518110611603576116026134b5565b5b6020026020010151611da5565b9050919050565b60008061162384611c62565b9050600061163082611c90565b905060608060008690506000806116468b611190565b9050600081511415611662576000975050505050505050611915565b60005b865181101561190c57815183111561168857600098505050505050505050611915565b6116ab87828151811061169e5761169d6134b5565b5b6020026020010151612002565b9550858051906020012084146116cc57600098505050505050505050611915565b6116ef8782815181106116e2576116e16134b5565b5b6020026020010151611c90565b94506011855114156117e257815183141561175f578c8051906020012061173086601081518110611723576117226134b5565b5b6020026020010151611da5565b80519060200120141561174e57600198505050505050505050611915565b600098505050505050505050611915565b6000828481518110611774576117736134b5565b5b602001015160f81c60f81b60f81c905060108160ff1611156117a25760009950505050505050505050611915565b6117c8868260ff16815181106117bb576117ba6134b5565b5b6020026020010151612092565b60001b94506001846117da9190613927565b9350506118f9565b6002855114156118e757600061181c61181587600081518110611808576118076134b5565b5b6020026020010151611da5565b84866120c9565b90508251818561182c9190613927565b141561188f578d8051906020012061185e87600181518110611851576118506134b5565b5b6020026020010151611da5565b80519060200120141561187d5760019950505050505050505050611915565b60009950505050505050505050611915565b60008114156118aa5760009950505050505050505050611915565b80846118b69190613927565b93506118dc866001815181106118cf576118ce6134b5565b5b6020026020010151612092565b60001b9450506118f8565b600098505050505050505050611915565b5b808061190490613a0b565b915050611665565b50505050505050505b949350505050565b6000611947826000015160038151811061193a576119396134b5565b5b6020026020010151611bae565b9050919050565b6000611978826000015160048151811061196b5761196a6134b5565b5b6020026020010151611bae565b60001b9050919050565b60006119ac826000015160008151811061199f5761199e6134b5565b5b6020026020010151611bae565b9050919050565b60606119dd82600001516001815181106119d0576119cf6134b5565b5b6020026020010151611da5565b9050919050565b600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166341539d4a876040518263ffffffff1660e01b8152600401611a459190613175565b60a06040518083038186803b158015611a5d57600080fd5b505afa158015611a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a959190613a69565b5093505092509250611aeb828b611aac91906139d7565b84878d8d8d8d604051602001611ac59493929190613b05565b604051602081830303815290604052805190602001206121ff909392919063ffffffff16565b611b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2190613b9f565b60405180910390fd5b8093505050509695505050505050565b611b42612698565b6040518060200160405280611b758460200151600181518110611b6857611b676134b5565b5b6020026020010151611c90565b8152509050919050565b611b876126ab565b82600001518281518110611b9e57611b9d6134b5565b5b6020026020010151905092915050565b6000808260000151118015611bc857506021826000015111155b611bd157600080fd5b6000611be08360200151612370565b90506000818460000151611bf491906139d7565b9050600080838660200151611c099190613927565b9050805191506020831015611c2557826020036101000a820491505b81945050505050919050565b6060611c5b8260200151600281518110611c4e57611c4d6134b5565b5b6020026020010151611da5565b9050919050565b611c6a6126ab565b600060208301905060405180604001604052808451815260200182815250915050919050565b6060611c9b82611ef4565b611ca457600080fd5b6000611caf8361242f565b905060008167ffffffffffffffff811115611ccd57611ccc61295c565b5b604051908082528060200260200182016040528015611d0657816020015b611cf36126ab565b815260200190600190039081611ceb5790505b5090506000611d188560200151612370565b8560200151611d279190613927565b9050600080600090505b84811015611d9857611d42836124bd565b9150604051806040016040528083815260200184815250848281518110611d6c57611d6b6134b5565b5b60200260200101819052508183611d839190613927565b92508080611d9090613a0b565b915050611d31565b5082945050505050919050565b60606000826000015111611db857600080fd5b6000611dc78360200151612370565b90506000818460000151611ddb91906139d7565b905060008167ffffffffffffffff811115611df957611df861295c565b5b6040519080825280601f01601f191660200182016040528015611e2b5781602001600182028036833780820191505090505b5090506000816020019050611e50848760200151611e499190613927565b8285612599565b81945050505050919050565b600080600284611e6c9190613bee565b14611eaf57601082600285611e819190613c1f565b81518110611e9257611e916134b5565b5b602001015160f81c60f81b60f81c611eaa9190613c50565b611ee9565b601082600285611ebf9190613c1f565b81518110611ed057611ecf6134b5565b5b602001015160f81c60f81b60f81c611ee89190613c81565b5b60f81b905092915050565b60008082600001511415611f0b5760009050611f3d565b60008083602001519050805160001a915060c060ff168260ff161015611f3657600092505050611f3d565b6001925050505b919050565b6000811415611f5057611fda565b5b602060ff168110611f9b5782518252602060ff1683611f709190613927565b9250602060ff1682611f829190613927565b9150602060ff1681611f9491906139d7565b9050611f51565b6000600182602060ff16611faf91906139d7565b610100611fbc9190613de5565b611fc691906139d7565b905080198451168184511681811785525050505b505050565b60006015826000015114611ff257600080fd5b611ffb82611bae565b9050919050565b60606000826000015167ffffffffffffffff8111156120245761202361295c565b5b6040519080825280601f01601f1916602001820160405280156120565781602001600182028036833780820191505090505b50905060008151141561206c578091505061208d565b60008160200190506120878460200151828660000151612599565b81925050505b919050565b600060218260000151146120a557600080fd5b600080600184602001516120b99190613927565b9050805191508192505050919050565b6000806000905060006120db86611190565b90506000815167ffffffffffffffff8111156120fa576120f961295c565b5b6040519080825280601f01601f19166020018201604052801561212c5781602001600182028036833780820191505090505b50905060008590505b8251866121429190613927565b8110156121cd57600087828151811061215e5761215d6134b5565b5b602001015160f81c60f81b90508083888461217991906139d7565b8151811061218a576121896134b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505080806121c590613a0b565b915050612135565b508080519060200120828051906020012014156121ed57815192506121f2565b600092505b8293505050509392505050565b600080602083516122109190613bee565b14612250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224790613e7c565b60405180910390fd5b6000602083516122609190613c1f565b905080600261226f9190613de5565b85106122b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a790613ee8565b60405180910390fd5b6000808790506000602090505b8551811161235f5780860151925060006002896122da9190613bee565b14156123105781836040516020016122f3929190613f08565b60405160208183030381529060405280519060200120915061233c565b8282604051602001612323929190613f08565b6040516020818303038152906040528051906020012091505b6002886123499190613c1f565b97506020816123589190613927565b90506122bd565b508581149350505050949350505050565b600080825160001a9050608060ff1681101561239057600091505061242a565b60b860ff168110806123b5575060c060ff1681101580156123b4575060f860ff1681105b5b156123c457600191505061242a565b60c060ff168110156123ff5760018060b86123df9190613f34565b60ff16826123ed91906139d7565b6123f79190613927565b91505061242a565b60018060f861240e9190613f34565b60ff168261241c91906139d7565b6124269190613927565b9150505b919050565b6000808260000151141561244657600090506124b8565b6000806124568460200151612370565b84602001516124659190613927565b905060008460000151856020015161247d9190613927565b90505b808210156124b157612491826124bd565b8261249c9190613927565b915082806124a990613a0b565b935050612480565b8293505050505b919050565b6000806000835160001a9050608060ff168110156124de576001915061258f565b60b860ff1681101561250d576001608060ff16826124fc91906139d7565b6125069190613927565b915061258e565b60c060ff1681101561253d5760b78103600185019450806020036101000a8551046001820181019350505061258d565b60f860ff1681101561256c57600160c060ff168261255b91906139d7565b6125659190613927565b915061258c565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b60008114156125a75761263f565b5b602060ff1681106125f25782518252602060ff16836125c79190613927565b9250602060ff16826125d99190613927565b9150602060ff16816125eb91906139d7565b90506125a8565b60008114156126005761263f565b6000600182602060ff1661261491906139d7565b6101006126219190613de5565b61262b91906139d7565b905080198451168184511681811785525050505b505050565b6040518060200160405280606081525090565b60405180606001604052806060815260200160608152602001600081525090565b604051806040016040528061268b6126ab565b8152602001606081525090565b6040518060200160405280606081525090565b604051806040016040528060008152602001600081525090565b6000819050919050565b6126d8816126c5565b82525050565b60006020820190506126f360008301846126cf565b92915050565b6000604051905090565b600080fd5b600080fd5b612716816126c5565b811461272157600080fd5b50565b6000813590506127338161270d565b92915050565b60006020828403121561274f5761274e612703565b5b600061275d84828501612724565b91505092915050565b60008115159050919050565b61277b81612766565b82525050565b60006020820190506127966000830184612772565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127c78261279c565b9050919050565b6127d7816127bc565b82525050565b60006020820190506127f260008301846127ce565b92915050565b612801816127bc565b811461280c57600080fd5b50565b60008135905061281e816127f8565b92915050565b60006020828403121561283a57612839612703565b5b60006128488482850161280f565b91505092915050565b6000819050919050565b61286481612851565b811461286f57600080fd5b50565b6000813590506128818161285b565b92915050565b6000806040838503121561289e5761289d612703565b5b60006128ac8582860161280f565b92505060206128bd85828601612872565b9150509250929050565b6000819050919050565b60006128ec6128e76128e28461279c565b6128c7565b61279c565b9050919050565b60006128fe826128d1565b9050919050565b6000612910826128f3565b9050919050565b61292081612905565b82525050565b600060208201905061293b6000830184612917565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129948261294b565b810181811067ffffffffffffffff821117156129b3576129b261295c565b5b80604052505050565b60006129c66126f9565b90506129d2828261298b565b919050565b600067ffffffffffffffff8211156129f2576129f161295c565b5b6129fb8261294b565b9050602081019050919050565b82818337600083830152505050565b6000612a2a612a25846129d7565b6129bc565b905082815260208101848484011115612a4657612a45612946565b5b612a51848285612a08565b509392505050565b600082601f830112612a6e57612a6d612941565b5b8135612a7e848260208601612a17565b91505092915050565b60008060008060008060c08789031215612aa457612aa3612703565b5b6000612ab289828a0161280f565b9650506020612ac389828a01612872565b9550506040612ad489828a0161280f565b9450506060612ae589828a01612872565b9350506080612af689828a01612872565b92505060a087013567ffffffffffffffff811115612b1757612b16612708565b5b612b2389828a01612a59565b9150509295509295509295565b6000612b3b826128f3565b9050919050565b612b4b81612b30565b82525050565b6000602082019050612b666000830184612b42565b92915050565b600067ffffffffffffffff821115612b8757612b8661295c565b5b612b908261294b565b9050602081019050919050565b6000612bb0612bab84612b6c565b6129bc565b905082815260208101848484011115612bcc57612bcb612946565b5b612bd7848285612a08565b509392505050565b600082601f830112612bf457612bf3612941565b5b8135612c04848260208601612b9d565b91505092915050565b600060208284031215612c2357612c22612703565b5b600082013567ffffffffffffffff811115612c4157612c40612708565b5b612c4d84828501612bdf565b91505092915050565b600082825260208201905092915050565b7f4f6e6c79206465706c6f79657200000000000000000000000000000000000000600082015250565b6000612c9d600d83612c56565b9150612ca882612c67565b602082019050919050565b60006020820190508181036000830152612ccc81612c90565b9050919050565b7f416c726561647920736574000000000000000000000000000000000000000000600082015250565b6000612d09600b83612c56565b9150612d1482612cd3565b602082019050919050565b60006020820190508181036000830152612d3881612cfc565b9050919050565b7f4e4654206e6f74206f776e656400000000000000000000000000000000000000600082015250565b6000612d75600d83612c56565b9150612d8082612d3f565b602082019050919050565b60006020820190508181036000830152612da481612d68565b9050919050565b612db481612851565b82525050565b6000608082019050612dcf60008301876127ce565b612ddc6020830186612dab565b612de960408301856127ce565b612df66060830184612dab565b95945050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e39578082015181840152602081019050612e1e565b83811115612e48576000848401525b50505050565b6000612e5982612dff565b612e638185612e0a565b9350612e73818560208601612e1b565b612e7c8161294b565b840191505092915050565b6000604082019050612e9c60008301856126cf565b8181036020830152612eae8184612e4e565b90509392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612eec816127bc565b82525050565b6000612efe8383612ee3565b60208301905092915050565b6000602082019050919050565b6000612f2282612eb7565b612f2c8185612ec2565b9350612f3783612ed3565b8060005b83811015612f68578151612f4f8882612ef2565b9750612f5a83612f0a565b925050600181019050612f3b565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612faa81612851565b82525050565b6000612fbc8383612fa1565b60208301905092915050565b6000602082019050919050565b6000612fe082612f75565b612fea8185612f80565b9350612ff583612f91565b8060005b8381101561302657815161300d8882612fb0565b975061301883612fc8565b925050600181019050612ff9565b5085935050505092915050565b600081519050919050565b600061304982613033565b6130538185612c56565b9350613063818560208601612e1b565b61306c8161294b565b840191505092915050565b60006101008201905061308d600083018b6127ce565b61309a602083018a612dab565b6130a760408301896127ce565b6130b46060830188612dab565b81810360808301526130c68187612f17565b905081810360a08301526130da8186612fd5565b90506130e960c0830185612dab565b81810360e08301526130fb818461303e565b90509998505050505050505050565b600060408201905061311f60008301856127ce565b61312c6020830184612dab565b9392505050565b6000815190506131428161285b565b92915050565b60006020828403121561315e5761315d612703565b5b600061316c84828501613133565b91505092915050565b600060208201905061318a6000830184612dab565b92915050565b60008151905061319f816127f8565b92915050565b6000602082840312156131bb576131ba612703565b5b60006131c984828501613190565b91505092915050565b60006040820190506131e760008301856127ce565b81810360208301526131f98184612e4e565b90509392505050565b6000819050919050565b600061322761322261321d84613202565b6128c7565b612851565b9050919050565b6132378161320c565b82525050565b600060608201905061325260008301866127ce565b61325f6020830185612dab565b61326c604083018461322e565b949350505050565b600067ffffffffffffffff82111561328f5761328e61295c565b5b602082029050602081019050919050565b600080fd5b60006132b08261279c565b9050919050565b6132c0816132a5565b81146132cb57600080fd5b50565b6000815190506132dd816132b7565b92915050565b60006132f66132f184613274565b6129bc565b90508083825260208201905060208402830185811115613319576133186132a0565b5b835b81811015613342578061332e88826132ce565b84526020840193505060208101905061331b565b5050509392505050565b600082601f83011261336157613360612941565b5b81516133718482602086016132e3565b91505092915050565b600067ffffffffffffffff8211156133955761339461295c565b5b602082029050602081019050919050565b60006133b96133b48461337a565b6129bc565b905080838252602082019050602084028301858111156133dc576133db6132a0565b5b835b8181101561340557806133f18882613133565b8452602084019350506020810190506133de565b5050509392505050565b600082601f83011261342457613423612941565b5b81516134348482602086016133a6565b91505092915050565b6000806040838503121561345457613453612703565b5b600083015167ffffffffffffffff81111561347257613471612708565b5b61347e8582860161334c565b925050602083015167ffffffffffffffff81111561349f5761349e612708565b5b6134ab8582860161340f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff82169050919050565b600061352b82613513565b915060ff82141561353f5761353e6134e4565b5b600182019050919050565b7f496e76616c696420627000000000000000000000000000000000000000000000600082015250565b6000613580600a83612c56565b915061358b8261354a565b602082019050919050565b600060208201905081810360008301526135af81613573565b9050919050565b6000819050919050565b6135d16135cc82612851565b6135b6565b82525050565b600081905092915050565b60006135ed82612dff565b6135f781856135d7565b9350613607818560208601612e1b565b80840191505092915050565b600061361f82866135c0565b60208201915061362f82856135e2565b915061363b82846135c0565b602082019150819050949350505050565b7f4678526f6f7454756e6e656c3a20455849545f414c52454144595f50524f434560008201527f5353454400000000000000000000000000000000000000000000000000000000602082015250565b60006136a8602483612c56565b91506136b38261364c565b604082019050919050565b600060208201905081810360008301526136d78161369b565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f46585f4348494c445f5460008201527f554e4e454c000000000000000000000000000000000000000000000000000000602082015250565b600061373a602583612c56565b9150613745826136de565b604082019050919050565b600060208201905081810360008301526137698161372d565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f524543454950545f505260008201527f4f4f460000000000000000000000000000000000000000000000000000000000602082015250565b60006137cc602383612c56565b91506137d782613770565b604082019050919050565b600060208201905081810360008301526137fb816137bf565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f5349474e415455524500600082015250565b6000613838601f83612c56565b915061384382613802565b602082019050919050565b600060208201905081810360008301526138678161382b565b9050919050565b600061388161387c84612b6c565b6129bc565b90508281526020810184848401111561389d5761389c612946565b5b6138a8848285612e1b565b509392505050565b600082601f8301126138c5576138c4612941565b5b81516138d584826020860161386e565b91505092915050565b6000602082840312156138f4576138f3612703565b5b600082015167ffffffffffffffff81111561391257613911612708565b5b61391e848285016138b0565b91505092915050565b600061393282612851565b915061393d83612851565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613972576139716134e4565b5b828201905092915050565b600061398882612851565b915061399383612851565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139cc576139cb6134e4565b5b828202905092915050565b60006139e282612851565b91506139ed83612851565b925082821015613a00576139ff6134e4565b5b828203905092915050565b6000613a1682612851565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a4957613a486134e4565b5b600182019050919050565b600081519050613a638161270d565b92915050565b600080600080600060a08688031215613a8557613a84612703565b5b6000613a9388828901613a54565b9550506020613aa488828901613133565b9450506040613ab588828901613133565b9350506060613ac688828901613133565b9250506080613ad788828901613190565b9150509295509295909350565b6000819050919050565b613aff613afa826126c5565b613ae4565b82525050565b6000613b1182876135c0565b602082019150613b2182866135c0565b602082019150613b318285613aee565b602082019150613b418284613aee565b60208201915081905095945050505050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f48454144455200000000600082015250565b6000613b89601c83612c56565b9150613b9482613b53565b602082019050919050565b60006020820190508181036000830152613bb881613b7c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613bf982612851565b9150613c0483612851565b925082613c1457613c13613bbf565b5b828206905092915050565b6000613c2a82612851565b9150613c3583612851565b925082613c4557613c44613bbf565b5b828204905092915050565b6000613c5b82613513565b9150613c6683613513565b925082613c7657613c75613bbf565b5b828206905092915050565b6000613c8c82613513565b9150613c9783613513565b925082613ca757613ca6613bbf565b5b828204905092915050565b60008160011c9050919050565b6000808291508390505b6001851115613d0957808604811115613ce557613ce46134e4565b5b6001851615613cf45780820291505b8081029050613d0285613cb2565b9450613cc9565b94509492505050565b600082613d225760019050613dde565b81613d305760009050613dde565b8160018114613d465760028114613d5057613d7f565b6001915050613dde565b60ff841115613d6257613d616134e4565b5b8360020a915084821115613d7957613d786134e4565b5b50613dde565b5060208310610133831016604e8410600b8410161715613db45782820a905083811115613daf57613dae6134e4565b5b613dde565b613dc18484846001613cbf565b92509050818404811115613dd857613dd76134e4565b5b81810290505b9392505050565b6000613df082612851565b9150613dfb83612851565b9250613e287fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613d12565b905092915050565b7f496e76616c69642070726f6f66206c656e677468000000000000000000000000600082015250565b6000613e66601483612c56565b9150613e7182613e30565b602082019050919050565b60006020820190508181036000830152613e9581613e59565b9050919050565b7f4c65616620696e64657820697320746f6f206269670000000000000000000000600082015250565b6000613ed2601583612c56565b9150613edd82613e9c565b602082019050919050565b60006020820190508181036000830152613f0181613ec5565b9050919050565b6000613f148285613aee565b602082019150613f248284613aee565b6020820191508190509392505050565b6000613f3f82613513565b9150613f4a83613513565b925082821015613f5d57613f5c6134e4565b5b82820390509291505056fea26469706673582212207632d4088aeee4b020a674429d20959bf13acfff284e0c83442f7d002ea2dceb64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a20000000000000000000000000385603ab55642cb4dd5de3ae9e306809991804f
-----Decoded View---------------
Arg [0] : _checkpointManager (address): 0x86E4Dc95c7FBdBf52e33D563BbDB00823894C287
Arg [1] : _fxRoot (address): 0xfe5e5D361b2ad62c541bAb87C45a0B9B018389a2
Arg [2] : _royaltyRegistry (address): 0x0385603ab55642cb4Dd5De3aE9e306809991804f
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287
Arg [1] : 000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a2
Arg [2] : 0000000000000000000000000385603ab55642cb4dd5de3ae9e306809991804f
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 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.