Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
14962540 | 916 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
PausableZoneController
Compiler Version
v0.8.14+commit.80d49f37
Optimization Enabled:
Yes with 19066 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.8.7; import { PausableZone } from "./PausableZone.sol"; // prettier-ignore import { PausableZoneControllerInterface } from "./interfaces/PausableZoneControllerInterface.sol"; // prettier-ignore import { PausableZoneEventsAndErrors } from "./interfaces/PausableZoneEventsAndErrors.sol"; // prettier-ignore import { Order, Fulfillment, OrderComponents, AdvancedOrder, CriteriaResolver, Execution } from "../lib/ConsiderationStructs.sol"; import { SeaportInterface } from "../interfaces/SeaportInterface.sol"; /** * @title PausableZoneController * @author cupOJoseph, BCLeFevre, stuckinaboot, stephankmin * @notice PausableZoneController enables deploying, pausing and executing * orders on PausableZones. This deployer is designed to be owned * by a gnosis safe, DAO, or trusted party. */ contract PausableZoneController is PausableZoneControllerInterface, PausableZoneEventsAndErrors { // Set the owner that can deploy, pause and execute orders on PausableZones. address internal _owner; // Set the address of the new potential owner of the zone. address private _potentialOwner; // Set the address with the ability to pause the zone. address internal _pauser; // Set the immutable zone creation code hash. bytes32 public immutable zoneCreationCode; /** * @dev Throws if called by any account other than the owner or pauser. */ modifier isPauser() { if (msg.sender != _pauser && msg.sender != _owner) { revert InvalidPauser(); } _; } /** * @notice Set the owner of the controller and store * the zone creation code. * * @param ownerAddress The deployer to be set as the owner. */ constructor(address ownerAddress) { // Set the owner address as the owner. _owner = ownerAddress; // Hash and store the zone creation code. zoneCreationCode = keccak256(type(PausableZone).creationCode); } /** * @notice Deploy a PausableZone to a precomputed address. * * @param salt The salt to be used to derive the zone address * * @return derivedAddress The derived address for the zone. */ function createZone(bytes32 salt) external override returns (address derivedAddress) { // Ensure the caller is the owner. require( msg.sender == _owner, "Only owner can create new Zones from here." ); // Derive the PausableZone address. // This expression demonstrates address computation but is not required. derivedAddress = address( uint160( uint256( keccak256( abi.encodePacked( bytes1(0xff), address(this), salt, zoneCreationCode ) ) ) ) ); // Revert if a zone is currently deployed to the derived address. if (derivedAddress.code.length != 0) { revert ZoneAlreadyExists(derivedAddress); } // Deploy the zone using the supplied salt. new PausableZone{ salt: salt }(); // Emit an event signifying that the zone was created. emit ZoneCreated(derivedAddress, salt); } /** * @notice Pause orders on a given zone. * * @param zone The address of the zone to be paused. * * @return success A boolean indicating the zone has been paused. */ function pause(address zone) external override isPauser returns (bool success) { // Call pause on the given zone. PausableZone(zone).pause(); // Return a boolean indicating the pause was successful. success = true; } /** * @notice Cancel Seaport orders on a given zone. * * @param pausableZoneAddress The zone that manages the orders to be cancelled. * @param seaportAddress The Seaport address. * @param orders The orders to cancel. */ function cancelOrders( address pausableZoneAddress, SeaportInterface seaportAddress, OrderComponents[] calldata orders ) external override { // Ensure the caller is the owner. require( msg.sender == _owner, "Only the owner can cancel orders with the zone." ); // Create a zone object from the zone address. PausableZone zone = PausableZone(pausableZoneAddress); // Call cancelOrders on the given zone. zone.cancelOrders(seaportAddress, orders); } /** * @notice Execute an arbitrary number of matched orders on a given zone. * * @param pausableZoneAddress The zone that manages the orders to be cancelled. * @param seaportAddress The Seaport address. * @param orders The orders to match. * @param fulfillments An array of elements allocating offer components * to consideration components. * * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. */ function executeMatchOrders( address pausableZoneAddress, SeaportInterface seaportAddress, Order[] calldata orders, Fulfillment[] calldata fulfillments ) external payable override returns (Execution[] memory executions) { // Ensure the caller is the owner. require( msg.sender == _owner, "Only the owner can execute orders with the zone." ); // Create a zone object from the zone address. PausableZone zone = PausableZone(pausableZoneAddress); // Call executeMatchOrders on the given zone and return the sequence // of transfers performed as part of matching the given orders. executions = zone.executeMatchOrders{ value: msg.value }( seaportAddress, orders, fulfillments ); } /** * @notice Execute an arbitrary number of matched advanced orders on a given zone. * * @param pausableZoneAddress The zone that manages the orders to be cancelled. * @param seaportAddress The Seaport address. * @param orders The orders to match. * @param criteriaResolvers An array where each element contains a reference * to a specific order as well as that order's * offer or consideration, a token identifier, and * a proof that the supplied token identifier is * contained in the order's merkle root. * @param fulfillments An array of elements allocating offer components * to consideration components. * * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. */ function executeMatchAdvancedOrders( address pausableZoneAddress, SeaportInterface seaportAddress, AdvancedOrder[] calldata orders, CriteriaResolver[] calldata criteriaResolvers, Fulfillment[] calldata fulfillments ) external payable override returns (Execution[] memory executions) { // Ensure the caller is the owner. require( msg.sender == _owner, "Only the owner can execute advanced orders with the zone." ); // Create a zone object from the zone address. PausableZone zone = PausableZone(pausableZoneAddress); // Call executeMatchOrders on the given zone and return the sequence // of transfers performed as part of matching the given orders. executions = zone.executeMatchAdvancedOrders{ value: msg.value }( seaportAddress, orders, criteriaResolvers, fulfillments ); } /** * @notice Initiate Zone ownership transfer by assigning a new potential * owner this contract. Once set, the new potential owner * may call `acceptOwnership` to claim ownership. * Only the owner in question may call this function. * * @param newPotentialOwner The address for which to initiate ownership * transfer to. */ function transferOwnership(address newPotentialOwner) external override { // Ensure the caller is the owner. require(msg.sender == _owner, "Only Owner can transfer Ownership."); // Ensure the new potential owner is not an invalid address. require( newPotentialOwner != address(0), "New Owner can not be 0 address." ); // Emit an event indicating that the potential owner has been updated. emit PotentialOwnerUpdated(newPotentialOwner); // Set the new potential owner as the potential owner. _potentialOwner = newPotentialOwner; } /** * @notice Clear the currently set potential owner, if any. * Only the owner of this contract may call this function. */ function cancelOwnershipTransfer() external override { // Ensure the caller is the current owner. require(msg.sender == _owner, "Only Owner can cancel."); // Emit an event indicating that the potential owner has been cleared. emit PotentialOwnerUpdated(address(0)); // Clear the current new potential owner. delete _potentialOwner; } /** * @notice Accept ownership of this contract. Only the account that the * current owner has set as the new potential owner may call this * function. */ function acceptOwnership() external override { // Ensure the caller is the potential owner. require( msg.sender == _potentialOwner, "Only Potential Owner can claim." ); // Emit an event indicating that the potential owner has been cleared. emit PotentialOwnerUpdated(address(0)); // Clear the current new potential owner delete _potentialOwner; // Emit an event indicating ownership has been transferred. emit OwnershipTransferred(_owner, msg.sender); // Set the caller as the owner of this contract. _owner = msg.sender; } /** * @notice Assign the given address with the ability to pause the zone. * * @param pauserToAssign The address to assign the pauser role. */ function assignPauser(address pauserToAssign) external override { // Ensure the caller is the owner. require(msg.sender == _owner, "Can only be set by the deployer"); // Ensure the pauser to assign is not an invalid address. require( pauserToAssign != address(0), "Pauser can not be set to the null address" ); // Set the given account as the pauser. _pauser = pauserToAssign; // Emit an event indicating the pauser has been assigned. emit PauserUpdated(_pauser); } /** * @notice Assign the given address with the ability to operate the * given zone. * * @param pausableZoneAddress The zone address to assign operator role. * @param operatorToAssign The address to assign as operator. */ function assignOperator( address pausableZoneAddress, address operatorToAssign ) external override { // Ensure the caller is the owner. require(msg.sender == _owner, "Can only be set by the deployer"); // Create a zone object from the zone address. PausableZone zone = PausableZone(pausableZoneAddress); // Call assignOperator on the zone by passing in the given operator address. zone.assignOperator(operatorToAssign); } /** * @notice An external view function that returns the owner. * * @return The address of the owner. */ function owner() external view override returns (address) { return _owner; } /** * @notice An external view function that return the potential owner. * * @return The address of the potential owner. */ function potentialOwner() external view override returns (address) { return _potentialOwner; } /** * @notice An external view function that returns the pauser. * * @return The address of the pauser. */ function pauser() external view override returns (address) { return _pauser; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.7; import { ZoneInterface } from "../interfaces/ZoneInterface.sol"; import { ZoneInteractionErrors } from "../interfaces/ZoneInteractionErrors.sol"; // prettier-ignore import { PausableZoneEventsAndErrors } from "./interfaces/PausableZoneEventsAndErrors.sol"; import { SeaportInterface } from "../interfaces/SeaportInterface.sol"; // prettier-ignore import { AdvancedOrder, CriteriaResolver, Order, OrderComponents, Fulfillment, Execution } from "../lib/ConsiderationStructs.sol"; import { PausableZoneInterface } from "./interfaces/PausableZoneInterface.sol"; /** * @title PausableZone * @author cupOJoseph, BCLeFevre, ryanio * @notice PausableZone is a simple zone implementation that approves every * order. It can be self-destructed by its controller to pause * restricted orders that have it set as their zone. */ contract PausableZone is PausableZoneEventsAndErrors, ZoneInterface, PausableZoneInterface { // Set an immutable controller that can pause the zone & update an operator. address internal immutable _controller; // Set an operator that can instruct the zone to cancel or execute orders. address public operator; /** * @dev Ensure that the caller is either the operator or controller. */ modifier isOperator() { // Ensure that the caller is either the operator or the controller. if (msg.sender != operator && msg.sender != _controller) { revert InvalidOperator(); } // Continue with function execution. _; } /** * @dev Ensure that the caller is the controller. */ modifier isController() { // Ensure that the caller is the controller. if (msg.sender != _controller) { revert InvalidController(); } // Continue with function execution. _; } /** * @notice Set the deployer as the controller of the zone. */ constructor() { // Set the controller to the deployer. _controller = msg.sender; // Emit an event signifying that the zone is unpaused. emit Unpaused(); } /** * @notice Check if a given order is currently valid. * * @dev This function is called by Seaport whenever extraData is not * provided by the caller. * * @param orderHash The hash of the order. * @param caller The caller in question. * @param offerer The offerer in question. * @param zoneHash The hash to provide upon calling the zone. * * @return validOrderMagicValue A magic value indicating if the order is * currently valid. */ function isValidOrder( bytes32 orderHash, address caller, address offerer, bytes32 zoneHash ) external pure override returns (bytes4 validOrderMagicValue) { orderHash; caller; offerer; zoneHash; // Return the selector of isValidOrder as the magic value. validOrderMagicValue = ZoneInterface.isValidOrder.selector; } /** * @notice Check if a given order including extraData is currently valid. * * @dev This function is called by Seaport whenever any extraData is * provided by the caller. * * @param orderHash The hash of the order. * @param caller The caller in question. * @param order The order in question. * @param priorOrderHashes The order hashes of each order supplied prior to * the current order as part of a "match" variety * of order fulfillment. * @param criteriaResolvers The criteria resolvers corresponding to * the order. * * @return validOrderMagicValue A magic value indicating if the order is * currently valid. */ function isValidOrderIncludingExtraData( bytes32 orderHash, address caller, AdvancedOrder calldata order, bytes32[] calldata priorOrderHashes, CriteriaResolver[] calldata criteriaResolvers ) external pure override returns (bytes4 validOrderMagicValue) { orderHash; caller; order; priorOrderHashes; criteriaResolvers; // Return the selector of isValidOrder as the magic value. validOrderMagicValue = ZoneInterface.isValidOrder.selector; } /** * @notice Cancel an arbitrary number of orders that have agreed to use the * contract as their zone. * * @param seaport The Seaport address. * @param orders The orders to cancel. * * @return cancelled A boolean indicating whether the supplied orders have * been successfully cancelled. */ function cancelOrders( SeaportInterface seaport, OrderComponents[] calldata orders ) external override isOperator returns (bool cancelled) { // Call cancel on Seaport and return its boolean value. cancelled = seaport.cancel(orders); } /** * @notice Execute an arbitrary number of matched orders, each with * an arbitrary number of items for offer and consideration * along with a set of fulfillments allocating offer components * to consideration components. * * @param seaport The Seaport address. * @param orders The orders to match. * @param fulfillments An array of elements allocating offer components * to consideration components. * * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. */ function executeMatchOrders( SeaportInterface seaport, Order[] calldata orders, Fulfillment[] calldata fulfillments ) external payable override isOperator returns (Execution[] memory executions) { // Call matchOrders on Seaport and return the sequence of transfers // performed as part of matching the given orders. executions = seaport.matchOrders{ value: msg.value }( orders, fulfillments ); } /** * @notice Execute an arbitrary number of matched advanced orders, * each with an arbitrary number of items for offer and * consideration along with a set of fulfillments allocating * offer components to consideration components. * * @param seaport The Seaport address. * @param orders The orders to match. * @param criteriaResolvers An array where each element contains a reference * to a specific order as well as that order's * offer or consideration, a token identifier, and * a proof that the supplied token identifier is * contained in the order's merkle root. * @param fulfillments An array of elements allocating offer components * to consideration components. * * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. */ function executeMatchAdvancedOrders( SeaportInterface seaport, AdvancedOrder[] calldata orders, CriteriaResolver[] calldata criteriaResolvers, Fulfillment[] calldata fulfillments ) external payable override isOperator returns (Execution[] memory executions) { // Call matchAdvancedOrders on Seaport and return the sequence of // transfers performed as part of matching the given orders. executions = seaport.matchAdvancedOrders{ value: msg.value }( orders, criteriaResolvers, fulfillments ); } /** * @notice Pause this contract, safely stopping orders from using * the contract as a zone. Restricted orders with this address as a * zone will not be fulfillable unless the zone is redeployed to the * same address. */ function pause() external override isController { // Emit an event signifying that the zone is paused. emit Paused(); // Destroy the zone, sending any ether to the transaction submitter. selfdestruct(payable(tx.origin)); } /** * @notice Assign the given address with the ability to operate the zone. * * @param operatorToAssign The address to assign as the operator. */ function assignOperator(address operatorToAssign) external override isController { // Ensure the operator being assigned is not the null address. require( operatorToAssign != address(0), "Operator can not be set to the null address" ); // Set the given address as the new operator. operator = operatorToAssign; // Emit an event indicating the operator has been updated. emit OperatorUpdated(operator); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.7; import { PausableZone } from "../PausableZone.sol"; // prettier-ignore import { PausableZoneEventsAndErrors } from "./PausableZoneEventsAndErrors.sol"; // prettier-ignore import { Order, Fulfillment, OrderComponents, AdvancedOrder, CriteriaResolver, Execution } from "../../lib/ConsiderationStructs.sol"; import { SeaportInterface } from "../../interfaces/SeaportInterface.sol"; /** * @title PausableZoneController * @author cupOJoseph, BCLeFevre, stuckinaboot * @notice PausableZoneController enables deploying, pausing and executing * orders on PausableZones. This deployer is designed to be owned * by a gnosis safe, DAO, or trusted party. */ interface PausableZoneControllerInterface { /** * @notice Deploy a PausableZone to a precomputed address. * * @param salt The salt to be used to derive the zone address * * @return derivedAddress The derived address for the zone. */ function createZone(bytes32 salt) external returns (address derivedAddress); /** * @notice Pause orders on a given zone. * * @param zone The address of the zone to be paused. * * @return success A boolean indicating the zone has been paused. */ function pause(address zone) external returns (bool success); /** * @notice Cancel Seaport offers on a given zone. * * @param pausableZoneAddress The zone that manages the orders to be * cancelled. * @param seaportAddress The Seaport address. * @param orders The orders to cancel. */ function cancelOrders( address pausableZoneAddress, SeaportInterface seaportAddress, OrderComponents[] calldata orders ) external; /** * @notice Execute an arbitrary number of matched orders on a given zone. * * @param pausableZoneAddress The zone that manages the orders to be * cancelled. * @param seaportAddress The Seaport address. * @param orders The orders to match. * @param fulfillments An array of elements allocating offer components * to consideration components. * * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. */ function executeMatchOrders( address pausableZoneAddress, SeaportInterface seaportAddress, Order[] calldata orders, Fulfillment[] calldata fulfillments ) external payable returns (Execution[] memory executions); /** * @notice Execute an arbitrary number of matched advanced orders on a * given zone. * * @param pausableZoneAddress The zone that manages the orders to be * cancelled. * @param seaportAddress The Seaport address. * @param orders The orders to match. * @param criteriaResolvers An array where each element contains a * reference to a specific order as well as * that order's offer or consideration, * a token identifier, and a proof that * the supplied token identifier is * contained in the order's merkle root. * @param fulfillments An array of elements allocating offer * components to consideration components. * * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. */ function executeMatchAdvancedOrders( address pausableZoneAddress, SeaportInterface seaportAddress, AdvancedOrder[] calldata orders, CriteriaResolver[] calldata criteriaResolvers, Fulfillment[] calldata fulfillments ) external payable returns (Execution[] memory executions); /** * @notice Initiate Zone ownership transfer by assigning a new potential * owner this contract. Once set, the new potential owner * may call `acceptOwnership` to claim ownership. * Only the owner in question may call this function. * * @param newPotentialOwner The address for which to initiate ownership * transfer to. */ function transferOwnership(address newPotentialOwner) external; /** * @notice Clear the currently set potential owner, if any. * Only the owner of this contract may call this function. */ function cancelOwnershipTransfer() external; /** * @notice Accept ownership of this contract. Only the account that the * current owner has set as the new potential owner may call this * function. */ function acceptOwnership() external; /** * @notice Assign the given address with the ability to pause the zone. * * @param pauserToAssign The address to assign the pauser role. */ function assignPauser(address pauserToAssign) external; /** * @notice Assign the given address with the ability to operate the * given zone. * * @param pausableZoneAddress The zone address to assign operator role. * @param operatorToAssign The address to assign as operator. */ function assignOperator( address pausableZoneAddress, address operatorToAssign ) external; /** * @notice An external view function that returns the owner. * * @return The address of the owner. */ function owner() external view returns (address); /** * @notice An external view function that return the potential owner. * * @return The address of the potential owner. */ function potentialOwner() external view returns (address); /** * @notice An external view function that returns the pauser. * * @return The address of the pauser. */ function pauser() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.7; /** * @notice PausableZoneEventsAndErrors contains errors and events * related to zone interaction. */ interface PausableZoneEventsAndErrors { /** * @dev Emit an event whenever a zone owner registers a new potential * owner for that zone. * * @param newPotentialOwner The new potential owner of the zone. */ event PotentialOwnerUpdated(address newPotentialOwner); /** * @dev Emit an event whenever zone ownership is transferred. * * @param previousOwner The previous owner of the zone. * @param newOwner The new owner of the zone. */ event OwnershipTransferred(address previousOwner, address newOwner); /** * @dev Emit an event whenever a new zone is created. * * @param zone The address of the zone. * @param salt The salt used to deploy the zone. */ event ZoneCreated(address zone, bytes32 salt); /** * @dev Emit an event whenever a zone owner assigns a new pauser * * @param newPauser The new pausear of the zone. */ event PauserUpdated(address newPauser); /** * @dev Emit an event whenever a zone owner assigns a new operator * * @param newOperator The new operator of the zone. */ event OperatorUpdated(address newOperator); /** * @dev Revert with an error when attempting to pause the zone * while the caller is not the owner or pauser of the zone. */ error InvalidPauser(); /** * @dev Revert with an error when attempting to call an operation * while the caller is not the controller or operator of the zone. */ error InvalidOperator(); /** * @dev Revert with an error when attempting to pause the zone or update the * operator while the caller is not the controller of the zone. */ error InvalidController(); /** * @dev Revert with an error when attempting to deploy a zone that is * currently deployed. */ error ZoneAlreadyExists(address zone); }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.7; // prettier-ignore import { OrderType, BasicOrderType, ItemType, Side } from "./ConsiderationEnums.sol"; /** * @dev An order contains eleven components: an offerer, a zone (or account that * can cancel the order or restrict who can fulfill the order depending on * the type), the order type (specifying partial fill support as well as * restricted order status), the start and end time, a hash that will be * provided to the zone when validating restricted orders, a salt, a key * corresponding to a given conduit, a counter, and an arbitrary number of * offer items that can be spent along with consideration items that must * be received by their respective recipient. */ struct OrderComponents { address offerer; address zone; OfferItem[] offer; ConsiderationItem[] consideration; OrderType orderType; uint256 startTime; uint256 endTime; bytes32 zoneHash; uint256 salt; bytes32 conduitKey; uint256 counter; } /** * @dev An offer item has five components: an item type (ETH or other native * tokens, ERC20, ERC721, and ERC1155, as well as criteria-based ERC721 and * ERC1155), a token address, a dual-purpose "identifierOrCriteria" * component that will either represent a tokenId or a merkle root * depending on the item type, and a start and end amount that support * increasing or decreasing amounts over the duration of the respective * order. */ struct OfferItem { ItemType itemType; address token; uint256 identifierOrCriteria; uint256 startAmount; uint256 endAmount; } /** * @dev A consideration item has the same five components as an offer item and * an additional sixth component designating the required recipient of the * item. */ struct ConsiderationItem { ItemType itemType; address token; uint256 identifierOrCriteria; uint256 startAmount; uint256 endAmount; address payable recipient; } /** * @dev A spent item is translated from a utilized offer item and has four * components: an item type (ETH or other native tokens, ERC20, ERC721, and * ERC1155), a token address, a tokenId, and an amount. */ struct SpentItem { ItemType itemType; address token; uint256 identifier; uint256 amount; } /** * @dev A received item is translated from a utilized consideration item and has * the same four components as a spent item, as well as an additional fifth * component designating the required recipient of the item. */ struct ReceivedItem { ItemType itemType; address token; uint256 identifier; uint256 amount; address payable recipient; } /** * @dev For basic orders involving ETH / native / ERC20 <=> ERC721 / ERC1155 * matching, a group of six functions may be called that only requires a * subset of the usual order arguments. Note the use of a "basicOrderType" * enum; this represents both the usual order type as well as the "route" * of the basic order (a simple derivation function for the basic order * type is `basicOrderType = orderType + (4 * basicOrderRoute)`.) */ struct BasicOrderParameters { // calldata offset address considerationToken; // 0x24 uint256 considerationIdentifier; // 0x44 uint256 considerationAmount; // 0x64 address payable offerer; // 0x84 address zone; // 0xa4 address offerToken; // 0xc4 uint256 offerIdentifier; // 0xe4 uint256 offerAmount; // 0x104 BasicOrderType basicOrderType; // 0x124 uint256 startTime; // 0x144 uint256 endTime; // 0x164 bytes32 zoneHash; // 0x184 uint256 salt; // 0x1a4 bytes32 offererConduitKey; // 0x1c4 bytes32 fulfillerConduitKey; // 0x1e4 uint256 totalOriginalAdditionalRecipients; // 0x204 AdditionalRecipient[] additionalRecipients; // 0x224 bytes signature; // 0x244 // Total length, excluding dynamic array data: 0x264 (580) } /** * @dev Basic orders can supply any number of additional recipients, with the * implied assumption that they are supplied from the offered ETH (or other * native token) or ERC20 token for the order. */ struct AdditionalRecipient { uint256 amount; address payable recipient; } /** * @dev The full set of order components, with the exception of the counter, * must be supplied when fulfilling more sophisticated orders or groups of * orders. The total number of original consideration items must also be * supplied, as the caller may specify additional consideration items. */ struct OrderParameters { address offerer; // 0x00 address zone; // 0x20 OfferItem[] offer; // 0x40 ConsiderationItem[] consideration; // 0x60 OrderType orderType; // 0x80 uint256 startTime; // 0xa0 uint256 endTime; // 0xc0 bytes32 zoneHash; // 0xe0 uint256 salt; // 0x100 bytes32 conduitKey; // 0x120 uint256 totalOriginalConsiderationItems; // 0x140 // offer.length // 0x160 } /** * @dev Orders require a signature in addition to the other order parameters. */ struct Order { OrderParameters parameters; bytes signature; } /** * @dev Advanced orders include a numerator (i.e. a fraction to attempt to fill) * and a denominator (the total size of the order) in addition to the * signature and other order parameters. It also supports an optional field * for supplying extra data; this data will be included in a staticcall to * `isValidOrderIncludingExtraData` on the zone for the order if the order * type is restricted and the offerer or zone are not the caller. */ struct AdvancedOrder { OrderParameters parameters; uint120 numerator; uint120 denominator; bytes signature; bytes extraData; } /** * @dev Orders can be validated (either explicitly via `validate`, or as a * consequence of a full or partial fill), specifically cancelled (they can * also be cancelled in bulk via incrementing a per-zone counter), and * partially or fully filled (with the fraction filled represented by a * numerator and denominator). */ struct OrderStatus { bool isValidated; bool isCancelled; uint120 numerator; uint120 denominator; } /** * @dev A criteria resolver specifies an order, side (offer vs. consideration), * and item index. It then provides a chosen identifier (i.e. tokenId) * alongside a merkle proof demonstrating the identifier meets the required * criteria. */ struct CriteriaResolver { uint256 orderIndex; Side side; uint256 index; uint256 identifier; bytes32[] criteriaProof; } /** * @dev A fulfillment is applied to a group of orders. It decrements a series of * offer and consideration items, then generates a single execution * element. A given fulfillment can be applied to as many offer and * consideration items as desired, but must contain at least one offer and * at least one consideration that match. The fulfillment must also remain * consistent on all key parameters across all offer items (same offerer, * token, type, tokenId, and conduit preference) as well as across all * consideration items (token, type, tokenId, and recipient). */ struct Fulfillment { FulfillmentComponent[] offerComponents; FulfillmentComponent[] considerationComponents; } /** * @dev Each fulfillment component contains one index referencing a specific * order and another referencing a specific offer or consideration item. */ struct FulfillmentComponent { uint256 orderIndex; uint256 itemIndex; } /** * @dev An execution is triggered once all consideration items have been zeroed * out. It sends the item in question from the offerer to the item's * recipient, optionally sourcing approvals from either this contract * directly or from the offerer's chosen conduit if one is specified. An * execution is not provided as an argument, but rather is derived via * orders, criteria resolvers, and fulfillments (where the total number of * executions will be less than or equal to the total number of indicated * fulfillments) and returned as part of `matchOrders`. */ struct Execution { ReceivedItem item; address offerer; bytes32 conduitKey; }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.7; // prettier-ignore import { BasicOrderParameters, OrderComponents, Fulfillment, FulfillmentComponent, Execution, Order, AdvancedOrder, OrderStatus, CriteriaResolver } from "../lib/ConsiderationStructs.sol"; /** * @title SeaportInterface * @author 0age * @custom:version 1.1 * @notice Seaport is a generalized ETH/ERC20/ERC721/ERC1155 marketplace. It * minimizes external calls to the greatest extent possible and provides * lightweight methods for common routes as well as more flexible * methods for composing advanced orders. * * @dev SeaportInterface contains all external function interfaces for Seaport. */ interface SeaportInterface { /** * @notice Fulfill an order offering an ERC721 token by supplying Ether (or * the native token for the given chain) as consideration for the * order. An arbitrary number of "additional recipients" may also be * supplied which will each receive native tokens from the fulfiller * as consideration. * * @param parameters Additional information on the fulfilled order. Note * that the offerer must first approve this contract (or * their preferred conduit if indicated by the order) for * their offered ERC721 token to be transferred. * * @return fulfilled A boolean indicating whether the order has been * successfully fulfilled. */ function fulfillBasicOrder(BasicOrderParameters calldata parameters) external payable returns (bool fulfilled); /** * @notice Fulfill an order with an arbitrary number of items for offer and * consideration. Note that this function does not support * criteria-based orders or partial filling of orders (though * filling the remainder of a partially-filled order is supported). * * @param order The order to fulfill. Note that both the * offerer and the fulfiller must first approve * this contract (or the corresponding conduit if * indicated) to transfer any relevant tokens on * their behalf and that contracts must implement * `onERC1155Received` to receive ERC1155 tokens * as consideration. * @param fulfillerConduitKey A bytes32 value indicating what conduit, if * any, to source the fulfiller's token approvals * from. The zero hash signifies that no conduit * should be used, with direct approvals set on * Seaport. * * @return fulfilled A boolean indicating whether the order has been * successfully fulfilled. */ function fulfillOrder(Order calldata order, bytes32 fulfillerConduitKey) external payable returns (bool fulfilled); /** * @notice Fill an order, fully or partially, with an arbitrary number of * items for offer and consideration alongside criteria resolvers * containing specific token identifiers and associated proofs. * * @param advancedOrder The order to fulfill along with the fraction * of the order to attempt to fill. Note that * both the offerer and the fulfiller must first * approve this contract (or their preferred * conduit if indicated by the order) to transfer * any relevant tokens on their behalf and that * contracts must implement `onERC1155Received` * to receive ERC1155 tokens as consideration. * Also note that all offer and consideration * components must have no remainder after * multiplication of the respective amount with * the supplied fraction for the partial fill to * be considered valid. * @param criteriaResolvers An array where each element contains a * reference to a specific offer or * consideration, a token identifier, and a proof * that the supplied token identifier is * contained in the merkle root held by the item * in question's criteria element. Note that an * empty criteria indicates that any * (transferable) token identifier on the token * in question is valid and that no associated * proof needs to be supplied. * @param fulfillerConduitKey A bytes32 value indicating what conduit, if * any, to source the fulfiller's token approvals * from. The zero hash signifies that no conduit * should be used, with direct approvals set on * Seaport. * @param recipient The intended recipient for all received items, * with `address(0)` indicating that the caller * should receive the items. * * @return fulfilled A boolean indicating whether the order has been * successfully fulfilled. */ function fulfillAdvancedOrder( AdvancedOrder calldata advancedOrder, CriteriaResolver[] calldata criteriaResolvers, bytes32 fulfillerConduitKey, address recipient ) external payable returns (bool fulfilled); /** * @notice Attempt to fill a group of orders, each with an arbitrary number * of items for offer and consideration. Any order that is not * currently active, has already been fully filled, or has been * cancelled will be omitted. Remaining offer and consideration * items will then be aggregated where possible as indicated by the * supplied offer and consideration component arrays and aggregated * items will be transferred to the fulfiller or to each intended * recipient, respectively. Note that a failing item transfer or an * issue with order formatting will cause the entire batch to fail. * Note that this function does not support criteria-based orders or * partial filling of orders (though filling the remainder of a * partially-filled order is supported). * * @param orders The orders to fulfill. Note that both * the offerer and the fulfiller must first * approve this contract (or the * corresponding conduit if indicated) to * transfer any relevant tokens on their * behalf and that contracts must implement * `onERC1155Received` to receive ERC1155 * tokens as consideration. * @param offerFulfillments An array of FulfillmentComponent arrays * indicating which offer items to attempt * to aggregate when preparing executions. * @param considerationFulfillments An array of FulfillmentComponent arrays * indicating which consideration items to * attempt to aggregate when preparing * executions. * @param fulfillerConduitKey A bytes32 value indicating what conduit, * if any, to source the fulfiller's token * approvals from. The zero hash signifies * that no conduit should be used, with * direct approvals set on this contract. * @param maximumFulfilled The maximum number of orders to fulfill. * * @return availableOrders An array of booleans indicating if each order * with an index corresponding to the index of the * returned boolean was fulfillable or not. * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. */ function fulfillAvailableOrders( Order[] calldata orders, FulfillmentComponent[][] calldata offerFulfillments, FulfillmentComponent[][] calldata considerationFulfillments, bytes32 fulfillerConduitKey, uint256 maximumFulfilled ) external payable returns (bool[] memory availableOrders, Execution[] memory executions); /** * @notice Attempt to fill a group of orders, fully or partially, with an * arbitrary number of items for offer and consideration per order * alongside criteria resolvers containing specific token * identifiers and associated proofs. Any order that is not * currently active, has already been fully filled, or has been * cancelled will be omitted. Remaining offer and consideration * items will then be aggregated where possible as indicated by the * supplied offer and consideration component arrays and aggregated * items will be transferred to the fulfiller or to each intended * recipient, respectively. Note that a failing item transfer or an * issue with order formatting will cause the entire batch to fail. * * @param advancedOrders The orders to fulfill along with the * fraction of those orders to attempt to * fill. Note that both the offerer and the * fulfiller must first approve this * contract (or their preferred conduit if * indicated by the order) to transfer any * relevant tokens on their behalf and that * contracts must implement * `onERC1155Received` to enable receipt of * ERC1155 tokens as consideration. Also * note that all offer and consideration * components must have no remainder after * multiplication of the respective amount * with the supplied fraction for an * order's partial fill amount to be * considered valid. * @param criteriaResolvers An array where each element contains a * reference to a specific offer or * consideration, a token identifier, and a * proof that the supplied token identifier * is contained in the merkle root held by * the item in question's criteria element. * Note that an empty criteria indicates * that any (transferable) token * identifier on the token in question is * valid and that no associated proof needs * to be supplied. * @param offerFulfillments An array of FulfillmentComponent arrays * indicating which offer items to attempt * to aggregate when preparing executions. * @param considerationFulfillments An array of FulfillmentComponent arrays * indicating which consideration items to * attempt to aggregate when preparing * executions. * @param fulfillerConduitKey A bytes32 value indicating what conduit, * if any, to source the fulfiller's token * approvals from. The zero hash signifies * that no conduit should be used, with * direct approvals set on this contract. * @param recipient The intended recipient for all received * items, with `address(0)` indicating that * the caller should receive the items. * @param maximumFulfilled The maximum number of orders to fulfill. * * @return availableOrders An array of booleans indicating if each order * with an index corresponding to the index of the * returned boolean was fulfillable or not. * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. */ function fulfillAvailableAdvancedOrders( AdvancedOrder[] calldata advancedOrders, CriteriaResolver[] calldata criteriaResolvers, FulfillmentComponent[][] calldata offerFulfillments, FulfillmentComponent[][] calldata considerationFulfillments, bytes32 fulfillerConduitKey, address recipient, uint256 maximumFulfilled ) external payable returns (bool[] memory availableOrders, Execution[] memory executions); /** * @notice Match an arbitrary number of orders, each with an arbitrary * number of items for offer and consideration along with as set of * fulfillments allocating offer components to consideration * components. Note that this function does not support * criteria-based or partial filling of orders (though filling the * remainder of a partially-filled order is supported). * * @param orders The orders to match. Note that both the offerer and * fulfiller on each order must first approve this * contract (or their conduit if indicated by the order) * to transfer any relevant tokens on their behalf and * each consideration recipient must implement * `onERC1155Received` to enable ERC1155 token receipt. * @param fulfillments An array of elements allocating offer components to * consideration components. Note that each * consideration component must be fully met for the * match operation to be valid. * * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. */ function matchOrders( Order[] calldata orders, Fulfillment[] calldata fulfillments ) external payable returns (Execution[] memory executions); /** * @notice Match an arbitrary number of full or partial orders, each with an * arbitrary number of items for offer and consideration, supplying * criteria resolvers containing specific token identifiers and * associated proofs as well as fulfillments allocating offer * components to consideration components. * * @param orders The advanced orders to match. Note that both the * offerer and fulfiller on each order must first * approve this contract (or a preferred conduit if * indicated by the order) to transfer any relevant * tokens on their behalf and each consideration * recipient must implement `onERC1155Received` in * order to receive ERC1155 tokens. Also note that * the offer and consideration components for each * order must have no remainder after multiplying * the respective amount with the supplied fraction * in order for the group of partial fills to be * considered valid. * @param criteriaResolvers An array where each element contains a reference * to a specific order as well as that order's * offer or consideration, a token identifier, and * a proof that the supplied token identifier is * contained in the order's merkle root. Note that * an empty root indicates that any (transferable) * token identifier is valid and that no associated * proof needs to be supplied. * @param fulfillments An array of elements allocating offer components * to consideration components. Note that each * consideration component must be fully met in * order for the match operation to be valid. * * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. */ function matchAdvancedOrders( AdvancedOrder[] calldata orders, CriteriaResolver[] calldata criteriaResolvers, Fulfillment[] calldata fulfillments ) external payable returns (Execution[] memory executions); /** * @notice Cancel an arbitrary number of orders. Note that only the offerer * or the zone of a given order may cancel it. Callers should ensure * that the intended order was cancelled by calling `getOrderStatus` * and confirming that `isCancelled` returns `true`. * * @param orders The orders to cancel. * * @return cancelled A boolean indicating whether the supplied orders have * been successfully cancelled. */ function cancel(OrderComponents[] calldata orders) external returns (bool cancelled); /** * @notice Validate an arbitrary number of orders, thereby registering their * signatures as valid and allowing the fulfiller to skip signature * verification on fulfillment. Note that validated orders may still * be unfulfillable due to invalid item amounts or other factors; * callers should determine whether validated orders are fulfillable * by simulating the fulfillment call prior to execution. Also note * that anyone can validate a signed order, but only the offerer can * validate an order without supplying a signature. * * @param orders The orders to validate. * * @return validated A boolean indicating whether the supplied orders have * been successfully validated. */ function validate(Order[] calldata orders) external returns (bool validated); /** * @notice Cancel all orders from a given offerer with a given zone in bulk * by incrementing a counter. Note that only the offerer may * increment the counter. * * @return newCounter The new counter. */ function incrementCounter() external returns (uint256 newCounter); /** * @notice Retrieve the order hash for a given order. * * @param order The components of the order. * * @return orderHash The order hash. */ function getOrderHash(OrderComponents calldata order) external view returns (bytes32 orderHash); /** * @notice Retrieve the status of a given order by hash, including whether * the order has been cancelled or validated and the fraction of the * order that has been filled. * * @param orderHash The order hash in question. * * @return isValidated A boolean indicating whether the order in question * has been validated (i.e. previously approved or * partially filled). * @return isCancelled A boolean indicating whether the order in question * has been cancelled. * @return totalFilled The total portion of the order that has been filled * (i.e. the "numerator"). * @return totalSize The total size of the order that is either filled or * unfilled (i.e. the "denominator"). */ function getOrderStatus(bytes32 orderHash) external view returns ( bool isValidated, bool isCancelled, uint256 totalFilled, uint256 totalSize ); /** * @notice Retrieve the current counter for a given offerer. * * @param offerer The offerer in question. * * @return counter The current counter. */ function getCounter(address offerer) external view returns (uint256 counter); /** * @notice Retrieve configuration information for this contract. * * @return version The contract version. * @return domainSeparator The domain separator for this contract. * @return conduitController The conduit Controller set for this contract. */ function information() external view returns ( string memory version, bytes32 domainSeparator, address conduitController ); /** * @notice Retrieve the name of this contract. * * @return contractName The name of this contract. */ function name() external view returns (string memory contractName); }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.7; // prettier-ignore import { AdvancedOrder, CriteriaResolver } from "../lib/ConsiderationStructs.sol"; interface ZoneInterface { /** * @dev Emit an event whenever a zone is successfully paused. */ event Paused(); /** * @dev Emit an event whenever a zone is successfully unpaused (created). */ event Unpaused(); // Called by Consideration whenever extraData is not provided by the caller. function isValidOrder( bytes32 orderHash, address caller, address offerer, bytes32 zoneHash ) external view returns (bytes4 validOrderMagicValue); // Called by Consideration whenever any extraData is provided by the caller. function isValidOrderIncludingExtraData( bytes32 orderHash, address caller, AdvancedOrder calldata order, bytes32[] calldata priorOrderHashes, CriteriaResolver[] calldata criteriaResolvers ) external view returns (bytes4 validOrderMagicValue); }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.7; /** * @title ZoneInteractionErrors * @author 0age * @notice ZoneInteractionErrors contains errors related to zone interaction. */ interface ZoneInteractionErrors { /** * @dev Revert with an error when attempting to fill an order that specifies * a restricted submitter as its order type when not submitted by * either the offerer or the order's zone or approved as valid by the * zone in question via a staticcall to `isValidOrder`. * * @param orderHash The order hash for the invalid restricted order. */ error InvalidRestrictedOrder(bytes32 orderHash); }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.7; import { SeaportInterface } from "../../interfaces/SeaportInterface.sol"; // prettier-ignore import { AdvancedOrder, CriteriaResolver, Order, OrderComponents, Fulfillment, Execution } from "../../lib/ConsiderationStructs.sol"; /** * @title PausableZone * @author cupOJoseph, BCLeFevre, ryanio * @notice PausableZone is a simple zone implementation that approves every * order. It can be self-destructed by its controller to pause * restricted orders that have it set as their zone. */ interface PausableZoneInterface { /** * @notice Cancel an arbitrary number of orders that have agreed to use the * contract as their zone. * * @param seaport The Seaport address. * @param orders The orders to cancel. * * @return cancelled A boolean indicating whether the supplied orders have * been successfully cancelled. */ function cancelOrders( SeaportInterface seaport, OrderComponents[] calldata orders ) external returns (bool cancelled); /** * @notice Execute an arbitrary number of matched orders, each with * an arbitrary number of items for offer and consideration * along with a set of fulfillments allocating offer components * to consideration components. * * @param seaport The Seaport address. * @param orders The orders to match. * @param fulfillments An array of elements allocating offer components * to consideration components. * * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. */ function executeMatchOrders( SeaportInterface seaport, Order[] calldata orders, Fulfillment[] calldata fulfillments ) external payable returns (Execution[] memory executions); /** * @notice Execute an arbitrary number of matched advanced orders, * each with an arbitrary number of items for offer and * consideration along with a set of fulfillments allocating * offer components to consideration components. * * @param seaport The Seaport address. * @param orders The orders to match. * @param criteriaResolvers An array where each element contains a reference * to a specific order as well as that order's * offer or consideration, a token identifier, and * a proof that the supplied token identifier is * contained in the order's merkle root. * @param fulfillments An array of elements allocating offer components * to consideration components. * * @return executions An array of elements indicating the sequence of * transfers performed as part of matching the given * orders. */ function executeMatchAdvancedOrders( SeaportInterface seaport, AdvancedOrder[] calldata orders, CriteriaResolver[] calldata criteriaResolvers, Fulfillment[] calldata fulfillments ) external payable returns (Execution[] memory executions); /** * @notice Pause this contract, safely stopping orders from using * the contract as a zone. Restricted orders with this address as a * zone will not be fulfillable unless the zone is redeployed to the * same address. */ function pause() external; /** * @notice Assign the given address with the ability to operate the zone. * * @param operatorToAssign The address to assign as the operator. */ function assignOperator(address operatorToAssign) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.7; // prettier-ignore enum OrderType { // 0: no partial fills, anyone can execute FULL_OPEN, // 1: partial fills supported, anyone can execute PARTIAL_OPEN, // 2: no partial fills, only offerer or zone can execute FULL_RESTRICTED, // 3: partial fills supported, only offerer or zone can execute PARTIAL_RESTRICTED } // prettier-ignore enum BasicOrderType { // 0: no partial fills, anyone can execute ETH_TO_ERC721_FULL_OPEN, // 1: partial fills supported, anyone can execute ETH_TO_ERC721_PARTIAL_OPEN, // 2: no partial fills, only offerer or zone can execute ETH_TO_ERC721_FULL_RESTRICTED, // 3: partial fills supported, only offerer or zone can execute ETH_TO_ERC721_PARTIAL_RESTRICTED, // 4: no partial fills, anyone can execute ETH_TO_ERC1155_FULL_OPEN, // 5: partial fills supported, anyone can execute ETH_TO_ERC1155_PARTIAL_OPEN, // 6: no partial fills, only offerer or zone can execute ETH_TO_ERC1155_FULL_RESTRICTED, // 7: partial fills supported, only offerer or zone can execute ETH_TO_ERC1155_PARTIAL_RESTRICTED, // 8: no partial fills, anyone can execute ERC20_TO_ERC721_FULL_OPEN, // 9: partial fills supported, anyone can execute ERC20_TO_ERC721_PARTIAL_OPEN, // 10: no partial fills, only offerer or zone can execute ERC20_TO_ERC721_FULL_RESTRICTED, // 11: partial fills supported, only offerer or zone can execute ERC20_TO_ERC721_PARTIAL_RESTRICTED, // 12: no partial fills, anyone can execute ERC20_TO_ERC1155_FULL_OPEN, // 13: partial fills supported, anyone can execute ERC20_TO_ERC1155_PARTIAL_OPEN, // 14: no partial fills, only offerer or zone can execute ERC20_TO_ERC1155_FULL_RESTRICTED, // 15: partial fills supported, only offerer or zone can execute ERC20_TO_ERC1155_PARTIAL_RESTRICTED, // 16: no partial fills, anyone can execute ERC721_TO_ERC20_FULL_OPEN, // 17: partial fills supported, anyone can execute ERC721_TO_ERC20_PARTIAL_OPEN, // 18: no partial fills, only offerer or zone can execute ERC721_TO_ERC20_FULL_RESTRICTED, // 19: partial fills supported, only offerer or zone can execute ERC721_TO_ERC20_PARTIAL_RESTRICTED, // 20: no partial fills, anyone can execute ERC1155_TO_ERC20_FULL_OPEN, // 21: partial fills supported, anyone can execute ERC1155_TO_ERC20_PARTIAL_OPEN, // 22: no partial fills, only offerer or zone can execute ERC1155_TO_ERC20_FULL_RESTRICTED, // 23: partial fills supported, only offerer or zone can execute ERC1155_TO_ERC20_PARTIAL_RESTRICTED } // prettier-ignore enum BasicOrderRouteType { // 0: provide Ether (or other native token) to receive offered ERC721 item. ETH_TO_ERC721, // 1: provide Ether (or other native token) to receive offered ERC1155 item. ETH_TO_ERC1155, // 2: provide ERC20 item to receive offered ERC721 item. ERC20_TO_ERC721, // 3: provide ERC20 item to receive offered ERC1155 item. ERC20_TO_ERC1155, // 4: provide ERC721 item to receive offered ERC20 item. ERC721_TO_ERC20, // 5: provide ERC1155 item to receive offered ERC20 item. ERC1155_TO_ERC20 } // prettier-ignore enum ItemType { // 0: ETH on mainnet, MATIC on polygon, etc. NATIVE, // 1: ERC20 items (ERC777 and ERC20 analogues could also technically work) ERC20, // 2: ERC721 items ERC721, // 3: ERC1155 items ERC1155, // 4: ERC721 items where a number of tokenIds are supported ERC721_WITH_CRITERIA, // 5: ERC1155 items where a number of ids are supported ERC1155_WITH_CRITERIA } // prettier-ignore enum Side { // 0: Items that can be spent OFFER, // 1: Items that must be received CONSIDERATION }
{ "remappings": [ "@rari-capital/solmate/=lib/solmate/", "@rari-capital/solmate/=lib/solmate/", "contracts/=contracts/", "ds-test/=lib/ds-test/src/", "ds-test/=lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "forge-std/=lib/forge-std/src/", "murky/=lib/murky/src/", "openzeppelin-contracts/=lib/murky/lib/openzeppelin-contracts/", "solmate/=lib/solmate/src/", "contracts/=contracts/", "foundry/=test/foundry/" ], "optimizer": { "enabled": true, "runs": 19066 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "viaIR": true, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"ownerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidController","type":"error"},{"inputs":[],"name":"InvalidOperator","type":"error"},{"inputs":[],"name":"InvalidPauser","type":"error"},{"inputs":[{"internalType":"address","name":"zone","type":"address"}],"name":"ZoneAlreadyExists","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPauser","type":"address"}],"name":"PauserUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPotentialOwner","type":"address"}],"name":"PotentialOwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"zone","type":"address"},{"indexed":false,"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"ZoneCreated","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pausableZoneAddress","type":"address"},{"internalType":"address","name":"operatorToAssign","type":"address"}],"name":"assignOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pauserToAssign","type":"address"}],"name":"assignPauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pausableZoneAddress","type":"address"},{"internalType":"contract SeaportInterface","name":"seaportAddress","type":"address"},{"components":[{"internalType":"address","name":"offerer","type":"address"},{"internalType":"address","name":"zone","type":"address"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifierOrCriteria","type":"uint256"},{"internalType":"uint256","name":"startAmount","type":"uint256"},{"internalType":"uint256","name":"endAmount","type":"uint256"}],"internalType":"struct OfferItem[]","name":"offer","type":"tuple[]"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifierOrCriteria","type":"uint256"},{"internalType":"uint256","name":"startAmount","type":"uint256"},{"internalType":"uint256","name":"endAmount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct ConsiderationItem[]","name":"consideration","type":"tuple[]"},{"internalType":"enum OrderType","name":"orderType","type":"uint8"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"zoneHash","type":"bytes32"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes32","name":"conduitKey","type":"bytes32"},{"internalType":"uint256","name":"counter","type":"uint256"}],"internalType":"struct OrderComponents[]","name":"orders","type":"tuple[]"}],"name":"cancelOrders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"createZone","outputs":[{"internalType":"address","name":"derivedAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pausableZoneAddress","type":"address"},{"internalType":"contract SeaportInterface","name":"seaportAddress","type":"address"},{"components":[{"components":[{"internalType":"address","name":"offerer","type":"address"},{"internalType":"address","name":"zone","type":"address"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifierOrCriteria","type":"uint256"},{"internalType":"uint256","name":"startAmount","type":"uint256"},{"internalType":"uint256","name":"endAmount","type":"uint256"}],"internalType":"struct OfferItem[]","name":"offer","type":"tuple[]"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifierOrCriteria","type":"uint256"},{"internalType":"uint256","name":"startAmount","type":"uint256"},{"internalType":"uint256","name":"endAmount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct ConsiderationItem[]","name":"consideration","type":"tuple[]"},{"internalType":"enum OrderType","name":"orderType","type":"uint8"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"zoneHash","type":"bytes32"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes32","name":"conduitKey","type":"bytes32"},{"internalType":"uint256","name":"totalOriginalConsiderationItems","type":"uint256"}],"internalType":"struct OrderParameters","name":"parameters","type":"tuple"},{"internalType":"uint120","name":"numerator","type":"uint120"},{"internalType":"uint120","name":"denominator","type":"uint120"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct AdvancedOrder[]","name":"orders","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"orderIndex","type":"uint256"},{"internalType":"enum Side","name":"side","type":"uint8"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"bytes32[]","name":"criteriaProof","type":"bytes32[]"}],"internalType":"struct CriteriaResolver[]","name":"criteriaResolvers","type":"tuple[]"},{"components":[{"components":[{"internalType":"uint256","name":"orderIndex","type":"uint256"},{"internalType":"uint256","name":"itemIndex","type":"uint256"}],"internalType":"struct FulfillmentComponent[]","name":"offerComponents","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"orderIndex","type":"uint256"},{"internalType":"uint256","name":"itemIndex","type":"uint256"}],"internalType":"struct FulfillmentComponent[]","name":"considerationComponents","type":"tuple[]"}],"internalType":"struct Fulfillment[]","name":"fulfillments","type":"tuple[]"}],"name":"executeMatchAdvancedOrders","outputs":[{"components":[{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct ReceivedItem","name":"item","type":"tuple"},{"internalType":"address","name":"offerer","type":"address"},{"internalType":"bytes32","name":"conduitKey","type":"bytes32"}],"internalType":"struct Execution[]","name":"executions","type":"tuple[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pausableZoneAddress","type":"address"},{"internalType":"contract SeaportInterface","name":"seaportAddress","type":"address"},{"components":[{"components":[{"internalType":"address","name":"offerer","type":"address"},{"internalType":"address","name":"zone","type":"address"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifierOrCriteria","type":"uint256"},{"internalType":"uint256","name":"startAmount","type":"uint256"},{"internalType":"uint256","name":"endAmount","type":"uint256"}],"internalType":"struct OfferItem[]","name":"offer","type":"tuple[]"},{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifierOrCriteria","type":"uint256"},{"internalType":"uint256","name":"startAmount","type":"uint256"},{"internalType":"uint256","name":"endAmount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct ConsiderationItem[]","name":"consideration","type":"tuple[]"},{"internalType":"enum OrderType","name":"orderType","type":"uint8"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes32","name":"zoneHash","type":"bytes32"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes32","name":"conduitKey","type":"bytes32"},{"internalType":"uint256","name":"totalOriginalConsiderationItems","type":"uint256"}],"internalType":"struct OrderParameters","name":"parameters","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct Order[]","name":"orders","type":"tuple[]"},{"components":[{"components":[{"internalType":"uint256","name":"orderIndex","type":"uint256"},{"internalType":"uint256","name":"itemIndex","type":"uint256"}],"internalType":"struct FulfillmentComponent[]","name":"offerComponents","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"orderIndex","type":"uint256"},{"internalType":"uint256","name":"itemIndex","type":"uint256"}],"internalType":"struct FulfillmentComponent[]","name":"considerationComponents","type":"tuple[]"}],"internalType":"struct Fulfillment[]","name":"fulfillments","type":"tuple[]"}],"name":"executeMatchOrders","outputs":[{"components":[{"components":[{"internalType":"enum ItemType","name":"itemType","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct ReceivedItem","name":"item","type":"tuple"},{"internalType":"address","name":"offerer","type":"address"},{"internalType":"bytes32","name":"conduitKey","type":"bytes32"}],"internalType":"struct Execution[]","name":"executions","type":"tuple[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"zone","type":"address"}],"name":"pause","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"potentialOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPotentialOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zoneCreationCode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a0604052346200009b5762004a71602081380391826200002081620000a0565b9384928339810103126200009b57516001600160a01b038116908190036200009b57600080546001600160a01b0319169190911790556115b46200006760208201620000a0565b8181526020810191620034bd83395190206080526040516133e09081620000dd823960805181818161058501526107800152f35b600080fd5b6040519190601f01601f191682016001600160401b03811183821017620000c657604052565b634e487b7160e01b600052604160045260246000fdfe60806040526004361015610013575b600080fd5b60003560e01c806323452b9c1461012b57806340ddc7881461012257806346b3ce9f146101195780637242512f1461011057806376a67a51146101075780637762df25146100fe57806379ba5097146100f55780638da5cb5b146100ec5780639fd0506d146100e3578063b44f6608146100da578063d6f3b110146100d1578063dcd5b13e146100c8578063f2fde38b146100bf5763f7e4aac6146100b757600080fd5b61000e61106b565b5061000e610f15565b5061000e610d94565b5061000e610c1d565b5061000e610ab8565b5061000e610a83565b5061000e610a4e565b5061000e6108c4565b5061000e61088f565b5061000e6107a3565b5061000e610767565b5061000e610514565b5061000e610374565b5061000e61013f565b600091031261000e57565b503461000e5760008060031936011261022a5773ffffffffffffffffffffffffffffffffffffffff81541633036101cc577f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da6020604051838152a16101c77fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155565b604051f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c79204f776e65722063616e2063616e63656c2e000000000000000000006044820152fd5b80fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b35906102568261022d565b565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9060068210156102c65752565b6102ce610289565b52565b60208082019080835283518092528060408094019401926000905b8382106102fb57505050505090565b90919293948360e060019284895180516103168482516102b9565b73ffffffffffffffffffffffffffffffffffffffff9081878201511687860152838101518486015260608082015190860152816080809201511690850152858201511660a0840152015160c0820152019601920190939291936102ec565b50608060031936011261000e5760043561038d8161022d565b6024359061039a8261022d565b67ffffffffffffffff9060443582811161000e576103bc903690600401610258565b909260643590811161000e576103d6903690600401610258565b92909373ffffffffffffffffffffffffffffffffffffffff91826000541633036104905761045e9661043a600096604051988997889687957f2718034d00000000000000000000000000000000000000000000000000000000875260048701611975565b03923491165af1908115610483575b600091610462575b50604051918291826102d1565b0390f35b61047d913d8091833e610475818361124f565b81019061167d565b38610451565b61048b611290565b610449565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f6e6c7920746865206f776e65722063616e2065786563757465206f7264657260448201527f73207769746820746865207a6f6e652e000000000000000000000000000000006064820152fd5b503461000e57602060031936011261000e5760043561056e61056761054e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b331461113b565b61064f61054e6040516020810190610633816106077f0000000000000000000000000000000000000000000000000000000000000000883087917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000605594927fff00000000000000000000000000000000000000000000000000000000000000855260601b166001840152601583015260358201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261124f565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b803b61071f577fd1fa916c9f898e9a8dcedb0f78093657d07014799896193f2b219bed6ac7399c6106db8361045e94604051806115b48082019082821067ffffffffffffffff831117610712575b611df7833903906000f515610705575b6040805173ffffffffffffffffffffffffffffffffffffffff86168152602081019290925290918291820190565b0390a160405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b61070d611290565b6106ad565b61071a6111c6565b61069d565b6040517e83438500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152602490fd5b503461000e57600060031936011261000e5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b503461000e57602060031936011261000e576004356107c18161022d565b73ffffffffffffffffffffffffffffffffffffffff90816002541633141580610881575b6108575716803b1561000e57600080916004604051809481937f8456cb590000000000000000000000000000000000000000000000000000000083525af1801561084a575b61083b575b60405160018152602090f35b610844906111f6565b3861082f565b610852611290565b61082a565b60046040517fc7260843000000000000000000000000000000000000000000000000000000008152fd5b5081600054163314156107e5565b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b503461000e57600060031936011261000e5773ffffffffffffffffffffffffffffffffffffffff6001541633036109f057604051600081527f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da90602090a161094f7fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06109bf61099260005473ffffffffffffffffffffffffffffffffffffffff1690565b6040805173ffffffffffffffffffffffffffffffffffffffff909216825233602083015290918291820190565b0390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055005b005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4f6e6c7920506f74656e7469616c204f776e65722063616e20636c61696d2e006044820152fd5b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b5060a060031936011261000e5760048035610ad28161022d565b60243590610adf8261022d565b67ffffffffffffffff60443581811161000e57610aff9036908601610258565b93909260643583811161000e57610b199036908801610258565b909360843590811161000e57610b329036908901610258565b9173ffffffffffffffffffffffffffffffffffffffff9586600054163303610b99579261045e999261043a92600099989796956040519b8c9a8b998a987f65c4eb72000000000000000000000000000000000000000000000000000000008a528901611bd8565b60848a6020604051917f08c379a0000000000000000000000000000000000000000000000000000000008352820152603960248201527f4f6e6c7920746865206f776e65722063616e206578656375746520616476616e60448201527f636564206f7264657273207769746820746865207a6f6e652e000000000000006064820152fd5b503461000e57606060031936011261000e57600435610c3b8161022d565b60243590610c488261022d565b60443567ffffffffffffffff811161000e57610c68903690600401610258565b909173ffffffffffffffffffffffffffffffffffffffff9283600054163303610d10576000602094610cca96604051978896879586937fe5c27af1000000000000000000000000000000000000000000000000000000008552600485016115cd565b0393165af18015610d03575b610cdc57005b6109ee9060203d8111610cfc575b610cf4818361124f565b81019061129d565b503d610cea565b610d0b611290565b610cd6565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f6e6c7920746865206f776e65722063616e2063616e63656c206f726465727360448201527f207769746820746865207a6f6e652e00000000000000000000000000000000006064820152fd5b503461000e57602060031936011261000e57600435610db28161022d565b73ffffffffffffffffffffffffffffffffffffffff610dd681600054163314611d91565b811615610e9157610e229073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255565b7fa4336c0cb1e245b95ad204faed7e940d6dc999684fd8b5e1ff597a0c4efca8ab610e8c610e6560025473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390a1005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5061757365722063616e206e6f742062652073657420746f20746865206e756c60448201527f6c206164647265737300000000000000000000000000000000000000000000006064820152fd5b503461000e57602060031936011261000e57600435610f338161022d565b73ffffffffffffffffffffffffffffffffffffffff9081600054163303610fe757610f646109ee9282161515611d2c565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da90602090a173ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4f6e6c79204f776e65722063616e207472616e73666572204f776e657273686960448201527f702e0000000000000000000000000000000000000000000000000000000000006064820152fd5b503461000e57604060031936011261000e576004356110898161022d565b6024356110958161022d565b73ffffffffffffffffffffffffffffffffffffffff918260009384926110bf828554163314611d91565b1692833b15611137576024908360405195869485937f84385c6f0000000000000000000000000000000000000000000000000000000085521660048401525af1801561112a575b611111575b50604051f35b8061111e611124926111f6565b80610134565b3861110b565b611132611290565b611106565b8280fd5b1561114257565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f6e6c79206f776e65722063616e20637265617465206e6577205a6f6e65732060448201527f66726f6d20686572652e000000000000000000000000000000000000000000006064820152fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161120a57604052565b6112126111c6565b604052565b6060810190811067ffffffffffffffff82111761120a57604052565b60a0810190811067ffffffffffffffff82111761120a57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761120a57604052565b506040513d6000823e3d90fd5b9081602091031261000e5751801515810361000e5790565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e5760a082023603831361000e57565b6006111561000e57565b9190808252602080920192916000905b828210611330575050505090565b909192938061134b600192873561134681611308565b6102b9565b73ffffffffffffffffffffffffffffffffffffffff8387013561136d8161022d565b168184015260408681013590820152606080870135908201526080808701359082015260a0908101950193920190611322565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e5760c082023603831361000e57565b9190808252602080920192916000905b828210611411575050505090565b9091929380611427600192873561134681611308565b828601356114348161022d565b73ffffffffffffffffffffffffffffffffffffffff8091168483015260408088013590830152606080880135908301526080808801359083015260a0908188013561147e8161022d565b169082015260c0908101950193920190611403565b3590600482101561000e57565b9060048210156102c65752565b906114d5816114bb8461024b565b73ffffffffffffffffffffffffffffffffffffffff169052565b6115016114e46020840161024b565b73ffffffffffffffffffffffffffffffffffffffff166020830152565b61154061152561151460408501856112b5565b610160806040870152850191611312565b61153260608501856113a0565b9084830360608601526113f3565b9161155a61155060808301611493565b60808401906114a0565b60a081013560a083015260c081013560c083015260e081013560e0830152610100808201359083015261012080820135908301526101408091013591015290565b90357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea18236030181121561000e570190565b929073ffffffffffffffffffffffffffffffffffffffff60408501911684528160209160408387015252606084019360608360051b82010194846000925b85841061161c575050505050505090565b909192939495968580611661837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0866001960301885261165c8c8861159b565b6114ad565b99019401940192959493919061160b565b51906102568261022d565b6020808284031261000e57815167ffffffffffffffff9283821161000e57019083601f8301121561000e578151928311611789575b6040938451946116c7838660051b018761124f565b848652828601918360e08097028601019481861161000e578401925b8584106116f4575050505050505090565b83820387811261000e5783519161170a83611217565b60a080921261000e5788926117718893875161172581611233565b895161173081611308565b8152858a015161173f8161022d565b86820152888a0151898201526060808b0151908201526080808b0151906117658261022d565b82015283528801611672565b8382015260c0870151868201528152019301926116e3565b6117916111c6565b6116b2565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e57813603831361000e57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18236030181121561000e570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e578160061b3603831361000e57565b9190808252602080920192916000905b8282106118c8575050505090565b833585528381013585820152604094850194909301926001909101906118ba565b90808352602080930192838260051b850194846000925b858410611911575050505050505090565b909192939495968580611964838560019503885261192f8c88611825565b9061195761194d6119408480611857565b60408086528501916118aa565b9285810190611857565b91858185039101526118aa565b990194019401929594939190611900565b90939195949273ffffffffffffffffffffffffffffffffffffffff60608301951682528060209560608785015252608082019060808160051b8401019588926000905b8382106119da5750505050506119d794955060408185039101526118e9565b90565b90919293978380611a4e83611a198f8e907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808d60019903018952611825565b90611a41611a37611a2a848061159b565b60408085528401906114ad565b9285810190611796565b91858185039101526117e6565b9a0192019201909392916119b8565b35906effffffffffffffffffffffffffffff8216820361000e57565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618236030181121561000e570190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161000e5760209260051b80928483013701016000815290565b90808352602080930190819360059282841b810195856000925b858410611b1857505050505050505090565b90919293949596978181038452611b2f8984611a79565b8035825286810135600281101561000e57878301526040808201359083015260608082013590830152608090818101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57019087823592019267ffffffffffffffff831161000e57828b1b3603841361000e5760019389938493611bc69360a080928201520191611aab565b9a019401940192969594939190611b06565b9593919796949260809173ffffffffffffffffffffffffffffffffffffffff838901911688528160209184838b01525260a0998a89018b8460051b8b01019b82956000935b868510611c5157505050505050505095611c43916119d796978683036040880152611aec565b9260608185039101526118e9565b909192939480889f8198998f82037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60018852611c8d9085611a79565b611c97818061159b565b878352878301611ca6916114ad565b6effffffffffffffffffffffffffffff80611cc2848701611a5d565b1684860152604090611cd5848301611a5d565b1690840152606090611ce983830184611796565b909285830390860152611cfb926117e6565b90868101611d0891611796565b909287818403910152611d1a926117e6565b9f019796956001019401929190611c1d565b15611d3357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e6577204f776e65722063616e206e6f74206265203020616464726573732e006044820152fd5b15611d9857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f43616e206f6e6c792062652073657420627920746865206465706c6f796572006044820152fdfe60a0806040523461006457336080527fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933600082a161154a908161006a82396080518181816104870152818161085b015281816108d801528181610a690152610c570152f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081630e1d31dc146100b6575080632718034d146100ad57806333131570146100a4578063570ca7351461009b57806365c4eb721461009257806384385c6f146100895780638456cb59146100805763e5c27af114610078575b600080fd5b610073610ab9565b50610073610a22565b50610073610883565b506100736105bc565b50610073610569565b506100736104af565b5061007361026a565b346100735760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610073576020906100f3602435610123565b6100fe604435610123565b7f0e1d31dc000000000000000000000000000000000000000000000000000000008152f35b73ffffffffffffffffffffffffffffffffffffffff81160361007357565b359061014c82610123565b565b9181601f840112156100735782359167ffffffffffffffff8311610073576020808501948460051b01011161007357565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9060068210156101bc5752565b6101c461017f565b52565b60208082019080835283518092528060408094019401926000905b8382106101f157505050505090565b90919293948360e0600192848951805161020c8482516101af565b73ffffffffffffffffffffffffffffffffffffffff9081878201511687860152838101518486015260608082015190860152816080809201511690850152858201511660a0840152015160c0820152019601920190939291936101e2565b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606081360112610073576004356102a281610123565b67ffffffffffffffff91602435838111610073576102c490369060040161014e565b929093604435908111610073576102df90369060040161014e565b73ffffffffffffffffffffffffffffffffffffffff9591866000541633141580610483575b610459576040948551967fa817440400000000000000000000000000000000000000000000000000000000885280604489018860048b015252606488019060648160051b8a01019580926000915b8383106103d35750505061039f89896000828e818d8161037d8f8f8f8f8584030160248601526112e9565b03923491165af19182156103c6575b6000926103a3575b5051918291826101c7565b0390f35b6103bf91923d8091833e6103b78183610cf4565b81019061107d565b9083610394565b6103ce611065565b61038c565b909192939761043d8b61044a838f6104178e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c61042e9360019903018a5288611225565b936104228580611033565b90808452830190610f45565b90602094848680960190611196565b91858185039101526111e6565b9a019301930191939290610352565b60046040517fccea9e6f000000000000000000000000000000000000000000000000000000008152fd5b50867f000000000000000000000000000000000000000000000000000000000000000016331415610304565b5034610073577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60a081360112610073576104eb602435610123565b60443567ffffffffffffffff918282116100735760a09136030112610073576064358181116100735761052290369060040161014e565b50506084359081116100735761053c90369060040161014e565b50506040517f0e1d31dc000000000000000000000000000000000000000000000000000000008152602090f35b50346100735760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007357602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b5060807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc81813601126100735760049081356105f781610123565b67ffffffffffffffff9160243583811161007357610618903690860161014e565b95909360443581811161007357610632903690880161014e565b9290916064359081116100735761064c903690890161014e565b93909273ffffffffffffffffffffffffffffffffffffffff998a6000541633141580610857575b61082e5797989260409889519a7f55944a42000000000000000000000000000000000000000000000000000000008c528160648d018d606098899101525260848c019560848d8460051b01019682946000935b85851061075357505050505050508561039f9a958a97956106fb868a989661070a968a988960009f9b030160248a0152611404565b928584030160448601526112e9565b03923491165af1918215610746575b60009261072b575051918291826101c7565b61073f91923d8091833e6103b78183610cf4565b9038610394565b61074e611065565b610719565b909192939495988f8f90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c600193820301865261081d6107948d86611391565b6107ae6107a18280611033565b60a0808652850190610f45565b926108106108066effffffffffffffffffffffffffffff956020978789986107d78a8901611375565b16898701526107e7828801611375565b16908501528c6107f981870187611196565b91868403908701526111e6565b9289810190611196565b91898185039101526111e6565b9b01940195019392959491906106c6565b896040517fccea9e6f000000000000000000000000000000000000000000000000000000008152fd5b508a7f000000000000000000000000000000000000000000000000000000000000000016331415610673565b50346100735760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610073576004356108bf81610123565b73ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000000000000000000000000000000000000000000001633036109f85716801561097457600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168217905560405173ffffffffffffffffffffffffffffffffffffffff90911681527fb3b3f5f64ab192e4b5fefde1f51ce9733bbdcf831951543b325aebd49cc27ec490602090a1005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f70657261746f722063616e206e6f742062652073657420746f20746865206e60448201527f756c6c20616464726573730000000000000000000000000000000000000000006064820152fd5b60046040517f6d5769be000000000000000000000000000000000000000000000000000000008152fd5b50346100735760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100735773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036109f8577f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7526000604051a132ff5b50346100735760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007357600435610af581610123565b60243567ffffffffffffffff811161007357610b1590369060040161014e565b9073ffffffffffffffffffffffffffffffffffffffff806000541633141580610c53575b61045957604051917ffd9f1e1000000000000000000000000000000000000000000000000000000000835260248301938060209586600487015252604484019060448160051b8601019280926000915b838310610c015761039f898981818e8160008e828f0393165af1918215610bf4575b600092610bc7575b505060405190151581529081906020820190565b610be69250803d10610bed575b610bde8183610cf4565b810190610d35565b8280610bb3565b503d610bd4565b610bfc611065565b610bab565b90919293948880610c44837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8c60019603018752610c3f8a87611033565b610f45565b97019301930191939290610b89565b50807f000000000000000000000000000000000000000000000000000000000000000016331415610b39565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff821117610ccb57604052565b610cd3610c7f565b604052565b60a0810190811067ffffffffffffffff821117610ccb57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ccb57604052565b90816020910312610073575180151581036100735790565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff82116100735760a082023603831361007357565b6006111561007357565b9190808252602080920192916000905b828210610dc8575050505090565b9091929380610de36001928735610dde81610da0565b6101af565b73ffffffffffffffffffffffffffffffffffffffff83870135610e0581610123565b168184015260408681013590820152606080870135908201526080808701359082015260a0908101950193920190610dba565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff82116100735760c082023603831361007357565b9190808252602080920192916000905b828210610ea9575050505090565b9091929380610ebf6001928735610dde81610da0565b82860135610ecc81610123565b73ffffffffffffffffffffffffffffffffffffffff8091168483015260408088013590830152606080880135908301526080808801359083015260a09081880135610f1681610123565b169082015260c0908101950193920190610e9b565b3590600482101561007357565b9060048210156101bc5752565b90610f6d81610f5384610141565b73ffffffffffffffffffffffffffffffffffffffff169052565b610f99610f7c60208401610141565b73ffffffffffffffffffffffffffffffffffffffff166020830152565b610fd8610fbd610fac6040850185610d4d565b610160806040870152850191610daa565b610fca6060850185610e38565b908483036060860152610e8b565b91610ff2610fe860808301610f2b565b6080840190610f38565b60a081013560a083015260c081013560c083015260e081013560e0830152610100808201359083015261012080820135908301526101408091013591015290565b90357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea182360301811215610073570190565b506040513d6000823e3d90fd5b519061014c82610123565b6020808284031261007357815167ffffffffffffffff9283821161007357019083601f83011215610073578151928311611189575b6040938451946110c7838660051b0187610cf4565b848652828601918360e080970286010194818611610073578401925b8584106110f4575050505050505090565b8382038781126100735783519161110a83610caf565b60a08092126100735788926111718893875161112581610cd8565b895161113081610da0565b8152858a015161113f81610123565b86820152888a0151898201526060808b0151908201526080808b01519061116582610123565b82015283528801611072565b8382015260c0870151868201528152019301926110e3565b611191610c7f565b6110b2565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff821161007357813603831361007357565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610073570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff8211610073578160061b3603831361007357565b9190808252602080920192916000905b8282106112c8575050505090565b833585528381013585820152604094850194909301926001909101906112ba565b90808352602080930192838260051b850194846000925b858410611311575050505050505090565b909192939495968580611364838560019503885261132f8c88611225565b9061135761134d6113408480611257565b60408086528501916112aa565b9285810190611257565b91858185039101526112aa565b990194019401929594939190611300565b35906effffffffffffffffffffffffffffff8216820361007357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6182360301811215610073570190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116100735760209260051b80928483013701016000815290565b9082908084526020809401936005928183851b82010195856000925b85841061143257505050505050505090565b90919293949596977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820301845261146b8984611391565b8035825286810135600281101561007357878301526040808201359083015260608082013590830152608090818101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357019087823592019267ffffffffffffffff831161007357828b1b3603841361007357600193899384936115029360a0809282015201916113c3565b9a01940194019296959493919061142056fea26469706673582212205373ac4d0ce5bb34fc04a8453b663d8817fd20f76b70b5b3fbc050c6b381c63464736f6c634300080e0033a26469706673582212205aec1f7011fb7c666bdc59c01ee61f8e8542a4c186ee08da8530035a171780f464736f6c634300080e003360a0806040523461006457336080527fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933600082a161154a908161006a82396080518181816104870152818161085b015281816108d801528181610a690152610c570152f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081630e1d31dc146100b6575080632718034d146100ad57806333131570146100a4578063570ca7351461009b57806365c4eb721461009257806384385c6f146100895780638456cb59146100805763e5c27af114610078575b600080fd5b610073610ab9565b50610073610a22565b50610073610883565b506100736105bc565b50610073610569565b506100736104af565b5061007361026a565b346100735760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610073576020906100f3602435610123565b6100fe604435610123565b7f0e1d31dc000000000000000000000000000000000000000000000000000000008152f35b73ffffffffffffffffffffffffffffffffffffffff81160361007357565b359061014c82610123565b565b9181601f840112156100735782359167ffffffffffffffff8311610073576020808501948460051b01011161007357565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9060068210156101bc5752565b6101c461017f565b52565b60208082019080835283518092528060408094019401926000905b8382106101f157505050505090565b90919293948360e0600192848951805161020c8482516101af565b73ffffffffffffffffffffffffffffffffffffffff9081878201511687860152838101518486015260608082015190860152816080809201511690850152858201511660a0840152015160c0820152019601920190939291936101e2565b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606081360112610073576004356102a281610123565b67ffffffffffffffff91602435838111610073576102c490369060040161014e565b929093604435908111610073576102df90369060040161014e565b73ffffffffffffffffffffffffffffffffffffffff9591866000541633141580610483575b610459576040948551967fa817440400000000000000000000000000000000000000000000000000000000885280604489018860048b015252606488019060648160051b8a01019580926000915b8383106103d35750505061039f89896000828e818d8161037d8f8f8f8f8584030160248601526112e9565b03923491165af19182156103c6575b6000926103a3575b5051918291826101c7565b0390f35b6103bf91923d8091833e6103b78183610cf4565b81019061107d565b9083610394565b6103ce611065565b61038c565b909192939761043d8b61044a838f6104178e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c61042e9360019903018a5288611225565b936104228580611033565b90808452830190610f45565b90602094848680960190611196565b91858185039101526111e6565b9a019301930191939290610352565b60046040517fccea9e6f000000000000000000000000000000000000000000000000000000008152fd5b50867f000000000000000000000000000000000000000000000000000000000000000016331415610304565b5034610073577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60a081360112610073576104eb602435610123565b60443567ffffffffffffffff918282116100735760a09136030112610073576064358181116100735761052290369060040161014e565b50506084359081116100735761053c90369060040161014e565b50506040517f0e1d31dc000000000000000000000000000000000000000000000000000000008152602090f35b50346100735760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007357602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b5060807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc81813601126100735760049081356105f781610123565b67ffffffffffffffff9160243583811161007357610618903690860161014e565b95909360443581811161007357610632903690880161014e565b9290916064359081116100735761064c903690890161014e565b93909273ffffffffffffffffffffffffffffffffffffffff998a6000541633141580610857575b61082e5797989260409889519a7f55944a42000000000000000000000000000000000000000000000000000000008c528160648d018d606098899101525260848c019560848d8460051b01019682946000935b85851061075357505050505050508561039f9a958a97956106fb868a989661070a968a988960009f9b030160248a0152611404565b928584030160448601526112e9565b03923491165af1918215610746575b60009261072b575051918291826101c7565b61073f91923d8091833e6103b78183610cf4565b9038610394565b61074e611065565b610719565b909192939495988f8f90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c600193820301865261081d6107948d86611391565b6107ae6107a18280611033565b60a0808652850190610f45565b926108106108066effffffffffffffffffffffffffffff956020978789986107d78a8901611375565b16898701526107e7828801611375565b16908501528c6107f981870187611196565b91868403908701526111e6565b9289810190611196565b91898185039101526111e6565b9b01940195019392959491906106c6565b896040517fccea9e6f000000000000000000000000000000000000000000000000000000008152fd5b508a7f000000000000000000000000000000000000000000000000000000000000000016331415610673565b50346100735760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610073576004356108bf81610123565b73ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000000000000000000000000000000000000000000001633036109f85716801561097457600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168217905560405173ffffffffffffffffffffffffffffffffffffffff90911681527fb3b3f5f64ab192e4b5fefde1f51ce9733bbdcf831951543b325aebd49cc27ec490602090a1005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f70657261746f722063616e206e6f742062652073657420746f20746865206e60448201527f756c6c20616464726573730000000000000000000000000000000000000000006064820152fd5b60046040517f6d5769be000000000000000000000000000000000000000000000000000000008152fd5b50346100735760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100735773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036109f8577f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7526000604051a132ff5b50346100735760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007357600435610af581610123565b60243567ffffffffffffffff811161007357610b1590369060040161014e565b9073ffffffffffffffffffffffffffffffffffffffff806000541633141580610c53575b61045957604051917ffd9f1e1000000000000000000000000000000000000000000000000000000000835260248301938060209586600487015252604484019060448160051b8601019280926000915b838310610c015761039f898981818e8160008e828f0393165af1918215610bf4575b600092610bc7575b505060405190151581529081906020820190565b610be69250803d10610bed575b610bde8183610cf4565b810190610d35565b8280610bb3565b503d610bd4565b610bfc611065565b610bab565b90919293948880610c44837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8c60019603018752610c3f8a87611033565b610f45565b97019301930191939290610b89565b50807f000000000000000000000000000000000000000000000000000000000000000016331415610b39565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff821117610ccb57604052565b610cd3610c7f565b604052565b60a0810190811067ffffffffffffffff821117610ccb57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ccb57604052565b90816020910312610073575180151581036100735790565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff82116100735760a082023603831361007357565b6006111561007357565b9190808252602080920192916000905b828210610dc8575050505090565b9091929380610de36001928735610dde81610da0565b6101af565b73ffffffffffffffffffffffffffffffffffffffff83870135610e0581610123565b168184015260408681013590820152606080870135908201526080808701359082015260a0908101950193920190610dba565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff82116100735760c082023603831361007357565b9190808252602080920192916000905b828210610ea9575050505090565b9091929380610ebf6001928735610dde81610da0565b82860135610ecc81610123565b73ffffffffffffffffffffffffffffffffffffffff8091168483015260408088013590830152606080880135908301526080808801359083015260a09081880135610f1681610123565b169082015260c0908101950193920190610e9b565b3590600482101561007357565b9060048210156101bc5752565b90610f6d81610f5384610141565b73ffffffffffffffffffffffffffffffffffffffff169052565b610f99610f7c60208401610141565b73ffffffffffffffffffffffffffffffffffffffff166020830152565b610fd8610fbd610fac6040850185610d4d565b610160806040870152850191610daa565b610fca6060850185610e38565b908483036060860152610e8b565b91610ff2610fe860808301610f2b565b6080840190610f38565b60a081013560a083015260c081013560c083015260e081013560e0830152610100808201359083015261012080820135908301526101408091013591015290565b90357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea182360301811215610073570190565b506040513d6000823e3d90fd5b519061014c82610123565b6020808284031261007357815167ffffffffffffffff9283821161007357019083601f83011215610073578151928311611189575b6040938451946110c7838660051b0187610cf4565b848652828601918360e080970286010194818611610073578401925b8584106110f4575050505050505090565b8382038781126100735783519161110a83610caf565b60a08092126100735788926111718893875161112581610cd8565b895161113081610da0565b8152858a015161113f81610123565b86820152888a0151898201526060808b0151908201526080808b01519061116582610123565b82015283528801611072565b8382015260c0870151868201528152019301926110e3565b611191610c7f565b6110b2565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff821161007357813603831361007357565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610073570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff8211610073578160061b3603831361007357565b9190808252602080920192916000905b8282106112c8575050505090565b833585528381013585820152604094850194909301926001909101906112ba565b90808352602080930192838260051b850194846000925b858410611311575050505050505090565b909192939495968580611364838560019503885261132f8c88611225565b9061135761134d6113408480611257565b60408086528501916112aa565b9285810190611257565b91858185039101526112aa565b990194019401929594939190611300565b35906effffffffffffffffffffffffffffff8216820361007357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6182360301811215610073570190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116100735760209260051b80928483013701016000815290565b9082908084526020809401936005928183851b82010195856000925b85841061143257505050505050505090565b90919293949596977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820301845261146b8984611391565b8035825286810135600281101561007357878301526040808201359083015260608082013590830152608090818101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357019087823592019267ffffffffffffffff831161007357828b1b3603841361007357600193899384936115029360a0809282015201916113c3565b9a01940194019296959493919061142056fea26469706673582212205373ac4d0ce5bb34fc04a8453b663d8817fd20f76b70b5b3fbc050c6b381c63464736f6c634300080e0033000000000000000000000000df7bb361dc059c185dced96ace6ec4d0c1f72b0f
Deployed Bytecode
0x60806040526004361015610013575b600080fd5b60003560e01c806323452b9c1461012b57806340ddc7881461012257806346b3ce9f146101195780637242512f1461011057806376a67a51146101075780637762df25146100fe57806379ba5097146100f55780638da5cb5b146100ec5780639fd0506d146100e3578063b44f6608146100da578063d6f3b110146100d1578063dcd5b13e146100c8578063f2fde38b146100bf5763f7e4aac6146100b757600080fd5b61000e61106b565b5061000e610f15565b5061000e610d94565b5061000e610c1d565b5061000e610ab8565b5061000e610a83565b5061000e610a4e565b5061000e6108c4565b5061000e61088f565b5061000e6107a3565b5061000e610767565b5061000e610514565b5061000e610374565b5061000e61013f565b600091031261000e57565b503461000e5760008060031936011261022a5773ffffffffffffffffffffffffffffffffffffffff81541633036101cc577f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da6020604051838152a16101c77fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155565b604051f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c79204f776e65722063616e2063616e63656c2e000000000000000000006044820152fd5b80fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b35906102568261022d565b565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9060068210156102c65752565b6102ce610289565b52565b60208082019080835283518092528060408094019401926000905b8382106102fb57505050505090565b90919293948360e060019284895180516103168482516102b9565b73ffffffffffffffffffffffffffffffffffffffff9081878201511687860152838101518486015260608082015190860152816080809201511690850152858201511660a0840152015160c0820152019601920190939291936102ec565b50608060031936011261000e5760043561038d8161022d565b6024359061039a8261022d565b67ffffffffffffffff9060443582811161000e576103bc903690600401610258565b909260643590811161000e576103d6903690600401610258565b92909373ffffffffffffffffffffffffffffffffffffffff91826000541633036104905761045e9661043a600096604051988997889687957f2718034d00000000000000000000000000000000000000000000000000000000875260048701611975565b03923491165af1908115610483575b600091610462575b50604051918291826102d1565b0390f35b61047d913d8091833e610475818361124f565b81019061167d565b38610451565b61048b611290565b610449565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f6e6c7920746865206f776e65722063616e2065786563757465206f7264657260448201527f73207769746820746865207a6f6e652e000000000000000000000000000000006064820152fd5b503461000e57602060031936011261000e5760043561056e61056761054e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b331461113b565b61064f61054e6040516020810190610633816106077f63f1858c57c6c2e2fdb2ca34b9de90fa5f9bcb34274049b1dbb83eb66209f43e883087917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000605594927fff00000000000000000000000000000000000000000000000000000000000000855260601b166001840152601583015260358201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261124f565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b803b61071f577fd1fa916c9f898e9a8dcedb0f78093657d07014799896193f2b219bed6ac7399c6106db8361045e94604051806115b48082019082821067ffffffffffffffff831117610712575b611df7833903906000f515610705575b6040805173ffffffffffffffffffffffffffffffffffffffff86168152602081019290925290918291820190565b0390a160405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b61070d611290565b6106ad565b61071a6111c6565b61069d565b6040517e83438500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152602490fd5b503461000e57600060031936011261000e5760206040517f63f1858c57c6c2e2fdb2ca34b9de90fa5f9bcb34274049b1dbb83eb66209f43e8152f35b503461000e57602060031936011261000e576004356107c18161022d565b73ffffffffffffffffffffffffffffffffffffffff90816002541633141580610881575b6108575716803b1561000e57600080916004604051809481937f8456cb590000000000000000000000000000000000000000000000000000000083525af1801561084a575b61083b575b60405160018152602090f35b610844906111f6565b3861082f565b610852611290565b61082a565b60046040517fc7260843000000000000000000000000000000000000000000000000000000008152fd5b5081600054163314156107e5565b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b503461000e57600060031936011261000e5773ffffffffffffffffffffffffffffffffffffffff6001541633036109f057604051600081527f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da90602090a161094f7fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06109bf61099260005473ffffffffffffffffffffffffffffffffffffffff1690565b6040805173ffffffffffffffffffffffffffffffffffffffff909216825233602083015290918291820190565b0390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055005b005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4f6e6c7920506f74656e7469616c204f776e65722063616e20636c61696d2e006044820152fd5b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b503461000e57600060031936011261000e57602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b5060a060031936011261000e5760048035610ad28161022d565b60243590610adf8261022d565b67ffffffffffffffff60443581811161000e57610aff9036908601610258565b93909260643583811161000e57610b199036908801610258565b909360843590811161000e57610b329036908901610258565b9173ffffffffffffffffffffffffffffffffffffffff9586600054163303610b99579261045e999261043a92600099989796956040519b8c9a8b998a987f65c4eb72000000000000000000000000000000000000000000000000000000008a528901611bd8565b60848a6020604051917f08c379a0000000000000000000000000000000000000000000000000000000008352820152603960248201527f4f6e6c7920746865206f776e65722063616e206578656375746520616476616e60448201527f636564206f7264657273207769746820746865207a6f6e652e000000000000006064820152fd5b503461000e57606060031936011261000e57600435610c3b8161022d565b60243590610c488261022d565b60443567ffffffffffffffff811161000e57610c68903690600401610258565b909173ffffffffffffffffffffffffffffffffffffffff9283600054163303610d10576000602094610cca96604051978896879586937fe5c27af1000000000000000000000000000000000000000000000000000000008552600485016115cd565b0393165af18015610d03575b610cdc57005b6109ee9060203d8111610cfc575b610cf4818361124f565b81019061129d565b503d610cea565b610d0b611290565b610cd6565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f6e6c7920746865206f776e65722063616e2063616e63656c206f726465727360448201527f207769746820746865207a6f6e652e00000000000000000000000000000000006064820152fd5b503461000e57602060031936011261000e57600435610db28161022d565b73ffffffffffffffffffffffffffffffffffffffff610dd681600054163314611d91565b811615610e9157610e229073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255565b7fa4336c0cb1e245b95ad204faed7e940d6dc999684fd8b5e1ff597a0c4efca8ab610e8c610e6560025473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390a1005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5061757365722063616e206e6f742062652073657420746f20746865206e756c60448201527f6c206164647265737300000000000000000000000000000000000000000000006064820152fd5b503461000e57602060031936011261000e57600435610f338161022d565b73ffffffffffffffffffffffffffffffffffffffff9081600054163303610fe757610f646109ee9282161515611d2c565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da90602090a173ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4f6e6c79204f776e65722063616e207472616e73666572204f776e657273686960448201527f702e0000000000000000000000000000000000000000000000000000000000006064820152fd5b503461000e57604060031936011261000e576004356110898161022d565b6024356110958161022d565b73ffffffffffffffffffffffffffffffffffffffff918260009384926110bf828554163314611d91565b1692833b15611137576024908360405195869485937f84385c6f0000000000000000000000000000000000000000000000000000000085521660048401525af1801561112a575b611111575b50604051f35b8061111e611124926111f6565b80610134565b3861110b565b611132611290565b611106565b8280fd5b1561114257565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f6e6c79206f776e65722063616e20637265617465206e6577205a6f6e65732060448201527f66726f6d20686572652e000000000000000000000000000000000000000000006064820152fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161120a57604052565b6112126111c6565b604052565b6060810190811067ffffffffffffffff82111761120a57604052565b60a0810190811067ffffffffffffffff82111761120a57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761120a57604052565b506040513d6000823e3d90fd5b9081602091031261000e5751801515810361000e5790565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e5760a082023603831361000e57565b6006111561000e57565b9190808252602080920192916000905b828210611330575050505090565b909192938061134b600192873561134681611308565b6102b9565b73ffffffffffffffffffffffffffffffffffffffff8387013561136d8161022d565b168184015260408681013590820152606080870135908201526080808701359082015260a0908101950193920190611322565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e5760c082023603831361000e57565b9190808252602080920192916000905b828210611411575050505090565b9091929380611427600192873561134681611308565b828601356114348161022d565b73ffffffffffffffffffffffffffffffffffffffff8091168483015260408088013590830152606080880135908301526080808801359083015260a0908188013561147e8161022d565b169082015260c0908101950193920190611403565b3590600482101561000e57565b9060048210156102c65752565b906114d5816114bb8461024b565b73ffffffffffffffffffffffffffffffffffffffff169052565b6115016114e46020840161024b565b73ffffffffffffffffffffffffffffffffffffffff166020830152565b61154061152561151460408501856112b5565b610160806040870152850191611312565b61153260608501856113a0565b9084830360608601526113f3565b9161155a61155060808301611493565b60808401906114a0565b60a081013560a083015260c081013560c083015260e081013560e0830152610100808201359083015261012080820135908301526101408091013591015290565b90357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea18236030181121561000e570190565b929073ffffffffffffffffffffffffffffffffffffffff60408501911684528160209160408387015252606084019360608360051b82010194846000925b85841061161c575050505050505090565b909192939495968580611661837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0866001960301885261165c8c8861159b565b6114ad565b99019401940192959493919061160b565b51906102568261022d565b6020808284031261000e57815167ffffffffffffffff9283821161000e57019083601f8301121561000e578151928311611789575b6040938451946116c7838660051b018761124f565b848652828601918360e08097028601019481861161000e578401925b8584106116f4575050505050505090565b83820387811261000e5783519161170a83611217565b60a080921261000e5788926117718893875161172581611233565b895161173081611308565b8152858a015161173f8161022d565b86820152888a0151898201526060808b0151908201526080808b0151906117658261022d565b82015283528801611672565b8382015260c0870151868201528152019301926116e3565b6117916111c6565b6116b2565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e57813603831361000e57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18236030181121561000e570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57016020813591019167ffffffffffffffff821161000e578160061b3603831361000e57565b9190808252602080920192916000905b8282106118c8575050505090565b833585528381013585820152604094850194909301926001909101906118ba565b90808352602080930192838260051b850194846000925b858410611911575050505050505090565b909192939495968580611964838560019503885261192f8c88611825565b9061195761194d6119408480611857565b60408086528501916118aa565b9285810190611857565b91858185039101526118aa565b990194019401929594939190611900565b90939195949273ffffffffffffffffffffffffffffffffffffffff60608301951682528060209560608785015252608082019060808160051b8401019588926000905b8382106119da5750505050506119d794955060408185039101526118e9565b90565b90919293978380611a4e83611a198f8e907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808d60019903018952611825565b90611a41611a37611a2a848061159b565b60408085528401906114ad565b9285810190611796565b91858185039101526117e6565b9a0192019201909392916119b8565b35906effffffffffffffffffffffffffffff8216820361000e57565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618236030181121561000e570190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161000e5760209260051b80928483013701016000815290565b90808352602080930190819360059282841b810195856000925b858410611b1857505050505050505090565b90919293949596978181038452611b2f8984611a79565b8035825286810135600281101561000e57878301526040808201359083015260608082013590830152608090818101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561000e57019087823592019267ffffffffffffffff831161000e57828b1b3603841361000e5760019389938493611bc69360a080928201520191611aab565b9a019401940192969594939190611b06565b9593919796949260809173ffffffffffffffffffffffffffffffffffffffff838901911688528160209184838b01525260a0998a89018b8460051b8b01019b82956000935b868510611c5157505050505050505095611c43916119d796978683036040880152611aec565b9260608185039101526118e9565b909192939480889f8198998f82037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60018852611c8d9085611a79565b611c97818061159b565b878352878301611ca6916114ad565b6effffffffffffffffffffffffffffff80611cc2848701611a5d565b1684860152604090611cd5848301611a5d565b1690840152606090611ce983830184611796565b909285830390860152611cfb926117e6565b90868101611d0891611796565b909287818403910152611d1a926117e6565b9f019796956001019401929190611c1d565b15611d3357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e6577204f776e65722063616e206e6f74206265203020616464726573732e006044820152fd5b15611d9857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f43616e206f6e6c792062652073657420627920746865206465706c6f796572006044820152fdfe60a0806040523461006457336080527fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933600082a161154a908161006a82396080518181816104870152818161085b015281816108d801528181610a690152610c570152f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081630e1d31dc146100b6575080632718034d146100ad57806333131570146100a4578063570ca7351461009b57806365c4eb721461009257806384385c6f146100895780638456cb59146100805763e5c27af114610078575b600080fd5b610073610ab9565b50610073610a22565b50610073610883565b506100736105bc565b50610073610569565b506100736104af565b5061007361026a565b346100735760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610073576020906100f3602435610123565b6100fe604435610123565b7f0e1d31dc000000000000000000000000000000000000000000000000000000008152f35b73ffffffffffffffffffffffffffffffffffffffff81160361007357565b359061014c82610123565b565b9181601f840112156100735782359167ffffffffffffffff8311610073576020808501948460051b01011161007357565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9060068210156101bc5752565b6101c461017f565b52565b60208082019080835283518092528060408094019401926000905b8382106101f157505050505090565b90919293948360e0600192848951805161020c8482516101af565b73ffffffffffffffffffffffffffffffffffffffff9081878201511687860152838101518486015260608082015190860152816080809201511690850152858201511660a0840152015160c0820152019601920190939291936101e2565b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc606081360112610073576004356102a281610123565b67ffffffffffffffff91602435838111610073576102c490369060040161014e565b929093604435908111610073576102df90369060040161014e565b73ffffffffffffffffffffffffffffffffffffffff9591866000541633141580610483575b610459576040948551967fa817440400000000000000000000000000000000000000000000000000000000885280604489018860048b015252606488019060648160051b8a01019580926000915b8383106103d35750505061039f89896000828e818d8161037d8f8f8f8f8584030160248601526112e9565b03923491165af19182156103c6575b6000926103a3575b5051918291826101c7565b0390f35b6103bf91923d8091833e6103b78183610cf4565b81019061107d565b9083610394565b6103ce611065565b61038c565b909192939761043d8b61044a838f6104178e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c61042e9360019903018a5288611225565b936104228580611033565b90808452830190610f45565b90602094848680960190611196565b91858185039101526111e6565b9a019301930191939290610352565b60046040517fccea9e6f000000000000000000000000000000000000000000000000000000008152fd5b50867f000000000000000000000000000000000000000000000000000000000000000016331415610304565b5034610073577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60a081360112610073576104eb602435610123565b60443567ffffffffffffffff918282116100735760a09136030112610073576064358181116100735761052290369060040161014e565b50506084359081116100735761053c90369060040161014e565b50506040517f0e1d31dc000000000000000000000000000000000000000000000000000000008152602090f35b50346100735760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007357602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b5060807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc81813601126100735760049081356105f781610123565b67ffffffffffffffff9160243583811161007357610618903690860161014e565b95909360443581811161007357610632903690880161014e565b9290916064359081116100735761064c903690890161014e565b93909273ffffffffffffffffffffffffffffffffffffffff998a6000541633141580610857575b61082e5797989260409889519a7f55944a42000000000000000000000000000000000000000000000000000000008c528160648d018d606098899101525260848c019560848d8460051b01019682946000935b85851061075357505050505050508561039f9a958a97956106fb868a989661070a968a988960009f9b030160248a0152611404565b928584030160448601526112e9565b03923491165af1918215610746575b60009261072b575051918291826101c7565b61073f91923d8091833e6103b78183610cf4565b9038610394565b61074e611065565b610719565b909192939495988f8f90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c600193820301865261081d6107948d86611391565b6107ae6107a18280611033565b60a0808652850190610f45565b926108106108066effffffffffffffffffffffffffffff956020978789986107d78a8901611375565b16898701526107e7828801611375565b16908501528c6107f981870187611196565b91868403908701526111e6565b9289810190611196565b91898185039101526111e6565b9b01940195019392959491906106c6565b896040517fccea9e6f000000000000000000000000000000000000000000000000000000008152fd5b508a7f000000000000000000000000000000000000000000000000000000000000000016331415610673565b50346100735760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610073576004356108bf81610123565b73ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000000000000000000000000000000000000000000001633036109f85716801561097457600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168217905560405173ffffffffffffffffffffffffffffffffffffffff90911681527fb3b3f5f64ab192e4b5fefde1f51ce9733bbdcf831951543b325aebd49cc27ec490602090a1005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f70657261746f722063616e206e6f742062652073657420746f20746865206e60448201527f756c6c20616464726573730000000000000000000000000000000000000000006064820152fd5b60046040517f6d5769be000000000000000000000000000000000000000000000000000000008152fd5b50346100735760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100735773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036109f8577f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7526000604051a132ff5b50346100735760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007357600435610af581610123565b60243567ffffffffffffffff811161007357610b1590369060040161014e565b9073ffffffffffffffffffffffffffffffffffffffff806000541633141580610c53575b61045957604051917ffd9f1e1000000000000000000000000000000000000000000000000000000000835260248301938060209586600487015252604484019060448160051b8601019280926000915b838310610c015761039f898981818e8160008e828f0393165af1918215610bf4575b600092610bc7575b505060405190151581529081906020820190565b610be69250803d10610bed575b610bde8183610cf4565b810190610d35565b8280610bb3565b503d610bd4565b610bfc611065565b610bab565b90919293948880610c44837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8c60019603018752610c3f8a87611033565b610f45565b97019301930191939290610b89565b50807f000000000000000000000000000000000000000000000000000000000000000016331415610b39565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff821117610ccb57604052565b610cd3610c7f565b604052565b60a0810190811067ffffffffffffffff821117610ccb57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610ccb57604052565b90816020910312610073575180151581036100735790565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff82116100735760a082023603831361007357565b6006111561007357565b9190808252602080920192916000905b828210610dc8575050505090565b9091929380610de36001928735610dde81610da0565b6101af565b73ffffffffffffffffffffffffffffffffffffffff83870135610e0581610123565b168184015260408681013590820152606080870135908201526080808701359082015260a0908101950193920190610dba565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff82116100735760c082023603831361007357565b9190808252602080920192916000905b828210610ea9575050505090565b9091929380610ebf6001928735610dde81610da0565b82860135610ecc81610123565b73ffffffffffffffffffffffffffffffffffffffff8091168483015260408088013590830152606080880135908301526080808801359083015260a09081880135610f1681610123565b169082015260c0908101950193920190610e9b565b3590600482101561007357565b9060048210156101bc5752565b90610f6d81610f5384610141565b73ffffffffffffffffffffffffffffffffffffffff169052565b610f99610f7c60208401610141565b73ffffffffffffffffffffffffffffffffffffffff166020830152565b610fd8610fbd610fac6040850185610d4d565b610160806040870152850191610daa565b610fca6060850185610e38565b908483036060860152610e8b565b91610ff2610fe860808301610f2b565b6080840190610f38565b60a081013560a083015260c081013560c083015260e081013560e0830152610100808201359083015261012080820135908301526101408091013591015290565b90357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea182360301811215610073570190565b506040513d6000823e3d90fd5b519061014c82610123565b6020808284031261007357815167ffffffffffffffff9283821161007357019083601f83011215610073578151928311611189575b6040938451946110c7838660051b0187610cf4565b848652828601918360e080970286010194818611610073578401925b8584106110f4575050505050505090565b8382038781126100735783519161110a83610caf565b60a08092126100735788926111718893875161112581610cd8565b895161113081610da0565b8152858a015161113f81610123565b86820152888a0151898201526060808b0151908201526080808b01519061116582610123565b82015283528801611072565b8382015260c0870151868201528152019301926110e3565b611191610c7f565b6110b2565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff821161007357813603831361007357565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610073570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357016020813591019167ffffffffffffffff8211610073578160061b3603831361007357565b9190808252602080920192916000905b8282106112c8575050505090565b833585528381013585820152604094850194909301926001909101906112ba565b90808352602080930192838260051b850194846000925b858410611311575050505050505090565b909192939495968580611364838560019503885261132f8c88611225565b9061135761134d6113408480611257565b60408086528501916112aa565b9285810190611257565b91858185039101526112aa565b990194019401929594939190611300565b35906effffffffffffffffffffffffffffff8216820361007357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6182360301811215610073570190565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116100735760209260051b80928483013701016000815290565b9082908084526020809401936005928183851b82010195856000925b85841061143257505050505050505090565b90919293949596977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820301845261146b8984611391565b8035825286810135600281101561007357878301526040808201359083015260608082013590830152608090818101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561007357019087823592019267ffffffffffffffff831161007357828b1b3603841361007357600193899384936115029360a0809282015201916113c3565b9a01940194019296959493919061142056fea26469706673582212205373ac4d0ce5bb34fc04a8453b663d8817fd20f76b70b5b3fbc050c6b381c63464736f6c634300080e0033a26469706673582212205aec1f7011fb7c666bdc59c01ee61f8e8542a4c186ee08da8530035a171780f464736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000df7bb361dc059c185dced96ace6ec4d0c1f72b0f
-----Decoded View---------------
Arg [0] : ownerAddress (address): 0xdF7bB361dC059c185DcEd96ACe6Ec4D0C1f72b0F
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000df7bb361dc059c185dced96ace6ec4d0c1f72b0f
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.