Source Code
Overview
AVAX Balance
More Info
ContractCreator
Multichain Info
N/A
| Transaction Hash |
Method
|
Block
|
From
|
To
|
Amount
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | Amount | ||
|---|---|---|---|---|---|---|
| 43889328 | 177 days ago | 0 AVAX | ||||
| 43889328 | 177 days ago | 0 AVAX | ||||
| 43889328 | 177 days ago | 0 AVAX | ||||
| 43889292 | 177 days ago | 0 AVAX | ||||
| 43889292 | 177 days ago | 0 AVAX | ||||
| 43889292 | 177 days ago | 0 AVAX | ||||
| 43600917 | 183 days ago | 0 AVAX | ||||
| 43600917 | 183 days ago | 0 AVAX | ||||
| 43600917 | 183 days ago | 0 AVAX | ||||
| 43600828 | 183 days ago | 0 AVAX | ||||
| 43600828 | 183 days ago | 0 AVAX | ||||
| 43600828 | 183 days ago | 0 AVAX | ||||
| 43599218 | 183 days ago | 0 AVAX | ||||
| 43599218 | 183 days ago | 0 AVAX | ||||
| 43599218 | 183 days ago | 0 AVAX | ||||
| 43596518 | 184 days ago | 0 AVAX | ||||
| 43596518 | 184 days ago | 0 AVAX | ||||
| 43596518 | 184 days ago | 0 AVAX | ||||
| 43592409 | 184 days ago | 0 AVAX | ||||
| 43592409 | 184 days ago | 0 AVAX | ||||
| 43592409 | 184 days ago | 0 AVAX | ||||
| 43592221 | 184 days ago | 0 AVAX | ||||
| 43592221 | 184 days ago | 0 AVAX | ||||
| 43592221 | 184 days ago | 0 AVAX | ||||
| 43592180 | 184 days ago | 0 AVAX |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
SlasherFactory
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
// SPDX-FileCopyrightText: Copyright 2024 ADDPHO
pragma solidity 0.8.25;
import {IEntity} from "../interfaces/common/IEntity.sol";
import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import {ISlasherFactory} from "../interfaces/ISlasherFactory.sol";
contract SlasherFactory is ISlasherFactory, Ownable, ERC165 {
using EnumerableSet for EnumerableSet.AddressSet;
using Clones for address;
using ERC165Checker for address;
/**
* @inheritdoc ISlasherFactory
*/
mapping(uint64 => bool) public blacklisted;
EnumerableSet.AddressSet private _whitelistedImplementations;
EnumerableSet.AddressSet private _entities;
modifier checkType(
uint64 type_
) {
if (type_ >= totalTypes()) {
revert SlasherFactory__InvalidType();
}
_;
}
constructor(
address owner_
) Ownable(owner_) {}
/**
* @inheritdoc ISlasherFactory
*/
function totalTypes() public view returns (uint64) {
return uint64(_whitelistedImplementations.length());
}
/**
* @inheritdoc ISlasherFactory
*/
function implementation(
uint64 type_
) public view returns (address) {
return _whitelistedImplementations.at(type_);
}
/**
* @inheritdoc ISlasherFactory
*/
function whitelist(
address implementation_
) external onlyOwner {
// Check if the implementation supports the IEntity interface via ERC165
if (!implementation_.supportsInterface(type(IEntity).interfaceId)) {
revert SlasherFactory__InvalidImplementation();
}
if (IEntity(implementation_).FACTORY() != address(this) || IEntity(implementation_).TYPE() != totalTypes()) {
revert SlasherFactory__InvalidImplementation();
}
if (!_whitelistedImplementations.add(implementation_)) {
revert SlasherFactory__AlreadyWhitelisted();
}
emit Whitelist(implementation_);
}
/**
* @inheritdoc ISlasherFactory
*/
function blacklist(
uint64 type_
) external onlyOwner checkType(type_) {
if (blacklisted[type_]) {
revert SlasherFactory__AlreadyBlacklisted();
}
blacklisted[type_] = true;
emit Blacklist(type_);
}
/**
* @inheritdoc ISlasherFactory
*/
function create(uint64 type_, bytes calldata data) external returns (address entity_) {
entity_ = implementation(type_).cloneDeterministic(keccak256(abi.encode(totalEntities(), type_, data)));
_addSlasherEntity(entity_);
IEntity(entity_).initialize(data);
}
function _addSlasherEntity(
address entity_
) internal {
_entities.add(entity_);
emit AddEntity(entity_);
}
/**
* @inheritdoc ISlasherFactory
*/
function entity(
uint256 index
) public view returns (address) {
return _entities.at(index);
}
/**
* @inheritdoc ISlasherFactory
*/
function isEntity(
address entity_
) public view returns (bool) {
return _entities.contains(entity_);
}
/**
* @inheritdoc ISlasherFactory
*/
function totalEntities() public view returns (uint256) {
return _entities.length();
}
function supportsInterface(
bytes4 interfaceId
) public view override(ERC165, ISlasherFactory) returns (bool) {
return interfaceId == type(ISlasherFactory).interfaceId || super.supportsInterface(interfaceId);
}
}// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: Copyright 2024 ADDPHO
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
interface IEntity is IERC165 {
error Entity__NotInitialized();
error Entity__ZeroAddress(string name);
/**
* @notice Get the factory's address.
* @return address of the factory
*/
function FACTORY() external view returns (address);
/**
* @notice Get the entity's type.
* @return type of the entity
*/
function TYPE() external view returns (uint64);
/**
* @notice Initialize this entity contract by using given data.
* @param data some data to use
*/
function initialize(
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Clones.sol)
pragma solidity ^0.8.20;
/**
* @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
* deploying minimal proxy contracts, also known as "clones".
*
* > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
* > a minimal bytecode implementation that delegates all calls to a known, fixed address.
*
* The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
* (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
* deterministic method.
*/
library Clones {
/**
* @dev A clone instance deployment failed.
*/
error ERC1167FailedCreateClone();
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create opcode, which should never revert.
*/
function clone(address implementation) internal returns (address instance) {
/// @solidity memory-safe-assembly
assembly {
// Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
// of the `implementation` address with the bytecode before the address.
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
// Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create(0, 0x09, 0x37)
}
if (instance == address(0)) {
revert ERC1167FailedCreateClone();
}
}
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create2 opcode and a `salt` to deterministically deploy
* the clone. Using the same `implementation` and `salt` multiple time will revert, since
* the clones cannot be deployed twice at the same address.
*/
function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
/// @solidity memory-safe-assembly
assembly {
// Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
// of the `implementation` address with the bytecode before the address.
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
// Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create2(0, 0x09, 0x37, salt)
}
if (instance == address(0)) {
revert ERC1167FailedCreateClone();
}
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(
address implementation,
bytes32 salt,
address deployer
) internal pure returns (address predicted) {
/// @solidity memory-safe-assembly
assembly {
let ptr := mload(0x40)
mstore(add(ptr, 0x38), deployer)
mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff)
mstore(add(ptr, 0x14), implementation)
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73)
mstore(add(ptr, 0x58), salt)
mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37))
predicted := keccak256(add(ptr, 0x43), 0x55)
}
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(
address implementation,
bytes32 salt
) internal view returns (address predicted) {
return predictDeterministicAddress(implementation, salt, address(this));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
pragma solidity ^0.8.20;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```solidity
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position is the index of the value in the `values` array plus 1.
// Position 0 is used to mean a value is not in the set.
mapping(bytes32 value => uint256) _positions;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._positions[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We cache the value's position to prevent multiple reads from the same storage slot
uint256 position = set._positions[value];
if (position != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 valueIndex = position - 1;
uint256 lastIndex = set._values.length - 1;
if (valueIndex != lastIndex) {
bytes32 lastValue = set._values[lastIndex];
// Move the lastValue to the index where the value to delete is
set._values[valueIndex] = lastValue;
// Update the tracked position of the lastValue (that was just moved)
set._positions[lastValue] = position;
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the tracked position for the deleted slot
delete set._positions[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._positions[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165Checker.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
/**
* @dev Library used to query support of an interface declared via {IERC165}.
*
* Note that these functions return the actual result of the query: they do not
* `revert` if an interface is not supported. It is up to the caller to decide
* what to do in these cases.
*/
library ERC165Checker {
// As per the EIP-165 spec, no interface should ever match 0xffffffff
bytes4 private constant INTERFACE_ID_INVALID = 0xffffffff;
/**
* @dev Returns true if `account` supports the {IERC165} interface.
*/
function supportsERC165(address account) internal view returns (bool) {
// Any contract that implements ERC165 must explicitly indicate support of
// InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid
return
supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&
!supportsERC165InterfaceUnchecked(account, INTERFACE_ID_INVALID);
}
/**
* @dev Returns true if `account` supports the interface defined by
* `interfaceId`. Support for {IERC165} itself is queried automatically.
*
* See {IERC165-supportsInterface}.
*/
function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
// query support of both ERC165 as per the spec and support of _interfaceId
return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);
}
/**
* @dev Returns a boolean array where each value corresponds to the
* interfaces passed in and whether they're supported or not. This allows
* you to batch check interfaces for a contract where your expectation
* is that some interfaces may not be supported.
*
* See {IERC165-supportsInterface}.
*/
function getSupportedInterfaces(
address account,
bytes4[] memory interfaceIds
) internal view returns (bool[] memory) {
// an array of booleans corresponding to interfaceIds and whether they're supported or not
bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);
// query support of ERC165 itself
if (supportsERC165(account)) {
// query support of each interface in interfaceIds
for (uint256 i = 0; i < interfaceIds.length; i++) {
interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);
}
}
return interfaceIdsSupported;
}
/**
* @dev Returns true if `account` supports all the interfaces defined in
* `interfaceIds`. Support for {IERC165} itself is queried automatically.
*
* Batch-querying can lead to gas savings by skipping repeated checks for
* {IERC165} support.
*
* See {IERC165-supportsInterface}.
*/
function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {
// query support of ERC165 itself
if (!supportsERC165(account)) {
return false;
}
// query support of each interface in interfaceIds
for (uint256 i = 0; i < interfaceIds.length; i++) {
if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {
return false;
}
}
// all interfaces supported
return true;
}
/**
* @notice Query if a contract implements an interface, does not check ERC165 support
* @param account The address of the contract to query for support of an interface
* @param interfaceId The interface identifier, as specified in ERC-165
* @return true if the contract at account indicates support of the interface with
* identifier interfaceId, false otherwise
* @dev Assumes that account contains a contract that supports ERC165, otherwise
* the behavior of this method is undefined. This precondition can be checked
* with {supportsERC165}.
*
* Some precompiled contracts will falsely indicate support for a given interface, so caution
* should be exercised when using this function.
*
* Interface identification is specified in ERC-165.
*/
function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {
// prepare call
bytes memory encodedParams = abi.encodeCall(IERC165.supportsInterface, (interfaceId));
// perform static call
bool success;
uint256 returnSize;
uint256 returnValue;
assembly {
success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)
returnSize := returndatasize()
returnValue := mload(0x00)
}
return success && returnSize >= 0x20 && returnValue > 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: Copyright 2024 ADDPHO
pragma solidity ^0.8.0;
import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
/**
* @title ISlasherFactory
* @dev Combined interface integrating ISlasherFactory, IFactory, IRegistry, and IERC165.
*/
interface ISlasherFactory is IERC165 {
error SlasherFactory__EntityNotExist();
error SlasherFactory__AlreadyBlacklisted();
error SlasherFactory__AlreadyWhitelisted();
error SlasherFactory__InvalidImplementation();
error SlasherFactory__InvalidType();
/**
* @notice Emitted when an entity is added.
* @param entity address of the added entity
*/
event AddEntity(address indexed entity);
/**
* @notice Emitted when a new type is whitelisted.
* @param implementation address of the new implementation
*/
event Whitelist(address indexed implementation);
/**
* @notice Emitted when a type is blacklisted (e.g., in case of invalid implementation).
* @param type_ type that was blacklisted
* @dev The given type is still deployable.
*/
event Blacklist(uint64 indexed type_);
/**
* @notice Query if a contract implements an interface
* @param interfaceId The interface identifier, as specified in ERC-165
* @return `true` if the contract implements `interfaceId` and
* `interfaceId` is not 0xffffffff, `false` otherwise
*/
function supportsInterface(
bytes4 interfaceId
) external view returns (bool);
/**
* @notice Get if a given address is an entity.
* @param account address to check
* @return if the given address is an entity
*/
function isEntity(
address account
) external view returns (bool);
/**
* @notice Get a total number of entities.
* @return total number of entities added
*/
function totalEntities() external view returns (uint256);
/**
* @notice Get an entity given its index.
* @param index index of the entity to get
* @return address of the entity
*/
function entity(
uint256 index
) external view returns (address);
/**
* @notice Get the total number of whitelisted types.
* @return total number of types
*/
function totalTypes() external view returns (uint64);
/**
* @notice Get the implementation for a given type.
* @param type_ position to get the implementation at
* @return address of the implementation
*/
function implementation(
uint64 type_
) external view returns (address);
/**
* @notice Get if a type is blacklisted (e.g., in case of invalid implementation).
* @param type_ type to check
* @return whether the type is blacklisted
* @dev The given type is still deployable.
*/
function blacklisted(
uint64 type_
) external view returns (bool);
/**
* @notice Whitelist a new type of entity.
* @param implementation address of the new implementation
*/
function whitelist(
address implementation
) external;
/**
* @notice Blacklist a type of entity.
* @param type_ type to blacklist
* @dev The given type will still be deployable.
*/
function blacklist(
uint64 type_
) external;
/**
* @notice Create a new entity at the factory.
* @param type_ type's implementation to use
* @param data initial data for the entity creation
* @return address of the entity
* @dev CREATE2 salt is constructed from the given parameters.
*/
function create(uint64 type_, bytes calldata data) external returns (address);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}{
"remappings": [
"@suzaku/collateral/=lib/collateral/src/",
"@suzaku/core/=lib/suzaku-core/",
"@suzaku/contracts-lib/=lib/suzaku-contracts-library/",
"@suzaku/contracts-library/=lib/suzaku-contracts-library/src/",
"@avalabs/teleporter/=lib/suzaku-contracts-library/lib/icm-contracts/contracts/",
"@avalabs/icm-contracts/=lib/suzaku-contracts-library/lib/icm-contracts/contracts/",
"@avalabs/subnet-evm-contracts/=lib/suzaku-core/lib/suzaku-contracts-library/lib/icm-contracts/lib/subnet-evm/contracts/contracts/",
"@avalabs/[email protected]/=lib/suzaku-contracts-library/lib/icm-contracts/lib/subnet-evm/contracts/",
"@forge-std/=lib/suzaku-contracts-library/lib/icm-contracts/lib/forge-std/src/",
"@mocks/=lib/suzaku-contracts-library/lib/icm-contracts/contracts/mocks/",
"@openzeppelin/contracts-upgradeable/=lib/collateral/lib/openzeppelin-contracts-upgradeable/contracts/",
"@openzeppelin/[email protected]/=lib/suzaku-contracts-library/lib/openzeppelin-contracts-upgradeable/contracts/",
"@openzeppelin/contracts/=lib/collateral/lib/openzeppelin-contracts/contracts/",
"@openzeppelin/[email protected]/=lib/suzaku-contracts-library/lib/openzeppelin-contracts/contracts/",
"@openzeppelin/foundry-upgrades/=lib/suzaku-core/lib/openzeppelin-foundry-upgrades/src/",
"@symbiotic/core/=lib/suzaku-core/lib/core/src/",
"@teleporter/=lib/suzaku-contracts-library/lib/icm-contracts/contracts/teleporter/",
"@utilities/=lib/suzaku-contracts-library/lib/icm-contracts/contracts/utilities/",
"collateral/=lib/collateral/",
"core/=lib/suzaku-core/lib/core/",
"ds-test/=lib/collateral/lib/permit2/lib/solmate/lib/ds-test/src/",
"erc4626-tests/=lib/collateral/lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
"forge-gas-snapshot/=lib/collateral/lib/permit2/lib/forge-gas-snapshot/src/",
"forge-std/=lib/forge-std/src/",
"icm-contracts/=lib/suzaku-contracts-library/lib/icm-contracts/contracts/",
"openzeppelin-contracts-upgradeable/=lib/collateral/lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/collateral/lib/openzeppelin-contracts/",
"openzeppelin-foundry-upgrades/=lib/suzaku-core/lib/openzeppelin-foundry-upgrades/src/",
"permit2/=lib/collateral/lib/permit2/",
"solidity-stringutils/=lib/suzaku-core/lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/",
"solmate/=lib/collateral/lib/permit2/lib/solmate/",
"subnet-evm/=lib/suzaku-contracts-library/lib/icm-contracts/lib/subnet-evm/",
"suzaku-contracts-library/=lib/suzaku-contracts-library/",
"suzaku-core/=lib/suzaku-core/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": true,
"libraries": {}
}Contract ABI
API[{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC1167FailedCreateClone","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"SlasherFactory__AlreadyBlacklisted","type":"error"},{"inputs":[],"name":"SlasherFactory__AlreadyWhitelisted","type":"error"},{"inputs":[],"name":"SlasherFactory__EntityNotExist","type":"error"},{"inputs":[],"name":"SlasherFactory__InvalidImplementation","type":"error"},{"inputs":[],"name":"SlasherFactory__InvalidType","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"}],"name":"AddEntity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"type_","type":"uint64"}],"name":"Blacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Whitelist","type":"event"},{"inputs":[{"internalType":"uint64","name":"type_","type":"uint64"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"blacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"type_","type":"uint64"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"create","outputs":[{"internalType":"address","name":"entity_","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"entity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"type_","type":"uint64"}],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entity_","type":"address"}],"name":"isEntity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEntities","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTypes","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"implementation_","type":"address"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60803460b457601f610c6638819003918201601f19168301916001600160401b0383118484101760b85780849260209460405283398101031260b457516001600160a01b03908181169081900360b4578015609c575f80546001600160a01b03198116831782556040519316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3610b9990816100cd8239f35b604051631e4fbdf760e01b81525f6004820152602490fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100e457806314887c58146100df5780635cd8b15e146100da578063715018a6146100d55780638da5cb5b146100d05780639b19251a146100cb578063b42ba2a2146100c6578063b572a966146100c1578063b6caa119146100bc578063cd108ef8146100b7578063f15df2e5146100b2578063f2fde38b146100ad5763f9661602146100a8575f80fd5b610663565b6105d5565b6105af565b61052e565b6104ed565b61043c565b6103cc565b610231565b61020a565b6101b3565b610196565b61014f565b3461013a57602036600319011261013a5760043563ffffffff60e01b811680910361013a5760209063a00ee17960e01b8114908115610129575b506040519015158152f35b6301ffc9a760e01b1490505f61011e565b5f80fd5b6001600160a01b0381160361013a57565b3461013a57602036600319011261013a5760043561016c8161013e565b60018060a01b03165f526005602052602060405f20541515604051908152f35b5f91031261013a57565b3461013a575f36600319011261013a576020600454604051908152f35b3461013a575f36600319011261013a576101cb610876565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461013a575f36600319011261013a575f546040516001600160a01b039091168152602090f35b3461013a5760208060031936011261013a5760048035916102518361013e565b610259610876565b610269610265846108a1565b1590565b6103bc576040516202dd3160ec1b81526001600160a01b039384169382828581885afa918215610388575f9261038d575b5016301480159190610301575b506102f2576102b861026583610a86565b6102e357507feb73900b98b6a3e2b8b01708fe544760cf570d21e7fbe5225f24e48b5b2b432e5f80a2005b60405163ab8823f960e01b8152fd5b604051632776b5cf60e11b8152fd5b604051635d927f4560e11b815290915081818481875afa918215610388575f9261035b575b50506001600160401b036103516103456002546001600160401b031690565b6001600160401b031690565b911614155f6102a7565b61037a9250803d10610381575b61037281836106e3565b810190610727565b5f80610326565b503d610368565b61071c565b6103ae919250833d85116103b5575b6103a681836106e3565b810190610704565b905f61029a565b503d61039c565b50604051632776b5cf60e11b8152fd5b3461013a57602036600319011261013a576004356004548110156104265760045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01546040516001600160a01b039091168152602090f35b610a72565b6001600160401b0381160361013a57565b3461013a57602036600319011261013a576004356104598161042b565b610461610876565b6001600160401b0380600254169116908110156104db57805f52600160205260ff60405f2054166104c957805f52600160205260405f20600160ff198254161790557ffc8245c2838846b295ae66fbe0d08e20c799b737c93b56f7b209df2e5fa2d4585f80a2005b604051630ade74ff60e01b8152600490fd5b604051630f3b16e960e01b8152600490fd5b3461013a57602036600319011261013a576001600160401b036004356105128161042b565b165f526001602052602060ff60405f2054166040519015158152f35b3461013a57604036600319011261013a5760043561054b8161042b565b6024356001600160401b0380821161013a573660238301121561013a57816004013590811161013a57366024828401011161013a576105ab92602461059193019061076d565b6040516001600160a01b0390911681529081906020820190565b0390f35b3461013a575f36600319011261013a5760206001600160401b0360025416604051908152f35b3461013a57602036600319011261013a576004356105f28161013e565b6105fa610876565b6001600160a01b0390811690811561064b575f54826bffffffffffffffffffffffff60a01b8216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b604051631e4fbdf760e01b81525f6004820152602490fd5b3461013a57602036600319011261013a57602061068a6004356106858161042b565b610830565b6040516001600160a01b039091168152f35b634e487b7160e01b5f52604160045260245ffd5b6001600160401b0381116106c357604052565b61069c565b606081019081106001600160401b038211176106c357604052565b90601f801991011681019081106001600160401b038211176106c357604052565b9081602091031261013a57516107198161013e565b90565b6040513d5f823e3d90fd5b9081602091031261013a57516107198161042b565b908060209392818452848401375f828201840152601f01601f1916010190565b91602061071993818152019161073c565b6107cb909392919361077e81610830565b90600454906001600160401b0360405191602083019384521660408201526060808201526107c2816107b460808201888b61073c565b03601f1981018352826106e3565b51902090610978565b926107d5846109de565b6001600160a01b03841691823b1561013a5761080a925f928360405180968195829463439fab9160e01b84526004840161075c565b03925af180156103885761081b5750565b8061082861082e926106b0565b8061018c565b565b6001600160401b03166002548110156104265760025f527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01546001600160a01b031690565b5f546001600160a01b0316330361088957565b60405163118cdaa760e01b8152336004820152602490fd5b604051906020808301815f6301ffc9a760e01b95868452866024820152602481526108cb816106c8565b51617530938685fa933d5f51908661096d575b5085610963575b5084610902575b505050816108f8575090565b6107199150610a17565b839450905f91839460405185810192835263ffffffff60e01b60248201526024815261092d816106c8565b5192fa5f5190913d83610958575b50508161094e575b5015905f80806108ec565b905015155f610943565b101591505f8061093b565b151594505f6108e5565b84111595505f6108de565b6e5af43d82803e903d91602b57fd5bf390763d602d80600a3d3981f3363d3d373d3d3d363d7300000062ffffff8260881c16175f5260781b17602052603760095ff5906001600160a01b038216156109cc57565b6040516330be1a3d60e21b8152600490fd5b6001600160a01b03166109f081610af7565b507fb919910dcefbf753bfd926ab3b1d3f85d877190c3d01ba1bd585047b99b99f0b5f80a2565b5f602091604051838101906301ffc9a760e01b825263d568451b60e01b602482015260248152610a46816106c8565b5191617530fa5f513d82610a66575b5081610a5f575090565b9050151590565b6020111591505f610a55565b634e487b7160e01b5f52603260045260245ffd5b805f52600360205260405f2054155f14610af257600254600160401b8110156106c35760018101806002558110156104265781907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0155600254905f52600360205260405f2055600190565b505f90565b805f52600560205260405f2054155f14610af257600454600160401b8110156106c35760018101806004558110156104265781907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0155600454905f52600560205260405f205560019056fea264697066735822122037d19da37b5fdf5f8c904ec6eb819a58971727239bf2941b00068cfb9398a12b64736f6c634300081900330000000000000000000000002811086bd8962c536264e711470f7ef9a783a5eb
Deployed Bytecode
0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100e457806314887c58146100df5780635cd8b15e146100da578063715018a6146100d55780638da5cb5b146100d05780639b19251a146100cb578063b42ba2a2146100c6578063b572a966146100c1578063b6caa119146100bc578063cd108ef8146100b7578063f15df2e5146100b2578063f2fde38b146100ad5763f9661602146100a8575f80fd5b610663565b6105d5565b6105af565b61052e565b6104ed565b61043c565b6103cc565b610231565b61020a565b6101b3565b610196565b61014f565b3461013a57602036600319011261013a5760043563ffffffff60e01b811680910361013a5760209063a00ee17960e01b8114908115610129575b506040519015158152f35b6301ffc9a760e01b1490505f61011e565b5f80fd5b6001600160a01b0381160361013a57565b3461013a57602036600319011261013a5760043561016c8161013e565b60018060a01b03165f526005602052602060405f20541515604051908152f35b5f91031261013a57565b3461013a575f36600319011261013a576020600454604051908152f35b3461013a575f36600319011261013a576101cb610876565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461013a575f36600319011261013a575f546040516001600160a01b039091168152602090f35b3461013a5760208060031936011261013a5760048035916102518361013e565b610259610876565b610269610265846108a1565b1590565b6103bc576040516202dd3160ec1b81526001600160a01b039384169382828581885afa918215610388575f9261038d575b5016301480159190610301575b506102f2576102b861026583610a86565b6102e357507feb73900b98b6a3e2b8b01708fe544760cf570d21e7fbe5225f24e48b5b2b432e5f80a2005b60405163ab8823f960e01b8152fd5b604051632776b5cf60e11b8152fd5b604051635d927f4560e11b815290915081818481875afa918215610388575f9261035b575b50506001600160401b036103516103456002546001600160401b031690565b6001600160401b031690565b911614155f6102a7565b61037a9250803d10610381575b61037281836106e3565b810190610727565b5f80610326565b503d610368565b61071c565b6103ae919250833d85116103b5575b6103a681836106e3565b810190610704565b905f61029a565b503d61039c565b50604051632776b5cf60e11b8152fd5b3461013a57602036600319011261013a576004356004548110156104265760045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01546040516001600160a01b039091168152602090f35b610a72565b6001600160401b0381160361013a57565b3461013a57602036600319011261013a576004356104598161042b565b610461610876565b6001600160401b0380600254169116908110156104db57805f52600160205260ff60405f2054166104c957805f52600160205260405f20600160ff198254161790557ffc8245c2838846b295ae66fbe0d08e20c799b737c93b56f7b209df2e5fa2d4585f80a2005b604051630ade74ff60e01b8152600490fd5b604051630f3b16e960e01b8152600490fd5b3461013a57602036600319011261013a576001600160401b036004356105128161042b565b165f526001602052602060ff60405f2054166040519015158152f35b3461013a57604036600319011261013a5760043561054b8161042b565b6024356001600160401b0380821161013a573660238301121561013a57816004013590811161013a57366024828401011161013a576105ab92602461059193019061076d565b6040516001600160a01b0390911681529081906020820190565b0390f35b3461013a575f36600319011261013a5760206001600160401b0360025416604051908152f35b3461013a57602036600319011261013a576004356105f28161013e565b6105fa610876565b6001600160a01b0390811690811561064b575f54826bffffffffffffffffffffffff60a01b8216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b604051631e4fbdf760e01b81525f6004820152602490fd5b3461013a57602036600319011261013a57602061068a6004356106858161042b565b610830565b6040516001600160a01b039091168152f35b634e487b7160e01b5f52604160045260245ffd5b6001600160401b0381116106c357604052565b61069c565b606081019081106001600160401b038211176106c357604052565b90601f801991011681019081106001600160401b038211176106c357604052565b9081602091031261013a57516107198161013e565b90565b6040513d5f823e3d90fd5b9081602091031261013a57516107198161042b565b908060209392818452848401375f828201840152601f01601f1916010190565b91602061071993818152019161073c565b6107cb909392919361077e81610830565b90600454906001600160401b0360405191602083019384521660408201526060808201526107c2816107b460808201888b61073c565b03601f1981018352826106e3565b51902090610978565b926107d5846109de565b6001600160a01b03841691823b1561013a5761080a925f928360405180968195829463439fab9160e01b84526004840161075c565b03925af180156103885761081b5750565b8061082861082e926106b0565b8061018c565b565b6001600160401b03166002548110156104265760025f527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01546001600160a01b031690565b5f546001600160a01b0316330361088957565b60405163118cdaa760e01b8152336004820152602490fd5b604051906020808301815f6301ffc9a760e01b95868452866024820152602481526108cb816106c8565b51617530938685fa933d5f51908661096d575b5085610963575b5084610902575b505050816108f8575090565b6107199150610a17565b839450905f91839460405185810192835263ffffffff60e01b60248201526024815261092d816106c8565b5192fa5f5190913d83610958575b50508161094e575b5015905f80806108ec565b905015155f610943565b101591505f8061093b565b151594505f6108e5565b84111595505f6108de565b6e5af43d82803e903d91602b57fd5bf390763d602d80600a3d3981f3363d3d373d3d3d363d7300000062ffffff8260881c16175f5260781b17602052603760095ff5906001600160a01b038216156109cc57565b6040516330be1a3d60e21b8152600490fd5b6001600160a01b03166109f081610af7565b507fb919910dcefbf753bfd926ab3b1d3f85d877190c3d01ba1bd585047b99b99f0b5f80a2565b5f602091604051838101906301ffc9a760e01b825263d568451b60e01b602482015260248152610a46816106c8565b5191617530fa5f513d82610a66575b5081610a5f575090565b9050151590565b6020111591505f610a55565b634e487b7160e01b5f52603260045260245ffd5b805f52600360205260405f2054155f14610af257600254600160401b8110156106c35760018101806002558110156104265781907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0155600254905f52600360205260405f2055600190565b505f90565b805f52600560205260405f2054155f14610af257600454600160401b8110156106c35760018101806004558110156104265781907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0155600454905f52600560205260405f205560019056fea264697066735822122037d19da37b5fdf5f8c904ec6eb819a58971727239bf2941b00068cfb9398a12b64736f6c63430008190033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002811086bd8962c536264e711470f7ef9a783a5eb
-----Decoded View---------------
Arg [0] : owner_ (address): 0x2811086Bd8962C536264e711470f7ef9A783a5eB
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002811086bd8962c536264e711470f7ef9a783a5eb
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.