APE Price: $0.15 (-8.04%)

Contract

0x5Dd31d29A378b1808173c0089f735963B15240C8

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo0 APE

APE Value

$0.00

More Info

Private Name Tags

Multichain Info

N/A
Transaction Hash
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
257183092025-10-29 19:10:4493 days ago1761765044  Contract Creation0 APE

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PublisherRegistry

Compiler Version
v0.8.27+commit.40a35a09

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "./lib/SharedStorage.sol";
import "./lib/ConfigHelper.sol";

/**
 * @title PublisherRegistry
 * @notice Owner-only, schema-less publisher registry where all values are strings.
 * @dev Publishers can be registered by an authorized signer (from Config contract).
 *      Fields are stored as key-value pairs with string values.
 *      Authorization is controlled via ConfigHelper.getPublisherRegistrySigner().
 */
contract PublisherRegistry {
    error InvalidSigner();
    error AlreadyRegistered();
    error NotRegistered();
    error PublisherNotActive();

    // ========== Events ==========
    event PublisherRegistered(address indexed publisher);
    event PublisherDeactivated(address indexed publisher);
    event FieldUpdated(address indexed publisher, string key, string value);
    event FieldRemoved(address indexed publisher, string key);

    // ========== Structs ==========
    struct Publisher {
        address publisher;
        bool active;
        bytes32[] keys; // enumerable keys
        mapping(bytes32 => string) values; // key => string value
        mapping(bytes32 => bool) hasKey; // presence tracker
        mapping(bytes32 => uint256) keyIndex; // keyHash => index in keys array (for O(1) removal)
        mapping(bytes32 => string) keyHashToKey; // keyHash => key (for enumeration)
    }

    struct Field {
        string key;
        string value;
    }

    struct PublisherDTO {
        address publisher;
        bool active;
        Field[] fields;
    }

    // ========== Storage ==========
    mapping(address => Publisher) private _pub;
    address[] private _publisherList;

    constructor(address configAddress) {
        SharedStorage.setConfigAddress(configAddress);
    }

    // ========== Registration ==========
    /**
     * @notice Register a new publisher address
     * @dev Can register any address, not just msg.sender. Only authorized signer can call.
     * @param publisher The address to register as a publisher
     */
    function registerPublisher(address publisher) external {
        _requireAuth();

        Publisher storage P = _pub[publisher];
        if (P.publisher != address(0)) revert AlreadyRegistered();

        P.publisher = publisher;
        P.active = true;
        _publisherList.push(publisher);

        emit PublisherRegistered(publisher);
    }

    /**
     * @notice Deactivate a publisher (keeps data but marks as inactive)
     * @dev Deactivation is preferred over deletion to preserve historical data
     * @param publisher The publisher address to deactivate
     */
    function deactivatePublisher(address publisher) external {
        _requireAuth();

        Publisher storage P = _pub[publisher];
        if (P.publisher == address(0)) revert NotRegistered();

        P.active = false;

        emit PublisherDeactivated(publisher);
    }

    // ========== Field Management ==========
    /**
     * @notice Set a field value for a publisher
     * @dev All values are stored as strings. Creates field if it doesn't exist.
     * @param publisher The publisher address
     * @param key The field key
     * @param value The field value (string)
     */
    function setField(
        address publisher,
        string calldata key,
        string calldata value
    ) external {
        _requireAuth();

        bytes32 keyHash = keccak256(bytes(key));
        Publisher storage P = _pub[publisher];
        if (P.publisher == address(0)) revert NotRegistered();

        if (!P.hasKey[keyHash]) {
            P.hasKey[keyHash] = true;
            P.keyIndex[keyHash] = P.keys.length;
            P.keys.push(keyHash);
            P.keyHashToKey[keyHash] = key;
        }
        P.values[keyHash] = value;

        emit FieldUpdated(publisher, key, value);
    }

    /**
     * @notice Batch update multiple fields for a publisher
     * @dev More gas efficient than calling setField multiple times
     * @param publisher The publisher address
     * @param fields Array of Field structs with keys and values
     */
    function setFields(address publisher, Field[] calldata fields) external {
        _requireAuth();

        Publisher storage P = _pub[publisher];
        if (P.publisher == address(0)) revert NotRegistered();

        for (uint256 i = 0; i < fields.length; i++) {
            bytes32 keyHash = keccak256(bytes(fields[i].key));

            if (!P.hasKey[keyHash]) {
                P.hasKey[keyHash] = true;
                P.keyIndex[keyHash] = P.keys.length;
                P.keys.push(keyHash);
                P.keyHashToKey[keyHash] = fields[i].key;
            }
            P.values[keyHash] = fields[i].value;

            emit FieldUpdated(publisher, fields[i].key, fields[i].value);
        }
    }

    /**
     * @notice Remove a field from a publisher
     * @dev Uses O(1) removal via keyIndex mapping. Emits event even if field doesn't exist.
     * @param publisher The publisher address
     * @param key The field key to remove
     */
    function removeField(address publisher, string calldata key) external {
        _requireAuth();

        Publisher storage P = _pub[publisher];
        if (P.publisher == address(0)) revert NotRegistered();

        bytes32 keyHash = keccak256(bytes(key));
        if (!P.hasKey[keyHash]) return;

        // O(1) removal using keyIndex
        uint256 index = P.keyIndex[keyHash];
        uint256 lastIndex = P.keys.length - 1;

        if (index != lastIndex) {
            // Move last element to the deleted position
            bytes32 lastKeyHash = P.keys[lastIndex];
            P.keys[index] = lastKeyHash;
            P.keyIndex[lastKeyHash] = index;
        }

        P.keys.pop();
        delete P.values[keyHash];
        delete P.hasKey[keyHash];
        delete P.keyIndex[keyHash];
        delete P.keyHashToKey[keyHash];

        emit FieldRemoved(publisher, key);
    }

    // ========== View Functions ==========

    /**
     * @notice Check if an address is registered as a publisher
     * @param publisher The address to check
     * @return True if registered (even if inactive)
     */
    function isRegistered(address publisher) external view returns (bool) {
        return _pub[publisher].publisher != address(0);
    }

    /**
     * @notice Check if a publisher is active
     * @param publisher The address to check
     * @return True if registered and active
     */
    function isActive(address publisher) external view returns (bool) {
        return _pub[publisher].active;
    }

    /**
     * @notice Get a specific field value for a publisher
     * @param publisher The publisher address
     * @param key The field key
     * @return The field value (empty string if not found)
     */
    function getField(
        address publisher,
        string calldata key
    ) external view returns (string memory) {
        Publisher storage P = _pub[publisher];
        if (P.publisher == address(0)) revert NotRegistered();

        bytes32 keyHash = keccak256(bytes(key));
        return P.values[keyHash];
    }

    /**
     * @notice Check if a publisher has a specific field
     * @param publisher The publisher address
     * @param key The field key
     * @return True if the field exists
     */
    function hasField(
        address publisher,
        string calldata key
    ) external view returns (bool) {
        Publisher storage P = _pub[publisher];
        if (P.publisher == address(0)) return false;

        bytes32 keyHash = keccak256(bytes(key));
        return P.hasKey[keyHash];
    }

    /**
     * @notice Get the number of fields for a publisher
     * @param publisher The publisher address
     * @return The count of fields
     */
    function getFieldCount(address publisher) external view returns (uint256) {
        Publisher storage P = _pub[publisher];
        if (P.publisher == address(0)) revert NotRegistered();

        return P.keys.length;
    }

    /**
     * @notice Get all data for a publisher
     * @dev Returns all fields as a DTO. May be gas-intensive for publishers with many fields.
     * @param publisher The publisher address
     * @return dto The publisher data transfer object
     */
    function getPublisher(
        address publisher
    ) public view returns (PublisherDTO memory dto) {
        Publisher storage P = _pub[publisher];
        if (P.publisher == address(0)) revert NotRegistered();

        uint256 len = P.keys.length;
        Field[] memory fields = new Field[](len);
        for (uint256 i = 0; i < len; i++) {
            bytes32 k = P.keys[i];
            fields[i] = Field({key: P.keyHashToKey[k], value: P.values[k]});
        }

        dto = PublisherDTO({
            publisher: publisher,
            active: P.active,
            fields: fields
        });
    }

    /**
     * @notice Get the total number of registered publishers
     * @return The count of all registered publishers
     */
    function getPublisherCount() external view returns (uint256) {
        return _publisherList.length;
    }

    /**
     * @notice Get all publisher addresses
     * @dev More gas efficient than getAllPublishers if you only need addresses
     * @return Array of all registered publisher addresses
     */
    function getPublisherAddresses() external view returns (address[] memory) {
        return _publisherList;
    }

    /**
     * @notice Get all publishers with pagination
     * @dev Use this instead of getAllPublishers to avoid gas issues with large datasets.
     *      WARNING: Can still be expensive depending on field counts per publisher.
     * @param offset Starting index
     * @param limit Maximum number of publishers to return
     * @return list Array of publisher DTOs
     */
    function getPublishers(
        uint256 offset,
        uint256 limit
    ) external view returns (PublisherDTO[] memory list) {
        uint256 total = _publisherList.length;

        if (offset >= total) {
            return new PublisherDTO[](0);
        }

        uint256 end = offset + limit;
        if (end > total) {
            end = total;
        }

        uint256 resultLength = end - offset;
        list = new PublisherDTO[](resultLength);

        for (uint256 i = 0; i < resultLength; i++) {
            list[i] = getPublisher(_publisherList[offset + i]);
        }
    }

    /**
     * @notice Get all publishers (legacy, not recommended for large datasets)
     * @dev WARNING: This can run out of gas with many publishers. Use getPublishers() with pagination instead.
     * @return list Array of all publisher DTOs
     */
    function getAllPublishers()
        external
        view
        returns (PublisherDTO[] memory list)
    {
        uint256 count = _publisherList.length;
        list = new PublisherDTO[](count);
        for (uint256 i = 0; i < count; i++) {
            list[i] = getPublisher(_publisherList[i]);
        }
    }

    // ========== Internal Functions ==========

    /**
     * @dev Verify that msg.sender is the authorized signer from Config
     * @dev Reverts if no signer is configured or if caller is not the authorized signer
     */
    function _requireAuth() internal view {
        address authorizedSigner = ConfigHelper.getPublisherRegistrySigner();
        if (authorizedSigner == address(0)) revert InvalidSigner();
        if (msg.sender != authorizedSigner) revert InvalidSigner();
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IConfig {
    // String storage (for URLs, metadata, etc.)
    function setString(string memory key, string memory value) external;
    function getString(string memory key) external view returns (string memory);

    // Address storage (for contracts, wallets, etc.)
    function setAddress(string memory key, address value) external;
    function getAddress(string memory key) external view returns (address);

    // Uint storage (for numbers, fees, etc.)
    function setUint(string memory key, uint256 value) external;
    function getUint(string memory key) external view returns (uint256);

    // Bytes storage (for arbitrary data)
    function setBytes(string memory key, bytes memory value) external;
    function getBytes(string memory key) external view returns (bytes memory);

    // Deletion
    function deleteString(string memory key) external;
    function deleteAddress(string memory key) external;
    function deleteUint(string memory key) external;
    function deleteBytes(string memory key) external;
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "../interfaces/IConfig.sol";
import "./SharedStorage.sol";

/**
 * @title ConfigHelper
 * @dev Provides convenient, type-safe access to commonly used configuration values.
 * This library reduces code duplication and provides a single source of truth for config keys.
 */
library ConfigHelper {
    // === Authentication Keys ===

    /**
     * @dev Gets the authentication key for the Clone Factory
     * @return The address authorized to sign Clone Factory operations
     */
    function getFactorySigner() internal view returns (address) {
        return SharedStorage.getConfig().getAddress("CLONE_FACTORY_AUTH_KEY");
    }

    /**
     * @dev Gets the authentication key for Royalties Splitter
     * @return The address authorized to sign royalty operations
     */
    function getRoyaltiesSigner() internal view returns (address) {
        return
            SharedStorage.getConfig().getAddress("ROYALTIES_SPLITTER_AUTH_KEY");
    }

    /**
     * @dev Gets the authentication key for Season Collection
     * @return The address authorized to sign season operations
     */
    function getSeasonCollectionSigner() internal view returns (address) {
        return
            SharedStorage.getConfig().getAddress("SEASON_COLLECTION_AUTH_KEY");
    }

    /**
     * @dev Gets the authentication key for Publisher Registry
     * @return The address authorized to sign publisher operations
     */
    function getPublisherRegistrySigner() internal view returns (address) {
        return
            SharedStorage.getConfig().getAddress("PUBLISHER_REGISTRY_AUTH_KEY");
    }

    /**
     * @dev Gets the authentication key for Signature Auth
     * @return The address authorized to sign authentication operations
     */
    function getSignatureAuthKey() internal view returns (address) {
        return SharedStorage.getConfig().getAddress("SIGNATURE_AUTH_AUTH_KEY");
    }

    /**
     * @dev Gets the metadata manager address
     * @return The address authorized to manage metadata URIs
     */
    function getMetadataManager() internal view returns (address) {
        return SharedStorage.getConfig().getAddress("METADATA_MANAGER");
    }

    // === URI Configuration ===

    /**
     * @dev Gets the base URI for token metadata
     * @return The base URI string (can be any length)
     */
    function getBaseURI() internal view returns (string memory) {
        return SharedStorage.getConfig().getString("BASE_URI");
    }

    /**
     * @dev Gets the URI suffix for token metadata
     * @return The URI suffix (e.g., ".json")
     */
    function getURISuffix() internal view returns (string memory) {
        return SharedStorage.getConfig().getString("URI_SUFFIX");
    }

    /**
     * @dev Gets the base URI for contract metadata
     * @return The base contract URI string
     */
    function getBaseContractURI() internal view returns (string memory) {
        return SharedStorage.getConfig().getString("BASE_CONTRACT_URI");
    }

    /**
     * @dev Gets the contract URI suffix
     * @return The contract URI suffix
     */
    function getContractURISuffix() internal view returns (string memory) {
        return SharedStorage.getConfig().getString("CONTRACT_URI_SUFFIX");
    }

    // === Payment Configuration ===

    /**
     * @dev Gets the service fee receiver address
     * @return The address that receives service fees
     */
    function getServiceFeeReceiver() internal view returns (address) {
        return
            SharedStorage.getConfig().getAddress(
                "PAYMENT_PROCESSOR_SERVICE_FEE_RECEIVER"
            );
    }

    /**
     * @dev Gets the USD price signer address
     * @return The address authorized to sign USD price data
     */
    function getUsdPriceSigner() internal view returns (address) {
        return
            SharedStorage.getConfig().getAddress(
                "PAYMENT_PROCESSOR_USD_PRICE_SIGNER"
            );
    }


    // === Royalty Configuration ===

    /**
     * @dev Gets the platform receiver address for royalties
     * @return The address that receives platform royalties
     */
    function getPlatformReceiver() internal view returns (address) {
        return
            SharedStorage.getConfig().getAddress(
                "ROYALTIES_SPLITTER_PLATFORM_RECEIVER"
            );
    }

    /**
     * @dev Gets the royalty fee in basis points
     * @return The royalty fee (e.g., 500 = 5%)
     */
    function getRoyaltyFeeBPS() internal view returns (uint256) {
        return SharedStorage.getConfig().getUint("ROYALTY_FEE_BPS");
    }

    // === Registry Configuration ===

    /**
     * @dev Gets the Publisher Registry contract address
     * @return The address of the Publisher Registry contract
     */
    function getPublisherRegistry() internal view returns (address) {
        return
            SharedStorage.getConfig().getAddress("PUBLISHER_REGISTRY_ADDRESS");
    }

    // === Helper Functions with Validation ===

    /**
     * @dev Gets an address from config with validation
     * @param key The config key
     * @return The address value
     */
    function getAddressOrRevert(
        string memory key
    ) internal view returns (address) {
        address value = SharedStorage.getConfig().getAddress(key);
        require(
            value != address(0),
            string.concat("Config: ", key, " not set")
        );
        return value;
    }

    /**
     * @dev Gets a string from config with validation
     * @param key The config key
     * @return The string value
     */
    function getStringOrRevert(
        string memory key
    ) internal view returns (string memory) {
        string memory value = SharedStorage.getConfig().getString(key);
        require(
            bytes(value).length > 0,
            string.concat("Config: ", key, " not set")
        );
        return value;
    }

    /**
     * @dev Gets a uint from config with validation
     * @param key The config key
     * @return The uint value
     */
    function getUintOrRevert(
        string memory key
    ) internal view returns (uint256) {
        uint256 value = SharedStorage.getConfig().getUint(key);
        require(value > 0, string.concat("Config: ", key, " not set"));
        return value;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "../interfaces/IConfig.sol";

/**
 * @title SharedStorage
 * @dev Inspired by Diamond Proxy pattern (EIP-2535), this library provides a shared storage structure
 * that can be accessed by all extension contracts. This avoids storing duplicate data across extensions
 * and provides a centralized location for common state variables.
 *
 * The storage uses a fixed slot (using assembly) to ensure it doesn't collide with other contract storage.
 * This pattern is gas-efficient and allows for flexible extension of shared data.
 */
library SharedStorage {
    // Storage slot for the shared storage (uses a hash to ensure unique position)
    // keccak256("deck0.storage.main") - 1
    bytes32 constant SHARED_STORAGE_POSITION =
        bytes32(uint256(keccak256("deck0.storage.main")) - 1);

    /**
     * @dev Main storage structure - add any shared data here
     * This struct can be extended to include any data that needs to be shared across extensions
     */
    struct Storage {
        // Config-related storage
        address configAddress;
        IConfig config;
        // Publisher-related storage
        address publisherAddress;
    }

    error InvalidConfigAddress();
    error ContractPaused();

    /**
     * @dev Returns the storage struct from the designated slot
     * Uses inline assembly to point to a specific storage slot
     */
    function getStorage() internal pure returns (Storage storage s) {
        bytes32 position = SHARED_STORAGE_POSITION;
        assembly {
            s.slot := position
        }
    }

    // === Config Management ===
    /**
     * @dev Sets the config address in shared storage
     */
    function setConfigAddress(address _configAddress) internal {
        if (_configAddress == address(0)) revert InvalidConfigAddress();
        Storage storage s = getStorage();
        s.configAddress = _configAddress;
        s.config = IConfig(_configAddress);
    }

    /**
     * @dev Gets the config address from shared storage
     */
    function getConfigAddress() internal view returns (address) {
        return getStorage().configAddress;
    }

    /**
     * @dev Gets the config interface from shared storage
     */
    function getConfig() internal view returns (IConfig) {
        return getStorage().config;
    }

    // === Publisher Management ===
    /**
     * @dev Sets the publisher address in shared storage
     */
    function setPublisherAddress(address _publisherAddress) internal {
        Storage storage s = getStorage();
        s.publisherAddress = _publisherAddress;
    }

    /**
     * @dev Gets the publisher address from shared storage
     */
    function getPublisherAddress() internal view returns (address) {
        return getStorage().publisherAddress;
    }

    /**
     * @dev Direct storage access for advanced use cases
     * Extensions can directly access storage using: SharedStorage.getStorage().yourField
     *
     * Example usage in an extension contract:
     * ```solidity
     * function setCustomValue(uint256 value) internal {
     *     SharedStorage.getStorage().globalNonce = value;
     * }
     *
     * function getCustomValue() internal view returns (uint256) {
     *     return SharedStorage.getStorage().globalNonce;
     * }
     * ```
     */
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "viaIR": true,
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"configAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyRegistered","type":"error"},{"inputs":[],"name":"InvalidConfigAddress","type":"error"},{"inputs":[],"name":"InvalidSigner","type":"error"},{"inputs":[],"name":"NotRegistered","type":"error"},{"inputs":[],"name":"PublisherNotActive","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"publisher","type":"address"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"FieldRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"publisher","type":"address"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"FieldUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"publisher","type":"address"}],"name":"PublisherDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"publisher","type":"address"}],"name":"PublisherRegistered","type":"event"},{"inputs":[{"internalType":"address","name":"publisher","type":"address"}],"name":"deactivatePublisher","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllPublishers","outputs":[{"components":[{"internalType":"address","name":"publisher","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct PublisherRegistry.Field[]","name":"fields","type":"tuple[]"}],"internalType":"struct PublisherRegistry.PublisherDTO[]","name":"list","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"publisher","type":"address"},{"internalType":"string","name":"key","type":"string"}],"name":"getField","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"publisher","type":"address"}],"name":"getFieldCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"publisher","type":"address"}],"name":"getPublisher","outputs":[{"components":[{"internalType":"address","name":"publisher","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct PublisherRegistry.Field[]","name":"fields","type":"tuple[]"}],"internalType":"struct PublisherRegistry.PublisherDTO","name":"dto","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublisherAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublisherCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"getPublishers","outputs":[{"components":[{"internalType":"address","name":"publisher","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct PublisherRegistry.Field[]","name":"fields","type":"tuple[]"}],"internalType":"struct PublisherRegistry.PublisherDTO[]","name":"list","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"publisher","type":"address"},{"internalType":"string","name":"key","type":"string"}],"name":"hasField","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"publisher","type":"address"}],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"publisher","type":"address"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"publisher","type":"address"}],"name":"registerPublisher","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"publisher","type":"address"},{"internalType":"string","name":"key","type":"string"}],"name":"removeField","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"publisher","type":"address"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setField","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"publisher","type":"address"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"internalType":"struct PublisherRegistry.Field[]","name":"fields","type":"tuple[]"}],"name":"setFields","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60803460d157601f61184338819003918201601f19168301916001600160401b0383118484101760d65780849260209460405283398101031260d157516001600160a01b0381169081900360d157801560c0577f9ac23eeb38cf6db2ee40e9cddb6cd5f309ef725f9da0ecdf19facb84c33be3ee80546001600160a01b031990811683179091557f9ac23eeb38cf6db2ee40e9cddb6cd5f309ef725f9da0ecdf19facb84c33be3ef8054909116909117905560405161175690816100ed8239f35b636a485a5b60e11b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c80633336acd314610bce57806336d0cf4214610bb057806336d673db14610b3d5780634c96f28114610ac95780635a1c02bd14610ab05780636f1d5fb714610a615780638b043e0814610a295780639655d5071461095d5780639e8dfa751461093a5780639f8a13d7146108f8578063a8bc04c414610557578063b6a562af146101c4578063c3c5a54714610180578063f8b13c121461014e5763fd9935e8146100c157600080fd5b34610149576020366003190112610149576100da610c9b565b6100e261161a565b60018060a01b03168060005260006020526040600020805460018060a01b038116156101385760ff60a01b191690557f5de512bf6b0ed0936054bc1177e637d0db80896822e565a02c0a8b8917c1bd5d600080a2005b63aba4733960e01b60005260046000fd5b600080fd5b346101495760403660031901126101495761017c61017060243560043561155b565b60405191829182610e04565b0390f35b34610149576020366003190112610149576001600160a01b036101a1610c9b565b166000526000602052602060018060a01b03604060002054161515604051908152f35b34610149576060366003190112610149576101dd610c9b565b6024356001600160401b038111610149576101fc903690600401610cb1565b906044356001600160401b0381116101495761021c903690600401610cb1565b92909161022761161a565b610232368383610f04565b602081519101209460018060a01b031692836000526000602052604060002060018060a01b03815416156101385760038101876000528060205260ff6040600020541615610405575b5060029192939495966000520160205260406000206001600160401b0386116103ef576102a88154610f4a565b601f81116103b2575b506000601f871160011461032857918691610309837f8ccb911afac7fb0437e4780bbfe3c13c37ffd30fa7b393d9ce4afe8893d1739598996103189660009161031d575b508160011b916000199060031b1c19161790565b90555b60405194859485611524565b0390a2005b90508401358b6102f5565b8181526020812090601f198816815b81811061039a5750918893917f8ccb911afac7fb0437e4780bbfe3c13c37ffd30fa7b393d9ce4afe8893d173959899610318969410610380575b5050600183811b01905561030c565b830135600019600386901b60f8161c191690558880610371565b91926020600181928689013581550194019201610337565b6103df90826000526020600020601f890160051c81019160208a106103e5575b601f0160051c01906110c4565b866102b1565b90915081906103d2565b634e487b7160e01b600052604160045260246000fd5b876000526020526040600020600160ff1982541617905561043c8760018301805482600052600485016020526040600020556114fe565b86600052600581016020526040600020966001600160401b0385116103ef576104658854610f4a565b601f8111610525575b50600097601f86116001146104be576104a586806002969798999a9b6000916104b357508160011b916000199060031b1c19161790565b90555b96959493929161027b565b90508801358c6102f5565b80895260208920601f19871699805b8b811061050d5750876002969798999a9b106104f3575b5050600187811b0190556104a8565b87013560001960038a901b60f8161c1916905589806104e4565b9091602060018192858b0135815501930191016104cd565b61055190896000526020600020601f880160051c810191602089106103e557601f0160051c01906110c4565b8861046e565b3461014957604036600319011261014957610570610c9b565b6024356001600160401b0381116101495736602382011215610149578060040135916001600160401b038311610149576024820191602436918560051b010111610149576105bc61161a565b6001600160a01b0390811660008181526020819052604090208054909491921615610138576003840193926002840160005b8381106105f757005b61061561060e6106088387876114aa565b806114cc565b3691610f04565b60208151910120806000528760205260ff60406000205416156107b2575b61064b6106418387876114aa565b60208101906114cc565b9091600052836020526040600020916001600160401b0382116103ef576106728354610f4a565b601f8111610780575b50600090601f83116001146107185791806106b292600196959460009261070d575b50508160011b916000199060031b1c19161790565b90555b857f8ccb911afac7fb0437e4780bbfe3c13c37ffd30fa7b393d9ce4afe8893d173956106e56106088489896114aa565b906107046106f7610641878c8c6114aa565b9060405194859485611524565b0390a2016105ee565b013590508c8061069d565b8382526020822091601f198416815b81811061076857509160019695949291838895931061074e575b505050811b0190556106b5565b0135600019600384901b60f8161c191690558b8080610741565b91936020600181928787013581550195019201610727565b6107ac90846000526020600020601f850160051c810191602086106103e557601f0160051c01906110c4565b8a61067b565b80600052876020526040600020600160ff198254161790556107ea816001890180548260005260048b016020526040600020556114fe565b6107f86106088387876114aa565b82600052600589016020526040600020916001600160401b0382116103ef576108218354610f4a565b601f81116108c6575b50600090601f83116001146108625761085b92916000918361070d5750508160011b916000199060031b1c19161790565b9055610633565b8382526020822091601f198416815b8181106108ae5750908460019594939210610894575b505050811b019055610633565b0135600019600384901b60f8161c191690558b8080610887565b91936020600181928787013581550195019201610871565b6108f290846000526020600020601f850160051c810191602086106103e557601f0160051c01906110c4565b8b61082a565b34610149576020366003190112610149576001600160a01b03610919610c9b565b166000526000602052602060ff60406000205460a01c166040519015158152f35b3461014957602061095361094d36610cde565b91611453565b6040519015158152f35b34610149576000366003190112610149576040518060206001549283815201809260016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69060005b818110610a0a57505050816109be910382610ee3565b6040519182916020830190602084525180915260408301919060005b8181106109e8575050500390f35b82516001600160a01b03168452859450602093840193909201916001016109da565b82546001600160a01b03168452602090930192600192830192016109a8565b346101495760203660031901126101495761017c610a4d610a48610c9b565b611313565b604051918291602083526020830190610d62565b34610149576020366003190112610149576001600160a01b03610a82610c9b565b16600090815260208190526040902080546001600160a01b0316156101385760016020910154604051908152f35b3461014957610ac7610ac136610cde565b9161114b565b005b3461014957600036600319011261014957600154610ae681611060565b9060005b818110610aff576040518061017c8582610e04565b80610b21610b0e600193610e64565b848060a01b0391549060031b1c16611313565b610b2b82866110b0565b52610b3681856110b0565b5001610aea565b3461014957610b4b36610cde565b6001600160a01b039283166000908152602081905260409020805492939092161561013857600292610b7e913691610f04565b602081519101206000520160205261017c610b9c6040600020610f84565b604051918291602083526020830190610d21565b34610149576000366003190112610149576020600154604051908152f35b3461014957602036600319011261014957610be7610c9b565b610bef61161a565b60018060a01b03168060005260006020526040600020805460018060a01b038116610c8a576001600160a81b0319168217600160a01b179055600154600160401b8110156103ef57806001610c479201600155610e64565b81546001600160a01b0360039290921b91821b19169083901b1790557f0872a00e2e723113f8d7a5be0f126918ee1e51d7416f8f1400c5ad86cbc927e3600080a2005b630ea075bf60e21b60005260046000fd5b600435906001600160a01b038216820361014957565b9181601f84011215610149578235916001600160401b038311610149576020838186019501011161014957565b906040600319830112610149576004356001600160a01b03811681036101495791602435906001600160401b03821161014957610d1d91600401610cb1565b9091565b919082519283825260005b848110610d4d575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201610d2c565b906040606082019260018060a01b0381511683526020810151151560208401520151916060604083015282518091526080820191602060808360051b8301019401926000915b838310610db757505050505090565b9091929394602080610df5600193607f1986820301875289519083610de58351604084526040840190610d21565b9201519084818403910152610d21565b97019301930191939290610da8565b602081016020825282518091526040820191602060408360051b8301019401926000915b838310610e3757505050505090565b9091929394602080610e55600193603f198682030187528951610d62565b97019301930191939290610e28565b600154811015610e7f57600160005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b8054821015610e7f5760005260206000200190600090565b606081019081106001600160401b038211176103ef57604052565b604081019081106001600160401b038211176103ef57604052565b90601f801991011681019081106001600160401b038211176103ef57604052565b9291926001600160401b0382116103ef5760405191610f2d601f8201601f191660200184610ee3565b829481845281830111610149578281602093846000960137010152565b90600182811c92168015610f7a575b6020831014610f6457565b634e487b7160e01b600052602260045260246000fd5b91607f1691610f59565b9060405191826000825492610f9884610f4a565b80845293600181169081156110065750600114610fbf575b50610fbd92500383610ee3565b565b90506000929192526020600020906000915b818310610fea575050906020610fbd9282010138610fb0565b6020919350806001915483858901015201910190918492610fd1565b905060209250610fbd94915060ff191682840152151560051b82010138610fb0565b6001600160401b0381116103ef5760051b60200190565b6040519061104c82610ead565b606060408360008152600060208201520152565b9061106a82611028565b6110776040519182610ee3565b8281528092611088601f1991611028565b019060005b82811061109957505050565b6020906110a461103f565b8282850101520161108d565b8051821015610e7f5760209160051b010190565b8181106110cf575050565b600081556001016110c4565b6110e58154610f4a565b90816110ef575050565b81601f60009311600114611101575055565b8183526020832061111d91601f0160051c8101906001016110c4565b8082528160208120915555565b908060209392818452848401376000828201840152601f01601f1916010190565b91909161115661161a565b60018060a01b03169182600052600060205260406000209160018060a01b038354161561013857611188368284610f04565b60208151910120926003810190846000528160205260ff604060002054161561130b5760048101948060005285602052604060002054956001830196875460001981019081116112f5578082036112a9575b50508654938415611293577f52be0080538728c40a78850591fb3d49dfa47180ae34c4752a65108088c227a79760059560001901906112198282610e95565b8154906000199060031b1b1916905555826000526002840160205261124160406000206110db565b82600052602052604060002060ff19815416905581600052602052600060408120556000520160205261127760406000206110db565b61128e60405192839260208452602084019161112a565b0390a2565b634e487b7160e01b600052603160045260246000fd5b6112b39089610e95565b90549060031b1c806112df6112c8848c610e95565b819391549060031b91821b91600019901b19161790565b90556000528160205260406000205538806111da565b634e487b7160e01b600052601160045260246000fd5b505050505050565b61131b61103f565b5060018060a01b03168060005260006020526040600020805460018060a01b0381161561013857600182019182549061135382611028565b936113616040519586610ee3565b828552601f1961137084611028565b0160005b81811061142857505060058201916002019060005b8481106113ba57505050505060ff90604051936113a585610ead565b845260a01c1615156020830152604082015290565b806113c760019284610e95565b90549060031b1c8060005285602052604060002090600052846020526114076040600020611400604051936113fb85610ec8565b610f84565b8352610f84565b6020820152611416828a6110b0565b5261142181896110b0565b5001611389565b60209060409593955161143a81610ec8565b6060815260608382015282828a01015201939193611374565b6001600160a01b039081166000908152602081905260409020805492939092909116156114a257600392611488913691610f04565b602081519101206000520160205260ff6040600020541690565b505050600090565b9190811015610e7f5760051b81013590603e1981360301821215610149570190565b903590601e198136030182121561014957018035906001600160401b0382116101495760200191813603831361014957565b805490600160401b8210156103ef57816112c891600161152094018155610e95565b9055565b929061153d9061154b959360408652604086019161112a565b92602081850391015261112a565b90565b919082018092116112f557565b919060015490818410156115dc57611573908461154e565b908082116115d4575b508281039081116112f55761159081611060565b9260005b8281106115a057505050565b806115b8610b0e6115b36001948661154e565b610e64565b6115c282886110b0565b526115cd81876110b0565b5001611594565b90503861157c565b505060405190915060006115f1602083610ee3565b81526000805b81811061160357505090565b60209061160e61103f565b828286010152016115f7565b7f9ac23eeb38cf6db2ee40e9cddb6cd5f309ef725f9da0ecdf19facb84c33be3ef5460405163bf40fac160e01b8152602060048201819052601b60248301527f5055424c49534845525f52454749535452595f415554485f4b4559000000000060448301529091829060649082906001600160a01b03165afa908115611714576000916116cb575b506001600160a01b031680156116ba5733036116ba57565b632057875960e21b60005260046000fd5b6020813d60201161170c575b816116e460209383610ee3565b810103126117085751906001600160a01b03821682036117055750386116a2565b80fd5b5080fd5b3d91506116d7565b6040513d6000823e3d90fdfea26469706673582212206652e2a656df6401707fd52a6ac2b431d301f64fc5e51b17cabf7b0e09db980664736f6c634300081b00330000000000000000000000001e03a4748fbb0c3937a54fc466f815da66d74ae6

Deployed Bytecode

0x6080604052600436101561001257600080fd5b60003560e01c80633336acd314610bce57806336d0cf4214610bb057806336d673db14610b3d5780634c96f28114610ac95780635a1c02bd14610ab05780636f1d5fb714610a615780638b043e0814610a295780639655d5071461095d5780639e8dfa751461093a5780639f8a13d7146108f8578063a8bc04c414610557578063b6a562af146101c4578063c3c5a54714610180578063f8b13c121461014e5763fd9935e8146100c157600080fd5b34610149576020366003190112610149576100da610c9b565b6100e261161a565b60018060a01b03168060005260006020526040600020805460018060a01b038116156101385760ff60a01b191690557f5de512bf6b0ed0936054bc1177e637d0db80896822e565a02c0a8b8917c1bd5d600080a2005b63aba4733960e01b60005260046000fd5b600080fd5b346101495760403660031901126101495761017c61017060243560043561155b565b60405191829182610e04565b0390f35b34610149576020366003190112610149576001600160a01b036101a1610c9b565b166000526000602052602060018060a01b03604060002054161515604051908152f35b34610149576060366003190112610149576101dd610c9b565b6024356001600160401b038111610149576101fc903690600401610cb1565b906044356001600160401b0381116101495761021c903690600401610cb1565b92909161022761161a565b610232368383610f04565b602081519101209460018060a01b031692836000526000602052604060002060018060a01b03815416156101385760038101876000528060205260ff6040600020541615610405575b5060029192939495966000520160205260406000206001600160401b0386116103ef576102a88154610f4a565b601f81116103b2575b506000601f871160011461032857918691610309837f8ccb911afac7fb0437e4780bbfe3c13c37ffd30fa7b393d9ce4afe8893d1739598996103189660009161031d575b508160011b916000199060031b1c19161790565b90555b60405194859485611524565b0390a2005b90508401358b6102f5565b8181526020812090601f198816815b81811061039a5750918893917f8ccb911afac7fb0437e4780bbfe3c13c37ffd30fa7b393d9ce4afe8893d173959899610318969410610380575b5050600183811b01905561030c565b830135600019600386901b60f8161c191690558880610371565b91926020600181928689013581550194019201610337565b6103df90826000526020600020601f890160051c81019160208a106103e5575b601f0160051c01906110c4565b866102b1565b90915081906103d2565b634e487b7160e01b600052604160045260246000fd5b876000526020526040600020600160ff1982541617905561043c8760018301805482600052600485016020526040600020556114fe565b86600052600581016020526040600020966001600160401b0385116103ef576104658854610f4a565b601f8111610525575b50600097601f86116001146104be576104a586806002969798999a9b6000916104b357508160011b916000199060031b1c19161790565b90555b96959493929161027b565b90508801358c6102f5565b80895260208920601f19871699805b8b811061050d5750876002969798999a9b106104f3575b5050600187811b0190556104a8565b87013560001960038a901b60f8161c1916905589806104e4565b9091602060018192858b0135815501930191016104cd565b61055190896000526020600020601f880160051c810191602089106103e557601f0160051c01906110c4565b8861046e565b3461014957604036600319011261014957610570610c9b565b6024356001600160401b0381116101495736602382011215610149578060040135916001600160401b038311610149576024820191602436918560051b010111610149576105bc61161a565b6001600160a01b0390811660008181526020819052604090208054909491921615610138576003840193926002840160005b8381106105f757005b61061561060e6106088387876114aa565b806114cc565b3691610f04565b60208151910120806000528760205260ff60406000205416156107b2575b61064b6106418387876114aa565b60208101906114cc565b9091600052836020526040600020916001600160401b0382116103ef576106728354610f4a565b601f8111610780575b50600090601f83116001146107185791806106b292600196959460009261070d575b50508160011b916000199060031b1c19161790565b90555b857f8ccb911afac7fb0437e4780bbfe3c13c37ffd30fa7b393d9ce4afe8893d173956106e56106088489896114aa565b906107046106f7610641878c8c6114aa565b9060405194859485611524565b0390a2016105ee565b013590508c8061069d565b8382526020822091601f198416815b81811061076857509160019695949291838895931061074e575b505050811b0190556106b5565b0135600019600384901b60f8161c191690558b8080610741565b91936020600181928787013581550195019201610727565b6107ac90846000526020600020601f850160051c810191602086106103e557601f0160051c01906110c4565b8a61067b565b80600052876020526040600020600160ff198254161790556107ea816001890180548260005260048b016020526040600020556114fe565b6107f86106088387876114aa565b82600052600589016020526040600020916001600160401b0382116103ef576108218354610f4a565b601f81116108c6575b50600090601f83116001146108625761085b92916000918361070d5750508160011b916000199060031b1c19161790565b9055610633565b8382526020822091601f198416815b8181106108ae5750908460019594939210610894575b505050811b019055610633565b0135600019600384901b60f8161c191690558b8080610887565b91936020600181928787013581550195019201610871565b6108f290846000526020600020601f850160051c810191602086106103e557601f0160051c01906110c4565b8b61082a565b34610149576020366003190112610149576001600160a01b03610919610c9b565b166000526000602052602060ff60406000205460a01c166040519015158152f35b3461014957602061095361094d36610cde565b91611453565b6040519015158152f35b34610149576000366003190112610149576040518060206001549283815201809260016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69060005b818110610a0a57505050816109be910382610ee3565b6040519182916020830190602084525180915260408301919060005b8181106109e8575050500390f35b82516001600160a01b03168452859450602093840193909201916001016109da565b82546001600160a01b03168452602090930192600192830192016109a8565b346101495760203660031901126101495761017c610a4d610a48610c9b565b611313565b604051918291602083526020830190610d62565b34610149576020366003190112610149576001600160a01b03610a82610c9b565b16600090815260208190526040902080546001600160a01b0316156101385760016020910154604051908152f35b3461014957610ac7610ac136610cde565b9161114b565b005b3461014957600036600319011261014957600154610ae681611060565b9060005b818110610aff576040518061017c8582610e04565b80610b21610b0e600193610e64565b848060a01b0391549060031b1c16611313565b610b2b82866110b0565b52610b3681856110b0565b5001610aea565b3461014957610b4b36610cde565b6001600160a01b039283166000908152602081905260409020805492939092161561013857600292610b7e913691610f04565b602081519101206000520160205261017c610b9c6040600020610f84565b604051918291602083526020830190610d21565b34610149576000366003190112610149576020600154604051908152f35b3461014957602036600319011261014957610be7610c9b565b610bef61161a565b60018060a01b03168060005260006020526040600020805460018060a01b038116610c8a576001600160a81b0319168217600160a01b179055600154600160401b8110156103ef57806001610c479201600155610e64565b81546001600160a01b0360039290921b91821b19169083901b1790557f0872a00e2e723113f8d7a5be0f126918ee1e51d7416f8f1400c5ad86cbc927e3600080a2005b630ea075bf60e21b60005260046000fd5b600435906001600160a01b038216820361014957565b9181601f84011215610149578235916001600160401b038311610149576020838186019501011161014957565b906040600319830112610149576004356001600160a01b03811681036101495791602435906001600160401b03821161014957610d1d91600401610cb1565b9091565b919082519283825260005b848110610d4d575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201610d2c565b906040606082019260018060a01b0381511683526020810151151560208401520151916060604083015282518091526080820191602060808360051b8301019401926000915b838310610db757505050505090565b9091929394602080610df5600193607f1986820301875289519083610de58351604084526040840190610d21565b9201519084818403910152610d21565b97019301930191939290610da8565b602081016020825282518091526040820191602060408360051b8301019401926000915b838310610e3757505050505090565b9091929394602080610e55600193603f198682030187528951610d62565b97019301930191939290610e28565b600154811015610e7f57600160005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b8054821015610e7f5760005260206000200190600090565b606081019081106001600160401b038211176103ef57604052565b604081019081106001600160401b038211176103ef57604052565b90601f801991011681019081106001600160401b038211176103ef57604052565b9291926001600160401b0382116103ef5760405191610f2d601f8201601f191660200184610ee3565b829481845281830111610149578281602093846000960137010152565b90600182811c92168015610f7a575b6020831014610f6457565b634e487b7160e01b600052602260045260246000fd5b91607f1691610f59565b9060405191826000825492610f9884610f4a565b80845293600181169081156110065750600114610fbf575b50610fbd92500383610ee3565b565b90506000929192526020600020906000915b818310610fea575050906020610fbd9282010138610fb0565b6020919350806001915483858901015201910190918492610fd1565b905060209250610fbd94915060ff191682840152151560051b82010138610fb0565b6001600160401b0381116103ef5760051b60200190565b6040519061104c82610ead565b606060408360008152600060208201520152565b9061106a82611028565b6110776040519182610ee3565b8281528092611088601f1991611028565b019060005b82811061109957505050565b6020906110a461103f565b8282850101520161108d565b8051821015610e7f5760209160051b010190565b8181106110cf575050565b600081556001016110c4565b6110e58154610f4a565b90816110ef575050565b81601f60009311600114611101575055565b8183526020832061111d91601f0160051c8101906001016110c4565b8082528160208120915555565b908060209392818452848401376000828201840152601f01601f1916010190565b91909161115661161a565b60018060a01b03169182600052600060205260406000209160018060a01b038354161561013857611188368284610f04565b60208151910120926003810190846000528160205260ff604060002054161561130b5760048101948060005285602052604060002054956001830196875460001981019081116112f5578082036112a9575b50508654938415611293577f52be0080538728c40a78850591fb3d49dfa47180ae34c4752a65108088c227a79760059560001901906112198282610e95565b8154906000199060031b1b1916905555826000526002840160205261124160406000206110db565b82600052602052604060002060ff19815416905581600052602052600060408120556000520160205261127760406000206110db565b61128e60405192839260208452602084019161112a565b0390a2565b634e487b7160e01b600052603160045260246000fd5b6112b39089610e95565b90549060031b1c806112df6112c8848c610e95565b819391549060031b91821b91600019901b19161790565b90556000528160205260406000205538806111da565b634e487b7160e01b600052601160045260246000fd5b505050505050565b61131b61103f565b5060018060a01b03168060005260006020526040600020805460018060a01b0381161561013857600182019182549061135382611028565b936113616040519586610ee3565b828552601f1961137084611028565b0160005b81811061142857505060058201916002019060005b8481106113ba57505050505060ff90604051936113a585610ead565b845260a01c1615156020830152604082015290565b806113c760019284610e95565b90549060031b1c8060005285602052604060002090600052846020526114076040600020611400604051936113fb85610ec8565b610f84565b8352610f84565b6020820152611416828a6110b0565b5261142181896110b0565b5001611389565b60209060409593955161143a81610ec8565b6060815260608382015282828a01015201939193611374565b6001600160a01b039081166000908152602081905260409020805492939092909116156114a257600392611488913691610f04565b602081519101206000520160205260ff6040600020541690565b505050600090565b9190811015610e7f5760051b81013590603e1981360301821215610149570190565b903590601e198136030182121561014957018035906001600160401b0382116101495760200191813603831361014957565b805490600160401b8210156103ef57816112c891600161152094018155610e95565b9055565b929061153d9061154b959360408652604086019161112a565b92602081850391015261112a565b90565b919082018092116112f557565b919060015490818410156115dc57611573908461154e565b908082116115d4575b508281039081116112f55761159081611060565b9260005b8281106115a057505050565b806115b8610b0e6115b36001948661154e565b610e64565b6115c282886110b0565b526115cd81876110b0565b5001611594565b90503861157c565b505060405190915060006115f1602083610ee3565b81526000805b81811061160357505090565b60209061160e61103f565b828286010152016115f7565b7f9ac23eeb38cf6db2ee40e9cddb6cd5f309ef725f9da0ecdf19facb84c33be3ef5460405163bf40fac160e01b8152602060048201819052601b60248301527f5055424c49534845525f52454749535452595f415554485f4b4559000000000060448301529091829060649082906001600160a01b03165afa908115611714576000916116cb575b506001600160a01b031680156116ba5733036116ba57565b632057875960e21b60005260046000fd5b6020813d60201161170c575b816116e460209383610ee3565b810103126117085751906001600160a01b03821682036117055750386116a2565b80fd5b5080fd5b3d91506116d7565b6040513d6000823e3d90fdfea26469706673582212206652e2a656df6401707fd52a6ac2b431d301f64fc5e51b17cabf7b0e09db980664736f6c634300081b0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000001e03a4748fbb0c3937a54fc466f815da66d74ae6

-----Decoded View---------------
Arg [0] : configAddress (address): 0x1e03A4748FBB0c3937a54FC466F815da66D74aE6

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001e03a4748fbb0c3937a54fc466f815da66d74ae6


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
0x5Dd31d29A378b1808173c0089f735963B15240C8
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.