Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 31 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Append Chunk Dat... | 24067981 | 9 days ago | IN | 0 ETH | 0.0001133 | ||||
| Append Chunk Dat... | 24067980 | 9 days ago | IN | 0 ETH | 0.00018015 | ||||
| Append Chunk Dat... | 24067979 | 9 days ago | IN | 0 ETH | 0.00018732 | ||||
| Append Chunk Dat... | 24067978 | 9 days ago | IN | 0 ETH | 0.00018468 | ||||
| Append Chunk Dat... | 24067977 | 9 days ago | IN | 0 ETH | 0.00019022 | ||||
| Append Chunk Dat... | 24067976 | 9 days ago | IN | 0 ETH | 0.00019054 | ||||
| Append Chunk Dat... | 24067975 | 9 days ago | IN | 0 ETH | 0.00018125 | ||||
| Append Chunk Dat... | 24067974 | 9 days ago | IN | 0 ETH | 0.00017904 | ||||
| Append Chunk Dat... | 24067973 | 9 days ago | IN | 0 ETH | 0.00017168 | ||||
| Append Chunk Dat... | 24067971 | 9 days ago | IN | 0 ETH | 0.00018904 | ||||
| Append Chunk Dat... | 24067970 | 9 days ago | IN | 0 ETH | 0.0001846 | ||||
| Append Chunk Dat... | 24067969 | 9 days ago | IN | 0 ETH | 0.00018506 | ||||
| Append Chunk Dat... | 24067968 | 9 days ago | IN | 0 ETH | 0.0001813 | ||||
| Append Chunk Dat... | 24067967 | 9 days ago | IN | 0 ETH | 0.00017702 | ||||
| Append Chunk Dat... | 24067966 | 9 days ago | IN | 0 ETH | 0.00017888 | ||||
| Append Chunk Dat... | 24067965 | 9 days ago | IN | 0 ETH | 0.0001781 | ||||
| Append Chunk Dat... | 24067964 | 9 days ago | IN | 0 ETH | 0.00016944 | ||||
| Create File | 24067963 | 9 days ago | IN | 0 ETH | 0.0001716 | ||||
| Append Chunk Dat... | 24067962 | 9 days ago | IN | 0 ETH | 0.0000724 | ||||
| Append Chunk Dat... | 24067961 | 9 days ago | IN | 0 ETH | 0.00017218 | ||||
| Append Chunk Dat... | 24067960 | 9 days ago | IN | 0 ETH | 0.00016228 | ||||
| Append Chunk Dat... | 24067959 | 9 days ago | IN | 0 ETH | 0.00015758 | ||||
| Append Chunk Dat... | 24067958 | 9 days ago | IN | 0 ETH | 0.00015983 | ||||
| Append Chunk Dat... | 24067957 | 9 days ago | IN | 0 ETH | 0.00014464 | ||||
| Append Chunk Dat... | 24067948 | 9 days ago | IN | 0 ETH | 0.00015176 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x61395a80 | 24067981 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067980 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067979 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067978 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067977 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067976 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067975 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067974 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067973 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067971 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067970 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067969 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067968 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067967 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067966 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067965 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067964 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067963 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x61289280 | 24067962 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067961 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067960 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067959 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067958 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067957 | 9 days ago | Contract Creation | 0 ETH | |||
| 0x615dc180 | 24067948 | 9 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BeaconStorage
Compiler Version
v0.8.27+commit.40a35a09
Optimization Enabled:
Yes with 200 runs
Other Settings:
prague EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {EthDrive} from "./EthDrive.sol";
/// @title BeaconStorage
/// @author nahiko
/// @notice Standalone file storage contract for Beacon assets
contract BeaconStorage is Ownable, EthDrive {
constructor() Ownable(msg.sender) {}
}// 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
pragma solidity ^0.8.27;
import "@openzeppelin/contracts/access/Ownable.sol";
import "./SSTORE2.sol";
/// @author nahiko
abstract contract EthDrive is Ownable {
mapping(string => address[]) public fileChunks;
uint256 public constant MAX_CHUNKS = 100;
constructor() {}
// =============================================================
// FILE MANAGEMENT
// =============================================================
function createFile(string memory fileName, bytes[] calldata chunks) public onlyOwner {
require(fileChunks[fileName].length == 0, "File already exists");
require(chunks.length > 0 && chunks.length <= MAX_CHUNKS, "Invalid chunk count");
for (uint256 i = 0; i < chunks.length; i++) {
require(chunks[i].length > 0, "Empty chunk");
address pointer = SSTORE2.write(chunks[i]);
fileChunks[fileName].push(pointer);
}
}
/// @notice Create multiple files in a single transaction (gas-efficient batching)
/// @param fileNames Array of file names to create
/// @param allChunks Array of chunk arrays, one per file
function createFiles(string[] calldata fileNames, bytes[][] calldata allChunks) public onlyOwner {
require(fileNames.length == allChunks.length, "Array length mismatch");
for (uint256 f = 0; f < fileNames.length; f++) {
string calldata fileName = fileNames[f];
bytes[] calldata chunks = allChunks[f];
require(fileChunks[fileName].length == 0, "File already exists");
require(chunks.length > 0 && chunks.length <= MAX_CHUNKS, "Invalid chunk count");
for (uint256 i = 0; i < chunks.length; i++) {
require(chunks[i].length > 0, "Empty chunk");
address pointer = SSTORE2.write(chunks[i]);
fileChunks[fileName].push(pointer);
}
}
}
/// @notice Delete multiple files in a single transaction
/// @param fileNames Array of file names to delete
function deleteFiles(string[] calldata fileNames) public onlyOwner {
for (uint256 i = 0; i < fileNames.length; i++) {
if (fileChunks[fileNames[i]].length > 0) {
delete fileChunks[fileNames[i]];
}
}
}
function renameFile(string memory oldName, string memory newName) public onlyOwner {
require(fileChunks[oldName].length > 0, "File not found");
require(fileChunks[newName].length == 0, "New name already exists");
fileChunks[newName] = fileChunks[oldName];
delete fileChunks[oldName];
}
function deleteFile(string memory fileName) public onlyOwner {
require(fileChunks[fileName].length > 0, "File not found");
delete fileChunks[fileName];
}
function getFile(string memory fileName) public view returns (bytes memory) {
address[] memory chunks = fileChunks[fileName];
// Return empty bytes if file doesn't exist (instead of reverting)
if (chunks.length == 0) {
return "";
}
bytes memory totalFile;
for (uint256 i = 0; i < chunks.length; i++) {
if (chunks[i] != address(0)) {
totalFile = bytes.concat(totalFile, SSTORE2.read(chunks[i]));
}
}
return totalFile;
}
// =============================================================
// CHUNK DATA MANAGEMENT
// (Handles raw bytes -> SSTORE2 -> Pointer)
// =============================================================
function appendChunkData(string memory fileName, bytes[] calldata chunks) public onlyOwner {
require(fileChunks[fileName].length > 0, "File not found");
require(fileChunks[fileName].length + chunks.length <= MAX_CHUNKS, "Max chunks exceeded");
for (uint256 i = 0; i < chunks.length; i++) {
require(chunks[i].length > 0, "Empty chunk");
address pointer = SSTORE2.write(chunks[i]);
fileChunks[fileName].push(pointer);
}
}
function updateChunkData(string memory fileName, uint256 chunkIndex, bytes calldata newChunkData)
public
onlyOwner
{
require(fileChunks[fileName].length > 0, "File not found");
require(chunkIndex < fileChunks[fileName].length, "Chunk index out of bounds");
require(newChunkData.length > 0, "Empty chunk");
address newPointer = SSTORE2.write(newChunkData);
fileChunks[fileName][chunkIndex] = newPointer;
}
function getChunkData(string memory fileName, uint256 chunkIndex) public view returns (bytes memory) {
require(chunkIndex < fileChunks[fileName].length, "Chunk index out of bounds");
address chunkPointer = fileChunks[fileName][chunkIndex];
require(chunkPointer != address(0), "Chunk deleted");
return SSTORE2.read(chunkPointer);
}
// =============================================================
// CHUNK POINTER MANAGEMENT
// (Handles direct address references)
// =============================================================
function appendChunkPointer(string memory fileName, address pointer) public onlyOwner {
require(fileChunks[fileName].length > 0, "File not found");
require(fileChunks[fileName].length + 1 <= MAX_CHUNKS, "Max chunks exceeded");
require(pointer != address(0), "Invalid pointer");
fileChunks[fileName].push(pointer);
}
function updateChunkPointer(string memory fileName, uint256 chunkIndex, address newPointer) public onlyOwner {
require(fileChunks[fileName].length > 0, "File not found");
require(chunkIndex < fileChunks[fileName].length, "Chunk index out of bounds");
require(newPointer != address(0), "Invalid pointer");
fileChunks[fileName][chunkIndex] = newPointer;
}
function deleteChunkPointer(string memory fileName, uint256 chunkIndex) public onlyOwner {
require(fileChunks[fileName].length > 0, "File not found");
require(chunkIndex < fileChunks[fileName].length, "Chunk index out of bounds");
delete fileChunks[fileName][chunkIndex];
}
function getChunkPointer(string memory fileName, uint256 chunkIndex) public view returns (address) {
require(chunkIndex < fileChunks[fileName].length, "Chunk index out of bounds");
return fileChunks[fileName][chunkIndex];
}
}// 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: 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.
}
}
}{
"remappings": [
"@openzeppelin/=lib/openzeppelin-contracts/",
"solady/=lib/solady/src/",
"forge-std/=lib/forge-std/src/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "prague",
"viaIR": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"MAX_CHUNKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"bytes[]","name":"chunks","type":"bytes[]"}],"name":"appendChunkData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"address","name":"pointer","type":"address"}],"name":"appendChunkPointer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"bytes[]","name":"chunks","type":"bytes[]"}],"name":"createFile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"fileNames","type":"string[]"},{"internalType":"bytes[][]","name":"allChunks","type":"bytes[][]"}],"name":"createFiles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"uint256","name":"chunkIndex","type":"uint256"}],"name":"deleteChunkPointer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"}],"name":"deleteFile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"fileNames","type":"string[]"}],"name":"deleteFiles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"fileChunks","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"uint256","name":"chunkIndex","type":"uint256"}],"name":"getChunkData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"uint256","name":"chunkIndex","type":"uint256"}],"name":"getChunkPointer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"}],"name":"getFile","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"oldName","type":"string"},{"internalType":"string","name":"newName","type":"string"}],"name":"renameFile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"uint256","name":"chunkIndex","type":"uint256"},{"internalType":"bytes","name":"newChunkData","type":"bytes"}],"name":"updateChunkData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fileName","type":"string"},{"internalType":"uint256","name":"chunkIndex","type":"uint256"},{"internalType":"address","name":"newPointer","type":"address"}],"name":"updateChunkPointer","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6080604052348015600e575f5ffd5b503380603357604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b603a81603f565b50608e565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61199d8061009b5f395ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c806388a6d29b1161009e578063ae1bbacb1161006e578063ae1bbacb14610231578063bf66dfc014610244578063e0876aa814610257578063f2fde38b1461026a578063f56b78b81461027d575f5ffd5b806388a6d29b146101e85780638da5cb5b146101fb5780638f4ddb411461020b578063a99100541461021e575f5ffd5b80635d3c4290116100e45780635d3c4290146101795780635ed253461461018c5780636ba6b6fb146101a2578063715018a6146101b557806377595926146101bd575f5ffd5b806303c7f8e71461011557806313d4a0441461013e5780632f5156b81461015357806353b274d814610166575b5f5ffd5b61012861012336600461140b565b610290565b604051610135919061144c565b60405180910390f35b61015161014c366004611481565b61036f565b005b61015161016136600461152b565b610499565b6101516101743660046115b0565b61071f565b610151610187366004611602565b61084b565b610194606481565b604051908152602001610135565b6101516101b0366004611640565b610902565b610151610a46565b6101d06101cb36600461140b565b610a59565b6040516001600160a01b039091168152602001610135565b6101516101f63660046116da565b610ae2565b5f546001600160a01b03166101d0565b610151610219366004611741565b610c62565b61015161022c36600461178b565b610db2565b61015161023f36600461140b565b610e24565b6101d061025236600461140b565b610ef3565b61012861026536600461178b565b610f38565b6101516102783660046117bc565b61105e565b61015161028b3660046116da565b611098565b60606001836040516102a291906117f3565b9081526040519081900360200190205482106102d95760405162461bcd60e51b81526004016102d0906117fe565b60405180910390fd5b5f6001846040516102ea91906117f3565b9081526020016040518091039020838154811061030957610309611835565b5f918252602090912001546001600160a01b031690508061035c5760405162461bcd60e51b815260206004820152600d60248201526c10da1d5b9ac819195b195d1959609a1b60448201526064016102d0565b6103658161120f565b9150505b92915050565b61037761123b565b5f60018360405161038891906117f3565b90815260405190819003602001902054116103b55760405162461bcd60e51b81526004016102d090611849565b6001816040516103c591906117f3565b90815260405190819003602001902054156104225760405162461bcd60e51b815260206004820152601760248201527f4e6577206e616d6520616c72656164792065786973747300000000000000000060448201526064016102d0565b60018260405161043291906117f3565b908152602001604051809103902060018260405161045091906117f3565b908152604051908190036020019020815461046b92906112f7565b5060018260405161047c91906117f3565b90815260200160405180910390205f6104959190611343565b5050565b6104a161123b565b8281146104e85760405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b60448201526064016102d0565b5f5b8381101561071857365f86868481811061050657610506611835565b90506020028101906105189190611871565b91509150365f86868681811061053057610530611835565b905060200281019061054291906118b3565b91509150600184846040516105589291906118f8565b90815260405190819003602001902054156105ab5760405162461bcd60e51b815260206004820152601360248201527246696c6520616c72656164792065786973747360681b60448201526064016102d0565b80158015906105bb575060648111155b6105fd5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a590818da1d5b9ac818dbdd5b9d606a1b60448201526064016102d0565b5f5b81811015610707575f83838381811061061a5761061a611835565b905060200281019061062c9190611871565b90501161064b5760405162461bcd60e51b81526004016102d090611907565b5f6106ac84848481811061066157610661611835565b90506020028101906106739190611871565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061126792505050565b9050600186866040516106c09291906118f8565b908152604051602091819003820190208054600180820183555f928352929091200180546001600160a01b0319166001600160a01b039390931692909217909155016105ff565b5050600190930192506104ea915050565b5050505050565b61072761123b565b5f60018460405161073891906117f3565b90815260405190819003602001902054116107655760405162461bcd60e51b81526004016102d090611849565b60018360405161077591906117f3565b9081526040519081900360200190205482106107a35760405162461bcd60e51b81526004016102d0906117fe565b6001600160a01b0381166107eb5760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103837b4b73a32b960891b60448201526064016102d0565b806001846040516107fc91906117f3565b9081526020016040518091039020838154811061081b5761081b611835565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b61085361123b565b5f5b818110156108fd575f600184848481811061087257610872611835565b90506020028101906108849190611871565b6040516108929291906118f8565b9081526040519081900360200190205411156108f55760018383838181106108bc576108bc611835565b90506020028101906108ce9190611871565b6040516108dc9291906118f8565b90815260200160405180910390205f6108f59190611343565b600101610855565b505050565b61090a61123b565b5f60018560405161091b91906117f3565b90815260405190819003602001902054116109485760405162461bcd60e51b81526004016102d090611849565b60018460405161095891906117f3565b9081526040519081900360200190205483106109865760405162461bcd60e51b81526004016102d0906117fe565b806109a35760405162461bcd60e51b81526004016102d090611907565b5f6109e283838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061126792505050565b9050806001866040516109f591906117f3565b90815260200160405180910390208581548110610a1457610a14611835565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050505050565b610a4e61123b565b610a575f6112a8565b565b5f600183604051610a6a91906117f3565b908152604051908190036020019020548210610a985760405162461bcd60e51b81526004016102d0906117fe565b600183604051610aa891906117f3565b90815260200160405180910390208281548110610ac757610ac7611835565b5f918252602090912001546001600160a01b03169392505050565b610aea61123b565b600183604051610afa91906117f3565b9081526040519081900360200190205415610b4d5760405162461bcd60e51b815260206004820152601360248201527246696c6520616c72656164792065786973747360681b60448201526064016102d0565b8015801590610b5d575060648111155b610b9f5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a590818da1d5b9ac818dbdd5b9d606a1b60448201526064016102d0565b5f5b81811015610c5c575f838383818110610bbc57610bbc611835565b9050602002810190610bce9190611871565b905011610bed5760405162461bcd60e51b81526004016102d090611907565b5f610c0384848481811061066157610661611835565b9050600185604051610c1591906117f3565b908152604051602091819003820190208054600180820183555f928352929091200180546001600160a01b0319166001600160a01b03939093169290921790915501610ba1565b50505050565b610c6a61123b565b5f600183604051610c7b91906117f3565b9081526040519081900360200190205411610ca85760405162461bcd60e51b81526004016102d090611849565b6064600183604051610cba91906117f3565b90815260405190819003602001902054610cd590600161192c565b1115610d195760405162461bcd60e51b815260206004820152601360248201527213585e0818da1d5b9adcc8195e18d959591959606a1b60448201526064016102d0565b6001600160a01b038116610d615760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103837b4b73a32b960891b60448201526064016102d0565b600182604051610d7191906117f3565b9081526040516020918190038201902080546001810182555f9182529190200180546001600160a01b0319166001600160a01b039290921691909117905550565b610dba61123b565b5f600182604051610dcb91906117f3565b9081526040519081900360200190205411610df85760405162461bcd60e51b81526004016102d090611849565b600181604051610e0891906117f3565b90815260200160405180910390205f610e219190611343565b50565b610e2c61123b565b5f600183604051610e3d91906117f3565b9081526040519081900360200190205411610e6a5760405162461bcd60e51b81526004016102d090611849565b600182604051610e7a91906117f3565b908152604051908190036020019020548110610ea85760405162461bcd60e51b81526004016102d0906117fe565b600182604051610eb891906117f3565b90815260200160405180910390208181548110610ed757610ed7611835565b5f91825260209091200180546001600160a01b03191690555050565b81516020818401810180516001825292820191850191909120919052805482908110610f1d575f80fd5b5f918252602090912001546001600160a01b03169150829050565b60605f600183604051610f4b91906117f3565b9081526040805191829003602090810183208054808302850183019093528284529190830182828015610fa557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610f87575b5050505050905080515f03610fc957505060408051602081019091525f8152919050565b60605f5b8251811015611056575f6001600160a01b0316838281518110610ff257610ff2611835565b60200260200101516001600160a01b03161461104e578161102b84838151811061101e5761101e611835565b602002602001015161120f565b60405160200161103c92919061194b565b60405160208183030381529060405291505b600101610fcd565b509392505050565b61106661123b565b6001600160a01b03811661108f57604051631e4fbdf760e01b81525f60048201526024016102d0565b610e21816112a8565b6110a061123b565b5f6001846040516110b191906117f3565b90815260405190819003602001902054116110de5760405162461bcd60e51b81526004016102d090611849565b6064828290506001856040516110f491906117f3565b9081526040519081900360200190205461110e919061192c565b11156111525760405162461bcd60e51b815260206004820152601360248201527213585e0818da1d5b9adcc8195e18d959591959606a1b60448201526064016102d0565b5f5b81811015610c5c575f83838381811061116f5761116f611835565b90506020028101906111819190611871565b9050116111a05760405162461bcd60e51b81526004016102d090611907565b5f6111b684848481811061066157610661611835565b90506001856040516111c891906117f3565b908152604051602091819003820190208054600180820183555f928352929091200180546001600160a01b0319166001600160a01b03939093169290921790915501611154565b60405164ffffffffff5f19833b0116602181015f601f8401853c80825260408201810160405250919050565b5f546001600160a01b03163314610a575760405163118cdaa760e01b81523360048201526024016102d0565b5f81518060401b6bfe61000180600a3d393df3000161fffe8211840152600b8101601584015ff09150816112a25763301164255f526004601cfd5b90915290565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255905f5260205f20908101928215611333575f5260205f209182015b82811115611333578254825591600101919060010190611318565b5061133f92915061135a565b5090565b5080545f8255905f5260205f2090810190610e2191905b5b8082111561133f575f815560010161135b565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112611391575f5ffd5b81356001600160401b038111156113aa576113aa61136e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156113d8576113d861136e565b6040528181528382016020018510156113ef575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f6040838503121561141c575f5ffd5b82356001600160401b03811115611431575f5ffd5b61143d85828601611382565b95602094909401359450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215611492575f5ffd5b82356001600160401b038111156114a7575f5ffd5b6114b385828601611382565b92505060208301356001600160401b038111156114ce575f5ffd5b6114da85828601611382565b9150509250929050565b5f5f83601f8401126114f4575f5ffd5b5081356001600160401b0381111561150a575f5ffd5b6020830191508360208260051b8501011115611524575f5ffd5b9250929050565b5f5f5f5f6040858703121561153e575f5ffd5b84356001600160401b03811115611553575f5ffd5b61155f878288016114e4565b90955093505060208501356001600160401b0381111561157d575f5ffd5b611589878288016114e4565b95989497509550505050565b80356001600160a01b03811681146115ab575f5ffd5b919050565b5f5f5f606084860312156115c2575f5ffd5b83356001600160401b038111156115d7575f5ffd5b6115e386828701611382565b935050602084013591506115f960408501611595565b90509250925092565b5f5f60208385031215611613575f5ffd5b82356001600160401b03811115611628575f5ffd5b611634858286016114e4565b90969095509350505050565b5f5f5f5f60608587031215611653575f5ffd5b84356001600160401b03811115611668575f5ffd5b61167487828801611382565b9450506020850135925060408501356001600160401b03811115611696575f5ffd5b8501601f810187136116a6575f5ffd5b80356001600160401b038111156116bb575f5ffd5b8760208284010111156116cc575f5ffd5b949793965060200194505050565b5f5f5f604084860312156116ec575f5ffd5b83356001600160401b03811115611701575f5ffd5b61170d86828701611382565b93505060208401356001600160401b03811115611728575f5ffd5b611734868287016114e4565b9497909650939450505050565b5f5f60408385031215611752575f5ffd5b82356001600160401b03811115611767575f5ffd5b61177385828601611382565b92505061178260208401611595565b90509250929050565b5f6020828403121561179b575f5ffd5b81356001600160401b038111156117b0575f5ffd5b61036584828501611382565b5f602082840312156117cc575f5ffd5b6117d582611595565b9392505050565b5f81518060208401855e5f93019283525090919050565b5f6117d582846117dc565b60208082526019908201527f4368756e6b20696e646578206f7574206f6620626f756e647300000000000000604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b6020808252600e908201526d119a5b19481b9bdd08199bdd5b9960921b604082015260600190565b5f5f8335601e19843603018112611886575f5ffd5b8301803591506001600160401b0382111561189f575f5ffd5b602001915036819003821315611524575f5ffd5b5f5f8335601e198436030181126118c8575f5ffd5b8301803591506001600160401b038211156118e1575f5ffd5b6020019150600581901b3603821315611524575f5ffd5b818382375f9101908152919050565b6020808252600b908201526a456d707479206368756e6b60a81b604082015260600190565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b5f61195f61195983866117dc565b846117dc565b94935050505056fea2646970667358221220d5af3e101fe34144edff97e55231ca35cb90ccdc36e1c8bc6d66a705d14397ce64736f6c634300081b0033
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610111575f3560e01c806388a6d29b1161009e578063ae1bbacb1161006e578063ae1bbacb14610231578063bf66dfc014610244578063e0876aa814610257578063f2fde38b1461026a578063f56b78b81461027d575f5ffd5b806388a6d29b146101e85780638da5cb5b146101fb5780638f4ddb411461020b578063a99100541461021e575f5ffd5b80635d3c4290116100e45780635d3c4290146101795780635ed253461461018c5780636ba6b6fb146101a2578063715018a6146101b557806377595926146101bd575f5ffd5b806303c7f8e71461011557806313d4a0441461013e5780632f5156b81461015357806353b274d814610166575b5f5ffd5b61012861012336600461140b565b610290565b604051610135919061144c565b60405180910390f35b61015161014c366004611481565b61036f565b005b61015161016136600461152b565b610499565b6101516101743660046115b0565b61071f565b610151610187366004611602565b61084b565b610194606481565b604051908152602001610135565b6101516101b0366004611640565b610902565b610151610a46565b6101d06101cb36600461140b565b610a59565b6040516001600160a01b039091168152602001610135565b6101516101f63660046116da565b610ae2565b5f546001600160a01b03166101d0565b610151610219366004611741565b610c62565b61015161022c36600461178b565b610db2565b61015161023f36600461140b565b610e24565b6101d061025236600461140b565b610ef3565b61012861026536600461178b565b610f38565b6101516102783660046117bc565b61105e565b61015161028b3660046116da565b611098565b60606001836040516102a291906117f3565b9081526040519081900360200190205482106102d95760405162461bcd60e51b81526004016102d0906117fe565b60405180910390fd5b5f6001846040516102ea91906117f3565b9081526020016040518091039020838154811061030957610309611835565b5f918252602090912001546001600160a01b031690508061035c5760405162461bcd60e51b815260206004820152600d60248201526c10da1d5b9ac819195b195d1959609a1b60448201526064016102d0565b6103658161120f565b9150505b92915050565b61037761123b565b5f60018360405161038891906117f3565b90815260405190819003602001902054116103b55760405162461bcd60e51b81526004016102d090611849565b6001816040516103c591906117f3565b90815260405190819003602001902054156104225760405162461bcd60e51b815260206004820152601760248201527f4e6577206e616d6520616c72656164792065786973747300000000000000000060448201526064016102d0565b60018260405161043291906117f3565b908152602001604051809103902060018260405161045091906117f3565b908152604051908190036020019020815461046b92906112f7565b5060018260405161047c91906117f3565b90815260200160405180910390205f6104959190611343565b5050565b6104a161123b565b8281146104e85760405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b60448201526064016102d0565b5f5b8381101561071857365f86868481811061050657610506611835565b90506020028101906105189190611871565b91509150365f86868681811061053057610530611835565b905060200281019061054291906118b3565b91509150600184846040516105589291906118f8565b90815260405190819003602001902054156105ab5760405162461bcd60e51b815260206004820152601360248201527246696c6520616c72656164792065786973747360681b60448201526064016102d0565b80158015906105bb575060648111155b6105fd5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a590818da1d5b9ac818dbdd5b9d606a1b60448201526064016102d0565b5f5b81811015610707575f83838381811061061a5761061a611835565b905060200281019061062c9190611871565b90501161064b5760405162461bcd60e51b81526004016102d090611907565b5f6106ac84848481811061066157610661611835565b90506020028101906106739190611871565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061126792505050565b9050600186866040516106c09291906118f8565b908152604051602091819003820190208054600180820183555f928352929091200180546001600160a01b0319166001600160a01b039390931692909217909155016105ff565b5050600190930192506104ea915050565b5050505050565b61072761123b565b5f60018460405161073891906117f3565b90815260405190819003602001902054116107655760405162461bcd60e51b81526004016102d090611849565b60018360405161077591906117f3565b9081526040519081900360200190205482106107a35760405162461bcd60e51b81526004016102d0906117fe565b6001600160a01b0381166107eb5760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103837b4b73a32b960891b60448201526064016102d0565b806001846040516107fc91906117f3565b9081526020016040518091039020838154811061081b5761081b611835565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b61085361123b565b5f5b818110156108fd575f600184848481811061087257610872611835565b90506020028101906108849190611871565b6040516108929291906118f8565b9081526040519081900360200190205411156108f55760018383838181106108bc576108bc611835565b90506020028101906108ce9190611871565b6040516108dc9291906118f8565b90815260200160405180910390205f6108f59190611343565b600101610855565b505050565b61090a61123b565b5f60018560405161091b91906117f3565b90815260405190819003602001902054116109485760405162461bcd60e51b81526004016102d090611849565b60018460405161095891906117f3565b9081526040519081900360200190205483106109865760405162461bcd60e51b81526004016102d0906117fe565b806109a35760405162461bcd60e51b81526004016102d090611907565b5f6109e283838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061126792505050565b9050806001866040516109f591906117f3565b90815260200160405180910390208581548110610a1457610a14611835565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050505050565b610a4e61123b565b610a575f6112a8565b565b5f600183604051610a6a91906117f3565b908152604051908190036020019020548210610a985760405162461bcd60e51b81526004016102d0906117fe565b600183604051610aa891906117f3565b90815260200160405180910390208281548110610ac757610ac7611835565b5f918252602090912001546001600160a01b03169392505050565b610aea61123b565b600183604051610afa91906117f3565b9081526040519081900360200190205415610b4d5760405162461bcd60e51b815260206004820152601360248201527246696c6520616c72656164792065786973747360681b60448201526064016102d0565b8015801590610b5d575060648111155b610b9f5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a590818da1d5b9ac818dbdd5b9d606a1b60448201526064016102d0565b5f5b81811015610c5c575f838383818110610bbc57610bbc611835565b9050602002810190610bce9190611871565b905011610bed5760405162461bcd60e51b81526004016102d090611907565b5f610c0384848481811061066157610661611835565b9050600185604051610c1591906117f3565b908152604051602091819003820190208054600180820183555f928352929091200180546001600160a01b0319166001600160a01b03939093169290921790915501610ba1565b50505050565b610c6a61123b565b5f600183604051610c7b91906117f3565b9081526040519081900360200190205411610ca85760405162461bcd60e51b81526004016102d090611849565b6064600183604051610cba91906117f3565b90815260405190819003602001902054610cd590600161192c565b1115610d195760405162461bcd60e51b815260206004820152601360248201527213585e0818da1d5b9adcc8195e18d959591959606a1b60448201526064016102d0565b6001600160a01b038116610d615760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103837b4b73a32b960891b60448201526064016102d0565b600182604051610d7191906117f3565b9081526040516020918190038201902080546001810182555f9182529190200180546001600160a01b0319166001600160a01b039290921691909117905550565b610dba61123b565b5f600182604051610dcb91906117f3565b9081526040519081900360200190205411610df85760405162461bcd60e51b81526004016102d090611849565b600181604051610e0891906117f3565b90815260200160405180910390205f610e219190611343565b50565b610e2c61123b565b5f600183604051610e3d91906117f3565b9081526040519081900360200190205411610e6a5760405162461bcd60e51b81526004016102d090611849565b600182604051610e7a91906117f3565b908152604051908190036020019020548110610ea85760405162461bcd60e51b81526004016102d0906117fe565b600182604051610eb891906117f3565b90815260200160405180910390208181548110610ed757610ed7611835565b5f91825260209091200180546001600160a01b03191690555050565b81516020818401810180516001825292820191850191909120919052805482908110610f1d575f80fd5b5f918252602090912001546001600160a01b03169150829050565b60605f600183604051610f4b91906117f3565b9081526040805191829003602090810183208054808302850183019093528284529190830182828015610fa557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610f87575b5050505050905080515f03610fc957505060408051602081019091525f8152919050565b60605f5b8251811015611056575f6001600160a01b0316838281518110610ff257610ff2611835565b60200260200101516001600160a01b03161461104e578161102b84838151811061101e5761101e611835565b602002602001015161120f565b60405160200161103c92919061194b565b60405160208183030381529060405291505b600101610fcd565b509392505050565b61106661123b565b6001600160a01b03811661108f57604051631e4fbdf760e01b81525f60048201526024016102d0565b610e21816112a8565b6110a061123b565b5f6001846040516110b191906117f3565b90815260405190819003602001902054116110de5760405162461bcd60e51b81526004016102d090611849565b6064828290506001856040516110f491906117f3565b9081526040519081900360200190205461110e919061192c565b11156111525760405162461bcd60e51b815260206004820152601360248201527213585e0818da1d5b9adcc8195e18d959591959606a1b60448201526064016102d0565b5f5b81811015610c5c575f83838381811061116f5761116f611835565b90506020028101906111819190611871565b9050116111a05760405162461bcd60e51b81526004016102d090611907565b5f6111b684848481811061066157610661611835565b90506001856040516111c891906117f3565b908152604051602091819003820190208054600180820183555f928352929091200180546001600160a01b0319166001600160a01b03939093169290921790915501611154565b60405164ffffffffff5f19833b0116602181015f601f8401853c80825260408201810160405250919050565b5f546001600160a01b03163314610a575760405163118cdaa760e01b81523360048201526024016102d0565b5f81518060401b6bfe61000180600a3d393df3000161fffe8211840152600b8101601584015ff09150816112a25763301164255f526004601cfd5b90915290565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255905f5260205f20908101928215611333575f5260205f209182015b82811115611333578254825591600101919060010190611318565b5061133f92915061135a565b5090565b5080545f8255905f5260205f2090810190610e2191905b5b8082111561133f575f815560010161135b565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112611391575f5ffd5b81356001600160401b038111156113aa576113aa61136e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156113d8576113d861136e565b6040528181528382016020018510156113ef575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f6040838503121561141c575f5ffd5b82356001600160401b03811115611431575f5ffd5b61143d85828601611382565b95602094909401359450505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215611492575f5ffd5b82356001600160401b038111156114a7575f5ffd5b6114b385828601611382565b92505060208301356001600160401b038111156114ce575f5ffd5b6114da85828601611382565b9150509250929050565b5f5f83601f8401126114f4575f5ffd5b5081356001600160401b0381111561150a575f5ffd5b6020830191508360208260051b8501011115611524575f5ffd5b9250929050565b5f5f5f5f6040858703121561153e575f5ffd5b84356001600160401b03811115611553575f5ffd5b61155f878288016114e4565b90955093505060208501356001600160401b0381111561157d575f5ffd5b611589878288016114e4565b95989497509550505050565b80356001600160a01b03811681146115ab575f5ffd5b919050565b5f5f5f606084860312156115c2575f5ffd5b83356001600160401b038111156115d7575f5ffd5b6115e386828701611382565b935050602084013591506115f960408501611595565b90509250925092565b5f5f60208385031215611613575f5ffd5b82356001600160401b03811115611628575f5ffd5b611634858286016114e4565b90969095509350505050565b5f5f5f5f60608587031215611653575f5ffd5b84356001600160401b03811115611668575f5ffd5b61167487828801611382565b9450506020850135925060408501356001600160401b03811115611696575f5ffd5b8501601f810187136116a6575f5ffd5b80356001600160401b038111156116bb575f5ffd5b8760208284010111156116cc575f5ffd5b949793965060200194505050565b5f5f5f604084860312156116ec575f5ffd5b83356001600160401b03811115611701575f5ffd5b61170d86828701611382565b93505060208401356001600160401b03811115611728575f5ffd5b611734868287016114e4565b9497909650939450505050565b5f5f60408385031215611752575f5ffd5b82356001600160401b03811115611767575f5ffd5b61177385828601611382565b92505061178260208401611595565b90509250929050565b5f6020828403121561179b575f5ffd5b81356001600160401b038111156117b0575f5ffd5b61036584828501611382565b5f602082840312156117cc575f5ffd5b6117d582611595565b9392505050565b5f81518060208401855e5f93019283525090919050565b5f6117d582846117dc565b60208082526019908201527f4368756e6b20696e646578206f7574206f6620626f756e647300000000000000604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b6020808252600e908201526d119a5b19481b9bdd08199bdd5b9960921b604082015260600190565b5f5f8335601e19843603018112611886575f5ffd5b8301803591506001600160401b0382111561189f575f5ffd5b602001915036819003821315611524575f5ffd5b5f5f8335601e198436030181126118c8575f5ffd5b8301803591506001600160401b038211156118e1575f5ffd5b6020019150600581901b3603821315611524575f5ffd5b818382375f9101908152919050565b6020808252600b908201526a456d707479206368756e6b60a81b604082015260600190565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b5f61195f61195983866117dc565b846117dc565b94935050505056fea2646970667358221220d5af3e101fe34144edff97e55231ca35cb90ccdc36e1c8bc6d66a705d14397ce64736f6c634300081b0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 36 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.