Overview
xDAI Balance
xDAI Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Loading...
Loading
Contract Name:
HashCheckpoint
Compiler Version
v0.8.21+commit.d9974bed
Optimization Enabled:
Yes with 750 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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)))); } }
{ "optimizer": { "enabled": true, "runs": 750 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
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.