Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CypherdudesFileStore
Compiler Version
v0.8.22+commit.4fc1097e
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.20; import {SSTORE2} from "./solady/utils/SSTORE2.sol"; import {ICypherdudesFileStore} from "./ICypherdudesFileStore.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {File, Content} from "./File.sol"; import {IContentStore} from "./IContentStore.sol"; interface ICypherDudes { struct TokenData { string cypherCard; } function tokenData( uint256 tokenId ) external view returns( string memory); } contract CypherdudesFileStore is ICypherdudesFileStore, Ownable { IContentStore public immutable contentStore; ICypherDudes public cypherDudesContract; address cypherDudesContractAddy; // filename => File checksum mapping(string => bytes32) public files; constructor(IContentStore _contentStore) Ownable(msg.sender){ contentStore = _contentStore; } function setCypherCardContract(address _cypherCardContract) public onlyOwner{ cypherDudesContract = ICypherDudes(_cypherCardContract); cypherDudesContractAddy = _cypherCardContract; } function fileExists(string memory filename) public view returns (bool) { return files[filename] != bytes32(0); } function getChecksum(string memory filename) public view returns (bytes32 checksum) { checksum = files[filename]; if (checksum == bytes32(0)) { revert FileNotFound(filename); } return checksum; } function getFile(string memory filename) public view returns (File memory file) { bytes32 checksum = files[filename]; if (checksum == bytes32(0)) { revert FileNotFound(filename); } address pointer = contentStore.pointers(checksum); if (pointer == address(0)) { revert FileNotFound(filename); } return abi.decode(SSTORE2.read(pointer), (File)); } function readFile(string memory filename) public view returns (string memory content){ return getFile(filename).read(); } function storeFile(string memory filename, bytes memory content) public returns(File memory file) { (bytes32 checksum,) = contentStore.addContent(content); bytes32[] memory checksums = new bytes32[](1); checksums[0] = checksum; return createFile(filename, checksums); } function createFile(string memory filename, bytes32[] memory checksums) public returns (File memory file) { return createFile(filename, checksums, new bytes(0)); } function createFile( string memory filename, bytes32[] memory checksums, bytes memory extraData ) public returns (File memory file) { if (files[filename] != bytes32(0)) { revert FilenameExists(filename); } return _createFile(filename, checksums, extraData); } function _createFile( string memory filename, bytes32[] memory checksums, bytes memory extraData ) private returns (File memory file) { Content[] memory contents = new Content[](checksums.length); uint256 size = 0; // TODO: optimize this for (uint256 i = 0; i < checksums.length; ++i) { size += contentStore.contentLength(checksums[i]); contents[i] = Content({ checksum: checksums[i], pointer: contentStore.getPointer(checksums[i]) }); } if (size == 0) { revert EmptyFile(); } file = File({size: size, contents: contents}); (bytes32 checksum,) = contentStore.addContent(abi.encode(file)); files[filename] = checksum; emit FileCreated(filename, checksum, filename, file.size, extraData); } function deleteFile(string memory filename) public onlyOwner { bytes32 checksum = files[filename]; if (checksum == bytes32(0)) { revert FileNotFound(filename); } delete files[filename]; emit FileDeleted(filename, checksum, filename); } function deleteCard(string memory filename) public { if (msg.sender == cypherDudesContractAddy){ bytes32 checksum = files[filename]; if (checksum == bytes32(0)) { revert FileNotFound(filename); } delete files[filename]; emit FileDeleted(filename, checksum, filename); } else{ revert NottheOwner(filename, msg.sender); } } function getScript(string memory filename) public view returns (bytes memory script){ bytes32 checksum = files[filename]; if (checksum == bytes32(0)) { revert FileNotFound(filename); } address pointer = contentStore.pointers(checksum); if (pointer == address(0)) { revert FileNotFound(filename); } return SSTORE2.read(pointer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.20; struct Content { bytes32 checksum; address pointer; } struct File { uint256 size; // content length in bytes, max 24k Content[] contents; } function read(File memory file) view returns (string memory contents) { Content[] memory chunks = file.contents; // Adapted from https://gist.github.com/xtremetom/20411eb126aaf35f98c8a8ffa00123cd assembly { let len := mload(chunks) let totalSize := 0x20 contents := mload(0x40) let size let chunk let pointer // loop through all pointer addresses // - get content // - get address // - get data size // - get code and add to contents // - update total size for { let i := 0 } lt(i, len) { i := add(i, 1) } { chunk := mload(add(chunks, add(0x20, mul(i, 0x20)))) pointer := mload(add(chunk, 0x20)) size := sub(extcodesize(pointer), 1) extcodecopy(pointer, add(contents, totalSize), 1, size) totalSize := add(totalSize, size) } // update contents size mstore(contents, sub(totalSize, 0x20)) // store contents mstore(0x40, add(contents, and(add(totalSize, 0x1f), not(0x1f)))) } } using {read} for File global;
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.20; interface IContentStore { event NewChecksum(bytes32 indexed checksum, uint256 contentSize); error ChecksumExists(bytes32 checksum); error ChecksumNotFound(bytes32 checksum); function pointers(bytes32 checksum) external view returns (address pointer); function checksumExists(bytes32 checksum) external view returns (bool); function contentLength(bytes32 checksum) external view returns (uint256 size); function addPointer(address pointer) external returns (bytes32 checksum); function addContent(bytes memory content) external returns (bytes32 checksum, address pointer); function getPointer(bytes32 checksum) external view returns (address pointer); }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.20; import {File} from "./File.sol"; import {IContentStore} from "./IContentStore.sol"; interface ICypherdudesFileStore { event FileCreated( string indexed indexedFilename, bytes32 indexed checksum, string filename, uint256 size, bytes metadata ); event FileDeleted( string indexed indexedFilename, bytes32 indexed checksum, string filename ); error NottheOwner(string filename, address wrongAddress); error FileNotFound(string filename); error FilenameExists(string filename); error EmptyFile(); function contentStore() external view returns (IContentStore); function files(string memory filename) external view returns (bytes32 checksum); function fileExists(string memory filename) external view returns (bool); function getChecksum(string memory filename) external view returns (bytes32 checksum); function getFile(string memory filename) external view returns (File memory file); function createFile(string memory filename, bytes32[] memory checksums) external returns (File memory file); function createFile( string memory filename, bytes32[] memory checksums, bytes memory extraData ) external returns (File memory file); function deleteFile(string memory filename) external; function deleteCard(string memory filename) external; function getScript(string memory filename) external view returns (bytes memory script); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice Read and write to persistent storage at a fraction of the cost. /// @author Solady (https://github.com/vectorized/solmady/blob/main/src/utils/SSTORE2.sol) /// @author Saw-mon-and-Natalie (https://github.com/Saw-mon-and-Natalie) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SSTORE2.sol) /// @author Modified from 0xSequence (https://github.com/0xSequence/sstore2/blob/master/contracts/SSTORE2.sol) library SSTORE2 { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ error DeploymentFailed(); error InvalidPointer(); error ReadOutOfBounds(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* WRITE LOGIC */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ function write(bytes memory data) internal returns (address pointer) { // Note: The assembly block below does not expand the memory. assembly { let originalDataLength := mload(data) // Add 1 to data size since we are prefixing it with a STOP opcode. let dataSize := add(originalDataLength, 1) /** * ------------------------------------------------------------------------------+ * Opcode | Mnemonic | Stack | Memory | * ------------------------------------------------------------------------------| * 61 codeSize | PUSH2 codeSize | codeSize | | * 80 | DUP1 | codeSize codeSize | | * 60 0xa | PUSH1 0xa | 0xa codeSize codeSize | | * 3D | RETURNDATASIZE | 0 0xa codeSize codeSize | | * 39 | CODECOPY | codeSize | [0..codeSize): code | * 3D | RETURNDATASZIE | 0 codeSize | [0..codeSize): code | * F3 | RETURN | | [0..codeSize): code | * 00 | STOP | | | * ------------------------------------------------------------------------------+ * @dev Prefix the bytecode with a STOP opcode to ensure it cannot be called. * Also PUSH2 is used since max contract size cap is 24,576 bytes which is less than 2 ** 16. */ mstore( data, or( 0x61000080600a3d393df300, // Left shift `dataSize` by 64 so that it lines up with the 0000 after PUSH2. shl(0x40, dataSize) ) ) // Deploy a new contract with the generated creation code. pointer := create(0, add(data, 0x15), add(dataSize, 0xa)) // If `pointer` is zero, revert. if iszero(pointer) { // Store the function selector of `DeploymentFailed()`. mstore(0x00, 0x30116425) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore original length of the variable size `data`. mstore(data, originalDataLength) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* READ LOGIC */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ function read(address pointer) internal view returns (bytes memory data) { assembly { let pointerCodesize := extcodesize(pointer) if iszero(pointerCodesize) { // Store the function selector of `InvalidPointer()`. mstore(0x00, 0x11052bb4) // Revert with (offset, size). revert(0x1c, 0x04) } // Offset all indices by 1 to skip the STOP opcode. let size := sub(pointerCodesize, 1) // Get the pointer to the free memory and allocate // enough 32-byte words for the data and the length of the data, // then copy the code to the allocated memory. // Masking with 0xffe0 will suffice, since contract size is less than 16 bits. data := mload(0x40) mstore(0x40, add(data, and(add(size, 0x3f), 0xffe0))) mstore(data, size) extcodecopy(pointer, add(data, 0x20), 1, size) } } function read(address pointer, uint256 start) internal view returns (bytes memory data) { assembly { let pointerCodesize := extcodesize(pointer) if iszero(pointerCodesize) { // Store the function selector of `InvalidPointer()`. mstore(0x00, 0x11052bb4) // Revert with (offset, size). revert(0x1c, 0x04) } // If `!(pointer.code.size > start)`, reverts. // This also handles the case where `start + 1` overflows. if iszero(gt(pointerCodesize, start)) { // Store the function selector of `ReadOutOfBounds()`. mstore(0x00, 0x84eb0dd1) // Revert with (offset, size). revert(0x1c, 0x04) } let size := sub(pointerCodesize, add(start, 1)) // Get the pointer to the free memory and allocate // enough 32-byte words for the data and the length of the data, // then copy the code to the allocated memory. // Masking with 0xffe0 will suffice, since contract size is less than 16 bits. data := mload(0x40) mstore(0x40, add(data, and(add(size, 0x3f), 0xffe0))) mstore(data, size) extcodecopy(pointer, add(data, 0x20), add(start, 1), size) } } function read( address pointer, uint256 start, uint256 end ) internal view returns (bytes memory data) { assembly { let pointerCodesize := extcodesize(pointer) if iszero(pointerCodesize) { // Store the function selector of `InvalidPointer()`. mstore(0x00, 0x11052bb4) // Revert with (offset, size). revert(0x1c, 0x04) } // If `!(pointer.code.size > end) || (start > end)`, revert. // This also handles the cases where `end + 1` or `start + 1` overflow. if iszero( and( gt(pointerCodesize, end), // Within bounds. iszero(gt(start, end)) // Valid range. ) ) { // Store the function selector of `ReadOutOfBounds()`. mstore(0x00, 0x84eb0dd1) // Revert with (offset, size). revert(0x1c, 0x04) } let size := sub(end, start) // Get the pointer to the free memory and allocate // enough 32-byte words for the data and the length of the data, // then copy the code to the allocated memory. // Masking with 0xffe0 will suffice, since contract size is less than 16 bits. data := mload(0x40) mstore(0x40, add(data, and(add(size, 0x3f), 0xffe0))) mstore(data, size) extcodecopy(pointer, add(data, 0x20), add(start, 1), size) } } }
{ "evmVersion": "paris", "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IContentStore","name":"_contentStore","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EmptyFile","type":"error"},{"inputs":[{"internalType":"string","name":"filename","type":"string"}],"name":"FileNotFound","type":"error"},{"inputs":[{"internalType":"string","name":"filename","type":"string"}],"name":"FilenameExists","type":"error"},{"inputs":[{"internalType":"string","name":"filename","type":"string"},{"internalType":"address","name":"wrongAddress","type":"address"}],"name":"NottheOwner","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"indexedFilename","type":"string"},{"indexed":true,"internalType":"bytes32","name":"checksum","type":"bytes32"},{"indexed":false,"internalType":"string","name":"filename","type":"string"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"FileCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"indexedFilename","type":"string"},{"indexed":true,"internalType":"bytes32","name":"checksum","type":"bytes32"},{"indexed":false,"internalType":"string","name":"filename","type":"string"}],"name":"FileDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"contentStore","outputs":[{"internalType":"contract IContentStore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"filename","type":"string"},{"internalType":"bytes32[]","name":"checksums","type":"bytes32[]"}],"name":"createFile","outputs":[{"components":[{"internalType":"uint256","name":"size","type":"uint256"},{"components":[{"internalType":"bytes32","name":"checksum","type":"bytes32"},{"internalType":"address","name":"pointer","type":"address"}],"internalType":"struct Content[]","name":"contents","type":"tuple[]"}],"internalType":"struct File","name":"file","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"filename","type":"string"},{"internalType":"bytes32[]","name":"checksums","type":"bytes32[]"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"createFile","outputs":[{"components":[{"internalType":"uint256","name":"size","type":"uint256"},{"components":[{"internalType":"bytes32","name":"checksum","type":"bytes32"},{"internalType":"address","name":"pointer","type":"address"}],"internalType":"struct Content[]","name":"contents","type":"tuple[]"}],"internalType":"struct File","name":"file","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cypherDudesContract","outputs":[{"internalType":"contract ICypherDudes","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"filename","type":"string"}],"name":"deleteCard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"filename","type":"string"}],"name":"deleteFile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"filename","type":"string"}],"name":"fileExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"files","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"filename","type":"string"}],"name":"getChecksum","outputs":[{"internalType":"bytes32","name":"checksum","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"filename","type":"string"}],"name":"getFile","outputs":[{"components":[{"internalType":"uint256","name":"size","type":"uint256"},{"components":[{"internalType":"bytes32","name":"checksum","type":"bytes32"},{"internalType":"address","name":"pointer","type":"address"}],"internalType":"struct Content[]","name":"contents","type":"tuple[]"}],"internalType":"struct File","name":"file","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"filename","type":"string"}],"name":"getScript","outputs":[{"internalType":"bytes","name":"script","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"filename","type":"string"}],"name":"readFile","outputs":[{"internalType":"string","name":"content","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_cypherCardContract","type":"address"}],"name":"setCypherCardContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"filename","type":"string"},{"internalType":"bytes","name":"content","type":"bytes"}],"name":"storeFile","outputs":[{"components":[{"internalType":"uint256","name":"size","type":"uint256"},{"components":[{"internalType":"bytes32","name":"checksum","type":"bytes32"},{"internalType":"address","name":"pointer","type":"address"}],"internalType":"struct Content[]","name":"contents","type":"tuple[]"}],"internalType":"struct File","name":"file","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b50604051620024623803806200246283398181016040528101906200003791906200023c565b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000ad5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000a491906200027f565b60405180910390fd5b620000be81620000fa60201b60201c565b508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506200029c565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001f082620001c3565b9050919050565b60006200020482620001e3565b9050919050565b6200021681620001f7565b81146200022257600080fd5b50565b60008151905062000236816200020b565b92915050565b600060208284031215620002555762000254620001be565b5b6000620002658482850162000225565b91505092915050565b6200027981620001e3565b82525050565b60006020820190506200029660008301846200026e565b92915050565b608051612180620002e26000396000818161048b0152818161051d0152818161081101528181610bd30152818161102601528181611112015261125c01526121806000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80638cb5e7dc116100a2578063a52e640e11610071578063a52e640e146102cc578063a9910054146102fc578063e0876aa814610318578063e775576114610348578063f2fde38b146103785761010b565b80638cb5e7dc1461021e5780638da5cb5b1461024e578063972079921461026c5780639bccd6ad1461029c5761010b565b806360f9bb11116100de57806360f9bb11146101aa578063715018a6146101da5780637fc92bf9146101e45780638188cd46146102005761010b565b80631eb8bc4e1461011057806334bee7ed146101405780633a6e674c1461015c578063527385ad1461017a575b600080fd5b61012a60048036038101906101259190611647565b610394565b6040516101379190611843565b60405180910390f35b61015a60048036038101906101559190611891565b6103fc565b005b610164610489565b604051610171919061191d565b60405180910390f35b610194600480360381019061018f9190611938565b6104ad565b6040516101a19190611a00565b60405180910390f35b6101c460048036038101906101bf9190611938565b61063a565b6040516101d19190611a77565b60405180910390f35b6101e2610654565b005b6101fe60048036038101906101f99190611938565b610668565b005b6102086107df565b6040516102159190611aba565b60405180910390f35b61023860048036038101906102339190611b76565b610805565b6040516102459190611843565b60405180910390f35b610256610930565b6040516102639190611bfd565b60405180910390f35b61028660048036038101906102819190611c18565b610959565b6040516102939190611843565b60405180910390f35b6102b660048036038101906102b19190611938565b6109da565b6040516102c39190611cda565b60405180910390f35b6102e660048036038101906102e19190611938565b610a08565b6040516102f39190611d04565b60405180910390f35b61031660048036038101906103119190611938565b610a77565b005b610332600480360381019061032d9190611938565b610b5d565b60405161033f9190611843565b60405180910390f35b610362600480360381019061035d9190611938565b610d03565b60405161036f9190611d04565b60405180910390f35b610392600480360381019061038d9190611891565b610d31565b005b61039c6113a2565b6103f48383600067ffffffffffffffff8111156103bc576103bb61141e565b5b6040519080825280601f01601f1916602001820160405280156103ee5781602001600182028036833780820191505090505b50610959565b905092915050565b610404610db7565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060006003836040516104c19190611d5b565b90815260200160405180910390205490506000801b810361051957826040517f5aeb32f80000000000000000000000000000000000000000000000000000000081526004016105109190611a77565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631bf226ac836040518263ffffffff1660e01b81526004016105749190611d04565b602060405180830381865afa158015610591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b59190611d87565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361062857836040517f5aeb32f800000000000000000000000000000000000000000000000000000000815260040161061f9190611a77565b60405180910390fd5b61063181610e3e565b92505050919050565b606061064d61064883610b5d565b610e7e565b9050919050565b61065c610db7565b6106666000610ef2565b565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361079d5760006003826040516106cf9190611d5b565b90815260200160405180910390205490506000801b810361072757816040517f5aeb32f800000000000000000000000000000000000000000000000000000000815260040161071e9190611a77565b60405180910390fd5b6003826040516107379190611d5b565b90815260200160405180910390206000905580826040516107589190611d5b565b60405180910390207f049d33e2ff016446d304c7c9f197f7112de9a3b3134df07ca017294a25a4e4618460405161078f9190611a77565b60405180910390a3506107dc565b80336040517f807378260000000000000000000000000000000000000000000000000000000081526004016107d3929190611db4565b60405180910390fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61080d6113a2565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663093e9839846040518263ffffffff1660e01b81526004016108689190611a00565b60408051808303816000875af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa9190611df9565b5090506000600167ffffffffffffffff8111156108ca576108c961141e565b5b6040519080825280602002602001820160405280156108f85781602001602082028036833780820191505090505b50905081816000815181106109105761090f611e39565b5b6020026020010181815250506109268582610394565b9250505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6109616113a2565b6000801b6003856040516109759190611d5b565b908152602001604051809103902054146109c657836040517f30add8a00000000000000000000000000000000000000000000000000000000081526004016109bd9190611a77565b60405180910390fd5b6109d1848484610fb6565b90509392505050565b60008060001b6003836040516109f09190611d5b565b90815260200160405180910390205414159050919050565b6000600382604051610a1a9190611d5b565b90815260200160405180910390205490506000801b8103610a7257816040517f5aeb32f8000000000000000000000000000000000000000000000000000000008152600401610a699190611a77565b60405180910390fd5b919050565b610a7f610db7565b6000600382604051610a919190611d5b565b90815260200160405180910390205490506000801b8103610ae957816040517f5aeb32f8000000000000000000000000000000000000000000000000000000008152600401610ae09190611a77565b60405180910390fd5b600382604051610af99190611d5b565b9081526020016040518091039020600090558082604051610b1a9190611d5b565b60405180910390207f049d33e2ff016446d304c7c9f197f7112de9a3b3134df07ca017294a25a4e46184604051610b519190611a77565b60405180910390a35050565b610b656113a2565b6000600383604051610b779190611d5b565b90815260200160405180910390205490506000801b8103610bcf57826040517f5aeb32f8000000000000000000000000000000000000000000000000000000008152600401610bc69190611a77565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631bf226ac836040518263ffffffff1660e01b8152600401610c2a9190611d04565b602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611d87565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cde57836040517f5aeb32f8000000000000000000000000000000000000000000000000000000008152600401610cd59190611a77565b60405180910390fd5b610ce781610e3e565b806020019051810190610cfa919061201d565b92505050919050565b6003818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b610d39610db7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dab5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610da29190611bfd565b60405180910390fd5b610db481610ef2565b50565b610dbf61139a565b73ffffffffffffffffffffffffffffffffffffffff16610ddd610930565b73ffffffffffffffffffffffffffffffffffffffff1614610e3c57610e0061139a565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610e339190611bfd565b60405180910390fd5b565b6060813b80610e55576311052bb46000526004601cfd5b60018103604051925061ffe0603f820116830160405280835280600160208501863c5050919050565b60606000826020015190508051602060405193506000806000805b85811015610ed357602081026020018701519250602083015191506001823b039350836001868a01843c8385019450600181019050610e99565b50602084038752601f19601f8501168701604052505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610fbe6113a2565b6000835167ffffffffffffffff811115610fdb57610fda61141e565b5b60405190808252806020026020018201604052801561101457816020015b6110016113bc565b815260200190600190039081610ff95790505b5090506000805b8551811015611206577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166331654b0987838151811061107357611072611e39565b5b60200260200101516040518263ffffffff1660e01b81526004016110979190611d04565b602060405180830381865afa1580156110b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d89190612066565b826110e391906120c2565b9150604051806040016040528087838151811061110357611102611e39565b5b602002602001015181526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634641dce689858151811061115f5761115e611e39565b5b60200260200101516040518263ffffffff1660e01b81526004016111839190611d04565b602060405180830381865afa1580156111a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c49190611d87565b73ffffffffffffffffffffffffffffffffffffffff168152508382815181106111f0576111ef611e39565b5b602002602001018190525080600101905061101b565b5060008103611241576040517f067b6a0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806040016040528082815260200183815250925060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663093e9839856040516020016112a79190611843565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016112d29190611a00565b60408051808303816000875af11580156112f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113149190611df9565b509050806003886040516113289190611d5b565b90815260200160405180910390208190555080876040516113499190611d5b565b60405180910390207fbf4d3dad9eb190a395deec4f74f993087bfb5df21ff6c0e1403ec61042090c2d8987600001518960405161138893929190612105565b60405180910390a35050509392505050565b600033905090565b604051806040016040528060008152602001606081525090565b604051806040016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6114568261140d565b810181811067ffffffffffffffff821117156114755761147461141e565b5b80604052505050565b60006114886113ef565b9050611494828261144d565b919050565b600067ffffffffffffffff8211156114b4576114b361141e565b5b6114bd8261140d565b9050602081019050919050565b82818337600083830152505050565b60006114ec6114e784611499565b61147e565b90508281526020810184848401111561150857611507611408565b5b6115138482856114ca565b509392505050565b600082601f8301126115305761152f611403565b5b81356115408482602086016114d9565b91505092915050565b600067ffffffffffffffff8211156115645761156361141e565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61158d8161157a565b811461159857600080fd5b50565b6000813590506115aa81611584565b92915050565b60006115c36115be84611549565b61147e565b905080838252602082019050602084028301858111156115e6576115e5611575565b5b835b8181101561160f57806115fb888261159b565b8452602084019350506020810190506115e8565b5050509392505050565b600082601f83011261162e5761162d611403565b5b813561163e8482602086016115b0565b91505092915050565b6000806040838503121561165e5761165d6113f9565b5b600083013567ffffffffffffffff81111561167c5761167b6113fe565b5b6116888582860161151b565b925050602083013567ffffffffffffffff8111156116a9576116a86113fe565b5b6116b585828601611619565b9150509250929050565b6000819050919050565b6116d2816116bf565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61170d8161157a565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061173e82611713565b9050919050565b61174e81611733565b82525050565b60408201600082015161176a6000850182611704565b50602082015161177d6020850182611745565b50505050565b600061178f8383611754565b60408301905092915050565b6000602082019050919050565b60006117b3826116d8565b6117bd81856116e3565b93506117c8836116f4565b8060005b838110156117f95781516117e08882611783565b97506117eb8361179b565b9250506001810190506117cc565b5085935050505092915050565b600060408301600083015161181e60008601826116c9565b506020830151848203602086015261183682826117a8565b9150508091505092915050565b6000602082019050818103600083015261185d8184611806565b905092915050565b61186e81611733565b811461187957600080fd5b50565b60008135905061188b81611865565b92915050565b6000602082840312156118a7576118a66113f9565b5b60006118b58482850161187c565b91505092915050565b6000819050919050565b60006118e36118de6118d984611713565b6118be565b611713565b9050919050565b60006118f5826118c8565b9050919050565b6000611907826118ea565b9050919050565b611917816118fc565b82525050565b6000602082019050611932600083018461190e565b92915050565b60006020828403121561194e5761194d6113f9565b5b600082013567ffffffffffffffff81111561196c5761196b6113fe565b5b6119788482850161151b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119bb5780820151818401526020810190506119a0565b60008484015250505050565b60006119d282611981565b6119dc818561198c565b93506119ec81856020860161199d565b6119f58161140d565b840191505092915050565b60006020820190508181036000830152611a1a81846119c7565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000611a4982611a22565b611a538185611a2d565b9350611a6381856020860161199d565b611a6c8161140d565b840191505092915050565b60006020820190508181036000830152611a918184611a3e565b905092915050565b6000611aa4826118ea565b9050919050565b611ab481611a99565b82525050565b6000602082019050611acf6000830184611aab565b92915050565b600067ffffffffffffffff821115611af057611aef61141e565b5b611af98261140d565b9050602081019050919050565b6000611b19611b1484611ad5565b61147e565b905082815260208101848484011115611b3557611b34611408565b5b611b408482856114ca565b509392505050565b600082601f830112611b5d57611b5c611403565b5b8135611b6d848260208601611b06565b91505092915050565b60008060408385031215611b8d57611b8c6113f9565b5b600083013567ffffffffffffffff811115611bab57611baa6113fe565b5b611bb78582860161151b565b925050602083013567ffffffffffffffff811115611bd857611bd76113fe565b5b611be485828601611b48565b9150509250929050565b611bf781611733565b82525050565b6000602082019050611c126000830184611bee565b92915050565b600080600060608486031215611c3157611c306113f9565b5b600084013567ffffffffffffffff811115611c4f57611c4e6113fe565b5b611c5b8682870161151b565b935050602084013567ffffffffffffffff811115611c7c57611c7b6113fe565b5b611c8886828701611619565b925050604084013567ffffffffffffffff811115611ca957611ca86113fe565b5b611cb586828701611b48565b9150509250925092565b60008115159050919050565b611cd481611cbf565b82525050565b6000602082019050611cef6000830184611ccb565b92915050565b611cfe8161157a565b82525050565b6000602082019050611d196000830184611cf5565b92915050565b600081905092915050565b6000611d3582611a22565b611d3f8185611d1f565b9350611d4f81856020860161199d565b80840191505092915050565b6000611d678284611d2a565b915081905092915050565b600081519050611d8181611865565b92915050565b600060208284031215611d9d57611d9c6113f9565b5b6000611dab84828501611d72565b91505092915050565b60006040820190508181036000830152611dce8185611a3e565b9050611ddd6020830184611bee565b9392505050565b600081519050611df381611584565b92915050565b60008060408385031215611e1057611e0f6113f9565b5b6000611e1e85828601611de4565b9250506020611e2f85828601611d72565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b611e7b816116bf565b8114611e8657600080fd5b50565b600081519050611e9881611e72565b92915050565b600067ffffffffffffffff821115611eb957611eb861141e565b5b602082029050602081019050919050565b600060408284031215611ee057611edf611e68565b5b611eea604061147e565b90506000611efa84828501611de4565b6000830152506020611f0e84828501611d72565b60208301525092915050565b6000611f2d611f2884611e9e565b61147e565b90508083825260208201905060408402830185811115611f5057611f4f611575565b5b835b81811015611f795780611f658882611eca565b845260208401935050604081019050611f52565b5050509392505050565b600082601f830112611f9857611f97611403565b5b8151611fa8848260208601611f1a565b91505092915050565b600060408284031215611fc757611fc6611e68565b5b611fd1604061147e565b90506000611fe184828501611e89565b600083015250602082015167ffffffffffffffff81111561200557612004611e6d565b5b61201184828501611f83565b60208301525092915050565b600060208284031215612033576120326113f9565b5b600082015167ffffffffffffffff811115612051576120506113fe565b5b61205d84828501611fb1565b91505092915050565b60006020828403121561207c5761207b6113f9565b5b600061208a84828501611e89565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006120cd826116bf565b91506120d8836116bf565b92508282019050808211156120f0576120ef612093565b5b92915050565b6120ff816116bf565b82525050565b6000606082019050818103600083015261211f8186611a3e565b905061212e60208301856120f6565b818103604083015261214081846119c7565b905094935050505056fea264697066735822122016251d9d19b0c93af42e0947d365d2726708fcbea1383ccb5beffc0547882b1864736f6c6343000816003300000000000000000000000001044883ed596a50e211ab2eaffd9a43ad382c8c
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80638cb5e7dc116100a2578063a52e640e11610071578063a52e640e146102cc578063a9910054146102fc578063e0876aa814610318578063e775576114610348578063f2fde38b146103785761010b565b80638cb5e7dc1461021e5780638da5cb5b1461024e578063972079921461026c5780639bccd6ad1461029c5761010b565b806360f9bb11116100de57806360f9bb11146101aa578063715018a6146101da5780637fc92bf9146101e45780638188cd46146102005761010b565b80631eb8bc4e1461011057806334bee7ed146101405780633a6e674c1461015c578063527385ad1461017a575b600080fd5b61012a60048036038101906101259190611647565b610394565b6040516101379190611843565b60405180910390f35b61015a60048036038101906101559190611891565b6103fc565b005b610164610489565b604051610171919061191d565b60405180910390f35b610194600480360381019061018f9190611938565b6104ad565b6040516101a19190611a00565b60405180910390f35b6101c460048036038101906101bf9190611938565b61063a565b6040516101d19190611a77565b60405180910390f35b6101e2610654565b005b6101fe60048036038101906101f99190611938565b610668565b005b6102086107df565b6040516102159190611aba565b60405180910390f35b61023860048036038101906102339190611b76565b610805565b6040516102459190611843565b60405180910390f35b610256610930565b6040516102639190611bfd565b60405180910390f35b61028660048036038101906102819190611c18565b610959565b6040516102939190611843565b60405180910390f35b6102b660048036038101906102b19190611938565b6109da565b6040516102c39190611cda565b60405180910390f35b6102e660048036038101906102e19190611938565b610a08565b6040516102f39190611d04565b60405180910390f35b61031660048036038101906103119190611938565b610a77565b005b610332600480360381019061032d9190611938565b610b5d565b60405161033f9190611843565b60405180910390f35b610362600480360381019061035d9190611938565b610d03565b60405161036f9190611d04565b60405180910390f35b610392600480360381019061038d9190611891565b610d31565b005b61039c6113a2565b6103f48383600067ffffffffffffffff8111156103bc576103bb61141e565b5b6040519080825280601f01601f1916602001820160405280156103ee5781602001600182028036833780820191505090505b50610959565b905092915050565b610404610db7565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f00000000000000000000000001044883ed596a50e211ab2eaffd9a43ad382c8c81565b606060006003836040516104c19190611d5b565b90815260200160405180910390205490506000801b810361051957826040517f5aeb32f80000000000000000000000000000000000000000000000000000000081526004016105109190611a77565b60405180910390fd5b60007f00000000000000000000000001044883ed596a50e211ab2eaffd9a43ad382c8c73ffffffffffffffffffffffffffffffffffffffff16631bf226ac836040518263ffffffff1660e01b81526004016105749190611d04565b602060405180830381865afa158015610591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b59190611d87565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361062857836040517f5aeb32f800000000000000000000000000000000000000000000000000000000815260040161061f9190611a77565b60405180910390fd5b61063181610e3e565b92505050919050565b606061064d61064883610b5d565b610e7e565b9050919050565b61065c610db7565b6106666000610ef2565b565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361079d5760006003826040516106cf9190611d5b565b90815260200160405180910390205490506000801b810361072757816040517f5aeb32f800000000000000000000000000000000000000000000000000000000815260040161071e9190611a77565b60405180910390fd5b6003826040516107379190611d5b565b90815260200160405180910390206000905580826040516107589190611d5b565b60405180910390207f049d33e2ff016446d304c7c9f197f7112de9a3b3134df07ca017294a25a4e4618460405161078f9190611a77565b60405180910390a3506107dc565b80336040517f807378260000000000000000000000000000000000000000000000000000000081526004016107d3929190611db4565b60405180910390fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61080d6113a2565b60007f00000000000000000000000001044883ed596a50e211ab2eaffd9a43ad382c8c73ffffffffffffffffffffffffffffffffffffffff1663093e9839846040518263ffffffff1660e01b81526004016108689190611a00565b60408051808303816000875af1158015610886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108aa9190611df9565b5090506000600167ffffffffffffffff8111156108ca576108c961141e565b5b6040519080825280602002602001820160405280156108f85781602001602082028036833780820191505090505b50905081816000815181106109105761090f611e39565b5b6020026020010181815250506109268582610394565b9250505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6109616113a2565b6000801b6003856040516109759190611d5b565b908152602001604051809103902054146109c657836040517f30add8a00000000000000000000000000000000000000000000000000000000081526004016109bd9190611a77565b60405180910390fd5b6109d1848484610fb6565b90509392505050565b60008060001b6003836040516109f09190611d5b565b90815260200160405180910390205414159050919050565b6000600382604051610a1a9190611d5b565b90815260200160405180910390205490506000801b8103610a7257816040517f5aeb32f8000000000000000000000000000000000000000000000000000000008152600401610a699190611a77565b60405180910390fd5b919050565b610a7f610db7565b6000600382604051610a919190611d5b565b90815260200160405180910390205490506000801b8103610ae957816040517f5aeb32f8000000000000000000000000000000000000000000000000000000008152600401610ae09190611a77565b60405180910390fd5b600382604051610af99190611d5b565b9081526020016040518091039020600090558082604051610b1a9190611d5b565b60405180910390207f049d33e2ff016446d304c7c9f197f7112de9a3b3134df07ca017294a25a4e46184604051610b519190611a77565b60405180910390a35050565b610b656113a2565b6000600383604051610b779190611d5b565b90815260200160405180910390205490506000801b8103610bcf57826040517f5aeb32f8000000000000000000000000000000000000000000000000000000008152600401610bc69190611a77565b60405180910390fd5b60007f00000000000000000000000001044883ed596a50e211ab2eaffd9a43ad382c8c73ffffffffffffffffffffffffffffffffffffffff16631bf226ac836040518263ffffffff1660e01b8152600401610c2a9190611d04565b602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611d87565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cde57836040517f5aeb32f8000000000000000000000000000000000000000000000000000000008152600401610cd59190611a77565b60405180910390fd5b610ce781610e3e565b806020019051810190610cfa919061201d565b92505050919050565b6003818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b610d39610db7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dab5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610da29190611bfd565b60405180910390fd5b610db481610ef2565b50565b610dbf61139a565b73ffffffffffffffffffffffffffffffffffffffff16610ddd610930565b73ffffffffffffffffffffffffffffffffffffffff1614610e3c57610e0061139a565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610e339190611bfd565b60405180910390fd5b565b6060813b80610e55576311052bb46000526004601cfd5b60018103604051925061ffe0603f820116830160405280835280600160208501863c5050919050565b60606000826020015190508051602060405193506000806000805b85811015610ed357602081026020018701519250602083015191506001823b039350836001868a01843c8385019450600181019050610e99565b50602084038752601f19601f8501168701604052505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610fbe6113a2565b6000835167ffffffffffffffff811115610fdb57610fda61141e565b5b60405190808252806020026020018201604052801561101457816020015b6110016113bc565b815260200190600190039081610ff95790505b5090506000805b8551811015611206577f00000000000000000000000001044883ed596a50e211ab2eaffd9a43ad382c8c73ffffffffffffffffffffffffffffffffffffffff166331654b0987838151811061107357611072611e39565b5b60200260200101516040518263ffffffff1660e01b81526004016110979190611d04565b602060405180830381865afa1580156110b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d89190612066565b826110e391906120c2565b9150604051806040016040528087838151811061110357611102611e39565b5b602002602001015181526020017f00000000000000000000000001044883ed596a50e211ab2eaffd9a43ad382c8c73ffffffffffffffffffffffffffffffffffffffff16634641dce689858151811061115f5761115e611e39565b5b60200260200101516040518263ffffffff1660e01b81526004016111839190611d04565b602060405180830381865afa1580156111a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c49190611d87565b73ffffffffffffffffffffffffffffffffffffffff168152508382815181106111f0576111ef611e39565b5b602002602001018190525080600101905061101b565b5060008103611241576040517f067b6a0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806040016040528082815260200183815250925060007f00000000000000000000000001044883ed596a50e211ab2eaffd9a43ad382c8c73ffffffffffffffffffffffffffffffffffffffff1663093e9839856040516020016112a79190611843565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016112d29190611a00565b60408051808303816000875af11580156112f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113149190611df9565b509050806003886040516113289190611d5b565b90815260200160405180910390208190555080876040516113499190611d5b565b60405180910390207fbf4d3dad9eb190a395deec4f74f993087bfb5df21ff6c0e1403ec61042090c2d8987600001518960405161138893929190612105565b60405180910390a35050509392505050565b600033905090565b604051806040016040528060008152602001606081525090565b604051806040016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6114568261140d565b810181811067ffffffffffffffff821117156114755761147461141e565b5b80604052505050565b60006114886113ef565b9050611494828261144d565b919050565b600067ffffffffffffffff8211156114b4576114b361141e565b5b6114bd8261140d565b9050602081019050919050565b82818337600083830152505050565b60006114ec6114e784611499565b61147e565b90508281526020810184848401111561150857611507611408565b5b6115138482856114ca565b509392505050565b600082601f8301126115305761152f611403565b5b81356115408482602086016114d9565b91505092915050565b600067ffffffffffffffff8211156115645761156361141e565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61158d8161157a565b811461159857600080fd5b50565b6000813590506115aa81611584565b92915050565b60006115c36115be84611549565b61147e565b905080838252602082019050602084028301858111156115e6576115e5611575565b5b835b8181101561160f57806115fb888261159b565b8452602084019350506020810190506115e8565b5050509392505050565b600082601f83011261162e5761162d611403565b5b813561163e8482602086016115b0565b91505092915050565b6000806040838503121561165e5761165d6113f9565b5b600083013567ffffffffffffffff81111561167c5761167b6113fe565b5b6116888582860161151b565b925050602083013567ffffffffffffffff8111156116a9576116a86113fe565b5b6116b585828601611619565b9150509250929050565b6000819050919050565b6116d2816116bf565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61170d8161157a565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061173e82611713565b9050919050565b61174e81611733565b82525050565b60408201600082015161176a6000850182611704565b50602082015161177d6020850182611745565b50505050565b600061178f8383611754565b60408301905092915050565b6000602082019050919050565b60006117b3826116d8565b6117bd81856116e3565b93506117c8836116f4565b8060005b838110156117f95781516117e08882611783565b97506117eb8361179b565b9250506001810190506117cc565b5085935050505092915050565b600060408301600083015161181e60008601826116c9565b506020830151848203602086015261183682826117a8565b9150508091505092915050565b6000602082019050818103600083015261185d8184611806565b905092915050565b61186e81611733565b811461187957600080fd5b50565b60008135905061188b81611865565b92915050565b6000602082840312156118a7576118a66113f9565b5b60006118b58482850161187c565b91505092915050565b6000819050919050565b60006118e36118de6118d984611713565b6118be565b611713565b9050919050565b60006118f5826118c8565b9050919050565b6000611907826118ea565b9050919050565b611917816118fc565b82525050565b6000602082019050611932600083018461190e565b92915050565b60006020828403121561194e5761194d6113f9565b5b600082013567ffffffffffffffff81111561196c5761196b6113fe565b5b6119788482850161151b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119bb5780820151818401526020810190506119a0565b60008484015250505050565b60006119d282611981565b6119dc818561198c565b93506119ec81856020860161199d565b6119f58161140d565b840191505092915050565b60006020820190508181036000830152611a1a81846119c7565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000611a4982611a22565b611a538185611a2d565b9350611a6381856020860161199d565b611a6c8161140d565b840191505092915050565b60006020820190508181036000830152611a918184611a3e565b905092915050565b6000611aa4826118ea565b9050919050565b611ab481611a99565b82525050565b6000602082019050611acf6000830184611aab565b92915050565b600067ffffffffffffffff821115611af057611aef61141e565b5b611af98261140d565b9050602081019050919050565b6000611b19611b1484611ad5565b61147e565b905082815260208101848484011115611b3557611b34611408565b5b611b408482856114ca565b509392505050565b600082601f830112611b5d57611b5c611403565b5b8135611b6d848260208601611b06565b91505092915050565b60008060408385031215611b8d57611b8c6113f9565b5b600083013567ffffffffffffffff811115611bab57611baa6113fe565b5b611bb78582860161151b565b925050602083013567ffffffffffffffff811115611bd857611bd76113fe565b5b611be485828601611b48565b9150509250929050565b611bf781611733565b82525050565b6000602082019050611c126000830184611bee565b92915050565b600080600060608486031215611c3157611c306113f9565b5b600084013567ffffffffffffffff811115611c4f57611c4e6113fe565b5b611c5b8682870161151b565b935050602084013567ffffffffffffffff811115611c7c57611c7b6113fe565b5b611c8886828701611619565b925050604084013567ffffffffffffffff811115611ca957611ca86113fe565b5b611cb586828701611b48565b9150509250925092565b60008115159050919050565b611cd481611cbf565b82525050565b6000602082019050611cef6000830184611ccb565b92915050565b611cfe8161157a565b82525050565b6000602082019050611d196000830184611cf5565b92915050565b600081905092915050565b6000611d3582611a22565b611d3f8185611d1f565b9350611d4f81856020860161199d565b80840191505092915050565b6000611d678284611d2a565b915081905092915050565b600081519050611d8181611865565b92915050565b600060208284031215611d9d57611d9c6113f9565b5b6000611dab84828501611d72565b91505092915050565b60006040820190508181036000830152611dce8185611a3e565b9050611ddd6020830184611bee565b9392505050565b600081519050611df381611584565b92915050565b60008060408385031215611e1057611e0f6113f9565b5b6000611e1e85828601611de4565b9250506020611e2f85828601611d72565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b611e7b816116bf565b8114611e8657600080fd5b50565b600081519050611e9881611e72565b92915050565b600067ffffffffffffffff821115611eb957611eb861141e565b5b602082029050602081019050919050565b600060408284031215611ee057611edf611e68565b5b611eea604061147e565b90506000611efa84828501611de4565b6000830152506020611f0e84828501611d72565b60208301525092915050565b6000611f2d611f2884611e9e565b61147e565b90508083825260208201905060408402830185811115611f5057611f4f611575565b5b835b81811015611f795780611f658882611eca565b845260208401935050604081019050611f52565b5050509392505050565b600082601f830112611f9857611f97611403565b5b8151611fa8848260208601611f1a565b91505092915050565b600060408284031215611fc757611fc6611e68565b5b611fd1604061147e565b90506000611fe184828501611e89565b600083015250602082015167ffffffffffffffff81111561200557612004611e6d565b5b61201184828501611f83565b60208301525092915050565b600060208284031215612033576120326113f9565b5b600082015167ffffffffffffffff811115612051576120506113fe565b5b61205d84828501611fb1565b91505092915050565b60006020828403121561207c5761207b6113f9565b5b600061208a84828501611e89565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006120cd826116bf565b91506120d8836116bf565b92508282019050808211156120f0576120ef612093565b5b92915050565b6120ff816116bf565b82525050565b6000606082019050818103600083015261211f8186611a3e565b905061212e60208301856120f6565b818103604083015261214081846119c7565b905094935050505056fea264697066735822122016251d9d19b0c93af42e0947d365d2726708fcbea1383ccb5beffc0547882b1864736f6c63430008160033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000001044883ed596a50e211ab2eaffd9a43ad382c8c
-----Decoded View---------------
Arg [0] : _contentStore (address): 0x01044883Ed596a50e211ab2EAFFd9a43Ad382C8c
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000001044883ed596a50e211ab2eaffd9a43ad382c8c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.