ETH Price: $3,318.03 (+0.03%)

Contract

0x6D7e57A214945A1be3Edf4fb3493c52aFaeed6eD
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set URL200258692024-06-05 13:16:47230 days ago1717593407IN
0x6D7e57A2...aFaeed6eD
0 ETH0.0017351127.51877762

Advanced mode:
Parent Transaction Hash Block
From
To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OffchainResolver

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 2 : OffChainResolver.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "solady/utils/ECDSA.sol";

interface IResolverService {
    function resolve(
        bytes calldata name, 
        bytes calldata data
    ) external view returns(
        bytes memory result, 
        uint64 expires, 
        bytes memory sig
    );
}
interface IExtendedResolver {
    function resolve(
        bytes memory name, 
        bytes memory data
    ) external view returns(
        bytes memory
    );
}


/// A modified/permissioned ENS resolver that directs all queries to a CCIP read gateway.
/// Callers must implement EIP 3668 and ENSIP 10.
contract OffchainResolver {
    string public url;
    mapping(address=>bool) public signers;

    event NewSigners(address[] signers);
    error OffchainLookup(
        address sender, 
        string[] urls, 
        bytes callData, 
        bytes4 callbackFunction, 
        bytes extraData
    );

    /// Constructor sets the URL and signers.
    /// @param _url The URL of the CCIP read gateway.
    /// @param _signers The addresses of the signers.
    constructor(string memory _url, address[] memory _signers) {
        url = _url;
        for(uint i = 0; i < _signers.length; i++) {
            signers[_signers[i]] = true;
        }
        emit NewSigners(_signers);
    }

    /// Resolves a name, as specified by ENSIP 10.
    /// @param name The DNS-encoded name to resolve.
    /// @param data The ABI encoded data for the underlying resolution function (Eg, addr(bytes32), text(bytes32,string), etc).
    /// @return The return data, ABI encoded identically to the underlying function.
    function resolve(
        bytes calldata name, 
        bytes calldata data
    ) external view returns(
        bytes memory
    ) {
        bytes memory callData = abi.encodeWithSelector(IResolverService.resolve.selector, name, data);
        string[] memory urls = new string[](1);
        urls[0] = url;
        revert OffchainLookup(
            address(this),
            urls,
            callData,
            OffchainResolver.resolveWithProof.selector,
            abi.encode(callData, address(this))
        );
    }

    /// Callback used by CCIP read compatible clients to verify and parse the response.
    /// @param response The response from the CCIP read gateway.
    /// @param extraData The original call data.
    /// @return The result of the original call.
    function resolveWithProof(
        bytes calldata response, 
        bytes calldata extraData
    ) external view returns(bytes memory) {
        (address signer, bytes memory result) = _verify(extraData, response);
        require(
            signers[signer],
            "SignatureVerifier: Invalid sigature");
        return result;
    }

    /// Sets the URL of the CCIP read gateway.
    /// @param _url The new URL.
    function setURL(string calldata _url) external {
        require(signers[msg.sender], "Not a signer");
        url = _url;
    }

    /// Sets multiple signers.
    /// @param _signers The new signers.
    function setSigners(address[] calldata _signers) external {
        require(signers[msg.sender], "Not a signer");
        for(uint i = 0; i < _signers.length; i++) {
            signers[_signers[i]] = true;
        }
        emit NewSigners(_signers);
    }

    /// Sets permissions for a single signer.
    /// @param signer The new signers.
    function setSigner(address signer, bool permission) external {
        require(signers[msg.sender], "Not a signer");
        signers[signer] = permission;
    }

    /// Makes a signature hash.
    /// @param target The target address.
    /// @param expires The expiration time.
    /// @param request The request data.
    /// @param result The result data.
    function _makeSignatureHash(
        address target, 
        uint64 expires, 
        bytes memory request, 
        bytes memory result
    ) internal pure returns(
        bytes32 signatureHash
    ) {
        signatureHash = keccak256(
            abi.encodePacked(
                hex"1900", 
                target, 
                expires, 
                keccak256(request), 
                keccak256(result)
            )
        );
    }

    /// Verifies a signature.
    /// @param request The request data.
    /// @param response The response data.
    /// @return The signer and result.
    function _verify(
        bytes calldata request, 
        bytes calldata response
    ) internal view returns(
        address, 
        bytes memory
    ) {
        (bytes memory result, uint64 expires, bytes memory sig) = abi.decode(response, (bytes, uint64, bytes));
        (bytes memory extraData, address sender) = abi.decode(request, (bytes, address));
        address signer = ECDSA.recover(_makeSignatureHash(sender, expires, extraData, result), sig);
        require(
            expires >= block.timestamp,
            "SignatureVerifier: Signature expired");
        return (signer, result);
    }

    /// Checks if the contract supports the interface.
    /// @param interfaceID The interface ID.
    function supportsInterface(bytes4 interfaceID) public pure returns(bool) {
        return interfaceID == type(IExtendedResolver).interfaceId;
    }

}

File 2 of 2 : ECDSA.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Gas optimized ECDSA wrapper.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ECDSA.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ECDSA.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/ECDSA.sol)
///
/// @dev Note:
/// - The recovery functions use the ecrecover precompile (0x1).
/// - As of Solady version 0.0.68, the `recover` variants will revert upon recovery failure.
///   This is for more safety by default.
///   Use the `tryRecover` variants if you need to get the zero address back
///   upon recovery failure instead.
/// - As of Solady version 0.0.134, all `bytes signature` variants accept both
///   regular 65-byte `(r, s, v)` and EIP-2098 `(r, vs)` short form signatures.
///   See: https://eips.ethereum.org/EIPS/eip-2098
///   This is for calldata efficiency on smart accounts prevalent on L2s.
///
/// WARNING! Do NOT use signatures as unique identifiers:
/// - Use a nonce in the digest to prevent replay attacks on the same contract.
/// - Use EIP-712 for the digest to prevent replay attacks across different chains and contracts.
///   EIP-712 also enables readable signing of typed data for better user safety.
/// This implementation does NOT check if a signature is non-malleable.
library ECDSA {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                        CUSTOM ERRORS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The signature is invalid.
    error InvalidSignature();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                    RECOVERY OPERATIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Recovers the signer's address from a message digest `hash`, and the `signature`.
    function recover(bytes32 hash, bytes memory signature) internal view returns (address result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := 1
            let m := mload(0x40) // Cache the free memory pointer.
            for {} 1 {} {
                mstore(0x00, hash)
                mstore(0x40, mload(add(signature, 0x20))) // `r`.
                if eq(mload(signature), 64) {
                    let vs := mload(add(signature, 0x40))
                    mstore(0x20, add(shr(255, vs), 27)) // `v`.
                    mstore(0x60, shr(1, shl(1, vs))) // `s`.
                    break
                }
                if eq(mload(signature), 65) {
                    mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.
                    mstore(0x60, mload(add(signature, 0x40))) // `s`.
                    break
                }
                result := 0
                break
            }
            result :=
                mload(
                    staticcall(
                        gas(), // Amount of gas left for the transaction.
                        result, // Address of `ecrecover`.
                        0x00, // Start of input.
                        0x80, // Size of input.
                        0x01, // Start of output.
                        0x20 // Size of output.
                    )
                )
            // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.
            if iszero(returndatasize()) {
                mstore(0x00, 0x8baa579f) // `InvalidSignature()`.
                revert(0x1c, 0x04)
            }
            mstore(0x60, 0) // Restore the zero slot.
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Recovers the signer's address from a message digest `hash`, and the `signature`.
    function recoverCalldata(bytes32 hash, bytes calldata signature)
        internal
        view
        returns (address result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            result := 1
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x00, hash)
            for {} 1 {} {
                if eq(signature.length, 64) {
                    let vs := calldataload(add(signature.offset, 0x20))
                    mstore(0x20, add(shr(255, vs), 27)) // `v`.
                    mstore(0x40, calldataload(signature.offset)) // `r`.
                    mstore(0x60, shr(1, shl(1, vs))) // `s`.
                    break
                }
                if eq(signature.length, 65) {
                    mstore(0x20, byte(0, calldataload(add(signature.offset, 0x40)))) // `v`.
                    calldatacopy(0x40, signature.offset, 0x40) // Copy `r` and `s`.
                    break
                }
                result := 0
                break
            }
            result :=
                mload(
                    staticcall(
                        gas(), // Amount of gas left for the transaction.
                        result, // Address of `ecrecover`.
                        0x00, // Start of input.
                        0x80, // Size of input.
                        0x01, // Start of output.
                        0x20 // Size of output.
                    )
                )
            // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.
            if iszero(returndatasize()) {
                mstore(0x00, 0x8baa579f) // `InvalidSignature()`.
                revert(0x1c, 0x04)
            }
            mstore(0x60, 0) // Restore the zero slot.
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Recovers the signer's address from a message digest `hash`,
    /// and the EIP-2098 short form signature defined by `r` and `vs`.
    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal view returns (address result) {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x00, hash)
            mstore(0x20, add(shr(255, vs), 27)) // `v`.
            mstore(0x40, r)
            mstore(0x60, shr(1, shl(1, vs))) // `s`.
            result :=
                mload(
                    staticcall(
                        gas(), // Amount of gas left for the transaction.
                        1, // Address of `ecrecover`.
                        0x00, // Start of input.
                        0x80, // Size of input.
                        0x01, // Start of output.
                        0x20 // Size of output.
                    )
                )
            // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.
            if iszero(returndatasize()) {
                mstore(0x00, 0x8baa579f) // `InvalidSignature()`.
                revert(0x1c, 0x04)
            }
            mstore(0x60, 0) // Restore the zero slot.
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Recovers the signer's address from a message digest `hash`,
    /// and the signature defined by `v`, `r`, `s`.
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s)
        internal
        view
        returns (address result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x00, hash)
            mstore(0x20, and(v, 0xff))
            mstore(0x40, r)
            mstore(0x60, s)
            result :=
                mload(
                    staticcall(
                        gas(), // Amount of gas left for the transaction.
                        1, // Address of `ecrecover`.
                        0x00, // Start of input.
                        0x80, // Size of input.
                        0x01, // Start of output.
                        0x20 // Size of output.
                    )
                )
            // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.
            if iszero(returndatasize()) {
                mstore(0x00, 0x8baa579f) // `InvalidSignature()`.
                revert(0x1c, 0x04)
            }
            mstore(0x60, 0) // Restore the zero slot.
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   TRY-RECOVER OPERATIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    // WARNING!
    // These functions will NOT revert upon recovery failure.
    // Instead, they will return the zero address upon recovery failure.
    // It is critical that the returned address is NEVER compared against
    // a zero address (e.g. an uninitialized address variable).

    /// @dev Recovers the signer's address from a message digest `hash`, and the `signature`.
    function tryRecover(bytes32 hash, bytes memory signature)
        internal
        view
        returns (address result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            result := 1
            let m := mload(0x40) // Cache the free memory pointer.
            for {} 1 {} {
                mstore(0x00, hash)
                mstore(0x40, mload(add(signature, 0x20))) // `r`.
                if eq(mload(signature), 64) {
                    let vs := mload(add(signature, 0x40))
                    mstore(0x20, add(shr(255, vs), 27)) // `v`.
                    mstore(0x60, shr(1, shl(1, vs))) // `s`.
                    break
                }
                if eq(mload(signature), 65) {
                    mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.
                    mstore(0x60, mload(add(signature, 0x40))) // `s`.
                    break
                }
                result := 0
                break
            }
            pop(
                staticcall(
                    gas(), // Amount of gas left for the transaction.
                    result, // Address of `ecrecover`.
                    0x00, // Start of input.
                    0x80, // Size of input.
                    0x40, // Start of output.
                    0x20 // Size of output.
                )
            )
            mstore(0x60, 0) // Restore the zero slot.
            // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.
            result := mload(xor(0x60, returndatasize()))
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Recovers the signer's address from a message digest `hash`, and the `signature`.
    function tryRecoverCalldata(bytes32 hash, bytes calldata signature)
        internal
        view
        returns (address result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            result := 1
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x00, hash)
            for {} 1 {} {
                if eq(signature.length, 64) {
                    let vs := calldataload(add(signature.offset, 0x20))
                    mstore(0x20, add(shr(255, vs), 27)) // `v`.
                    mstore(0x40, calldataload(signature.offset)) // `r`.
                    mstore(0x60, shr(1, shl(1, vs))) // `s`.
                    break
                }
                if eq(signature.length, 65) {
                    mstore(0x20, byte(0, calldataload(add(signature.offset, 0x40)))) // `v`.
                    calldatacopy(0x40, signature.offset, 0x40) // Copy `r` and `s`.
                    break
                }
                result := 0
                break
            }
            pop(
                staticcall(
                    gas(), // Amount of gas left for the transaction.
                    result, // Address of `ecrecover`.
                    0x00, // Start of input.
                    0x80, // Size of input.
                    0x40, // Start of output.
                    0x20 // Size of output.
                )
            )
            mstore(0x60, 0) // Restore the zero slot.
            // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.
            result := mload(xor(0x60, returndatasize()))
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Recovers the signer's address from a message digest `hash`,
    /// and the EIP-2098 short form signature defined by `r` and `vs`.
    function tryRecover(bytes32 hash, bytes32 r, bytes32 vs)
        internal
        view
        returns (address result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x00, hash)
            mstore(0x20, add(shr(255, vs), 27)) // `v`.
            mstore(0x40, r)
            mstore(0x60, shr(1, shl(1, vs))) // `s`.
            pop(
                staticcall(
                    gas(), // Amount of gas left for the transaction.
                    1, // Address of `ecrecover`.
                    0x00, // Start of input.
                    0x80, // Size of input.
                    0x40, // Start of output.
                    0x20 // Size of output.
                )
            )
            mstore(0x60, 0) // Restore the zero slot.
            // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.
            result := mload(xor(0x60, returndatasize()))
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /// @dev Recovers the signer's address from a message digest `hash`,
    /// and the signature defined by `v`, `r`, `s`.
    function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s)
        internal
        view
        returns (address result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x00, hash)
            mstore(0x20, and(v, 0xff))
            mstore(0x40, r)
            mstore(0x60, s)
            pop(
                staticcall(
                    gas(), // Amount of gas left for the transaction.
                    1, // Address of `ecrecover`.
                    0x00, // Start of input.
                    0x80, // Size of input.
                    0x40, // Start of output.
                    0x20 // Size of output.
                )
            )
            mstore(0x60, 0) // Restore the zero slot.
            // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.
            result := mload(xor(0x60, returndatasize()))
            mstore(0x40, m) // Restore the free memory pointer.
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     HASHING OPERATIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns an Ethereum Signed Message, created from a `hash`.
    /// This produces a hash corresponding to the one signed with the
    /// [`eth_sign`](https://eth.wiki/json-rpc/API#eth_sign)
    /// JSON-RPC method as part of EIP-191.
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 result) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, hash) // Store into scratch space for keccak256.
            mstore(0x00, "\x00\x00\x00\x00\x19Ethereum Signed Message:\n32") // 28 bytes.
            result := keccak256(0x04, 0x3c) // `32 * 2 - (32 - 28) = 60 = 0x3c`.
        }
    }

    /// @dev Returns an Ethereum Signed Message, created from `s`.
    /// This produces a hash corresponding to the one signed with the
    /// [`eth_sign`](https://eth.wiki/json-rpc/API#eth_sign)
    /// JSON-RPC method as part of EIP-191.
    /// Note: Supports lengths of `s` up to 999999 bytes.
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32 result) {
        /// @solidity memory-safe-assembly
        assembly {
            let sLength := mload(s)
            let o := 0x20
            mstore(o, "\x19Ethereum Signed Message:\n") // 26 bytes, zero-right-padded.
            mstore(0x00, 0x00)
            // Convert the `s.length` to ASCII decimal representation: `base10(s.length)`.
            for { let temp := sLength } 1 {} {
                o := sub(o, 1)
                mstore8(o, add(48, mod(temp, 10)))
                temp := div(temp, 10)
                if iszero(temp) { break }
            }
            let n := sub(0x3a, o) // Header length: `26 + 32 - o`.
            // Throw an out-of-offset error (consumes all gas) if the header exceeds 32 bytes.
            returndatacopy(returndatasize(), returndatasize(), gt(n, 0x20))
            mstore(s, or(mload(0x00), mload(n))) // Temporarily store the header.
            result := keccak256(add(s, sub(0x20, n)), add(n, sLength))
            mstore(s, sLength) // Restore the length.
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   EMPTY CALLDATA HELPERS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns an empty calldata bytes.
    function emptySignature() internal pure returns (bytes calldata signature) {
        /// @solidity memory-safe-assembly
        assembly {
            signature.length := 0
        }
    }
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "ens-contracts/=lib/ens-contracts/contracts/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "solady/=lib/solady/src/",
    "chainlink/=lib/chainlink/contracts/src/",
    "solidity-stringutils/=lib/solidity-stringutils/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_url","type":"string"},{"internalType":"address[]","name":"_signers","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"string[]","name":"urls","type":"string[]"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes4","name":"callbackFunction","type":"bytes4"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"OffchainLookup","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"signers","type":"address[]"}],"name":"NewSigners","type":"event"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"resolve","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"response","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"resolveWithProof","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"bool","name":"permission","type":"bool"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_signers","type":"address[]"}],"name":"setSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url","type":"string"}],"name":"setURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"signers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"url","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620012b1380380620012b18339810160408190526200003491620001cf565b60006200004283826200033c565b5060005b8151811015620000a55760018060008484815181106200006a576200006a62000408565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905560010162000046565b507fab0b9cc3a46b568cb08d985497cde8ab7e18892d01f58db7dc7f0d2af859b2d781604051620000d791906200041e565b60405180910390a150506200046d565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620001285762000128620000e7565b604052919050565b600082601f8301126200014257600080fd5b815160206001600160401b03821115620001605762000160620000e7565b8160051b62000171828201620000fd565b92835284810182019282810190878511156200018c57600080fd5b83870192505b84831015620001c45782516001600160a01b0381168114620001b45760008081fd5b8252918301919083019062000192565b979650505050505050565b60008060408385031215620001e357600080fd5b82516001600160401b0380821115620001fb57600080fd5b818501915085601f8301126200021057600080fd5b815181811115620002255762000225620000e7565b60206200023b601f8301601f19168201620000fd565b82815288828487010111156200025057600080fd5b60005b838110156200027057858101830151828201840152820162000253565b5060009281018201929092528601519094509150808211156200029257600080fd5b50620002a18582860162000130565b9150509250929050565b600181811c90821680620002c057607f821691505b602082108103620002e157634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000337576000816000526020600020601f850160051c81016020861015620003125750805b601f850160051c820191505b8181101562000333578281556001016200031e565b5050505b505050565b81516001600160401b03811115620003585762000358620000e7565b6200037081620003698454620002ab565b84620002e7565b602080601f831160018114620003a857600084156200038f5750858301515b600019600386901b1c1916600185901b17855562000333565b600085815260208120601f198616915b82811015620003d957888601518255948401946001909101908401620003b8565b5085821015620003f85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b81811015620004615783516001600160a01b0316835292840192918401916001016200043a565b50909695505050505050565b610e34806200047d6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063773434081161005b57806377343408146101135780639061b92314610126578063a377266214610139578063f4d4d2f81461014c57600080fd5b806301ffc9a71461008d57806331cb6105146100c65780635600f04f146100db578063736c0d5b146100f0575b600080fd5b6100b161009b366004610727565b6001600160e01b031916639061b92360e01b1490565b60405190151581526020015b60405180910390f35b6100d96100d4366004610770565b61015f565b005b6100e36101c2565b6040516100bd91906107f4565b6100b16100fe366004610807565b60016020526000908152604090205460ff1681565b6100d961012136600461086d565b610250565b6100e36101343660046108af565b610291565b6100d961014736600461091b565b610407565b6100e361015a3660046108af565b6104db565b3360009081526001602052604090205460ff166101975760405162461bcd60e51b815260040161018e90610990565b60405180910390fd5b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b600080546101cf906109b6565b80601f01602080910402602001604051908101604052809291908181526020018280546101fb906109b6565b80156102485780601f1061021d57610100808354040283529160200191610248565b820191906000526020600020905b81548152906001019060200180831161022b57829003601f168201915b505050505081565b3360009081526001602052604090205460ff1661027f5760405162461bcd60e51b815260040161018e90610990565b600061028c828483610a56565b505050565b60606000639061b92360e01b868686866040516024016102b49493929190610b40565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031995909516949094179093528051600180825281830190925291935060009282015b60608152602001906001900390816102fe57905050905060008054610322906109b6565b80601f016020809104026020016040519081016040528092919081815260200182805461034e906109b6565b801561039b5780601f106103705761010080835404028352916020019161039b565b820191906000526020600020905b81548152906001019060200180831161037e57829003601f168201915b5050505050816000815181106103b3576103b3610b72565b602002602001018190525030818363f4d4d2f860e01b85306040516020016103dc929190610b88565b60408051601f1981840301815290829052630556f18360e41b825261018e9594939291600401610bb2565b3360009081526001602052604090205460ff166104365760405162461bcd60e51b815260040161018e90610990565b60005b8181101561049d57600180600085858581811061045857610458610b72565b905060200201602081019061046d9190610807565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610439565b507fab0b9cc3a46b568cb08d985497cde8ab7e18892d01f58db7dc7f0d2af859b2d782826040516104cf929190610c5f565b60405180910390a15050565b60606000806104ec8585898961056f565b6001600160a01b038216600090815260016020526040902054919350915060ff166105655760405162461bcd60e51b815260206004820152602360248201527f5369676e617475726556657269666965723a20496e76616c696420736967617460448201526275726560e81b606482015260840161018e565b9695505050505050565b6000606081808061058286880188610d3a565b919450925090506000806105988a8c018c610db7565b81516020808401919091208851828a012060408051601960f81b818601526bffffffffffffffffffffffff19606087901b1660228201526001600160c01b031960c08c901b166036820152603e810193909352605e8084019290925280518084039092018252607e9092019091528051910120919350915060009061061d9085610696565b9050428567ffffffffffffffff1610156106855760405162461bcd60e51b8152602060048201526024808201527f5369676e617475726556657269666965723a205369676e6174757265206578706044820152631a5c995960e21b606482015260840161018e565b9b949a509398505050505050505050565b60405160019083600052602083015160405260408351036106d257604083015160ff81901c601b016020526001600160ff1b03166060526106f8565b60418351036106f357606083015160001a60205260408301516060526106f8565b600091505b6020600160806000855afa5191503d61071957638baa579f6000526004601cfd5b600060605260405292915050565b60006020828403121561073957600080fd5b81356001600160e01b03198116811461075157600080fd5b9392505050565b6001600160a01b038116811461076d57600080fd5b50565b6000806040838503121561078357600080fd5b823561078e81610758565b9150602083013580151581146107a357600080fd5b809150509250929050565b6000815180845260005b818110156107d4576020818501810151868301820152016107b8565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061075160208301846107ae565b60006020828403121561081957600080fd5b813561075181610758565b60008083601f84011261083657600080fd5b50813567ffffffffffffffff81111561084e57600080fd5b60208301915083602082850101111561086657600080fd5b9250929050565b6000806020838503121561088057600080fd5b823567ffffffffffffffff81111561089757600080fd5b6108a385828601610824565b90969095509350505050565b600080600080604085870312156108c557600080fd5b843567ffffffffffffffff808211156108dd57600080fd5b6108e988838901610824565b9096509450602087013591508082111561090257600080fd5b5061090f87828801610824565b95989497509550505050565b6000806020838503121561092e57600080fd5b823567ffffffffffffffff8082111561094657600080fd5b818501915085601f83011261095a57600080fd5b81358181111561096957600080fd5b8660208260051b850101111561097e57600080fd5b60209290920196919550909350505050565b6020808252600c908201526b2737ba10309039b4b3b732b960a11b604082015260600190565b600181811c908216806109ca57607f821691505b6020821081036109ea57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b601f82111561028c576000816000526020600020601f850160051c81016020861015610a2f5750805b601f850160051c820191505b81811015610a4e57828155600101610a3b565b505050505050565b67ffffffffffffffff831115610a6e57610a6e6109f0565b610a8283610a7c83546109b6565b83610a06565b6000601f841160018114610ab65760008515610a9e5750838201355b600019600387901b1c1916600186901b178355610b10565b600083815260209020601f19861690835b82811015610ae75786850135825560209485019460019092019101610ac7565b5086821015610b045760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000610b54604083018688610b17565b8281036020840152610b67818587610b17565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b604081526000610b9b60408301856107ae565b905060018060a01b03831660208301529392505050565b600060a0820160018060a01b0388168352602060a0602085015281885180845260c08601915060c08160051b870101935060208a0160005b82811015610c185760bf19888703018452610c068683516107ae565b95509284019290840190600101610bea565b50505050508281036040840152610c2f81876107ae565b6001600160e01b03198616606085015290508281036080840152610c5381856107ae565b98975050505050505050565b60208082528181018390526000908460408401835b86811015610ca2578235610c8781610758565b6001600160a01b031682529183019190830190600101610c74565b509695505050505050565b600082601f830112610cbe57600080fd5b813567ffffffffffffffff80821115610cd957610cd96109f0565b604051601f8301601f19908116603f01168101908282118183101715610d0157610d016109f0565b81604052838152866020858801011115610d1a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215610d4f57600080fd5b833567ffffffffffffffff80821115610d6757600080fd5b610d7387838801610cad565b9450602086013591508082168214610d8a57600080fd5b90925060408501359080821115610da057600080fd5b50610dad86828701610cad565b9150509250925092565b60008060408385031215610dca57600080fd5b823567ffffffffffffffff811115610de157600080fd5b610ded85828601610cad565b92505060208301356107a38161075856fea2646970667358221220b3357cfec710fcff7a1326627ccbd5865b600ab5e38d9659563e210930adbbe664736f6c63430008170033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003c68747470733a2f2f7673732e766973696f6e696f2e776f726b6572732e6465762f6c6f6f6b75702f7b73656e6465727d2f7b646174617d2e6a736f6e0000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000008601a8569d52b76d869256b9309e910634c23aca000000000000000000000000328ebc7bb2ca4bf4216863042a960e3c64ed4c10

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063773434081161005b57806377343408146101135780639061b92314610126578063a377266214610139578063f4d4d2f81461014c57600080fd5b806301ffc9a71461008d57806331cb6105146100c65780635600f04f146100db578063736c0d5b146100f0575b600080fd5b6100b161009b366004610727565b6001600160e01b031916639061b92360e01b1490565b60405190151581526020015b60405180910390f35b6100d96100d4366004610770565b61015f565b005b6100e36101c2565b6040516100bd91906107f4565b6100b16100fe366004610807565b60016020526000908152604090205460ff1681565b6100d961012136600461086d565b610250565b6100e36101343660046108af565b610291565b6100d961014736600461091b565b610407565b6100e361015a3660046108af565b6104db565b3360009081526001602052604090205460ff166101975760405162461bcd60e51b815260040161018e90610990565b60405180910390fd5b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b600080546101cf906109b6565b80601f01602080910402602001604051908101604052809291908181526020018280546101fb906109b6565b80156102485780601f1061021d57610100808354040283529160200191610248565b820191906000526020600020905b81548152906001019060200180831161022b57829003601f168201915b505050505081565b3360009081526001602052604090205460ff1661027f5760405162461bcd60e51b815260040161018e90610990565b600061028c828483610a56565b505050565b60606000639061b92360e01b868686866040516024016102b49493929190610b40565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031995909516949094179093528051600180825281830190925291935060009282015b60608152602001906001900390816102fe57905050905060008054610322906109b6565b80601f016020809104026020016040519081016040528092919081815260200182805461034e906109b6565b801561039b5780601f106103705761010080835404028352916020019161039b565b820191906000526020600020905b81548152906001019060200180831161037e57829003601f168201915b5050505050816000815181106103b3576103b3610b72565b602002602001018190525030818363f4d4d2f860e01b85306040516020016103dc929190610b88565b60408051601f1981840301815290829052630556f18360e41b825261018e9594939291600401610bb2565b3360009081526001602052604090205460ff166104365760405162461bcd60e51b815260040161018e90610990565b60005b8181101561049d57600180600085858581811061045857610458610b72565b905060200201602081019061046d9190610807565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610439565b507fab0b9cc3a46b568cb08d985497cde8ab7e18892d01f58db7dc7f0d2af859b2d782826040516104cf929190610c5f565b60405180910390a15050565b60606000806104ec8585898961056f565b6001600160a01b038216600090815260016020526040902054919350915060ff166105655760405162461bcd60e51b815260206004820152602360248201527f5369676e617475726556657269666965723a20496e76616c696420736967617460448201526275726560e81b606482015260840161018e565b9695505050505050565b6000606081808061058286880188610d3a565b919450925090506000806105988a8c018c610db7565b81516020808401919091208851828a012060408051601960f81b818601526bffffffffffffffffffffffff19606087901b1660228201526001600160c01b031960c08c901b166036820152603e810193909352605e8084019290925280518084039092018252607e9092019091528051910120919350915060009061061d9085610696565b9050428567ffffffffffffffff1610156106855760405162461bcd60e51b8152602060048201526024808201527f5369676e617475726556657269666965723a205369676e6174757265206578706044820152631a5c995960e21b606482015260840161018e565b9b949a509398505050505050505050565b60405160019083600052602083015160405260408351036106d257604083015160ff81901c601b016020526001600160ff1b03166060526106f8565b60418351036106f357606083015160001a60205260408301516060526106f8565b600091505b6020600160806000855afa5191503d61071957638baa579f6000526004601cfd5b600060605260405292915050565b60006020828403121561073957600080fd5b81356001600160e01b03198116811461075157600080fd5b9392505050565b6001600160a01b038116811461076d57600080fd5b50565b6000806040838503121561078357600080fd5b823561078e81610758565b9150602083013580151581146107a357600080fd5b809150509250929050565b6000815180845260005b818110156107d4576020818501810151868301820152016107b8565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061075160208301846107ae565b60006020828403121561081957600080fd5b813561075181610758565b60008083601f84011261083657600080fd5b50813567ffffffffffffffff81111561084e57600080fd5b60208301915083602082850101111561086657600080fd5b9250929050565b6000806020838503121561088057600080fd5b823567ffffffffffffffff81111561089757600080fd5b6108a385828601610824565b90969095509350505050565b600080600080604085870312156108c557600080fd5b843567ffffffffffffffff808211156108dd57600080fd5b6108e988838901610824565b9096509450602087013591508082111561090257600080fd5b5061090f87828801610824565b95989497509550505050565b6000806020838503121561092e57600080fd5b823567ffffffffffffffff8082111561094657600080fd5b818501915085601f83011261095a57600080fd5b81358181111561096957600080fd5b8660208260051b850101111561097e57600080fd5b60209290920196919550909350505050565b6020808252600c908201526b2737ba10309039b4b3b732b960a11b604082015260600190565b600181811c908216806109ca57607f821691505b6020821081036109ea57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b601f82111561028c576000816000526020600020601f850160051c81016020861015610a2f5750805b601f850160051c820191505b81811015610a4e57828155600101610a3b565b505050505050565b67ffffffffffffffff831115610a6e57610a6e6109f0565b610a8283610a7c83546109b6565b83610a06565b6000601f841160018114610ab65760008515610a9e5750838201355b600019600387901b1c1916600186901b178355610b10565b600083815260209020601f19861690835b82811015610ae75786850135825560209485019460019092019101610ac7565b5086821015610b045760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000610b54604083018688610b17565b8281036020840152610b67818587610b17565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b604081526000610b9b60408301856107ae565b905060018060a01b03831660208301529392505050565b600060a0820160018060a01b0388168352602060a0602085015281885180845260c08601915060c08160051b870101935060208a0160005b82811015610c185760bf19888703018452610c068683516107ae565b95509284019290840190600101610bea565b50505050508281036040840152610c2f81876107ae565b6001600160e01b03198616606085015290508281036080840152610c5381856107ae565b98975050505050505050565b60208082528181018390526000908460408401835b86811015610ca2578235610c8781610758565b6001600160a01b031682529183019190830190600101610c74565b509695505050505050565b600082601f830112610cbe57600080fd5b813567ffffffffffffffff80821115610cd957610cd96109f0565b604051601f8301601f19908116603f01168101908282118183101715610d0157610d016109f0565b81604052838152866020858801011115610d1a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215610d4f57600080fd5b833567ffffffffffffffff80821115610d6757600080fd5b610d7387838801610cad565b9450602086013591508082168214610d8a57600080fd5b90925060408501359080821115610da057600080fd5b50610dad86828701610cad565b9150509250925092565b60008060408385031215610dca57600080fd5b823567ffffffffffffffff811115610de157600080fd5b610ded85828601610cad565b92505060208301356107a38161075856fea2646970667358221220b3357cfec710fcff7a1326627ccbd5865b600ab5e38d9659563e210930adbbe664736f6c63430008170033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003c68747470733a2f2f7673732e766973696f6e696f2e776f726b6572732e6465762f6c6f6f6b75702f7b73656e6465727d2f7b646174617d2e6a736f6e0000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000008601a8569d52b76d869256b9309e910634c23aca000000000000000000000000328ebc7bb2ca4bf4216863042a960e3c64ed4c10

-----Decoded View---------------
Arg [0] : _url (string): https://vss.visionio.workers.dev/lookup/{sender}/{data}.json
Arg [1] : _signers (address[]): 0x8601A8569d52B76D869256B9309E910634C23ACa,0x328eBc7bb2ca4Bf4216863042a960E3C64Ed4c10

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [3] : 68747470733a2f2f7673732e766973696f6e696f2e776f726b6572732e646576
Arg [4] : 2f6c6f6f6b75702f7b73656e6465727d2f7b646174617d2e6a736f6e00000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 0000000000000000000000008601a8569d52b76d869256b9309e910634c23aca
Arg [7] : 000000000000000000000000328ebc7bb2ca4bf4216863042a960e3c64ed4c10


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
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.