Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set URL | 20025869 | 230 days ago | IN | 0 ETH | 0.00173511 |
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
Contract Source Code (Solidity Standard Json-Input format)
// 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; } }
// 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 } } }
{ "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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.