Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 77 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Store At | 24389953 | 27 days ago | IN | 0 ETH | 0.01137105 | ||||
| Add Chunk | 24277723 | 42 days ago | IN | 0 ETH | 0.00449513 | ||||
| Add Chunk | 24277721 | 42 days ago | IN | 0 ETH | 0.00581457 | ||||
| Add Chunk | 24277719 | 42 days ago | IN | 0 ETH | 0.00581802 | ||||
| Add Chunk | 24277717 | 42 days ago | IN | 0 ETH | 0.00582897 | ||||
| Init Chunked | 24277715 | 42 days ago | IN | 0 ETH | 0.00011459 | ||||
| Add Chunk | 24277713 | 42 days ago | IN | 0 ETH | 0.00523584 | ||||
| Add Chunk | 24277711 | 42 days ago | IN | 0 ETH | 0.005833 | ||||
| Add Chunk | 24277709 | 42 days ago | IN | 0 ETH | 0.00586299 | ||||
| Init Chunked | 24277707 | 42 days ago | IN | 0 ETH | 0.00000889 | ||||
| Add Chunk | 24277705 | 42 days ago | IN | 0 ETH | 0.00422049 | ||||
| Add Chunk | 24277703 | 42 days ago | IN | 0 ETH | 0.0058512 | ||||
| Add Chunk | 24277701 | 42 days ago | IN | 0 ETH | 0.00588111 | ||||
| Init Chunked | 24277699 | 42 days ago | IN | 0 ETH | 0.00006545 | ||||
| Init Chunked | 24277695 | 42 days ago | IN | 0 ETH | 0.00011579 | ||||
| Add Chunk | 24277690 | 42 days ago | IN | 0 ETH | 0.00526656 | ||||
| Add Chunk | 24277688 | 42 days ago | IN | 0 ETH | 0.00587673 | ||||
| Add Chunk | 24277687 | 42 days ago | IN | 0 ETH | 0.00593733 | ||||
| Init Chunked | 24277685 | 42 days ago | IN | 0 ETH | 0.0000108 | ||||
| Add Chunk | 24277680 | 42 days ago | IN | 0 ETH | 0.0004904 | ||||
| Add Chunk | 24277678 | 42 days ago | IN | 0 ETH | 0.00594523 | ||||
| Add Chunk | 24277676 | 42 days ago | IN | 0 ETH | 0.00596362 | ||||
| Add Chunk | 24277674 | 42 days ago | IN | 0 ETH | 0.00596507 | ||||
| Add Chunk | 24277672 | 42 days ago | IN | 0 ETH | 0.00599334 | ||||
| Init Chunked | 24277670 | 42 days ago | IN | 0 ETH | 0.00011638 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x615d9580 | 24389953 | 27 days ago | Contract Creation | 0 ETH | |||
| 0x6123d780 | 24277723 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277721 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277719 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277717 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612a3b80 | 24277713 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277711 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277709 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x61216f80 | 24277705 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277703 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277701 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x6129bf80 | 24277690 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277688 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277687 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x61026b80 | 24277680 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277678 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277676 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277674 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277672 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x61105f80 | 24277662 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277658 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277656 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277654 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x612ee180 | 24277652 | 42 days ago | Contract Creation | 0 ETH | |||
| 0x6112a180 | 24277640 | 42 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ContentStore
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import "solady/auth/Ownable.sol";
import "solady/utils/SSTORE2.sol";
/// @title ContentStore
/// @notice Stores chunked content (images, game data) in contract bytecode
/// @dev Uses SSTORE2 for gas-efficient storage (~200 gas/byte vs 20000 gas/slot)
contract ContentStore is Ownable {
/// @dev Location of stored data
struct DataLoc {
address pointer;
uint48 start;
uint48 end;
}
/// @dev Content entry with optional chunking
struct Content {
uint24 chunkCount;
bytes32 contentType; // e.g., keccak256("image/webp"), keccak256("application/javascript")
mapping(uint256 => address) chunks;
}
mapping(uint256 => Content) internal contents;
mapping(uint256 => DataLoc) internal locations; // For single-pointer small content
uint256 public nextId = 1;
event ContentStored(uint256 indexed id, bytes32 contentType);
event ChunkStored(uint256 indexed id, uint256 index);
error ContentNotFound();
error ChunkOutOfBounds();
error EmptyData();
constructor(address owner_) {
_initializeOwner(owner_);
}
/// @notice Store small content in single transaction
/// @param contentType Type identifier
/// @param data Content bytes
/// @return id Content ID
function store(bytes32 contentType, bytes calldata data) external onlyOwner returns (uint256 id) {
if (data.length == 0) revert EmptyData();
id = nextId++;
address pointer = SSTORE2.write(data);
locations[id] = DataLoc(pointer, 0, uint48(data.length));
contents[id].contentType = contentType;
emit ContentStored(id, contentType);
}
/// @notice Store content at specific ID
/// @param id Content ID
/// @param contentType Type identifier
/// @param data Content bytes
function storeAt(uint256 id, bytes32 contentType, bytes calldata data) external onlyOwner {
if (data.length == 0) revert EmptyData();
if (id >= nextId) nextId = id + 1;
address pointer = SSTORE2.write(data);
locations[id] = DataLoc(pointer, 0, uint48(data.length));
contents[id].contentType = contentType;
emit ContentStored(id, contentType);
}
/// @notice Initialize chunked content
/// @param id Content ID
/// @param contentType Type identifier
function initChunked(uint256 id, bytes32 contentType) external onlyOwner {
if (id >= nextId) nextId = id + 1;
contents[id].contentType = contentType;
emit ContentStored(id, contentType);
}
/// @notice Add chunk to content
/// @param id Content ID
/// @param chunk Chunk data
function addChunk(uint256 id, bytes calldata chunk) external onlyOwner {
if (contents[id].contentType == bytes32(0)) revert ContentNotFound();
if (chunk.length == 0) revert EmptyData();
uint256 index = contents[id].chunkCount;
contents[id].chunks[index] = SSTORE2.write(chunk);
contents[id].chunkCount++;
emit ChunkStored(id, index);
}
/// @notice Add multiple chunks
/// @param id Content ID
/// @param chunks Array of chunk data
function addChunks(uint256 id, bytes[] calldata chunks) external onlyOwner {
if (contents[id].contentType == bytes32(0)) revert ContentNotFound();
uint256 startIndex = contents[id].chunkCount;
for (uint256 i; i < chunks.length; ++i) {
if (chunks[i].length == 0) revert EmptyData();
contents[id].chunks[startIndex + i] = SSTORE2.write(chunks[i]);
emit ChunkStored(id, startIndex + i);
}
contents[id].chunkCount += uint24(chunks.length);
}
/// @notice Batch store multiple small contents
/// @param contentType Type identifier for all
/// @param dataArray Array of content bytes
/// @return startId First content ID
function storeBatch(bytes32 contentType, bytes[] calldata dataArray) external onlyOwner returns (uint256 startId) {
startId = nextId;
for (uint256 i; i < dataArray.length; ++i) {
if (dataArray[i].length == 0) revert EmptyData();
uint256 id = nextId++;
address pointer = SSTORE2.write(dataArray[i]);
locations[id] = DataLoc(pointer, 0, uint48(dataArray[i].length));
contents[id].contentType = contentType;
emit ContentStored(id, contentType);
}
}
/// @notice Get content bytes
/// @param id Content ID
/// @return Content as bytes
function get(uint256 id) external view returns (bytes memory) {
Content storage content = contents[id];
if (content.contentType == bytes32(0)) revert ContentNotFound();
// Single storage
DataLoc memory loc = locations[id];
if (loc.pointer != address(0)) {
return SSTORE2.read(loc.pointer, loc.start, loc.end);
}
// Chunked storage
bytes memory result;
for (uint256 i; i < content.chunkCount; ++i) {
result = bytes.concat(result, SSTORE2.read(content.chunks[i]));
}
return result;
}
/// @notice Get content as string
/// @param id Content ID
/// @return Content as string
function getString(uint256 id) external view returns (string memory) {
return string(this.get(id));
}
/// @notice Get single chunk
/// @param id Content ID
/// @param index Chunk index
/// @return Chunk bytes
function getChunk(uint256 id, uint256 index) external view returns (bytes memory) {
Content storage content = contents[id];
if (content.contentType == bytes32(0)) revert ContentNotFound();
if (index >= content.chunkCount) revert ChunkOutOfBounds();
return SSTORE2.read(content.chunks[index]);
}
/// @notice Get content info
/// @param id Content ID
/// @return contentType Content type
/// @return chunkCount Number of chunks (0 if single storage)
function getInfo(uint256 id) external view returns (bytes32 contentType, uint24 chunkCount) {
Content storage content = contents[id];
if (content.contentType == bytes32(0)) revert ContentNotFound();
return (content.contentType, content.chunkCount);
}
/// @notice Check if content exists
/// @param id Content ID
/// @return True if exists
function exists(uint256 id) external view returns (bool) {
return contents[id].contentType != bytes32(0);
}
}// 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/solady/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)
/// @author Modified from SSTORE3 (https://github.com/Philogy/sstore3)
library SSTORE2 {
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CONSTANTS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The proxy initialization code.
uint256 private constant _CREATE3_PROXY_INITCODE = 0x67363d3d37363d34f03d5260086018f3;
/// @dev Hash of the `_CREATE3_PROXY_INITCODE`.
/// Equivalent to `keccak256(abi.encodePacked(hex"67363d3d37363d34f03d5260086018f3"))`.
bytes32 internal constant CREATE3_PROXY_INITCODE_HASH =
0x21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CUSTOM ERRORS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Unable to deploy the storage contract.
error DeploymentFailed();
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* WRITE LOGIC */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Writes `data` into the bytecode of a storage contract and returns its address.
function write(bytes memory data) internal returns (address pointer) {
/// @solidity memory-safe-assembly
assembly {
let n := mload(data) // Let `l` be `n + 1`. +1 as we prefix a STOP opcode.
/**
* ---------------------------------------------------+
* Opcode | Mnemonic | Stack | Memory |
* ---------------------------------------------------|
* 61 l | PUSH2 l | l | |
* 80 | DUP1 | l l | |
* 60 0xa | PUSH1 0xa | 0xa l l | |
* 3D | RETURNDATASIZE | 0 0xa l l | |
* 39 | CODECOPY | l | [0..l): code |
* 3D | RETURNDATASIZE | 0 l | [0..l): code |
* F3 | RETURN | | [0..l): 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.
*/
// Do a out-of-gas revert if `n + 1` is more than 2 bytes.
mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n)))
// Deploy a new contract with the generated creation code.
pointer := create(0, add(data, 0x15), add(n, 0xb))
if iszero(pointer) {
mstore(0x00, 0x30116425) // `DeploymentFailed()`.
revert(0x1c, 0x04)
}
mstore(data, n) // Restore the length of `data`.
}
}
/// @dev Writes `data` into the bytecode of a storage contract with `salt`
/// and returns its normal CREATE2 deterministic address.
function writeCounterfactual(bytes memory data, bytes32 salt)
internal
returns (address pointer)
{
/// @solidity memory-safe-assembly
assembly {
let n := mload(data)
// Do a out-of-gas revert if `n + 1` is more than 2 bytes.
mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n)))
// Deploy a new contract with the generated creation code.
pointer := create2(0, add(data, 0x15), add(n, 0xb), salt)
if iszero(pointer) {
mstore(0x00, 0x30116425) // `DeploymentFailed()`.
revert(0x1c, 0x04)
}
mstore(data, n) // Restore the length of `data`.
}
}
/// @dev Writes `data` into the bytecode of a storage contract and returns its address.
/// This uses the so-called "CREATE3" workflow,
/// which means that `pointer` is agnostic to `data, and only depends on `salt`.
function writeDeterministic(bytes memory data, bytes32 salt)
internal
returns (address pointer)
{
/// @solidity memory-safe-assembly
assembly {
let n := mload(data)
mstore(0x00, _CREATE3_PROXY_INITCODE) // Store the `_PROXY_INITCODE`.
let proxy := create2(0, 0x10, 0x10, salt)
if iszero(proxy) {
mstore(0x00, 0x30116425) // `DeploymentFailed()`.
revert(0x1c, 0x04)
}
mstore(0x14, proxy) // Store the proxy's address.
// 0xd6 = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x01).
// 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex).
mstore(0x00, 0xd694)
mstore8(0x34, 0x01) // Nonce of the proxy contract (1).
pointer := keccak256(0x1e, 0x17)
// Do a out-of-gas revert if `n + 1` is more than 2 bytes.
mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n)))
if iszero(
mul( // The arguments of `mul` are evaluated last to first.
extcodesize(pointer),
call(gas(), proxy, 0, add(data, 0x15), add(n, 0xb), codesize(), 0x00)
)
) {
mstore(0x00, 0x30116425) // `DeploymentFailed()`.
revert(0x1c, 0x04)
}
mstore(data, n) // Restore the length of `data`.
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* ADDRESS CALCULATIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns the initialization code hash of the storage contract for `data`.
/// Used for mining vanity addresses with create2crunch.
function initCodeHash(bytes memory data) internal pure returns (bytes32 hash) {
/// @solidity memory-safe-assembly
assembly {
let n := mload(data)
// Do a out-of-gas revert if `n + 1` is more than 2 bytes.
returndatacopy(returndatasize(), returndatasize(), gt(n, 0xfffe))
mstore(data, add(0x61000180600a3d393df300, shl(0x40, n)))
hash := keccak256(add(data, 0x15), add(n, 0xb))
mstore(data, n) // Restore the length of `data`.
}
}
/// @dev Equivalent to `predictCounterfactualAddress(data, salt, address(this))`
function predictCounterfactualAddress(bytes memory data, bytes32 salt)
internal
view
returns (address pointer)
{
pointer = predictCounterfactualAddress(data, salt, address(this));
}
/// @dev Returns the CREATE2 address of the storage contract for `data`
/// deployed with `salt` by `deployer`.
/// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.
function predictCounterfactualAddress(bytes memory data, bytes32 salt, address deployer)
internal
pure
returns (address predicted)
{
bytes32 hash = initCodeHash(data);
/// @solidity memory-safe-assembly
assembly {
// Compute and store the bytecode hash.
mstore8(0x00, 0xff) // Write the prefix.
mstore(0x35, hash)
mstore(0x01, shl(96, deployer))
mstore(0x15, salt)
predicted := keccak256(0x00, 0x55)
// Restore the part of the free memory pointer that has been overwritten.
mstore(0x35, 0)
}
}
/// @dev Equivalent to `predictDeterministicAddress(salt, address(this))`.
function predictDeterministicAddress(bytes32 salt) internal view returns (address pointer) {
pointer = predictDeterministicAddress(salt, address(this));
}
/// @dev Returns the "CREATE3" deterministic address for `salt` with `deployer`.
function predictDeterministicAddress(bytes32 salt, address deployer)
internal
pure
returns (address pointer)
{
/// @solidity memory-safe-assembly
assembly {
let m := mload(0x40) // Cache the free memory pointer.
mstore(0x00, deployer) // Store `deployer`.
mstore8(0x0b, 0xff) // Store the prefix.
mstore(0x20, salt) // Store the salt.
mstore(0x40, CREATE3_PROXY_INITCODE_HASH) // Store the bytecode hash.
mstore(0x14, keccak256(0x0b, 0x55)) // Store the proxy's address.
mstore(0x40, m) // Restore the free memory pointer.
// 0xd6 = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x01).
// 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex).
mstore(0x00, 0xd694)
mstore8(0x34, 0x01) // Nonce of the proxy contract (1).
pointer := keccak256(0x1e, 0x17)
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* READ LOGIC */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Equivalent to `read(pointer, 0, 2 ** 256 - 1)`.
function read(address pointer) internal view returns (bytes memory data) {
/// @solidity memory-safe-assembly
assembly {
data := mload(0x40)
let n := and(0xffffffffff, sub(extcodesize(pointer), 0x01))
extcodecopy(pointer, add(data, 0x1f), 0x00, add(n, 0x21))
mstore(data, n) // Store the length.
mstore(0x40, add(n, add(data, 0x40))) // Allocate memory.
}
}
/// @dev Equivalent to `read(pointer, start, 2 ** 256 - 1)`.
function read(address pointer, uint256 start) internal view returns (bytes memory data) {
/// @solidity memory-safe-assembly
assembly {
data := mload(0x40)
let n := and(0xffffffffff, sub(extcodesize(pointer), 0x01))
let l := sub(n, and(0xffffff, mul(lt(start, n), start)))
extcodecopy(pointer, add(data, 0x1f), start, add(l, 0x21))
mstore(data, mul(sub(n, start), lt(start, n))) // Store the length.
mstore(0x40, add(data, add(0x40, mload(data)))) // Allocate memory.
}
}
/// @dev Returns a slice of the data on `pointer` from `start` to `end`.
/// `start` and `end` will be clamped to the range `[0, args.length]`.
/// The `pointer` MUST be deployed via the SSTORE2 write functions.
/// Otherwise, the behavior is undefined.
/// Out-of-gas reverts if `pointer` does not have any code.
function read(address pointer, uint256 start, uint256 end)
internal
view
returns (bytes memory data)
{
/// @solidity memory-safe-assembly
assembly {
data := mload(0x40)
if iszero(lt(end, 0xffff)) { end := 0xffff }
let d := mul(sub(end, start), lt(start, end))
extcodecopy(pointer, add(data, 0x1f), start, add(d, 0x01))
if iszero(and(0xff, mload(add(data, d)))) {
let n := sub(extcodesize(pointer), 0x01)
returndatacopy(returndatasize(), returndatasize(), shr(40, n))
d := mul(gt(n, start), sub(d, mul(gt(end, n), sub(end, n))))
}
mstore(data, d) // Store the length.
mstore(add(add(data, 0x20), d), 0) // Zeroize the slot after the bytes.
mstore(0x40, add(add(data, 0x40), d)) // Allocate memory.
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/// @notice Simple single owner authorization mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)
///
/// @dev Note:
/// This implementation does NOT auto-initialize the owner to `msg.sender`.
/// You MUST call the `_initializeOwner` in the constructor / initializer.
///
/// While the ownable portion follows
/// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,
/// the nomenclature for the 2-step ownership handover may be unique to this codebase.
abstract contract Ownable {
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CUSTOM ERRORS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The caller is not authorized to call the function.
error Unauthorized();
/// @dev The `newOwner` cannot be the zero address.
error NewOwnerIsZeroAddress();
/// @dev The `pendingOwner` does not have a valid handover request.
error NoHandoverRequest();
/// @dev Cannot double-initialize.
error AlreadyInitialized();
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* EVENTS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The ownership is transferred from `oldOwner` to `newOwner`.
/// This event is intentionally kept the same as OpenZeppelin's Ownable to be
/// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173),
/// despite it not being as lightweight as a single argument event.
event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);
/// @dev An ownership handover to `pendingOwner` has been requested.
event OwnershipHandoverRequested(address indexed pendingOwner);
/// @dev The ownership handover to `pendingOwner` has been canceled.
event OwnershipHandoverCanceled(address indexed pendingOwner);
/// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`.
uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;
/// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`.
uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;
/// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`.
uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* STORAGE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The owner slot is given by:
/// `bytes32(~uint256(uint32(bytes4(keccak256("_OWNER_SLOT_NOT")))))`.
/// It is intentionally chosen to be a high value
/// to avoid collision with lower slots.
/// The choice of manual storage layout is to enable compatibility
/// with both regular and upgradeable contracts.
bytes32 internal constant _OWNER_SLOT =
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927;
/// The ownership handover slot of `newOwner` is given by:
/// ```
/// mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED))
/// let handoverSlot := keccak256(0x00, 0x20)
/// ```
/// It stores the expiry timestamp of the two-step ownership handover.
uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Override to return true to make `_initializeOwner` prevent double-initialization.
function _guardInitializeOwner() internal pure virtual returns (bool guard) {}
/// @dev Initializes the owner directly without authorization guard.
/// This function must be called upon initialization,
/// regardless of whether the contract is upgradeable or not.
/// This is to enable generalization to both regular and upgradeable contracts,
/// and to save gas in case the initial owner is not the caller.
/// For performance reasons, this function will not check if there
/// is an existing owner.
function _initializeOwner(address newOwner) internal virtual {
if (_guardInitializeOwner()) {
/// @solidity memory-safe-assembly
assembly {
let ownerSlot := _OWNER_SLOT
if sload(ownerSlot) {
mstore(0x00, 0x0dc149f0) // `AlreadyInitialized()`.
revert(0x1c, 0x04)
}
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Store the new value.
sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
}
} else {
/// @solidity memory-safe-assembly
assembly {
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Store the new value.
sstore(_OWNER_SLOT, newOwner)
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
}
}
}
/// @dev Sets the owner directly without authorization guard.
function _setOwner(address newOwner) internal virtual {
if (_guardInitializeOwner()) {
/// @solidity memory-safe-assembly
assembly {
let ownerSlot := _OWNER_SLOT
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
// Store the new value.
sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
}
} else {
/// @solidity memory-safe-assembly
assembly {
let ownerSlot := _OWNER_SLOT
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
// Store the new value.
sstore(ownerSlot, newOwner)
}
}
}
/// @dev Throws if the sender is not the owner.
function _checkOwner() internal view virtual {
/// @solidity memory-safe-assembly
assembly {
// If the caller is not the stored owner, revert.
if iszero(eq(caller(), sload(_OWNER_SLOT))) {
mstore(0x00, 0x82b42900) // `Unauthorized()`.
revert(0x1c, 0x04)
}
}
}
/// @dev Returns how long a two-step ownership handover is valid for in seconds.
/// Override to return a different value if needed.
/// Made internal to conserve bytecode. Wrap it in a public function if needed.
function _ownershipHandoverValidFor() internal view virtual returns (uint64) {
return 48 * 3600;
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* PUBLIC UPDATE FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Allows the owner to transfer the ownership to `newOwner`.
function transferOwnership(address newOwner) public payable virtual onlyOwner {
/// @solidity memory-safe-assembly
assembly {
if iszero(shl(96, newOwner)) {
mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`.
revert(0x1c, 0x04)
}
}
_setOwner(newOwner);
}
/// @dev Allows the owner to renounce their ownership.
function renounceOwnership() public payable virtual onlyOwner {
_setOwner(address(0));
}
/// @dev Request a two-step ownership handover to the caller.
/// The request will automatically expire in 48 hours (172800 seconds) by default.
function requestOwnershipHandover() public payable virtual {
unchecked {
uint256 expires = block.timestamp + _ownershipHandoverValidFor();
/// @solidity memory-safe-assembly
assembly {
// Compute and set the handover slot to `expires`.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), expires)
// Emit the {OwnershipHandoverRequested} event.
log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
}
}
}
/// @dev Cancels the two-step ownership handover to the caller, if any.
function cancelOwnershipHandover() public payable virtual {
/// @solidity memory-safe-assembly
assembly {
// Compute and set the handover slot to 0.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), 0)
// Emit the {OwnershipHandoverCanceled} event.
log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
}
}
/// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`.
/// Reverts if there is no existing ownership handover requested by `pendingOwner`.
function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner {
/// @solidity memory-safe-assembly
assembly {
// Compute and set the handover slot to 0.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
let handoverSlot := keccak256(0x0c, 0x20)
// If the handover does not exist, or has expired.
if gt(timestamp(), sload(handoverSlot)) {
mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`.
revert(0x1c, 0x04)
}
// Set the handover slot to 0.
sstore(handoverSlot, 0)
}
_setOwner(pendingOwner);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* PUBLIC READ FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns the owner of the contract.
function owner() public view virtual returns (address result) {
/// @solidity memory-safe-assembly
assembly {
result := sload(_OWNER_SLOT)
}
}
/// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.
function ownershipHandoverExpiresAt(address pendingOwner)
public
view
virtual
returns (uint256 result)
{
/// @solidity memory-safe-assembly
assembly {
// Compute the handover slot.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
// Load the handover slot.
result := sload(keccak256(0x0c, 0x20))
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* MODIFIERS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Marks a function as only callable by the owner.
modifier onlyOwner() virtual {
_checkOwner();
_;
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"remappings": [
"solady/=https://raw.githubusercontent.com/Vectorized/solady/main/src/"
]
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"ChunkOutOfBounds","type":"error"},{"inputs":[],"name":"ContentNotFound","type":"error"},{"inputs":[],"name":"EmptyData","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"ChunkStored","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"contentType","type":"bytes32"}],"name":"ContentStored","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"chunk","type":"bytes"}],"name":"addChunk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes[]","name":"chunks","type":"bytes[]"}],"name":"addChunks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"get","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getChunk","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getInfo","outputs":[{"internalType":"bytes32","name":"contentType","type":"bytes32"},{"internalType":"uint24","name":"chunkCount","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes32","name":"contentType","type":"bytes32"}],"name":"initChunked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"contentType","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"store","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes32","name":"contentType","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"storeAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"contentType","type":"bytes32"},{"internalType":"bytes[]","name":"dataArray","type":"bytes[]"}],"name":"storeBatch","outputs":[{"internalType":"uint256","name":"startId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"}]Contract Creation Code
608060405260016002553480156013575f5ffd5b5060405161140b38038061140b8339810160408190526030916077565b603781603c565b5060a2565b6001600160a01b0316638b78c6d819819055805f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b5f602082840312156086575f5ffd5b81516001600160a01b0381168114609b575f5ffd5b9392505050565b61135c806100af5f395ff3fe608060405260043610610110575f3560e01c806379627fa11161009d578063b7c763b511610062578063b7c763b5146102df578063cf6dc0fa146102fe578063f04e283e1461031d578063f2fde38b14610330578063fee81cf414610343575f5ffd5b806379627fa11461022b5780638da5cb5b1461024a5780639507d39a146102755780639a8c17dd146102a1578063ad88b6e4146102c0575f5ffd5b8063294bd5ce116100e3578063294bd5ce146101a75780634f558e79146101c657806354d1f13d1461020657806361b8ce8c1461020e578063715018a614610223575f5ffd5b80630f11e5471461011457806316d5002a146101355780631a3cd59a14610167578063256929621461019f575b5f5ffd5b34801561011f575f5ffd5b5061013361012e366004610f8d565b610374565b005b348015610140575f5ffd5b5061015461014f366004610f8d565b61053e565b6040519081526020015b60405180910390f35b348015610172575f5ffd5b50610186610181366004610fd5565b6106b1565b6040805192835262ffffff90911660208301520161015e565b6101336106fa565b3480156101b2575f5ffd5b506101546101c136600461102a565b610747565b3480156101d1575f5ffd5b506101f66101e0366004610fd5565b5f90815260208190526040902060010154151590565b604051901515815260200161015e565b61013361087e565b348015610219575f5ffd5b5061015460025481565b6101336108b7565b348015610236575f5ffd5b5061013361024536600461102a565b6108ca565b348015610255575f5ffd5b50638b78c6d819546040516001600160a01b03909116815260200161015e565b348015610280575f5ffd5b5061029461028f366004610fd5565b610a1d565b60405161015e9190611093565b3480156102ac575f5ffd5b506101336102bb3660046110ac565b610b3e565b3480156102cb575f5ffd5b506102946102da3660046110ac565b610b96565b3480156102ea575f5ffd5b506102946102f9366004610fd5565b610c1b565b348015610309575f5ffd5b506101336103183660046110cc565b610c7e565b61013361032b36600461111b565b610db6565b61013361033e36600461111b565b610df3565b34801561034e575f5ffd5b5061015461035d36600461111b565b63389a75e1600c9081525f91909152602090205490565b61037c610e19565b5f838152602081905260409020600101546103aa576040516315f2470160e31b815260040160405180910390fd5b5f8381526020819052604081205462ffffff16905b828110156104f9578383828181106103d9576103d9611141565b90506020028101906103eb9190611155565b90505f0361040c576040516399d8fec960e01b815260040160405180910390fd5b61046c84848381811061042157610421611141565b90506020028101906104339190611155565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e3392505050565b5f8681526020819052604081206002019061048784866111ac565b815260208101919091526040015f2080546001600160a01b0319166001600160a01b0392909216919091179055847faa65dca3f562832c0ba4bbde8d03d3d978faaf4da00e3d88cc93ad26d927096d6104e083856111ac565b60405190815260200160405180910390a26001016103bf565b505f848152602081905260408120805484929061051c90849062ffffff166111bf565b92506101000a81548162ffffff021916908362ffffff16021790555050505050565b5f610547610e19565b506002545f5b828110156106a95783838281811061056757610567611141565b90506020028101906105799190611155565b90505f0361059a576040516399d8fec960e01b815260040160405180910390fd5b600280545f91826105aa836111da565b9190505590505f6105c686868581811061042157610421611141565b604080516060810182526001600160a01b03831681525f602082015291925081018787868181106105f9576105f9611141565b905060200281019061060b9190611155565b65ffffffffffff908116909252505f8481526001602081815260408084208651815488850151988401518816600160d01b026001600160d01b0399909816600160a01b026001600160d01b03199091166001600160a01b039092169190911717969096169490941790945581845290829020018990555188815283915f5160206113075f395f51905f52910160405180910390a2505060010161054d565b509392505050565b5f81815260208190526040812060018101548291906106e3576040516315f2470160e31b815260040160405180910390fd5b60018101549054909462ffffff9091169350915050565b5f6202a30067ffffffffffffffff164201905063389a75e1600c52335f52806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f5fa250565b5f610750610e19565b5f829003610771576040516399d8fec960e01b815260040160405180910390fd5b60028054905f610780836111da565b9190505590505f6107c584848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e3392505050565b604080516060810182526001600160a01b0380841682525f602080840182815265ffffffffffff8a81168688019081528a8552600180855288862097518854945192518416600160d01b026001600160d01b0393909416600160a01b026001600160d01b03199095169716969096179290921791909116179093559182905290829020018790555190915082905f5160206113075f395f51905f529061086e9088815260200190565b60405180910390a2509392505050565b63389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f5fa2565b6108bf610e19565b6108c85f610e74565b565b6108d2610e19565b5f83815260208190526040902060010154610900576040516315f2470160e31b815260040160405180910390fd5b5f819003610921576040516399d8fec960e01b815260040160405180910390fd5b5f8381526020818152604091829020548251601f850183900483028101830190935283835262ffffff169161096f9185908590819084018382808284375f92019190915250610e3392505050565b5f8581526020818152604080832085845260028101835290832080546001600160a01b0319166001600160a01b039590951694909417909355868252819052815462ffffff1691906109c0836111f2565b91906101000a81548162ffffff021916908362ffffff16021790555050837faa65dca3f562832c0ba4bbde8d03d3d978faaf4da00e3d88cc93ad26d927096d82604051610a0f91815260200190565b60405180910390a250505050565b5f818152602081905260409020600181015460609190610a50576040516315f2470160e31b815260040160405180910390fd5b5f83815260016020908152604091829020825160608101845290546001600160a01b03811680835265ffffffffffff600160a01b8304811694840194909452600160d01b9091049092169281019290925215610ad457610acc815f0151826020015165ffffffffffff16836040015165ffffffffffff16610eb1565b949350505050565b60605f5b835462ffffff16811015610b35575f8181526002850160205260409020548290610b0a906001600160a01b0316610f19565b604051602001610b1b92919061122b565b60408051601f198184030181529190529150600101610ad8565b50949350505050565b610b46610e19565b6002548210610b5e57610b5a8260016111ac565b6002555b5f8281526020818152604091829020600101839055905182815283915f5160206113075f395f51905f52910160405180910390a25050565b5f828152602081905260409020600181015460609190610bc9576040516315f2470160e31b815260040160405180910390fd5b805462ffffff168310610bef576040516376fb3d3160e11b815260040160405180910390fd5b5f838152600282016020526040902054610c11906001600160a01b0316610f19565b9150505b92915050565b604051634a83e9cd60e11b8152600481018290526060903090639507d39a906024015f60405180830381865afa158015610c57573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c159190810190611253565b610c86610e19565b5f819003610ca7576040516399d8fec960e01b815260040160405180910390fd5b6002548410610cbf57610cbb8460016111ac565b6002555b5f610cfe83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e3392505050565b604080516060810182526001600160a01b0380841682525f602080840182815265ffffffffffff8981168688019081528d8552600180855288862097518854945192518416600160d01b026001600160d01b0393909416600160a01b026001600160d01b03199095169716969096179290921791909116179093559182905290829020018690555190915085905f5160206113075f395f51905f5290610da79087815260200190565b60405180910390a25050505050565b610dbe610e19565b63389a75e1600c52805f526020600c208054421115610de457636f5e88185f526004601cfd5b5f9055610df081610e74565b50565b610dfb610e19565b8060601b610e1057637448fbae5f526004601cfd5b610df081610e74565b638b78c6d8195433146108c8576382b429005f526004601cfd5b5f81518060401b6bfe61000180600a3d393df3000161fffe8211840152600b8101601584015ff0915081610e6e5763301164255f526004601cfd5b90915290565b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a355565b60405161ffff8210610ec35761ffff91505b818310838303026001810184601f8401873c8082015160ff16610efd576001853b038060281c3d3d3e808403818511028203858211029150505b8082525f81602084010152806040830101604052509392505050565b60405164ffffffffff5f19833b0116602181015f601f8401853c80825260408201810160405250919050565b5f5f83601f840112610f55575f5ffd5b50813567ffffffffffffffff811115610f6c575f5ffd5b6020830191508360208260051b8501011115610f86575f5ffd5b9250929050565b5f5f5f60408486031215610f9f575f5ffd5b83359250602084013567ffffffffffffffff811115610fbc575f5ffd5b610fc886828701610f45565b9497909650939450505050565b5f60208284031215610fe5575f5ffd5b5035919050565b5f5f83601f840112610ffc575f5ffd5b50813567ffffffffffffffff811115611013575f5ffd5b602083019150836020828501011115610f86575f5ffd5b5f5f5f6040848603121561103c575f5ffd5b83359250602084013567ffffffffffffffff811115611059575f5ffd5b610fc886828701610fec565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6110a56020830184611065565b9392505050565b5f5f604083850312156110bd575f5ffd5b50508035926020909101359150565b5f5f5f5f606085870312156110df575f5ffd5b8435935060208501359250604085013567ffffffffffffffff811115611103575f5ffd5b61110f87828801610fec565b95989497509550505050565b5f6020828403121561112b575f5ffd5b81356001600160a01b03811681146110a5575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f5f8335601e1984360301811261116a575f5ffd5b83018035915067ffffffffffffffff821115611184575f5ffd5b602001915036819003821315610f86575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c1557610c15611198565b62ffffff8181168382160190811115610c1557610c15611198565b5f600182016111eb576111eb611198565b5060010190565b5f62ffffff821662ffffff810361120b5761120b611198565b60010192915050565b5f81518060208401855e5f93019283525090919050565b5f610acc6112398386611214565b84611214565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611263575f5ffd5b815167ffffffffffffffff811115611279575f5ffd5b8201601f81018413611289575f5ffd5b805167ffffffffffffffff8111156112a3576112a361123f565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156112d2576112d261123f565b6040528181528282016020018610156112e9575f5ffd5b8160208401602083015e5f9181016020019190915294935050505056fef0d86e4da46a3c60e2dc0f8453bea09697e36bbb29e5a5fb05404b14387c7c2ea264697066735822122001ce30d100ea93568ded9489354569ab46461c3c38e084ad5eeea9fa21cdf94c64736f6c634300081c0033000000000000000000000000d7dd9612a21f7c249fb7f33e9c2e9144345e162b
Deployed Bytecode
0x608060405260043610610110575f3560e01c806379627fa11161009d578063b7c763b511610062578063b7c763b5146102df578063cf6dc0fa146102fe578063f04e283e1461031d578063f2fde38b14610330578063fee81cf414610343575f5ffd5b806379627fa11461022b5780638da5cb5b1461024a5780639507d39a146102755780639a8c17dd146102a1578063ad88b6e4146102c0575f5ffd5b8063294bd5ce116100e3578063294bd5ce146101a75780634f558e79146101c657806354d1f13d1461020657806361b8ce8c1461020e578063715018a614610223575f5ffd5b80630f11e5471461011457806316d5002a146101355780631a3cd59a14610167578063256929621461019f575b5f5ffd5b34801561011f575f5ffd5b5061013361012e366004610f8d565b610374565b005b348015610140575f5ffd5b5061015461014f366004610f8d565b61053e565b6040519081526020015b60405180910390f35b348015610172575f5ffd5b50610186610181366004610fd5565b6106b1565b6040805192835262ffffff90911660208301520161015e565b6101336106fa565b3480156101b2575f5ffd5b506101546101c136600461102a565b610747565b3480156101d1575f5ffd5b506101f66101e0366004610fd5565b5f90815260208190526040902060010154151590565b604051901515815260200161015e565b61013361087e565b348015610219575f5ffd5b5061015460025481565b6101336108b7565b348015610236575f5ffd5b5061013361024536600461102a565b6108ca565b348015610255575f5ffd5b50638b78c6d819546040516001600160a01b03909116815260200161015e565b348015610280575f5ffd5b5061029461028f366004610fd5565b610a1d565b60405161015e9190611093565b3480156102ac575f5ffd5b506101336102bb3660046110ac565b610b3e565b3480156102cb575f5ffd5b506102946102da3660046110ac565b610b96565b3480156102ea575f5ffd5b506102946102f9366004610fd5565b610c1b565b348015610309575f5ffd5b506101336103183660046110cc565b610c7e565b61013361032b36600461111b565b610db6565b61013361033e36600461111b565b610df3565b34801561034e575f5ffd5b5061015461035d36600461111b565b63389a75e1600c9081525f91909152602090205490565b61037c610e19565b5f838152602081905260409020600101546103aa576040516315f2470160e31b815260040160405180910390fd5b5f8381526020819052604081205462ffffff16905b828110156104f9578383828181106103d9576103d9611141565b90506020028101906103eb9190611155565b90505f0361040c576040516399d8fec960e01b815260040160405180910390fd5b61046c84848381811061042157610421611141565b90506020028101906104339190611155565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e3392505050565b5f8681526020819052604081206002019061048784866111ac565b815260208101919091526040015f2080546001600160a01b0319166001600160a01b0392909216919091179055847faa65dca3f562832c0ba4bbde8d03d3d978faaf4da00e3d88cc93ad26d927096d6104e083856111ac565b60405190815260200160405180910390a26001016103bf565b505f848152602081905260408120805484929061051c90849062ffffff166111bf565b92506101000a81548162ffffff021916908362ffffff16021790555050505050565b5f610547610e19565b506002545f5b828110156106a95783838281811061056757610567611141565b90506020028101906105799190611155565b90505f0361059a576040516399d8fec960e01b815260040160405180910390fd5b600280545f91826105aa836111da565b9190505590505f6105c686868581811061042157610421611141565b604080516060810182526001600160a01b03831681525f602082015291925081018787868181106105f9576105f9611141565b905060200281019061060b9190611155565b65ffffffffffff908116909252505f8481526001602081815260408084208651815488850151988401518816600160d01b026001600160d01b0399909816600160a01b026001600160d01b03199091166001600160a01b039092169190911717969096169490941790945581845290829020018990555188815283915f5160206113075f395f51905f52910160405180910390a2505060010161054d565b509392505050565b5f81815260208190526040812060018101548291906106e3576040516315f2470160e31b815260040160405180910390fd5b60018101549054909462ffffff9091169350915050565b5f6202a30067ffffffffffffffff164201905063389a75e1600c52335f52806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f5fa250565b5f610750610e19565b5f829003610771576040516399d8fec960e01b815260040160405180910390fd5b60028054905f610780836111da565b9190505590505f6107c584848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e3392505050565b604080516060810182526001600160a01b0380841682525f602080840182815265ffffffffffff8a81168688019081528a8552600180855288862097518854945192518416600160d01b026001600160d01b0393909416600160a01b026001600160d01b03199095169716969096179290921791909116179093559182905290829020018790555190915082905f5160206113075f395f51905f529061086e9088815260200190565b60405180910390a2509392505050565b63389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f5fa2565b6108bf610e19565b6108c85f610e74565b565b6108d2610e19565b5f83815260208190526040902060010154610900576040516315f2470160e31b815260040160405180910390fd5b5f819003610921576040516399d8fec960e01b815260040160405180910390fd5b5f8381526020818152604091829020548251601f850183900483028101830190935283835262ffffff169161096f9185908590819084018382808284375f92019190915250610e3392505050565b5f8581526020818152604080832085845260028101835290832080546001600160a01b0319166001600160a01b039590951694909417909355868252819052815462ffffff1691906109c0836111f2565b91906101000a81548162ffffff021916908362ffffff16021790555050837faa65dca3f562832c0ba4bbde8d03d3d978faaf4da00e3d88cc93ad26d927096d82604051610a0f91815260200190565b60405180910390a250505050565b5f818152602081905260409020600181015460609190610a50576040516315f2470160e31b815260040160405180910390fd5b5f83815260016020908152604091829020825160608101845290546001600160a01b03811680835265ffffffffffff600160a01b8304811694840194909452600160d01b9091049092169281019290925215610ad457610acc815f0151826020015165ffffffffffff16836040015165ffffffffffff16610eb1565b949350505050565b60605f5b835462ffffff16811015610b35575f8181526002850160205260409020548290610b0a906001600160a01b0316610f19565b604051602001610b1b92919061122b565b60408051601f198184030181529190529150600101610ad8565b50949350505050565b610b46610e19565b6002548210610b5e57610b5a8260016111ac565b6002555b5f8281526020818152604091829020600101839055905182815283915f5160206113075f395f51905f52910160405180910390a25050565b5f828152602081905260409020600181015460609190610bc9576040516315f2470160e31b815260040160405180910390fd5b805462ffffff168310610bef576040516376fb3d3160e11b815260040160405180910390fd5b5f838152600282016020526040902054610c11906001600160a01b0316610f19565b9150505b92915050565b604051634a83e9cd60e11b8152600481018290526060903090639507d39a906024015f60405180830381865afa158015610c57573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c159190810190611253565b610c86610e19565b5f819003610ca7576040516399d8fec960e01b815260040160405180910390fd5b6002548410610cbf57610cbb8460016111ac565b6002555b5f610cfe83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610e3392505050565b604080516060810182526001600160a01b0380841682525f602080840182815265ffffffffffff8981168688019081528d8552600180855288862097518854945192518416600160d01b026001600160d01b0393909416600160a01b026001600160d01b03199095169716969096179290921791909116179093559182905290829020018690555190915085905f5160206113075f395f51905f5290610da79087815260200190565b60405180910390a25050505050565b610dbe610e19565b63389a75e1600c52805f526020600c208054421115610de457636f5e88185f526004601cfd5b5f9055610df081610e74565b50565b610dfb610e19565b8060601b610e1057637448fbae5f526004601cfd5b610df081610e74565b638b78c6d8195433146108c8576382b429005f526004601cfd5b5f81518060401b6bfe61000180600a3d393df3000161fffe8211840152600b8101601584015ff0915081610e6e5763301164255f526004601cfd5b90915290565b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a355565b60405161ffff8210610ec35761ffff91505b818310838303026001810184601f8401873c8082015160ff16610efd576001853b038060281c3d3d3e808403818511028203858211029150505b8082525f81602084010152806040830101604052509392505050565b60405164ffffffffff5f19833b0116602181015f601f8401853c80825260408201810160405250919050565b5f5f83601f840112610f55575f5ffd5b50813567ffffffffffffffff811115610f6c575f5ffd5b6020830191508360208260051b8501011115610f86575f5ffd5b9250929050565b5f5f5f60408486031215610f9f575f5ffd5b83359250602084013567ffffffffffffffff811115610fbc575f5ffd5b610fc886828701610f45565b9497909650939450505050565b5f60208284031215610fe5575f5ffd5b5035919050565b5f5f83601f840112610ffc575f5ffd5b50813567ffffffffffffffff811115611013575f5ffd5b602083019150836020828501011115610f86575f5ffd5b5f5f5f6040848603121561103c575f5ffd5b83359250602084013567ffffffffffffffff811115611059575f5ffd5b610fc886828701610fec565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6110a56020830184611065565b9392505050565b5f5f604083850312156110bd575f5ffd5b50508035926020909101359150565b5f5f5f5f606085870312156110df575f5ffd5b8435935060208501359250604085013567ffffffffffffffff811115611103575f5ffd5b61110f87828801610fec565b95989497509550505050565b5f6020828403121561112b575f5ffd5b81356001600160a01b03811681146110a5575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f5f8335601e1984360301811261116a575f5ffd5b83018035915067ffffffffffffffff821115611184575f5ffd5b602001915036819003821315610f86575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c1557610c15611198565b62ffffff8181168382160190811115610c1557610c15611198565b5f600182016111eb576111eb611198565b5060010190565b5f62ffffff821662ffffff810361120b5761120b611198565b60010192915050565b5f81518060208401855e5f93019283525090919050565b5f610acc6112398386611214565b84611214565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611263575f5ffd5b815167ffffffffffffffff811115611279575f5ffd5b8201601f81018413611289575f5ffd5b805167ffffffffffffffff8111156112a3576112a361123f565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156112d2576112d261123f565b6040528181528282016020018610156112e9575f5ffd5b8160208401602083015e5f9181016020019190915294935050505056fef0d86e4da46a3c60e2dc0f8453bea09697e36bbb29e5a5fb05404b14387c7c2ea264697066735822122001ce30d100ea93568ded9489354569ab46461c3c38e084ad5eeea9fa21cdf94c64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d7dd9612a21f7c249fb7f33e9c2e9144345e162b
-----Decoded View---------------
Arg [0] : owner_ (address): 0xd7dD9612A21F7C249Fb7F33E9C2e9144345e162b
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d7dd9612a21f7c249fb7f33e9c2e9144345e162b
Deployed Bytecode Sourcemap
310:6248:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3236:518;;;;;;;;;;-1:-1:-1;3236:518:0;;;;;:::i;:::-;;:::i;:::-;;3952:546;;;;;;;;;;-1:-1:-1;3952:546:0;;;;;:::i;:::-;;:::i;:::-;;;1687:25:3;;;1675:2;1660:18;3952:546:0;;;;;;;;6053:278;;;;;;;;;;-1:-1:-1;6053:278:0;;;;;:::i;:::-;;:::i;:::-;;;;2126:25:3;;;2199:8;2187:21;;;2182:2;2167:18;;2160:49;2099:18;6053:278:0;1954:261:3;9021:617:1;;;:::i;1352:385:0:-;;;;;;;;;;-1:-1:-1;1352:385:0;;;;;:::i;:::-;;:::i;6437:119::-;;;;;;;;;;-1:-1:-1;6437:119:0;;;;;:::i;:::-;6488:4;6511:12;;;;;;;;;;:24;;;:38;;;6437:119;;;;3265:14:3;;3258:22;3240:41;;3228:2;3213:18;6437:119:0;3100:187:3;9720:456:1;;;:::i;872:25:0:-;;;;;;;;;;;;;;;;8762:100:1;;;:::i;2734:389:0:-;;;;;;;;;;-1:-1:-1;2734:389:0;;;;;:::i;:::-;;:::i;11408:182:1:-;;;;;;;;;;-1:-1:-1;;;11556:18:1;11408:182;;-1:-1:-1;;;;;3984:32:3;;;3966:51;;3954:2;3939:18;11408:182:1;3820:203:3;4600:599:0;;;;;;;;;;-1:-1:-1;4600:599:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2414:216::-;;;;;;;;;;-1:-1:-1;2414:216:0;;;;;:::i;:::-;;:::i;5548:330::-;;;;;;;;;;-1:-1:-1;5548:330:0;;;;;:::i;:::-;;:::i;5306:113::-;;;;;;;;;;-1:-1:-1;5306:113:0;;;;;:::i;:::-;;:::i;1894:399::-;;;;;;;;;;-1:-1:-1;1894:399:0;;;;;:::i;:::-;;:::i;10363:708:1:-;;;;;;:::i;:::-;;:::i;8348:349::-;;;;;;:::i;:::-;;:::i;11693:435::-;;;;;;;;;;-1:-1:-1;11693:435:1;;;;;:::i;:::-;11963:19;11957:4;11950:33;;;11812:14;11996:26;;;;12106:4;12090:21;;12084:28;;11693:435;3236:518:0;12517:13:1;:11;:13::i;:::-;3361:1:0::1;3325:12:::0;;;::::1;::::0;;;;;;:24:::1;;::::0;3321:68:::1;;3372:17;;-1:-1:-1::0;;;3372:17:0::1;;;;;;;;;;;3321:68;3400:18;3421:12:::0;;;::::1;::::0;;;;;;:23;::::1;;::::0;3454:236:::1;3470:17:::0;;::::1;3454:236;;;3512:6;;3519:1;3512:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;;3532:1;3512:21:::0;3508:45:::1;;3542:11;;-1:-1:-1::0;;;3542:11:0::1;;;;;;;;;;;3508:45;3605:24;3619:6;;3626:1;3619:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;3605:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;3605:13:0::1;::::0;-1:-1:-1;;;3605:24:0:i:1;:::-;3567:8;:12:::0;;;::::1;::::0;;;;;;:19:::1;;::::0;3587:14:::1;3600:1:::0;3587:10;:14:::1;:::i;:::-;3567:35:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;3567:35:0;:62;;-1:-1:-1;;;;;;3567:62:0::1;-1:-1:-1::0;;;;;3567:62:0;;;::::1;::::0;;;::::1;::::0;;3660:2;3648:31:::1;3664:14;3677:1:::0;3664:10;:14:::1;:::i;:::-;3648:31;::::0;1687:25:3;;;1675:2;1660:18;3648:31:0::1;;;;;;;3489:3;;3454:236;;;-1:-1:-1::0;3699:8:0::1;:12:::0;;;::::1;::::0;;;;;;:48;;3733:6;;3699:8;:48:::1;::::0;3733:6;;3699:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3311:443;3236:518:::0;;;:::o;3952:546::-;4049:15;12517:13:1;:11;:13::i;:::-;-1:-1:-1;4086:6:0::1;::::0;4108:9:::1;4103:389;4119:20:::0;;::::1;4103:389;;;4164:9;;4174:1;4164:12;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:19;;4187:1;4164:24:::0;4160:48:::1;;4197:11;;-1:-1:-1::0;;;4197:11:0::1;;;;;;;;;;;4160:48;4235:6;:8:::0;;4222:10:::1;::::0;;4235:8:::1;::::0;::::1;:::i;:::-;;;;;4222:21;;4257:15;4275:27;4289:9;;4299:1;4289:12;;;;;;;:::i;4275:27::-;4332:48;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;4332:48:0;::::1;::::0;;-1:-1:-1;4332:48:0::1;::::0;::::1;::::0;4257:45;;-1:-1:-1;4332:48:0;;4359:9;;4369:1;4359:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;4332:48;::::0;;::::1;::::0;;;-1:-1:-1;4316:13:0::1;::::0;;;:9:::1;:13;::::0;;;;;;;:64;;;;;;::::1;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;;4316:64:0::1;-1:-1:-1::0;;;;;4316:64:0;;;::::1;-1:-1:-1::0;;;4316:64:0::1;-1:-1:-1::0;;;;;;4316:64:0;;;-1:-1:-1;;;;;4316:64:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;4394:12;;;;;;;:24:::1;:38:::0;;;4451:30;1687:25:3;;;4316:13:0;;-1:-1:-1;;;;;;;;;;;4451:30:0;1660:18:3;4451:30:0::1;;;;;;;-1:-1:-1::0;;4141:3:0::1;;4103:389;;;;3952:546:::0;;;;;:::o;6053:278::-;6105:19;6181:12;;;;;;;;;;6207:19;;;;6105;;6181:12;6203:63;;6249:17;;-1:-1:-1;;;6249:17:0;;;;;;;;;;;6203:63;6284:19;;;;6305:18;;6284:19;;6305:18;;;;;-1:-1:-1;6053:278:0;-1:-1:-1;;6053:278:0:o;9021:617:1:-;9114:15;7972:9;9132:46;;:15;:46;9114:64;;9346:19;9340:4;9333:33;9396:8;9390:4;9383:22;9452:7;9445:4;9439;9429:21;9422:38;9599:8;9552:45;9549:1;9546;9541:67;9248:374;9021:617::o;1352:385:0:-;1437:10;12517:13:1;:11;:13::i;:::-;1478:1:0::1;1463:16:::0;;;1459:40:::1;;1488:11;;-1:-1:-1::0;;;1488:11:0::1;;;;;;;;;;;1459:40;1515:6;:8:::0;;;:6:::1;:8;::::0;::::1;:::i;:::-;;;;;1510:13;;1533:15;1551:19;1565:4;;1551:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;1551:13:0::1;::::0;-1:-1:-1;;;1551:19:0:i:1;:::-;1596:40;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;1596:40:0;;::::1;::::0;;-1:-1:-1;1596:40:0::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;;1580:13;;;:9:::1;:13:::0;;;;;;:56;;;;;;;;;::::1;-1:-1:-1::0;;;1580:56:0::1;-1:-1:-1::0;;;;;1580:56:0;;;::::1;-1:-1:-1::0;;;1580:56:0::1;-1:-1:-1::0;;;;;;1580:56:0;;;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;;::::0;;;1646:12;;;;;;;;:24:::1;:38:::0;;;1700:30;1533:37;;-1:-1:-1;1590:2:0;;-1:-1:-1;;;;;;;;;;;1700:30:0;::::1;::::0;1673:11;1687:25:3;;1675:2;1660:18;;1541:177;1700:30:0::1;;;;;;;;1449:288;1352:385:::0;;;;;:::o;9720:456:1:-;9922:19;9916:4;9909:33;9968:8;9962:4;9955:22;10020:1;10013:4;10007;9997:21;9990:32;10151:8;10105:44;10102:1;10099;10094:66;9720:456::o;8762:100::-;12517:13;:11;:13::i;:::-;8834:21:::1;8852:1;8834:9;:21::i;:::-;8762:100::o:0;2734:389:0:-;12517:13:1;:11;:13::i;:::-;2855:1:0::1;2819:12:::0;;;::::1;::::0;;;;;;:24:::1;;::::0;2815:68:::1;;2866:17;;-1:-1:-1::0;;;2866:17:0::1;;;;;;;;;;;2815:68;2913:1;2897:17:::0;;;2893:41:::1;;2923:11;;-1:-1:-1::0;;;2923:11:0::1;;;;;;;;;;;2893:41;2945:13;2961:12:::0;;;::::1;::::0;;;;;;;;:23;3023:20;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;2961:23:::1;;::::0;3023:20:::1;::::0;3037:5;;;;;;3023:20;::::1;3037:5:::0;;;;3023:20;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;3023:13:0::1;::::0;-1:-1:-1;;;3023:20:0:i:1;:::-;2994:8;:12:::0;;;::::1;::::0;;;;;;;:26;;;:19:::1;::::0;::::1;:26:::0;;;;;:49;;-1:-1:-1;;;;;;2994:49:0::1;-1:-1:-1::0;;;;;2994:49:0;;;::::1;::::0;;;::::1;::::0;;;3053:12;;;;;;:25;;::::1;;::::0;2994:12;3053:25:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;3106:2;3094:22;3110:5;3094:22;;;;1687:25:3::0;;1675:2;1660:18;;1541:177;3094:22:0::1;;;;;;;;2805:318;2734:389:::0;;;:::o;4600:599::-;4672:23;4698:12;;;;;;;;;;4724:19;;;;4648:12;;4698;4720:63;;4766:17;;-1:-1:-1;;;4766:17:0;;;;;;;;;;;4720:63;4820:18;4841:13;;;:9;:13;;;;;;;;;4820:34;;;;;;;;;-1:-1:-1;;;;;4820:34:0;;;;;;-1:-1:-1;;;4820:34:0;;;;;;;;;;;-1:-1:-1;;;4820:34:0;;;;;;;;;;;;;4868:25;4864:108;;4916:45;4929:3;:11;;;4942:3;:9;;;4916:45;;4953:3;:7;;;4916:45;;:12;:45::i;:::-;4909:52;4600:599;-1:-1:-1;;;;4600:599:0:o;4864:108::-;5009:19;5043:9;5038:132;5058:18;;;;5054:22;;5038:132;;;5140:17;;;;:14;;;:17;;;;;;5119:6;;5127:31;;-1:-1:-1;;;;;5140:17:0;5127:12;:31::i;:::-;5106:53;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;5106:53:0;;;;;;;;;;-1:-1:-1;5078:3:0;;5038:132;;;-1:-1:-1;5186:6:0;4600:599;-1:-1:-1;;;;4600:599:0:o;2414:216::-;12517:13:1;:11;:13::i;:::-;2507:6:0::1;;2501:2;:12;2497:33;;2524:6;:2:::0;2529:1:::1;2524:6;:::i;:::-;2515;:15:::0;2497:33:::1;2540:8;:12:::0;;;::::1;::::0;;;;;;;;:24:::1;;:38:::0;;;2593:30;;1687:25:3;;;2540:12:0;;-1:-1:-1;;;;;;;;;;;2593:30:0;1660:18:3;2593:30:0::1;;;;;;;2414:216:::0;;:::o;5548:330::-;5640:23;5666:12;;;;;;;;;;5692:19;;;;5616:12;;5666;5688:63;;5734:17;;-1:-1:-1;;;5734:17:0;;;;;;;;;;;5688:63;5774:18;;;;5765:27;;5761:58;;5801:18;;-1:-1:-1;;;5801:18:0;;;;;;;;;;;5761:58;5849:21;;;;:14;;;:21;;;;;;5836:35;;-1:-1:-1;;;;;5849:21:0;5836:12;:35::i;:::-;5829:42;;;5548:330;;;;;:::o;5306:113::-;5399:12;;-1:-1:-1;;;5399:12:0;;;;;1687:25:3;;;5360:13:0;;5399:4;;:8;;1660:18:3;;5399:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5399:12:0;;;;;;;;;;;;:::i;1894:399::-;12517:13:1;:11;:13::i;:::-;2013:1:0::1;1998:16:::0;;;1994:40:::1;;2023:11;;-1:-1:-1::0;;;2023:11:0::1;;;;;;;;;;;1994:40;2055:6;;2049:2;:12;2045:33;;2072:6;:2:::0;2077:1:::1;2072:6;:::i;:::-;2063;:15:::0;2045:33:::1;2089:15;2107:19;2121:4;;2107:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;2107:13:0::1;::::0;-1:-1:-1;;;2107:19:0:i:1;:::-;2152:40;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;2152:40:0;;::::1;::::0;;-1:-1:-1;2152:40:0::1;::::0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;;2136:13;;;:9:::1;:13:::0;;;;;;:56;;;;;;;;;::::1;-1:-1:-1::0;;;2136:56:0::1;-1:-1:-1::0;;;;;2136:56:0;;;::::1;-1:-1:-1::0;;;2136:56:0::1;-1:-1:-1::0;;;;;;2136:56:0;;;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;;::::0;;;2202:12;;;;;;;;:24:::1;:38:::0;;;2256:30;2089:37;;-1:-1:-1;2146:2:0;;-1:-1:-1;;;;;;;;;;;2256:30:0;::::1;::::0;2229:11;1687:25:3;;1675:2;1660:18;;1541:177;2256:30:0::1;;;;;;;;1984:309;1894:399:::0;;;;:::o;10363:708:1:-;12517:13;:11;:13::i;:::-;10597:19:::1;10591:4;10584:33;10643:12;10637:4;10630:26;10705:4;10699;10689:21;10811:12;10805:19;10792:11;10789:36;10786:157;;;10857:10;10851:4;10844:24;10924:4;10918;10911:18;10786:157;11020:1;10999:23:::0;;11041::::1;11051:12:::0;11041:9:::1;:23::i;:::-;10363:708:::0;:::o;8348:349::-;12517:13;:11;:13::i;:::-;8520:8:::1;8516:2;8512:17;8502:150;;8562:10;8556:4;8549:24;8633:4;8627;8620:18;8502:150;8671:19;8681:8;8671:9;:19::i;7292:355::-:0;-1:-1:-1;;7498:18:1;7488:8;7485:32;7475:156;;7550:10;7544:4;7537:24;7612:4;7606;7599:18;2052:1785:2;2104:15;2212:4;2206:11;3474:1;3468:4;3464:12;3436:26;3432:45;3422:6;3419:1;3416:13;3410:4;3406:24;3399:79;3607:3;3604:1;3600:11;3593:4;3587;3583:15;3580:1;3573:39;3562:50;;3635:7;3625:135;;3675:10;3669:4;3662:24;3741:4;3735;3728:18;3625:135;3773:15;;;2052:1785;:::o;6145:1089:1:-;-1:-1:-1;;7093:16:1;;-1:-1:-1;;;;;6941:26:1;;;;;;7053:38;7050:1;;7042:78;7177:27;6145:1089::o;11718:912:2:-;11937:4;11931:11;11973:6;11965:15;;11955:44;;11991:6;11984:13;;11955:44;12052:3;12045:5;12042:14;12034:5;12029:3;12025:15;12021:36;12122:4;12119:1;12115:12;12108:5;12101:4;12095;12091:15;12082:7;12070:58;12177:1;12171:4;12167:12;12161:19;12155:4;12151:30;12141:270;;12236:4;12226:7;12214:20;12210:31;12317:1;12313:2;12309:10;12291:16;12273;12258:62;12392:1;12387:3;12383:11;12379:1;12374:3;12371:10;12367:28;12364:1;12360:36;12352:5;12349:1;12346:12;12342:55;12337:60;;;12141:270;12437:1;12431:4;12424:15;12505:1;12501;12494:4;12488;12484:15;12480:23;12473:34;12591:1;12584:4;12578;12574:15;12570:23;12564:4;12557:37;;11718:912;;;;;:::o;10291:445::-;10454:4;10448:11;10485:12;-1:-1:-1;;10503:20:2;;10499:31;10481:50;10595:4;10588:12;;10582:4;10575;10565:15;;10515:7;10544:57;10627:1;10621:4;10614:15;10693:4;10687;10683:15;10680:1;10676:23;10670:4;10663:37;;10291:445;;;:::o;14:374:3:-;84:8;94:6;148:3;141:4;133:6;129:17;125:27;115:55;;166:1;163;156:12;115:55;-1:-1:-1;189:20:3;;232:18;221:30;;218:50;;;264:1;261;254:12;218:50;301:4;293:6;289:17;277:29;;361:3;354:4;344:6;341:1;337:14;329:6;325:27;321:38;318:47;315:67;;;378:1;375;368:12;315:67;14:374;;;;;:::o;393:569::-;499:6;507;515;568:2;556:9;547:7;543:23;539:32;536:52;;;584:1;581;574:12;536:52;629:23;;;-1:-1:-1;727:2:3;712:18;;699:32;754:18;743:30;;740:50;;;786:1;783;776:12;740:50;825:77;894:7;885:6;874:9;870:22;825:77;:::i;:::-;393:569;;921:8;;-1:-1:-1;799:103:3;;-1:-1:-1;;;;393:569:3:o;1723:226::-;1782:6;1835:2;1823:9;1814:7;1810:23;1806:32;1803:52;;;1851:1;1848;1841:12;1803:52;-1:-1:-1;1896:23:3;;1723:226;-1:-1:-1;1723:226:3:o;2220:347::-;2271:8;2281:6;2335:3;2328:4;2320:6;2316:17;2312:27;2302:55;;2353:1;2350;2343:12;2302:55;-1:-1:-1;2376:20:3;;2419:18;2408:30;;2405:50;;;2451:1;2448;2441:12;2405:50;2488:4;2480:6;2476:17;2464:29;;2540:3;2533:4;2524:6;2516;2512:19;2508:30;2505:39;2502:59;;;2557:1;2554;2547:12;2572:523;2651:6;2659;2667;2720:2;2708:9;2699:7;2695:23;2691:32;2688:52;;;2736:1;2733;2726:12;2688:52;2781:23;;;-1:-1:-1;2879:2:3;2864:18;;2851:32;2906:18;2895:30;;2892:50;;;2938:1;2935;2928:12;2892:50;2977:58;3027:7;3018:6;3007:9;3003:22;2977:58;:::i;4028:299::-;4080:3;4118:5;4112:12;4145:6;4140:3;4133:19;4201:6;4194:4;4187:5;4183:16;4176:4;4171:3;4167:14;4161:47;4253:1;4246:4;4237:6;4232:3;4228:16;4224:27;4217:38;4316:4;4309:2;4305:7;4300:2;4292:6;4288:15;4284:29;4279:3;4275:39;4271:50;4264:57;;;4028:299;;;;:::o;4332:228::-;4479:2;4468:9;4461:21;4442:4;4499:55;4550:2;4539:9;4535:18;4527:6;4499:55;:::i;:::-;4491:63;4332:228;-1:-1:-1;;;4332:228:3:o;4565:346::-;4633:6;4641;4694:2;4682:9;4673:7;4669:23;4665:32;4662:52;;;4710:1;4707;4700:12;4662:52;-1:-1:-1;;4755:23:3;;;4875:2;4860:18;;;4847:32;;-1:-1:-1;4565:346:3:o;5502:643::-;5590:6;5598;5606;5614;5667:2;5655:9;5646:7;5642:23;5638:32;5635:52;;;5683:1;5680;5673:12;5635:52;5728:23;;;-1:-1:-1;5848:2:3;5833:18;;5820:32;;-1:-1:-1;5929:2:3;5914:18;;5901:32;5956:18;5945:30;;5942:50;;;5988:1;5985;5978:12;5942:50;6027:58;6077:7;6068:6;6057:9;6053:22;6027:58;:::i;:::-;5502:643;;;;-1:-1:-1;6104:8:3;-1:-1:-1;;;;5502:643:3:o;6150:286::-;6209:6;6262:2;6250:9;6241:7;6237:23;6233:32;6230:52;;;6278:1;6275;6268:12;6230:52;6304:23;;-1:-1:-1;;;;;6356:31:3;;6346:42;;6336:70;;6402:1;6399;6392:12;6441:127;6502:10;6497:3;6493:20;6490:1;6483:31;6533:4;6530:1;6523:15;6557:4;6554:1;6547:15;6573:521;6650:4;6656:6;6716:11;6703:25;6810:2;6806:7;6795:8;6779:14;6775:29;6771:43;6751:18;6747:68;6737:96;;6829:1;6826;6819:12;6737:96;6856:33;;6908:20;;;-1:-1:-1;6951:18:3;6940:30;;6937:50;;;6983:1;6980;6973:12;6937:50;7016:4;7004:17;;-1:-1:-1;7047:14:3;7043:27;;;7033:38;;7030:58;;;7084:1;7081;7074:12;7099:127;7160:10;7155:3;7151:20;7148:1;7141:31;7191:4;7188:1;7181:15;7215:4;7212:1;7205:15;7231:125;7296:9;;;7317:10;;;7314:36;;;7330:18;;:::i;7361:161::-;7454:8;7429:16;;;7447;;;7425:39;;7476:17;;7473:43;;;7496:18;;:::i;7527:135::-;7566:3;7587:17;;;7584:43;;7607:18;;:::i;:::-;-1:-1:-1;7654:1:3;7643:13;;7527:135::o;7849:184::-;7887:3;7931:8;7924:5;7920:20;7964:8;7955:7;7952:21;7949:47;;7976:18;;:::i;:::-;8025:1;8012:15;;7849:184;-1:-1:-1;;7849:184:3:o;8038:211::-;8079:3;8117:5;8111:12;8161:6;8154:4;8147:5;8143:16;8138:3;8132:36;8223:1;8187:16;;8212:13;;;-1:-1:-1;8187:16:3;;8038:211;-1:-1:-1;8038:211:3:o;8254:261::-;8429:3;8454:55;8479:29;8504:3;8496:6;8479:29;:::i;:::-;8471:6;8454:55;:::i;8520:127::-;8581:10;8576:3;8572:20;8569:1;8562:31;8612:4;8609:1;8602:15;8636:4;8633:1;8626:15;8652:934;8731:6;8784:2;8772:9;8763:7;8759:23;8755:32;8752:52;;;8800:1;8797;8790:12;8752:52;8833:9;8827:16;8866:18;8858:6;8855:30;8852:50;;;8898:1;8895;8888:12;8852:50;8921:22;;8974:4;8966:13;;8962:27;-1:-1:-1;8952:55:3;;9003:1;9000;8993:12;8952:55;9036:2;9030:9;9062:18;9054:6;9051:30;9048:56;;;9084:18;;:::i;:::-;9133:2;9127:9;9225:2;9187:17;;-1:-1:-1;;9183:31:3;;;9216:2;9179:40;9175:54;9163:67;;9260:18;9245:34;;9281:22;;;9242:62;9239:88;;;9307:18;;:::i;:::-;9343:2;9336:22;9367;;;9408:15;;;9425:2;9404:24;9401:37;-1:-1:-1;9398:57:3;;;9451:1;9448;9441:12;9398:57;9500:6;9495:2;9491;9487:11;9482:2;9474:6;9470:15;9464:43;9553:1;9527:19;;;9548:2;9523:28;9516:39;;;;9531:6;8652:934;-1:-1:-1;;;;8652:934:3:o
Swarm Source
ipfs://01ce30d100ea93568ded9489354569ab46461c3c38e084ad5eeea9fa21cdf94c
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.