xDAI Price: $1.00 (-0.00%)
Gas: 1 GWei

Contract

0x694e62BDF7Ff510A4EE66662cf4866A961a31653

Overview

xDAI Balance

Gnosis Chain LogoGnosis Chain LogoGnosis Chain Logo0 xDAI

xDAI Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
HashCheckpoint

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 750 runs

Other Settings:
default evmVersion
File 1 of 1 : HashCheckpoint.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

/// @title Hash Checkpoint - Smart contract for checkpointing IPFS hashes on-chain
/// @author Aleksandr Kuperman - <[email protected]>
contract HashCheckpoint {
    error OwnerOnly(address sender, address owner);
    error ZeroAddress();
    error ZeroValue();
    event OwnerUpdated(address indexed owner);
    event ManagerUpdated(address indexed manager);
    event BaseURIChanged(string baseURI);
    event HashUpdated(address indexed emitter, bytes32 hash);

    // Owner address
    address public owner;
    // Base URI
    string public baseURI;
    // To better understand the CID anatomy, please refer to: https://proto.school/anatomy-of-a-cid/05
    // CID = <multibase_encoding>multibase_encoding(<cid-version><multicodec><multihash-algorithm><multihash-length><multihash-hash>)
    // CID prefix = <multibase_encoding>multibase_encoding(<cid-version><multicodec><multihash-algorithm><multihash-length>)
    // to complement the multibase_encoding(<multihash-hash>)
    // multibase_encoding = base16 = "f"
    // cid-version = version 1 = "0x01"
    // multicodec = dag-pb = "0x70"
    // multihash-algorithm = sha2-256 = "0x12"
    // multihash-length = 256 bits = "0x20"
    string public constant CID_PREFIX = "f01701220";
    // Map of address => latest IPFS hash
    mapping (address => bytes32) public latestHashes;

    /// @dev Hash checkpoint constructor.
    /// @param _baseURI Hash registry base URI.
    constructor(string memory _baseURI) {
        baseURI = _baseURI;
        owner = msg.sender;
    }

    /// @dev Changes the owner address.
    /// @param newOwner Address of a new owner.
    function changeOwner(address newOwner) external virtual {
        // Check for the ownership
        if (msg.sender != owner) {
            revert OwnerOnly(msg.sender, owner);
        }

        // Check for the zero address
        if (newOwner == address(0)) {
            revert ZeroAddress();
        }

        owner = newOwner;
        emit OwnerUpdated(newOwner);
    }
    
    /// @dev Sets unit base URI.
    /// @param bURI Base URI string.
    function setBaseURI(string memory bURI) external virtual {
        // Check for the ownership
        if (msg.sender != owner) {
            revert OwnerOnly(msg.sender, owner);
        }

        // Check for the zero value
        if (bytes(bURI).length == 0) {
            revert ZeroValue();
        }

        baseURI = bURI;
        emit BaseURIChanged(bURI);
    }

    /// @dev Emits a hash
    /// @param hash The hash to be emitted.
    function checkpoint(bytes32 hash) external virtual {
        latestHashes[msg.sender] = hash;
        emit HashUpdated(msg.sender, hash);
    }

    // Open sourced from: https://stackoverflow.com/questions/67893318/solidity-how-to-represent-bytes32-as-string
    /// @dev Converts bytes16 input data to hex16.
    /// @notice This method converts bytes into the same bytes-character hex16 representation.
    /// @param data bytes16 input data.
    /// @return result hex16 conversion from the input bytes16 data.
    function _toHex16(bytes16 data) internal pure returns (bytes32 result) {
        result = bytes32 (data) & 0xFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 |
        (bytes32 (data) & 0x0000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000) >> 64;
        result = result & 0xFFFFFFFF000000000000000000000000FFFFFFFF000000000000000000000000 |
        (result & 0x00000000FFFFFFFF000000000000000000000000FFFFFFFF0000000000000000) >> 32;
        result = result & 0xFFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 |
        (result & 0x0000FFFF000000000000FFFF000000000000FFFF000000000000FFFF00000000) >> 16;
        result = result & 0xFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000 |
        (result & 0x00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000) >> 8;
        result = (result & 0xF000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000) >> 4 |
        (result & 0x0F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F00) >> 8;
        result = bytes32 (0x3030303030303030303030303030303030303030303030303030303030303030 +
        uint256 (result) +
            (uint256 (result) + 0x0606060606060606060606060606060606060606060606060606060606060606 >> 4 &
            0x0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F) * 39);
    }

    /// @dev Latest hash
    /// @notice Expected multicodec: dag-pb; hashing function: sha2-256, with base16 encoding and leading CID_PREFIX removed.
    /// @param _address The address that provided the hash.
    /// @return Latest hash string.
    function latestHash(address _address) public view virtual returns (string memory) {
        bytes32 latest_hash = latestHashes[_address];
        // Parse 2 parts of bytes32 into left and right hex16 representation, and concatenate into string
        // adding the base URI and a cid prefix for the full base16 multibase prefix IPFS hash representation
        return string(abi.encodePacked(CID_PREFIX, _toHex16(bytes16(latest_hash)),
            _toHex16(bytes16(latest_hash << 128))));
    }

    /// @dev Latest hash URI
    /// @notice Expected multicodec: dag-pb; hashing function: sha2-256, with base16 encoding and leading CID_PREFIX removed.
    /// @param _address The address that provided the hash.
    /// @return Latest hash URI string.
    function latestHashURI(address _address) public view virtual returns (string memory) {
        bytes32 latest_hash = latestHashes[_address];
        // Parse 2 parts of bytes32 into left and right hex16 representation, and concatenate into string
        // adding the base URI and a cid prefix for the full base16 multibase prefix IPFS hash representation
        return string(abi.encodePacked(baseURI, CID_PREFIX, _toHex16(bytes16(latest_hash)),
            _toHex16(bytes16(latest_hash << 128))));
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"OwnerOnly","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroValue","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"emitter","type":"address"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"HashUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"ManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"inputs":[],"name":"CID_PREFIX","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"latestHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"latestHashURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestHashes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"bURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162000d6d38038062000d6d833981016040819052620000349162000072565b6001620000428282620001d6565b5050600080546001600160a01b03191633179055620002a2565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156200008657600080fd5b82516001600160401b03808211156200009e57600080fd5b818501915085601f830112620000b357600080fd5b815181811115620000c857620000c86200005c565b604051601f8201601f19908116603f01168101908382118183101715620000f357620000f36200005c565b8160405282815288868487010111156200010c57600080fd5b600093505b8284101562000130578484018601518185018701529285019262000111565b600086848301015280965050505050505092915050565b600181811c908216806200015c57607f821691505b6020821081036200017d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001d157600081815260208120601f850160051c81016020861015620001ac5750805b601f850160051c820191505b81811015620001cd57828155600101620001b8565b5050505b505050565b81516001600160401b03811115620001f257620001f26200005c565b6200020a8162000203845462000147565b8462000183565b602080601f831160018114620002425760008415620002295750858301515b600019600386901b1c1916600185901b178555620001cd565b600085815260208120601f198616915b82811015620002735788860151825594840194600190910190840162000252565b5085821015620002925787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610abb80620002b26000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c80637c5e63e011610076578063a6f9dae11161005b578063a6f9dae11461016b578063a9eb79511461017e578063ba20b5bd1461019157600080fd5b80637c5e63e0146101185780638da5cb5b1461014057600080fd5b806355f804b3146100a85780635b34eba0146100bd578063654ac6ca146100d05780636c0360eb14610103575b600080fd5b6100bb6100b63660046106f2565b6101a4565b005b6100bb6100cb3660046107a3565b610252565b6100f06100de3660046107bc565b60026020526000908152604090205481565b6040519081526020015b60405180910390f35b61010b6102a1565b6040516100fa9190610810565b61010b6040518060400160405280600981526020016806630313730313232360bc1b81525081565b600054610153906001600160a01b031681565b6040516001600160a01b0390911681526020016100fa565b6100bb6101793660046107bc565b61032f565b61010b61018c3660046107bc565b6103f6565b61010b61019f3660046107bc565b610486565b6000546001600160a01b031633146101e95760005460405163521eb56d60e11b81523360048201526001600160a01b0390911660248201526044015b60405180910390fd5b805160000361020b57604051637c946ed760e01b815260040160405180910390fd5b600161021782826108cc565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6816040516102479190610810565b60405180910390a150565b3360008181526002602052604090819020839055517fe0580e65e31c995b4cd3d5c8a911e89d31ef328be761a1ca2f35b795d00a152c906102969084815260200190565b60405180910390a250565b600180546102ae90610843565b80601f01602080910402602001604051908101604052809291908181526020018280546102da90610843565b80156103275780601f106102fc57610100808354040283529160200191610327565b820191906000526020600020905b81548152906001019060200180831161030a57829003601f168201915b505050505081565b6000546001600160a01b0316331461036f5760005460405163521eb56d60e11b81523360048201526001600160a01b0390911660248201526044016101e0565b6001600160a01b0381166103965760405163d92e233d60e01b815260040160405180910390fd5b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b6060600060026000846001600160a01b03166001600160a01b0316815260200190815260200160002054905060016040518060400160405280600981526020016806630313730313232360bc1b81525061044f836104ee565b61045c608085901b6104ee565b60405160200161046f949392919061098c565b604051602081830303815290604052915050919050565b6001600160a01b038116600090815260026020908152604091829020548251808401909352600983526806630313730313232360bc1b918301919091526060916104cf826104ee565b6104dc608084901b6104ee565b60405160200161046f93929190610a1e565b7aff00000000000000ff00000000000000ff00000000000000ff00006bffffffff0000000000000000604083901c9081167bffffffff00000000000000000000000000000000000000000000000084161760201c6fffffffff000000000000000000000000919091167fffffffff0000000000000000000000000000000000000000000000000000000084161717601081901c9182167eff00000000000000ff00000000000000ff00000000000000ff000000000000821617600890811c7bff00000000000000ff00000000000000ff00000000000000ff000000939093167fff00000000000000ff00000000000000ff00000000000000ff000000000000009290921691909117919091179081901c7e0f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f167f0f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f00600492831c161790610672827f0606060606060606060606060606060606060606060606060606060606060606610a5b565b901c7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f1660276106a29190610a6e565b6106cc827f3030303030303030303030303030303030303030303030303030303030303030610a5b565b6106d69190610a5b565b92915050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561070457600080fd5b813567ffffffffffffffff8082111561071c57600080fd5b818401915084601f83011261073057600080fd5b813581811115610742576107426106dc565b604051601f8201601f19908116603f0116810190838211818310171561076a5761076a6106dc565b8160405282815287602084870101111561078357600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000602082840312156107b557600080fd5b5035919050565b6000602082840312156107ce57600080fd5b81356001600160a01b03811681146107e557600080fd5b9392505050565b60005b838110156108075781810151838201526020016107ef565b50506000910152565b602081526000825180602084015261082f8160408501602087016107ec565b601f01601f19169190910160400192915050565b600181811c9082168061085757607f821691505b60208210810361087757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156108c757600081815260208120601f850160051c810160208610156108a45750805b601f850160051c820191505b818110156108c3578281556001016108b0565b5050505b505050565b815167ffffffffffffffff8111156108e6576108e66106dc565b6108fa816108f48454610843565b8461087d565b602080601f83116001811461092f57600084156109175750858301515b600019600386901b1c1916600185901b1785556108c3565b600085815260208120601f198616915b8281101561095e5788860151825594840194600190910190840161093f565b508582101561097c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080865461099a81610843565b600182811680156109b257600181146109c7576109f6565b60ff19841687528215158302870194506109f6565b8a60005260208060002060005b858110156109ed5781548a8201529084019082016109d4565b50505082870194505b505050508551610a0a818360208a016107ec565b019384525050602082015260400192915050565b60008451610a308184602089016107ec565b91909101928352506020820152604001919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106d6576106d6610a45565b80820281158282048414176106d6576106d6610a4556fea2646970667358221220139ade09b76b26b910b9d6c1e914cd0bce392032c7b3c8bc73e5f80de104f77664736f6c634300081500330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f676174657761792e6175746f6e6f6c61732e746563682f697066732f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100a35760003560e01c80637c5e63e011610076578063a6f9dae11161005b578063a6f9dae11461016b578063a9eb79511461017e578063ba20b5bd1461019157600080fd5b80637c5e63e0146101185780638da5cb5b1461014057600080fd5b806355f804b3146100a85780635b34eba0146100bd578063654ac6ca146100d05780636c0360eb14610103575b600080fd5b6100bb6100b63660046106f2565b6101a4565b005b6100bb6100cb3660046107a3565b610252565b6100f06100de3660046107bc565b60026020526000908152604090205481565b6040519081526020015b60405180910390f35b61010b6102a1565b6040516100fa9190610810565b61010b6040518060400160405280600981526020016806630313730313232360bc1b81525081565b600054610153906001600160a01b031681565b6040516001600160a01b0390911681526020016100fa565b6100bb6101793660046107bc565b61032f565b61010b61018c3660046107bc565b6103f6565b61010b61019f3660046107bc565b610486565b6000546001600160a01b031633146101e95760005460405163521eb56d60e11b81523360048201526001600160a01b0390911660248201526044015b60405180910390fd5b805160000361020b57604051637c946ed760e01b815260040160405180910390fd5b600161021782826108cc565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6816040516102479190610810565b60405180910390a150565b3360008181526002602052604090819020839055517fe0580e65e31c995b4cd3d5c8a911e89d31ef328be761a1ca2f35b795d00a152c906102969084815260200190565b60405180910390a250565b600180546102ae90610843565b80601f01602080910402602001604051908101604052809291908181526020018280546102da90610843565b80156103275780601f106102fc57610100808354040283529160200191610327565b820191906000526020600020905b81548152906001019060200180831161030a57829003601f168201915b505050505081565b6000546001600160a01b0316331461036f5760005460405163521eb56d60e11b81523360048201526001600160a01b0390911660248201526044016101e0565b6001600160a01b0381166103965760405163d92e233d60e01b815260040160405180910390fd5b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b6060600060026000846001600160a01b03166001600160a01b0316815260200190815260200160002054905060016040518060400160405280600981526020016806630313730313232360bc1b81525061044f836104ee565b61045c608085901b6104ee565b60405160200161046f949392919061098c565b604051602081830303815290604052915050919050565b6001600160a01b038116600090815260026020908152604091829020548251808401909352600983526806630313730313232360bc1b918301919091526060916104cf826104ee565b6104dc608084901b6104ee565b60405160200161046f93929190610a1e565b7aff00000000000000ff00000000000000ff00000000000000ff00006bffffffff0000000000000000604083901c9081167bffffffff00000000000000000000000000000000000000000000000084161760201c6fffffffff000000000000000000000000919091167fffffffff0000000000000000000000000000000000000000000000000000000084161717601081901c9182167eff00000000000000ff00000000000000ff00000000000000ff000000000000821617600890811c7bff00000000000000ff00000000000000ff00000000000000ff000000939093167fff00000000000000ff00000000000000ff00000000000000ff000000000000009290921691909117919091179081901c7e0f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f167f0f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f00600492831c161790610672827f0606060606060606060606060606060606060606060606060606060606060606610a5b565b901c7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f1660276106a29190610a6e565b6106cc827f3030303030303030303030303030303030303030303030303030303030303030610a5b565b6106d69190610a5b565b92915050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561070457600080fd5b813567ffffffffffffffff8082111561071c57600080fd5b818401915084601f83011261073057600080fd5b813581811115610742576107426106dc565b604051601f8201601f19908116603f0116810190838211818310171561076a5761076a6106dc565b8160405282815287602084870101111561078357600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000602082840312156107b557600080fd5b5035919050565b6000602082840312156107ce57600080fd5b81356001600160a01b03811681146107e557600080fd5b9392505050565b60005b838110156108075781810151838201526020016107ef565b50506000910152565b602081526000825180602084015261082f8160408501602087016107ec565b601f01601f19169190910160400192915050565b600181811c9082168061085757607f821691505b60208210810361087757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156108c757600081815260208120601f850160051c810160208610156108a45750805b601f850160051c820191505b818110156108c3578281556001016108b0565b5050505b505050565b815167ffffffffffffffff8111156108e6576108e66106dc565b6108fa816108f48454610843565b8461087d565b602080601f83116001811461092f57600084156109175750858301515b600019600386901b1c1916600185901b1785556108c3565b600085815260208120601f198616915b8281101561095e5788860151825594840194600190910190840161093f565b508582101561097c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080865461099a81610843565b600182811680156109b257600181146109c7576109f6565b60ff19841687528215158302870194506109f6565b8a60005260208060002060005b858110156109ed5781548a8201529084019082016109d4565b50505082870194505b505050508551610a0a818360208a016107ec565b019384525050602082015260400192915050565b60008451610a308184602089016107ec565b91909101928352506020820152604001919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106d6576106d6610a45565b80820281158282048414176106d6576106d6610a4556fea2646970667358221220139ade09b76b26b910b9d6c1e914cd0bce392032c7b3c8bc73e5f80de104f77664736f6c63430008150033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f676174657761792e6175746f6e6f6c61732e746563682f697066732f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): https://gateway.autonolas.tech/ipfs/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [2] : 68747470733a2f2f676174657761792e6175746f6e6f6c61732e746563682f69
Arg [3] : 7066732f00000000000000000000000000000000000000000000000000000000


Block Transaction Gas Used Reward
view all blocks validated

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits

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.