Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
To
|
||||
|---|---|---|---|---|---|---|---|---|
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH | |||||
| Transfer* | 23151557 | 85 days ago | 0 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
StolenNftFilterOracle
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 100 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import "solmate/auth/Owned.sol";
import "reservoir-oracle/ReservoirOracle.sol";
/// @title StolenNftFilterOracle
/// @author out.eth (@outdoteth)
/// @notice A contract to check that a set of NFTs are not stolen.
contract StolenNftFilterOracle is ReservoirOracle, Owned {
bytes32 private constant TOKEN_TYPE_HASH = keccak256("Token(address contract,uint256 tokenId)");
uint256 public cooldownPeriod = 0;
uint256 public validFor = 60 minutes;
constructor() Owned(msg.sender) ReservoirOracle(0xAeB1D03929bF87F69888f381e73FBf75753d75AF) {}
/// @notice Sets the cooldown period.
/// @param _cooldownPeriod The cooldown period.
function setCooldownPeriod(uint256 _cooldownPeriod) public onlyOwner {
cooldownPeriod = _cooldownPeriod;
}
/// @notice Sets the valid for period.
/// @param _validFor The valid for period.
function setValidFor(uint256 _validFor) public onlyOwner {
validFor = _validFor;
}
function updateReservoirOracleAddress(address newReservoirOracleAddress) public override onlyOwner {
RESERVOIR_ORACLE_ADDRESS = newReservoirOracleAddress;
}
/// @notice Checks that a set of NFTs are not stolen.
/// @param tokenAddress The address of the NFT contract.
/// @param tokenIds The ids of the NFTs.
/// @param messages The messages signed by the reservoir oracle.
function validateTokensAreNotStolen(address tokenAddress, uint256[] calldata tokenIds, Message[] calldata messages)
public
view
{
for (uint256 i = 0; i < tokenIds.length; i++) {
Message calldata message = messages[i];
// check that the signer is correct and message id matches token id + token address
bytes32 expectedMessageId = keccak256(abi.encode(TOKEN_TYPE_HASH, tokenAddress, tokenIds[i]));
require(_verifyMessage(expectedMessageId, validFor, message), "Message has invalid signature");
(bool isFlagged, uint256 lastTransferTime) = abi.decode(message.payload, (bool, uint256));
// check that the NFT is not stolen
require(!isFlagged, "NFT is flagged as suspicious");
// check that the NFT was not transferred too recently
require(lastTransferTime + cooldownPeriod < block.timestamp, "NFT was transferred too recently");
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
// Inspired by https://github.com/ZeframLou/trustus
abstract contract ReservoirOracle {
// --- Structs ---
struct Message {
bytes32 id;
bytes payload;
// The UNIX timestamp when the message was signed by the oracle
uint256 timestamp;
// ECDSA signature or EIP-2098 compact signature
bytes signature;
}
// --- Errors ---
error InvalidMessage();
// --- Fields ---
address public RESERVOIR_ORACLE_ADDRESS;
// --- Constructor ---
constructor(address reservoirOracleAddress) {
RESERVOIR_ORACLE_ADDRESS = reservoirOracleAddress;
}
// --- Public methods ---
function updateReservoirOracleAddress(address newReservoirOracleAddress)
public
virtual;
// --- Internal methods ---
function _verifyMessage(
bytes32 id,
uint256 validFor,
Message memory message
) internal view virtual returns (bool success) {
// Ensure the message matches the requested id
if (id != message.id) {
return false;
}
// Ensure the message timestamp is valid
if (
message.timestamp > block.timestamp ||
message.timestamp + validFor < block.timestamp
) {
return false;
}
bytes32 r;
bytes32 s;
uint8 v;
// Extract the individual signature fields from the signature
bytes memory signature = message.signature;
if (signature.length == 64) {
// EIP-2098 compact signature
bytes32 vs;
assembly {
r := mload(add(signature, 0x20))
vs := mload(add(signature, 0x40))
s := and(
vs,
0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
)
v := add(shr(255, vs), 27)
}
} else if (signature.length == 65) {
// ECDSA signature
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
} else {
return false;
}
address signerAddress = ecrecover(
keccak256(
abi.encodePacked(
"\x19Ethereum Signed Message:\n32",
// EIP-712 structured-data hash
keccak256(
abi.encode(
keccak256(
"Message(bytes32 id,bytes payload,uint256 timestamp)"
),
message.id,
keccak256(message.payload),
message.timestamp
)
)
)
),
v,
r,
s
);
// Ensure the signer matches the designated oracle address
return signerAddress == RESERVOIR_ORACLE_ADDRESS;
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event OwnershipTransferred(address indexed user, address indexed newOwner);
/*//////////////////////////////////////////////////////////////
OWNERSHIP STORAGE
//////////////////////////////////////////////////////////////*/
address public owner;
modifier onlyOwner() virtual {
require(msg.sender == owner, "UNAUTHORIZED");
_;
}
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(address _owner) {
owner = _owner;
emit OwnershipTransferred(address(0), _owner);
}
/*//////////////////////////////////////////////////////////////
OWNERSHIP LOGIC
//////////////////////////////////////////////////////////////*/
function transferOwnership(address newOwner) public virtual onlyOwner {
owner = newOwner;
emit OwnershipTransferred(msg.sender, newOwner);
}
}{
"remappings": [
"@manifoldxyz/libraries-solidity/=lib/royalty-registry-solidity/lib/libraries-solidity/",
"@openzeppelin/contracts-upgradeable/=lib/royalty-registry-solidity/lib/openzeppelin-contracts-upgradeable/contracts/",
"@openzeppelin/contracts/=lib/royalty-registry-solidity/lib/openzeppelin-contracts/contracts/",
"ERC721A/=lib/ERC721A/contracts/",
"create2-helpers/=lib/royalty-registry-solidity/lib/create2-helpers/src/",
"create2-scripts/=lib/royalty-registry-solidity/lib/create2-helpers/script/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"forge-std/=lib/forge-std/src/",
"libraries-solidity/=lib/royalty-registry-solidity/lib/libraries-solidity/contracts/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
"openzeppelin/=lib/openzeppelin-contracts/contracts/",
"oracle/=lib/oracle/contracts/",
"reservoir-oracle/=lib/oracle/contracts/",
"royalty-registry-solidity/=lib/royalty-registry-solidity/contracts/",
"solmate/=lib/solmate/src/"
],
"optimizer": {
"enabled": true,
"runs": 100
},
"metadata": {
"bytecodeHash": "ipfs"
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "london",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidMessage","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"RESERVOIR_ORACLE_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldownPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cooldownPeriod","type":"uint256"}],"name":"setCooldownPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_validFor","type":"uint256"}],"name":"setValidFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newReservoirOracleAddress","type":"address"}],"name":"updateReservoirOracleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"validFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct ReservoirOracle.Message[]","name":"messages","type":"tuple[]"}],"name":"validateTokensAreNotStolen","outputs":[],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040526000600255610e1060035534801561001b57600080fd5b506000805473aeb1d03929bf87f69888f381e73fbf75753d75af6001600160a01b03199182161782556001805433921682179055604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350610a058061008b6000396000f3fe608060405234801561001057600080fd5b50600436106100835760003560e01c806304646a4914610088578063149120bc146100a457806372d8fcd5146100ad57806380ea3de1146100c25780638a4fa05b146100d55780638b67ad0f146100e85780638d9d5282146101135780638da5cb5b14610126578063f2fde38b14610139575b600080fd5b61009160025481565b6040519081526020015b60405180910390f35b61009160035481565b6100c06100bb366004610675565b61014c565b005b6100c06100d0366004610690565b6101a1565b6100c06100e33660046106f5565b6101d0565b6000546100fb906001600160a01b031681565b6040516001600160a01b03909116815260200161009b565b6100c0610121366004610690565b6103cf565b6001546100fb906001600160a01b031681565b6100c0610147366004610675565b6103fe565b6001546001600160a01b0316331461017f5760405162461bcd60e51b815260040161017690610776565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146101cb5760405162461bcd60e51b815260040161017690610776565b600255565b60005b838110156103c757368383838181106101ee576101ee61079c565b905060200281019061020091906107b2565b905060007fc0a1ebc1ee06dbc8c69ee4d865db358058921259f8d3cb15d2133d87fa20322e888888868181106102385761023861079c565b9050602002013560405160200161026b939291909283526001600160a01b03919091166020830152604082015260600190565b604051602081830303815290604052805190602001209050610299816003548461029490610875565b610474565b6102e55760405162461bcd60e51b815260206004820152601d60248201527f4d6573736167652068617320696e76616c6964207369676e61747572650000006044820152606401610176565b6000806102f5602085018561090f565b8101906103029190610956565b9150915081156103545760405162461bcd60e51b815260206004820152601c60248201527f4e465420697320666c616767656420617320737573706963696f7573000000006044820152606401610176565b4260025482610363919061099d565b106103b05760405162461bcd60e51b815260206004820181905260248201527f4e465420776173207472616e7366657272656420746f6f20726563656e746c796044820152606401610176565b5050505080806103bf906109b6565b9150506101d3565b505050505050565b6001546001600160a01b031633146103f95760405162461bcd60e51b815260040161017690610776565b600355565b6001546001600160a01b031633146104285760405162461bcd60e51b815260040161017690610776565b600180546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b8051600090841461048757506000610652565b42826040015111806104a75750428383604001516104a5919061099d565b105b156104b457506000610652565b6000806000808560600151905080516040036104f057602081015160408201519094506001600160ff1b038116935060ff1c601b019150610523565b8051604103610516576020810151935060408101519250606081015160001a9150610523565b6000945050505050610652565b600060017f395537e76dcb230984fc10f328a95df716a3205146e2e10a6b1405dc0a67059388600001518960200151805190602001208a60400151604051602001610587949392919093845260208401929092526040830152606082015260800190565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f198184030181528282528051602091820120600084529083018083525260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa15801561062e573d6000803e3d6000fd5b5050604051601f1901516000546001600160a01b0391821691161496505050505050505b9392505050565b80356001600160a01b038116811461067057600080fd5b919050565b60006020828403121561068757600080fd5b61065282610659565b6000602082840312156106a257600080fd5b5035919050565b60008083601f8401126106bb57600080fd5b50813567ffffffffffffffff8111156106d357600080fd5b6020830191508360208260051b85010111156106ee57600080fd5b9250929050565b60008060008060006060868803121561070d57600080fd5b61071686610659565b9450602086013567ffffffffffffffff8082111561073357600080fd5b61073f89838a016106a9565b9096509450604088013591508082111561075857600080fd5b50610765888289016106a9565b969995985093965092949392505050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235607e198336030181126107c857600080fd5b9190910192915050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126107f957600080fd5b813567ffffffffffffffff80821115610814576108146107d2565b604051601f8301601f19908116603f0116810190828211818310171561083c5761083c6107d2565b8160405283815286602085880101111561085557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006080823603121561088757600080fd5b6040516080810167ffffffffffffffff82821081831117156108ab576108ab6107d2565b816040528435835260208501359150808211156108c757600080fd5b6108d3368387016107e8565b60208401526040850135604084015260608501359150808211156108f657600080fd5b50610903368286016107e8565b60608301525092915050565b6000808335601e1984360301811261092657600080fd5b83018035915067ffffffffffffffff82111561094157600080fd5b6020019150368190038213156106ee57600080fd5b6000806040838503121561096957600080fd5b8235801515811461097957600080fd5b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156109b0576109b0610987565b92915050565b6000600182016109c8576109c8610987565b506001019056fea2646970667358221220d86c14f5e1c31b419a42c8695831125ccb428d79e0b89aefa10b1dcb2cf973cc64736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100835760003560e01c806304646a4914610088578063149120bc146100a457806372d8fcd5146100ad57806380ea3de1146100c25780638a4fa05b146100d55780638b67ad0f146100e85780638d9d5282146101135780638da5cb5b14610126578063f2fde38b14610139575b600080fd5b61009160025481565b6040519081526020015b60405180910390f35b61009160035481565b6100c06100bb366004610675565b61014c565b005b6100c06100d0366004610690565b6101a1565b6100c06100e33660046106f5565b6101d0565b6000546100fb906001600160a01b031681565b6040516001600160a01b03909116815260200161009b565b6100c0610121366004610690565b6103cf565b6001546100fb906001600160a01b031681565b6100c0610147366004610675565b6103fe565b6001546001600160a01b0316331461017f5760405162461bcd60e51b815260040161017690610776565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146101cb5760405162461bcd60e51b815260040161017690610776565b600255565b60005b838110156103c757368383838181106101ee576101ee61079c565b905060200281019061020091906107b2565b905060007fc0a1ebc1ee06dbc8c69ee4d865db358058921259f8d3cb15d2133d87fa20322e888888868181106102385761023861079c565b9050602002013560405160200161026b939291909283526001600160a01b03919091166020830152604082015260600190565b604051602081830303815290604052805190602001209050610299816003548461029490610875565b610474565b6102e55760405162461bcd60e51b815260206004820152601d60248201527f4d6573736167652068617320696e76616c6964207369676e61747572650000006044820152606401610176565b6000806102f5602085018561090f565b8101906103029190610956565b9150915081156103545760405162461bcd60e51b815260206004820152601c60248201527f4e465420697320666c616767656420617320737573706963696f7573000000006044820152606401610176565b4260025482610363919061099d565b106103b05760405162461bcd60e51b815260206004820181905260248201527f4e465420776173207472616e7366657272656420746f6f20726563656e746c796044820152606401610176565b5050505080806103bf906109b6565b9150506101d3565b505050505050565b6001546001600160a01b031633146103f95760405162461bcd60e51b815260040161017690610776565b600355565b6001546001600160a01b031633146104285760405162461bcd60e51b815260040161017690610776565b600180546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b8051600090841461048757506000610652565b42826040015111806104a75750428383604001516104a5919061099d565b105b156104b457506000610652565b6000806000808560600151905080516040036104f057602081015160408201519094506001600160ff1b038116935060ff1c601b019150610523565b8051604103610516576020810151935060408101519250606081015160001a9150610523565b6000945050505050610652565b600060017f395537e76dcb230984fc10f328a95df716a3205146e2e10a6b1405dc0a67059388600001518960200151805190602001208a60400151604051602001610587949392919093845260208401929092526040830152606082015260800190565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f198184030181528282528051602091820120600084529083018083525260ff861690820152606081018790526080810186905260a0016020604051602081039080840390855afa15801561062e573d6000803e3d6000fd5b5050604051601f1901516000546001600160a01b0391821691161496505050505050505b9392505050565b80356001600160a01b038116811461067057600080fd5b919050565b60006020828403121561068757600080fd5b61065282610659565b6000602082840312156106a257600080fd5b5035919050565b60008083601f8401126106bb57600080fd5b50813567ffffffffffffffff8111156106d357600080fd5b6020830191508360208260051b85010111156106ee57600080fd5b9250929050565b60008060008060006060868803121561070d57600080fd5b61071686610659565b9450602086013567ffffffffffffffff8082111561073357600080fd5b61073f89838a016106a9565b9096509450604088013591508082111561075857600080fd5b50610765888289016106a9565b969995985093965092949392505050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235607e198336030181126107c857600080fd5b9190910192915050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126107f957600080fd5b813567ffffffffffffffff80821115610814576108146107d2565b604051601f8301601f19908116603f0116810190828211818310171561083c5761083c6107d2565b8160405283815286602085880101111561085557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006080823603121561088757600080fd5b6040516080810167ffffffffffffffff82821081831117156108ab576108ab6107d2565b816040528435835260208501359150808211156108c757600080fd5b6108d3368387016107e8565b60208401526040850135604084015260608501359150808211156108f657600080fd5b50610903368286016107e8565b60608301525092915050565b6000808335601e1984360301811261092657600080fd5b83018035915067ffffffffffffffff82111561094157600080fd5b6020019150368190038213156106ee57600080fd5b6000806040838503121561096957600080fd5b8235801515811461097957600080fd5b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156109b0576109b0610987565b92915050565b6000600182016109c8576109c8610987565b506001019056fea2646970667358221220d86c14f5e1c31b419a42c8695831125ccb428d79e0b89aefa10b1dcb2cf973cc64736f6c63430008110033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
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.