Source Code
Latest 16 from a total of 16 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Increment Nonce | 19825871 | 514 days ago | IN | 0 ETH | 0.00047044 | ||||
Increment Nonce | 18090613 | 757 days ago | IN | 0 ETH | 0.00045517 | ||||
Increment Nonce | 18090611 | 757 days ago | IN | 0 ETH | 0.00074212 | ||||
Execute | 17422304 | 851 days ago | IN | 0 ETH | 0.00135659 | ||||
Increment Nonce | 17397437 | 854 days ago | IN | 0 ETH | 0.00138718 | ||||
Execute | 17337082 | 863 days ago | IN | 0 ETH | 0.0020964 | ||||
Execute | 17337077 | 863 days ago | IN | 0 ETH | 0.0019335 | ||||
Execute | 17337074 | 863 days ago | IN | 0 ETH | 0.00206339 | ||||
Bulk Execute | 17144067 | 890 days ago | IN | 0 ETH | 0.00135347 | ||||
_execute | 16933736 | 920 days ago | IN | 0.0001 ETH | 0.00152338 | ||||
_execute | 16933678 | 920 days ago | IN | 0.0001 ETH | 0.00156802 | ||||
Increment Nonce | 16829530 | 934 days ago | IN | 0 ETH | 0.00118424 | ||||
Execute | 16729106 | 949 days ago | IN | 0.009 ETH | 0.00105133 | ||||
Increment Nonce | 16697360 | 953 days ago | IN | 0 ETH | 0.00074272 | ||||
Increment Nonce | 16697117 | 953 days ago | IN | 0 ETH | 0.00098266 | ||||
Increment Nonce | 16697009 | 953 days ago | IN | 0 ETH | 0.00153783 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
BlurExchange
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 800 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "./lib/ReentrancyGuarded.sol"; import "./lib/EIP712.sol"; import "./lib/MerkleVerifier.sol"; import "./interfaces/IBlurExchange.sol"; import "./interfaces/IBlurPool.sol"; import "./interfaces/IExecutionDelegate.sol"; import "./interfaces/IPolicyManager.sol"; import "./interfaces/IMatchingPolicy.sol"; import { Side, SignatureVersion, AssetType, Fee, Order, Input, Execution } from "./lib/OrderStructs.sol"; /** * @title BlurExchange * @dev Core Blur exchange contract */ contract BlurExchange is IBlurExchange, ReentrancyGuarded, EIP712, OwnableUpgradeable, UUPSUpgradeable { /* Auth */ uint256 public isOpen; modifier whenOpen() { require(isOpen == 1, "Closed"); _; } modifier setupExecution() { require(!isInternal, "Unsafe call"); // add redundant re-entrancy check for clarity remainingETH = msg.value; isInternal = true; _; remainingETH = 0; isInternal = false; } modifier internalCall() { require(isInternal, "Unsafe call"); _; } event Opened(); event Closed(); function open() external onlyOwner { isOpen = 1; emit Opened(); } function close() external onlyOwner { isOpen = 0; emit Closed(); } // required by the OZ UUPS module function _authorizeUpgrade(address) internal override onlyOwner {} /* Constants */ string public constant NAME = "Blur Exchange"; string public constant VERSION = "1.0"; uint256 public constant INVERSE_BASIS_POINT = 10_000; address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address public constant POOL = 0x0000000000A39bb272e79075ade125fd351887Ac; uint256 private constant MAX_FEE_RATE = 250; /* Variables */ IExecutionDelegate public executionDelegate; IPolicyManager public policyManager; address public oracle; uint256 public blockRange; /* Storage */ mapping(bytes32 => bool) public cancelledOrFilled; mapping(address => uint256) public nonces; bool public isInternal = false; uint256 public remainingETH = 0; /* Governance Variables */ uint256 public feeRate; address public feeRecipient; address public governor; /* Events */ event OrdersMatched( address indexed maker, address indexed taker, Order sell, bytes32 sellHash, Order buy, bytes32 buyHash ); event OrderCancelled(bytes32 hash); event NonceIncremented(address indexed trader, uint256 newNonce); event NewExecutionDelegate(IExecutionDelegate indexed executionDelegate); event NewPolicyManager(IPolicyManager indexed policyManager); event NewOracle(address indexed oracle); event NewBlockRange(uint256 blockRange); event NewFeeRate(uint256 feeRate); event NewFeeRecipient(address feeRecipient); event NewGovernor(address governor); constructor() { _disableInitializers(); } /* Constructor (for ERC1967) */ function initialize( IExecutionDelegate _executionDelegate, IPolicyManager _policyManager, address _oracle, uint _blockRange ) external initializer { __Ownable_init(); isOpen = 1; DOMAIN_SEPARATOR = _hashDomain(EIP712Domain({ name : NAME, version : VERSION, chainId : block.chainid, verifyingContract : address(this) })); executionDelegate = _executionDelegate; policyManager = _policyManager; oracle = _oracle; blockRange = _blockRange; } /* External Functions */ /** * @dev _execute wrapper * @param sell Sell input * @param buy Buy input */ function execute(Input calldata sell, Input calldata buy) external payable whenOpen setupExecution { _execute(sell, buy); _returnDust(); } /** * @dev Bulk execute multiple matches * @param executions Potential buy/sell matches */ function bulkExecute(Execution[] calldata executions) external payable whenOpen setupExecution { /* REFERENCE uint256 executionsLength = executions.length; for (uint8 i=0; i < executionsLength; i++) { bytes memory data = abi.encodeWithSelector(this._execute.selector, executions[i].sell, executions[i].buy); (bool success,) = address(this).delegatecall(data); } _returnDust(remainingETH); */ uint256 executionsLength = executions.length; if (executionsLength == 0) { revert("No orders to execute"); } for (uint8 i = 0; i < executionsLength; i++) { assembly { let memPointer := mload(0x40) let order_location := calldataload(add(executions.offset, mul(i, 0x20))) let order_pointer := add(executions.offset, order_location) let size switch eq(add(i, 0x01), executionsLength) case 1 { size := sub(calldatasize(), order_pointer) } default { let next_order_location := calldataload(add(executions.offset, mul(add(i, 0x01), 0x20))) let next_order_pointer := add(executions.offset, next_order_location) size := sub(next_order_pointer, order_pointer) } mstore(memPointer, 0xe04d94ae00000000000000000000000000000000000000000000000000000000) // _execute calldatacopy(add(0x04, memPointer), order_pointer, size) // must be put in separate transaction to bypass failed executions // must be put in delegatecall to maintain the authorization from the caller let result := delegatecall(gas(), address(), memPointer, add(size, 0x04), 0, 0) } } _returnDust(); } /** * @dev Match two orders, ensuring validity of the match, and execute all associated state transitions. Must be called internally. * @param sell Sell input * @param buy Buy input */ function _execute(Input calldata sell, Input calldata buy) public payable internalCall reentrancyGuard // move re-entrancy check for clarity { require(sell.order.side == Side.Sell); bytes32 sellHash = _hashOrder(sell.order, nonces[sell.order.trader]); bytes32 buyHash = _hashOrder(buy.order, nonces[buy.order.trader]); require(_validateOrderParameters(sell.order, sellHash), "Sell has invalid parameters"); require(_validateOrderParameters(buy.order, buyHash), "Buy has invalid parameters"); require(_validateSignatures(sell, sellHash), "Sell failed authorization"); require(_validateSignatures(buy, buyHash), "Buy failed authorization"); (uint256 price, uint256 tokenId, uint256 amount, AssetType assetType) = _canMatchOrders(sell.order, buy.order); /* Mark orders as filled. */ cancelledOrFilled[sellHash] = true; cancelledOrFilled[buyHash] = true; _executeFundsTransfer( sell.order.trader, buy.order.trader, sell.order.paymentToken, sell.order.fees, buy.order.fees, price ); _executeTokenTransfer( sell.order.collection, sell.order.trader, buy.order.trader, tokenId, amount, assetType ); emit OrdersMatched( sell.order.listingTime <= buy.order.listingTime ? sell.order.trader : buy.order.trader, sell.order.listingTime > buy.order.listingTime ? sell.order.trader : buy.order.trader, sell.order, sellHash, buy.order, buyHash ); } /** * @dev Cancel an order, preventing it from being matched. Must be called by the trader of the order * @param order Order to cancel */ function cancelOrder(Order calldata order) public { /* Assert sender is authorized to cancel order. */ require(msg.sender == order.trader, "Not sent by trader"); bytes32 hash = _hashOrder(order, nonces[order.trader]); require(!cancelledOrFilled[hash], "Order cancelled or filled"); /* Mark order as cancelled, preventing it from being matched. */ cancelledOrFilled[hash] = true; emit OrderCancelled(hash); } /** * @dev Cancel multiple orders * @param orders Orders to cancel */ function cancelOrders(Order[] calldata orders) external { for (uint8 i = 0; i < orders.length; i++) { cancelOrder(orders[i]); } } /** * @dev Cancel all current orders for a user, preventing them from being matched. Must be called by the trader of the order */ function incrementNonce() external { nonces[msg.sender] += 1; emit NonceIncremented(msg.sender, nonces[msg.sender]); } /* Setters */ function setExecutionDelegate(IExecutionDelegate _executionDelegate) external onlyOwner { require(address(_executionDelegate) != address(0), "Address cannot be zero"); executionDelegate = _executionDelegate; emit NewExecutionDelegate(executionDelegate); } function setPolicyManager(IPolicyManager _policyManager) external onlyOwner { require(address(_policyManager) != address(0), "Address cannot be zero"); policyManager = _policyManager; emit NewPolicyManager(policyManager); } function setOracle(address _oracle) external onlyOwner { require(_oracle != address(0), "Address cannot be zero"); oracle = _oracle; emit NewOracle(oracle); } function setBlockRange(uint256 _blockRange) external onlyOwner { blockRange = _blockRange; emit NewBlockRange(blockRange); } function setGovernor(address _governor) external onlyOwner { governor = _governor; emit NewGovernor(governor); } function setFeeRate(uint256 _feeRate) external { require(msg.sender == governor, "Fee rate can only be set by governor"); require(_feeRate <= MAX_FEE_RATE, "Fee cannot be more than 2.5%"); feeRate = _feeRate; emit NewFeeRate(feeRate); } function setFeeRecipient(address _feeRecipient) external onlyOwner { feeRecipient = _feeRecipient; emit NewFeeRecipient(feeRecipient); } /* Internal Functions */ /** * @dev Verify the validity of the order parameters * @param order order * @param orderHash hash of order */ function _validateOrderParameters(Order calldata order, bytes32 orderHash) internal view returns (bool) { return ( /* Order must have a trader. */ (order.trader != address(0)) && /* Order must not be cancelled or filled. */ (!cancelledOrFilled[orderHash]) && /* Order must be settleable. */ (order.listingTime < block.timestamp) && (block.timestamp < order.expirationTime) ); } /** * @dev Verify the validity of the signatures * @param order order * @param orderHash hash of order */ function _validateSignatures(Input calldata order, bytes32 orderHash) internal view returns (bool) { if (order.order.extraParams.length > 0 && order.order.extraParams[0] == 0x01) { /* Check oracle authorization. */ require(block.number - order.blockNumber < blockRange, "Signed block number out of range"); if ( !_validateOracleAuthorization( orderHash, order.signatureVersion, order.extraSignature, order.blockNumber ) ) { return false; } } if (order.order.trader == msg.sender) { return true; } /* Check user authorization. */ if ( !_validateUserAuthorization( orderHash, order.order.trader, order.v, order.r, order.s, order.signatureVersion, order.extraSignature ) ) { return false; } return true; } /** * @dev Verify the validity of the user signature * @param orderHash hash of the order * @param trader order trader who should be the signer * @param v v * @param r r * @param s s * @param signatureVersion signature version * @param extraSignature packed merkle path */ function _validateUserAuthorization( bytes32 orderHash, address trader, uint8 v, bytes32 r, bytes32 s, SignatureVersion signatureVersion, bytes calldata extraSignature ) internal view returns (bool) { bytes32 hashToSign; if (signatureVersion == SignatureVersion.Single) { /* Single-listing authentication: Order signed by trader */ hashToSign = _hashToSign(orderHash); } else if (signatureVersion == SignatureVersion.Bulk) { /* Bulk-listing authentication: Merkle root of orders signed by trader */ (bytes32[] memory merklePath) = abi.decode(extraSignature, (bytes32[])); bytes32 computedRoot = MerkleVerifier._computeRoot(orderHash, merklePath); hashToSign = _hashToSignRoot(computedRoot); } return _verify(trader, hashToSign, v, r, s); } /** * @dev Verify the validity of oracle signature * @param orderHash hash of the order * @param signatureVersion signature version * @param extraSignature packed oracle signature * @param blockNumber block number used in oracle signature */ function _validateOracleAuthorization( bytes32 orderHash, SignatureVersion signatureVersion, bytes calldata extraSignature, uint256 blockNumber ) internal view returns (bool) { bytes32 oracleHash = _hashToSignOracle(orderHash, blockNumber); uint8 v; bytes32 r; bytes32 s; if (signatureVersion == SignatureVersion.Single) { assembly { v := calldataload(extraSignature.offset) r := calldataload(add(extraSignature.offset, 0x20)) s := calldataload(add(extraSignature.offset, 0x40)) } /* REFERENCE (v, r, s) = abi.decode(extraSignature, (uint8, bytes32, bytes32)); */ } else if (signatureVersion == SignatureVersion.Bulk) { /* If the signature was a bulk listing the merkle path must be unpacked before the oracle signature. */ assembly { v := calldataload(add(extraSignature.offset, 0x20)) r := calldataload(add(extraSignature.offset, 0x40)) s := calldataload(add(extraSignature.offset, 0x60)) } /* REFERENCE uint8 _v, bytes32 _r, bytes32 _s; (bytes32[] memory merklePath, uint8 _v, bytes32 _r, bytes32 _s) = abi.decode(extraSignature, (bytes32[], uint8, bytes32, bytes32)); v = _v; r = _r; s = _s; */ } return _verify(oracle, oracleHash, v, r, s); } /** * @dev Verify ECDSA signature * @param signer Expected signer * @param digest Signature preimage * @param v v * @param r r * @param s s */ function _verify( address signer, bytes32 digest, uint8 v, bytes32 r, bytes32 s ) internal pure returns (bool) { require(v == 27 || v == 28, "Invalid v parameter"); address recoveredSigner = ecrecover(digest, v, r, s); if (recoveredSigner == address(0)) { return false; } else { return signer == recoveredSigner; } } /** * @dev Call the matching policy to check orders can be matched and get execution parameters * @param sell sell order * @param buy buy order */ function _canMatchOrders(Order calldata sell, Order calldata buy) internal view returns (uint256 price, uint256 tokenId, uint256 amount, AssetType assetType) { bool canMatch; if (sell.listingTime <= buy.listingTime) { /* Seller is maker. */ require(policyManager.isPolicyWhitelisted(sell.matchingPolicy), "Policy is not whitelisted"); (canMatch, price, tokenId, amount, assetType) = IMatchingPolicy(sell.matchingPolicy).canMatchMakerAsk(sell, buy); } else { /* Buyer is maker. */ require(policyManager.isPolicyWhitelisted(buy.matchingPolicy), "Policy is not whitelisted"); (canMatch, price, tokenId, amount, assetType) = IMatchingPolicy(buy.matchingPolicy).canMatchMakerBid(buy, sell); } require(canMatch, "Orders cannot be matched"); return (price, tokenId, amount, assetType); } /** * @dev Execute all ERC20 token / ETH transfers associated with an order match (fees and buyer => seller transfer) * @param seller seller * @param buyer buyer * @param paymentToken payment token * @param sellerFees seller fees * @param buyerFees buyer fees * @param price price */ function _executeFundsTransfer( address seller, address buyer, address paymentToken, Fee[] calldata sellerFees, Fee[] calldata buyerFees, uint256 price ) internal { if (paymentToken == address(0)) { require(msg.sender == buyer, "Cannot use ETH"); require(remainingETH >= price, "Insufficient value"); remainingETH -= price; } /* Take fee. */ uint256 sellerFeesPaid = _transferFees(sellerFees, paymentToken, buyer, price, true); uint256 buyerFeesPaid = _transferFees(buyerFees, paymentToken, buyer, price, false); if (paymentToken == address(0)) { /* Need to account for buyer fees paid on top of the price. */ remainingETH -= buyerFeesPaid; } /* Transfer remainder to seller. */ _transferTo(paymentToken, buyer, seller, price - sellerFeesPaid); } /** * @dev Charge a fee in ETH or WETH * @param fees fees to distribute * @param paymentToken address of token to pay in * @param from address to charge fees * @param price price of token * @return total fees paid */ function _transferFees( Fee[] calldata fees, address paymentToken, address from, uint256 price, bool protocolFee ) internal returns (uint256) { uint256 totalFee = 0; /* Take protocol fee if enabled. */ if (feeRate > 0 && protocolFee) { uint256 fee = (price * feeRate) / INVERSE_BASIS_POINT; _transferTo(paymentToken, from, feeRecipient, fee); totalFee += fee; } /* Take order fees. */ for (uint8 i = 0; i < fees.length; i++) { uint256 fee = (price * fees[i].rate) / INVERSE_BASIS_POINT; _transferTo(paymentToken, from, fees[i].recipient, fee); totalFee += fee; } require(totalFee <= price, "Fees are more than the price"); return totalFee; } /** * @dev Transfer amount in ETH or WETH * @param paymentToken address of token to pay in * @param from token sender * @param to token recipient * @param amount amount to transfer */ function _transferTo( address paymentToken, address from, address to, uint256 amount ) internal { if (amount == 0) { return; } if (paymentToken == address(0)) { /* Transfer funds in ETH. */ require(to != address(0), "Transfer to zero address"); (bool success,) = payable(to).call{value: amount}(""); require(success, "ETH transfer failed"); } else if (paymentToken == POOL) { /* Transfer Pool funds. */ bool success = IBlurPool(POOL).transferFrom(from, to, amount); require(success, "Pool transfer failed"); } else if (paymentToken == WETH) { /* Transfer funds in WETH. */ executionDelegate.transferERC20(WETH, from, to, amount); } else { revert("Invalid payment token"); } } /** * @dev Execute call through delegate proxy * @param collection collection contract address * @param from seller address * @param to buyer address * @param tokenId tokenId * @param assetType asset type of the token */ function _executeTokenTransfer( address collection, address from, address to, uint256 tokenId, uint256 amount, AssetType assetType ) internal { /* Call execution delegate. */ if (assetType == AssetType.ERC721) { executionDelegate.transferERC721(collection, from, to, tokenId); } else if (assetType == AssetType.ERC1155) { executionDelegate.transferERC1155(collection, from, to, tokenId, amount); } } /** * @dev Return remaining ETH sent to bulkExecute or execute */ function _returnDust() private { uint256 _remainingETH = remainingETH; assembly { if gt(_remainingETH, 0) { let callStatus := call( gas(), caller(), _remainingETH, 0, 0, 0, 0 ) if iszero(callStatus) { revert(0, 0) } } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; import "../../interfaces/draft-IERC1822Upgradeable.sol"; import "../ERC1967/ERC1967UpgradeUpgradeable.sol"; import "./Initializable.sol"; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate that the this implementation remains valid after an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; /** * @title ReentrancyGuarded * @dev Protections for reentrancy attacks */ contract ReentrancyGuarded { bool private reentrancyLock = false; /* Prevent a contract function from being reentrant-called. */ modifier reentrancyGuard { require(!reentrancyLock, "Reentrancy detected"); reentrancyLock = true; _; reentrancyLock = false; } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import {Order, Fee} from "./OrderStructs.sol"; /** * @title EIP712 * @dev Contains all of the order hashing functions for EIP712 compliant signatures */ contract EIP712 { struct EIP712Domain { string name; string version; uint256 chainId; address verifyingContract; } /* Order typehash for EIP 712 compatibility. */ bytes32 constant public FEE_TYPEHASH = keccak256( "Fee(uint16 rate,address recipient)" ); bytes32 constant public ORDER_TYPEHASH = keccak256( "Order(address trader,uint8 side,address matchingPolicy,address collection,uint256 tokenId,uint256 amount,address paymentToken,uint256 price,uint256 listingTime,uint256 expirationTime,Fee[] fees,uint256 salt,bytes extraParams,uint256 nonce)Fee(uint16 rate,address recipient)" ); bytes32 constant public ORACLE_ORDER_TYPEHASH = keccak256( "OracleOrder(Order order,uint256 blockNumber)Fee(uint16 rate,address recipient)Order(address trader,uint8 side,address matchingPolicy,address collection,uint256 tokenId,uint256 amount,address paymentToken,uint256 price,uint256 listingTime,uint256 expirationTime,Fee[] fees,uint256 salt,bytes extraParams,uint256 nonce)" ); bytes32 constant public ROOT_TYPEHASH = keccak256( "Root(bytes32 root)" ); bytes32 constant EIP712DOMAIN_TYPEHASH = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); bytes32 DOMAIN_SEPARATOR; function _hashDomain(EIP712Domain memory eip712Domain) internal pure returns (bytes32) { return keccak256( abi.encode( EIP712DOMAIN_TYPEHASH, keccak256(bytes(eip712Domain.name)), keccak256(bytes(eip712Domain.version)), eip712Domain.chainId, eip712Domain.verifyingContract ) ); } function _hashFee(Fee calldata fee) internal pure returns (bytes32) { return keccak256( abi.encode( FEE_TYPEHASH, fee.rate, fee.recipient ) ); } function _packFees(Fee[] calldata fees) internal pure returns (bytes32) { bytes32[] memory feeHashes = new bytes32[]( fees.length ); for (uint256 i = 0; i < fees.length; i++) { feeHashes[i] = _hashFee(fees[i]); } return keccak256(abi.encodePacked(feeHashes)); } function _hashOrder(Order calldata order, uint256 nonce) internal pure returns (bytes32) { return keccak256( bytes.concat( abi.encode( ORDER_TYPEHASH, order.trader, order.side, order.matchingPolicy, order.collection, order.tokenId, order.amount, order.paymentToken, order.price, order.listingTime, order.expirationTime, _packFees(order.fees), order.salt, keccak256(order.extraParams) ), abi.encode(nonce) ) ); } function _hashToSign(bytes32 orderHash) internal view returns (bytes32 hash) { return keccak256(abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, orderHash )); } function _hashToSignRoot(bytes32 root) internal view returns (bytes32 hash) { return keccak256(abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256(abi.encode( ROOT_TYPEHASH, root )) )); } function _hashToSignOracle(bytes32 orderHash, uint256 blockNumber) internal view returns (bytes32 hash) { return keccak256(abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256(abi.encode( ORACLE_ORDER_TYPEHASH, orderHash, blockNumber )) )); } uint256[44] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; /** * @title MerkleVerifier * @dev Utility functions for Merkle tree computations */ library MerkleVerifier { error InvalidProof(); /** * @dev Verify the merkle proof * @param leaf leaf * @param root root * @param proof proof */ function _verifyProof( bytes32 leaf, bytes32 root, bytes32[] memory proof ) public pure { bytes32 computedRoot = _computeRoot(leaf, proof); if (computedRoot != root) { revert InvalidProof(); } } /** * @dev Compute the merkle root * @param leaf leaf * @param proof proof */ function _computeRoot( bytes32 leaf, bytes32[] memory proof ) public pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; computedHash = _hashPair(computedHash, proofElement); } return computedHash; } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash( bytes32 a, bytes32 b ) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import {Input, Order} from "../lib/OrderStructs.sol"; import "./IExecutionDelegate.sol"; import "./IPolicyManager.sol"; interface IBlurExchange { function nonces(address) external view returns (uint256); function close() external; function initialize( IExecutionDelegate _executionDelegate, IPolicyManager _policyManager, address _oracle, uint _blockRange ) external; function setExecutionDelegate(IExecutionDelegate _executionDelegate) external; function setPolicyManager(IPolicyManager _policyManager) external; function setOracle(address _oracle) external; function setBlockRange(uint256 _blockRange) external; function cancelOrder(Order calldata order) external; function cancelOrders(Order[] calldata orders) external; function incrementNonce() external; function execute(Input calldata sell, Input calldata buy) external payable; }
pragma solidity ^0.8.17; interface IBlurPool { event Transfer(address indexed from, address indexed to, uint256 amount); function totalSupply() external view returns (uint256); function balanceOf(address user) external view returns (uint256); function deposit() external payable; function withdraw(uint256) external; function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; interface IExecutionDelegate { function approveContract(address _contract) external; function denyContract(address _contract) external; function revokeApproval() external; function grantApproval() external; function transferERC721Unsafe(address collection, address from, address to, uint256 tokenId) external; function transferERC721(address collection, address from, address to, uint256 tokenId) external; function transferERC1155(address collection, address from, address to, uint256 tokenId, uint256 amount) external; function transferERC20(address token, address from, address to, uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; interface IPolicyManager { function addPolicy(address policy) external; function removePolicy(address policy) external; function isPolicyWhitelisted(address policy) external view returns (bool); function viewWhitelistedPolicies(uint256 cursor, uint256 size) external view returns (address[] memory, uint256); function viewCountWhitelistedPolicies() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import {Order, AssetType} from "../lib/OrderStructs.sol"; interface IMatchingPolicy { function canMatchMakerAsk(Order calldata makerAsk, Order calldata takerBid) external view returns ( bool, uint256, uint256, uint256, AssetType ); function canMatchMakerBid(Order calldata makerBid, Order calldata takerAsk) external view returns ( bool, uint256, uint256, uint256, AssetType ); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; enum Side { Buy, Sell } enum SignatureVersion { Single, Bulk } enum AssetType { ERC721, ERC1155 } struct Fee { uint16 rate; address payable recipient; } struct Order { address trader; Side side; address matchingPolicy; address collection; uint256 tokenId; uint256 amount; address paymentToken; uint256 price; uint256 listingTime; /* Order expiration timestamp - 0 for oracle cancellations. */ uint256 expirationTime; Fee[] fees; uint256 salt; bytes extraParams; } struct Input { Order order; uint8 v; bytes32 r; bytes32 s; bytes extraSignature; SignatureVersion signatureVersion; uint256 blockNumber; } struct Execution { Input sell; Input buy; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; import "../beacon/IBeaconUpgradeable.sol"; import "../../interfaces/draft-IERC1822Upgradeable.sol"; import "../../utils/AddressUpgradeable.sol"; import "../../utils/StorageSlotUpgradeable.sol"; import "../utils/Initializable.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
{ "metadata": { "bytecodeHash": "none" }, "optimizer": { "enabled": true, "runs": 800 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": { "contracts/lib/MerkleVerifier.sol": { "MerkleVerifier": "0x4c2bbdbeccae1c492c681158a46eae498a05627b" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[],"name":"Closed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blockRange","type":"uint256"}],"name":"NewBlockRange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IExecutionDelegate","name":"executionDelegate","type":"address"}],"name":"NewExecutionDelegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeRate","type":"uint256"}],"name":"NewFeeRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeRecipient","type":"address"}],"name":"NewFeeRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"governor","type":"address"}],"name":"NewGovernor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oracle","type":"address"}],"name":"NewOracle","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IPolicyManager","name":"policyManager","type":"address"}],"name":"NewPolicyManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"uint256","name":"newNonce","type":"uint256"}],"name":"NonceIncremented","type":"event"},{"anonymous":false,"inputs":[],"name":"Opened","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"OrderCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":true,"internalType":"address","name":"taker","type":"address"},{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"enum Side","name":"side","type":"uint8"},{"internalType":"address","name":"matchingPolicy","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"components":[{"internalType":"uint16","name":"rate","type":"uint16"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct Fee[]","name":"fees","type":"tuple[]"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"extraParams","type":"bytes"}],"indexed":false,"internalType":"struct Order","name":"sell","type":"tuple"},{"indexed":false,"internalType":"bytes32","name":"sellHash","type":"bytes32"},{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"enum Side","name":"side","type":"uint8"},{"internalType":"address","name":"matchingPolicy","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"components":[{"internalType":"uint16","name":"rate","type":"uint16"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct Fee[]","name":"fees","type":"tuple[]"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"extraParams","type":"bytes"}],"indexed":false,"internalType":"struct Order","name":"buy","type":"tuple"},{"indexed":false,"internalType":"bytes32","name":"buyHash","type":"bytes32"}],"name":"OrdersMatched","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"FEE_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INVERSE_BASIS_POINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_ORDER_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORDER_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"enum Side","name":"side","type":"uint8"},{"internalType":"address","name":"matchingPolicy","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"components":[{"internalType":"uint16","name":"rate","type":"uint16"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct Fee[]","name":"fees","type":"tuple[]"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"extraParams","type":"bytes"}],"internalType":"struct Order","name":"order","type":"tuple"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"bytes","name":"extraSignature","type":"bytes"},{"internalType":"enum SignatureVersion","name":"signatureVersion","type":"uint8"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"internalType":"struct Input","name":"sell","type":"tuple"},{"components":[{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"enum Side","name":"side","type":"uint8"},{"internalType":"address","name":"matchingPolicy","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"components":[{"internalType":"uint16","name":"rate","type":"uint16"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct Fee[]","name":"fees","type":"tuple[]"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"extraParams","type":"bytes"}],"internalType":"struct Order","name":"order","type":"tuple"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"bytes","name":"extraSignature","type":"bytes"},{"internalType":"enum SignatureVersion","name":"signatureVersion","type":"uint8"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"internalType":"struct Input","name":"buy","type":"tuple"}],"name":"_execute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"blockRange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"enum Side","name":"side","type":"uint8"},{"internalType":"address","name":"matchingPolicy","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"components":[{"internalType":"uint16","name":"rate","type":"uint16"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct Fee[]","name":"fees","type":"tuple[]"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"extraParams","type":"bytes"}],"internalType":"struct Order","name":"order","type":"tuple"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"bytes","name":"extraSignature","type":"bytes"},{"internalType":"enum SignatureVersion","name":"signatureVersion","type":"uint8"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"internalType":"struct Input","name":"sell","type":"tuple"},{"components":[{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"enum Side","name":"side","type":"uint8"},{"internalType":"address","name":"matchingPolicy","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"components":[{"internalType":"uint16","name":"rate","type":"uint16"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct Fee[]","name":"fees","type":"tuple[]"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"extraParams","type":"bytes"}],"internalType":"struct Order","name":"order","type":"tuple"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"bytes","name":"extraSignature","type":"bytes"},{"internalType":"enum SignatureVersion","name":"signatureVersion","type":"uint8"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"internalType":"struct Input","name":"buy","type":"tuple"}],"internalType":"struct Execution[]","name":"executions","type":"tuple[]"}],"name":"bulkExecute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"enum Side","name":"side","type":"uint8"},{"internalType":"address","name":"matchingPolicy","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"components":[{"internalType":"uint16","name":"rate","type":"uint16"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct Fee[]","name":"fees","type":"tuple[]"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"extraParams","type":"bytes"}],"internalType":"struct Order","name":"order","type":"tuple"}],"name":"cancelOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"enum Side","name":"side","type":"uint8"},{"internalType":"address","name":"matchingPolicy","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"components":[{"internalType":"uint16","name":"rate","type":"uint16"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct Fee[]","name":"fees","type":"tuple[]"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"extraParams","type":"bytes"}],"internalType":"struct Order[]","name":"orders","type":"tuple[]"}],"name":"cancelOrders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"cancelledOrFilled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"enum Side","name":"side","type":"uint8"},{"internalType":"address","name":"matchingPolicy","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"components":[{"internalType":"uint16","name":"rate","type":"uint16"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct Fee[]","name":"fees","type":"tuple[]"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"extraParams","type":"bytes"}],"internalType":"struct Order","name":"order","type":"tuple"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"bytes","name":"extraSignature","type":"bytes"},{"internalType":"enum SignatureVersion","name":"signatureVersion","type":"uint8"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"internalType":"struct Input","name":"sell","type":"tuple"},{"components":[{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"enum Side","name":"side","type":"uint8"},{"internalType":"address","name":"matchingPolicy","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"listingTime","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"components":[{"internalType":"uint16","name":"rate","type":"uint16"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct Fee[]","name":"fees","type":"tuple[]"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"extraParams","type":"bytes"}],"internalType":"struct Order","name":"order","type":"tuple"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"bytes","name":"extraSignature","type":"bytes"},{"internalType":"enum SignatureVersion","name":"signatureVersion","type":"uint8"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"internalType":"struct Input","name":"buy","type":"tuple"}],"name":"execute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"executionDelegate","outputs":[{"internalType":"contract IExecutionDelegate","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"incrementNonce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IExecutionDelegate","name":"_executionDelegate","type":"address"},{"internalType":"contract IPolicyManager","name":"_policyManager","type":"address"},{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"uint256","name":"_blockRange","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInternal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOpen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policyManager","outputs":[{"internalType":"contract IPolicyManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blockRange","type":"uint256"}],"name":"setBlockRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IExecutionDelegate","name":"_executionDelegate","type":"address"}],"name":"setExecutionDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeRate","type":"uint256"}],"name":"setFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeRecipient","type":"address"}],"name":"setFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governor","type":"address"}],"name":"setGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPolicyManager","name":"_policyManager","type":"address"}],"name":"setPolicyManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60a06040526000805460ff1990811682553060805261012f80549091169055610130553480156200002f57600080fd5b506200003a62000040565b62000102565b605f54610100900460ff1615620000ad5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b605f5460ff90811610156200010057605f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516140046200013a6000396000818161094a015281816109cf01528181610bf301528181610c780152610d6201526140046000f3fe6080604052600436106102dc5760003560e01c80637ecebe0011610184578063b3be57f8116100d6578063e74b981b1161008a578063f973a20911610064578063f973a2091461081a578063fcfff16f1461084e578063ffa1ad741461086357600080fd5b8063e74b981b146107ba578063f2fde38b146107da578063f4acd740146107fa57600080fd5b8063cae6047f116100bb578063cae6047f14610771578063cf756fdf14610787578063e04d94ae146107a757600080fd5b8063b3be57f81461073e578063c42cf5351461075157600080fd5b8063a3f4df7e11610138578063ab7e8cba11610112578063ab7e8cba146106d6578063ad5c4648146106f6578063adde41e11461071e57600080fd5b8063a3f4df7e14610658578063a4b2c6741461069e578063ab3dbf3b146106b557600080fd5b8063978bbdb911610169578063978bbdb91461060d578063986c9b20146106245780639a1fc3a71461064557600080fd5b80637ecebe00146105c15780638da5cb5b146105ef57600080fd5b806347535d7b1161023d578063627cdcb9116101f15780637535d246116101cb5780637535d2461461055d5780637adbf973146105805780637dc0d1d0146105a057600080fd5b8063627cdcb9146105135780636992aa3614610528578063715018a61461054857600080fd5b80634f1ef286116102225780634f1ef286146104ba57806352d1902d146104cd5780635511f319146104e257600080fd5b806347535d7b1461046f5780634832ede11461048657600080fd5b806331e6d0fe1161029457806343d726d61161027957806343d726d61461041957806345596e2e1461042e578063469048401461044e57600080fd5b806331e6d0fe146103c55780633659cfe6146103f957600080fd5b806316e29d71116102c557806316e29d71146103415780631d97c9bb1461036c5780632c7acf8c146103ae57600080fd5b8063037c9be2146102e15780630c340a2414610303575b600080fd5b3480156102ed57600080fd5b506103016102fc36600461353f565b610892565b005b34801561030f57600080fd5b5061013354610324906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561034d57600080fd5b5061012f5461035c9060ff1681565b6040519015158152602001610338565b34801561037857600080fd5b506103a07fd71080023d2f293ed0723dc287d6b2d4e7d27d0b6c12928e300721b7c78c748581565b604051908152602001610338565b3480156103ba57600080fd5b506103a06101305481565b3480156103d157600080fd5b506103a07f5bcf4b2eaff7fcdeb49f0bda53026b9ebdd93db566fe4c447125cb899e598c9081565b34801561040557600080fd5b5061030161041436600461353f565b610940565b34801561042557600080fd5b50610301610abb565b34801561043a57600080fd5b5061030161044936600461356c565b610af4565b34801561045a57600080fd5b5061013254610324906001600160a01b031681565b34801561047b57600080fd5b506103a06101285481565b34801561049257600080fd5b506103a07f05b43f730f67de334a342883f867101fc7ef3361dfdff4a29a7aa97e0920ef7a81565b6103016104c83660046135cc565b610be9565b3480156104d957600080fd5b506103a0610d55565b3480156104ee57600080fd5b5061035c6104fd36600461356c565b61012d6020526000908152604090205460ff1681565b34801561051f57600080fd5b50610301610e1a565b34801561053457600080fd5b5061030161054336600461356c565b610e87565b34801561055457600080fd5b50610301610ec5565b34801561056957600080fd5b506103246ea39bb272e79075ade125fd351887ac81565b34801561058c57600080fd5b5061030161059b36600461353f565b610ed9565b3480156105ac57600080fd5b5061012b54610324906001600160a01b031681565b3480156105cd57600080fd5b506103a06105dc36600461353f565b61012e6020526000908152604090205481565b3480156105fb57600080fd5b506092546001600160a01b0316610324565b34801561061957600080fd5b506103a06101315481565b34801561063057600080fd5b5061012954610324906001600160a01b031681565b61030161065336600461368c565b610f82565b34801561066457600080fd5b506106916040518060400160405280600d81526020016c426c75722045786368616e676560981b81525081565b6040516103389190613714565b3480156106aa57600080fd5b506103a061012c5481565b3480156106c157600080fd5b5061012a54610324906001600160a01b031681565b3480156106e257600080fd5b506103016106f1366004613793565b61103a565b34801561070257600080fd5b5061032473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561072a57600080fd5b5061030161073936600461353f565b611089565b61030161074c366004613793565b611132565b34801561075d57600080fd5b5061030161076c36600461353f565b6112ae565b34801561077d57600080fd5b506103a061271081565b34801561079357600080fd5b506103016107a23660046137d5565b611305565b6103016107b536600461368c565b6114d8565b3480156107c657600080fd5b506103016107d536600461353f565b6119de565b3480156107e657600080fd5b506103016107f536600461353f565b611a35565b34801561080657600080fd5b50610301610815366004613826565b611ac2565b34801561082657600080fd5b506103a07f376bfbc394a7ba7fdf10f224572cef371358e3053e362f4554fcd2ad56329b3f81565b34801561085a57600080fd5b50610301611c01565b34801561086f57600080fd5b50610691604051806040016040528060038152602001620312e360ec1b81525081565b61089a611c3a565b6001600160a01b0381166108f55760405162461bcd60e51b815260206004820152601660248201527f416464726573732063616e6e6f74206265207a65726f0000000000000000000060448201526064015b60405180910390fd5b61012980546001600160a01b0319166001600160a01b0383169081179091556040517ff9a0f356a7ef079355de09d32ce45cc3cfabc8f118681c19a17501f005a376ac90600090a250565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036109cd5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b60648201526084016108ec565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610a287f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610a935760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b60648201526084016108ec565b610a9c81611c94565b60408051600080825260208201909252610ab891839190611c9c565b50565b610ac3611c3a565b60006101288190556040517f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a9190a1565b610133546001600160a01b03163314610b5b5760405162461bcd60e51b8152602060048201526024808201527f46656520726174652063616e206f6e6c792062652073657420627920676f7665604482015263393737b960e11b60648201526084016108ec565b60fa811115610bac5760405162461bcd60e51b815260206004820152601c60248201527f4665652063616e6e6f74206265206d6f7265207468616e20322e35250000000060448201526064016108ec565b6101318190556040518181527f788980e82f4651cc86d1cc00916685528f16c9abb21b2afe72325496c18c94ae906020015b60405180910390a150565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610c765760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b60648201526084016108ec565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610cd17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610d3c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b60648201526084016108ec565b610d4582611c94565b610d5182826001611c9c565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610df55760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016108ec565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b33600090815261012e60205260408120805460019290610e3b908490613878565b909155505033600081815261012e60209081526040918290205491519182527fa82a649bbd060c9099cd7b7326e2b0dc9e9af0836480e0f849dc9eaa79710b3b910160405180910390a2565b610e8f611c3a565b61012c8190556040518181527f7706177c541ba1b858371bfc568aa77450b4713bbdbba62c730d4484ab6c125190602001610bde565b610ecd611c3a565b610ed76000611e3c565b565b610ee1611c3a565b6001600160a01b038116610f375760405162461bcd60e51b815260206004820152601660248201527f416464726573732063616e6e6f74206265207a65726f0000000000000000000060448201526064016108ec565b61012b80546001600160a01b0319166001600160a01b0383169081179091556040517fb3eacd0e351fafdfefdec84e1cd19679b38dbcd63ea7c2c24da17fd2bc3b3c0e90600090a250565b61012854600114610fbe5760405162461bcd60e51b815260206004820152600660248201526510db1bdcd95960d21b60448201526064016108ec565b61012f5460ff16156110005760405162461bcd60e51b815260206004820152600b60248201526a155b9cd859994818d85b1b60aa1b60448201526064016108ec565b346101305561012f805460ff1916600117905561101d82826114d8565b611025611e8e565b505060006101305561012f805460ff19169055565b60005b60ff81168211156110845761107283838360ff168181106110605761106061388b565b905060200281019061081591906138a1565b8061107c816138c2565b91505061103d565b505050565b611091611c3a565b6001600160a01b0381166110e75760405162461bcd60e51b815260206004820152601660248201527f416464726573732063616e6e6f74206265207a65726f0000000000000000000060448201526064016108ec565b61012a80546001600160a01b0319166001600160a01b0383169081179091556040517fdbe18f3fd927cc2aefe380ffd2abfdb8e13f0239c0258ccfc84c3d8fdd8c041890600090a250565b6101285460011461116e5760405162461bcd60e51b815260206004820152600660248201526510db1bdcd95960d21b60448201526064016108ec565b61012f5460ff16156111b05760405162461bcd60e51b815260206004820152600b60248201526a155b9cd859994818d85b1b60aa1b60448201526064016108ec565b346101305561012f805460ff191660011790558060008190036112155760405162461bcd60e51b815260206004820152601460248201527f4e6f206f726465727320746f206578656375746500000000000000000000000060448201526064016108ec565b60005b818160ff16101561128f5760405160208202850135850160006001808501861490811461125557600185016020028801358801839003915061125b565b82360391505b50637026ca5760e11b8352808284600401376000806004830185305af4505050508080611287906138c2565b915050611218565b50611298611e8e565b50506000610130555061012f805460ff19169055565b6112b6611c3a565b61013380546001600160a01b0319166001600160a01b0383169081179091556040519081527f5425363a03f182281120f5919107c49c7a1a623acc1cbc6df468b6f0c11fcf8c90602001610bde565b605f54610100900460ff16158080156113255750605f54600160ff909116105b8061133f5750303b15801561133f5750605f5460ff166001145b6113b15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ec565b605f805460ff1916600117905580156113d457605f805461ff0019166101001790555b6113dc611eac565b6001610128556040805160c081018252600d608082019081526c426c75722045786368616e676560981b60a083015281528151808301835260038152620312e360ec1b602082810191909152820152469181019190915230606082015261144290611f1f565b60325561012980546001600160a01b038088166001600160a01b03199283161790925561012a805487841690831617905561012b80549286169290911691909117905561012c82905580156114d157605f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b61012f5460ff166115195760405162461bcd60e51b815260206004820152600b60248201526a155b9cd859994818d85b1b60aa1b60448201526064016108ec565b60005460ff161561156c5760405162461bcd60e51b815260206004820152601360248201527f5265656e7472616e63792064657465637465640000000000000000000000000060448201526064016108ec565b6000805460ff1916600190811790915561158683806138a1565b61159790604081019060200161390f565b60018111156115a8576115a86138e1565b146115b257600080fd5b60006116046115c184806138a1565b61012e60006115d087806138a1565b6115de90602081019061353f565b6001600160a01b03166001600160a01b0316815260200190815260200160002054611fbc565b905060006116156115c184806138a1565b905061162a61162485806138a1565b836120fd565b6116765760405162461bcd60e51b815260206004820152601b60248201527f53656c6c2068617320696e76616c696420706172616d6574657273000000000060448201526064016108ec565b61168961168384806138a1565b826120fd565b6116d55760405162461bcd60e51b815260206004820152601a60248201527f4275792068617320696e76616c696420706172616d657465727300000000000060448201526064016108ec565b6116df848361215b565b61172b5760405162461bcd60e51b815260206004820152601960248201527f53656c6c206661696c656420617574686f72697a6174696f6e0000000000000060448201526064016108ec565b611735838261215b565b6117815760405162461bcd60e51b815260206004820152601860248201527f427579206661696c656420617574686f72697a6174696f6e000000000000000060448201526064016108ec565b60008080806117a261179389806138a1565b61179d89806138a1565b612315565b60008a815261012d60205260408082208054600160ff1991821681179092558c84529190922080549091169091179055929650909450925090506118626117e989806138a1565b6117f790602081019061353f565b61180189806138a1565b61180f90602081019061353f565b6118198b806138a1565b61182a9060e081019060c00161353f565b6118348c806138a1565b6118439061014081019061392c565b61184d8d806138a1565b61185c9061014081019061392c565b8b61267b565b6118b861186f89806138a1565b61188090608081019060600161353f565b61188a8a806138a1565b61189890602081019061353f565b6118a28a806138a1565b6118b090602081019061353f565b8686866127bb565b6118c287806138a1565b61010001356118d189806138a1565b6101000135116118f8576118e587806138a1565b6118f390602081019061353f565b611910565b61190288806138a1565b61191090602081019061353f565b6001600160a01b031661192388806138a1565b61010001356119328a806138a1565b6101000135111561195a5761194788806138a1565b61195590602081019061353f565b611972565b61196489806138a1565b61197290602081019061353f565b6001600160a01b03167f61cbb2a3dee0b6064c2e681aadd61677fb4ef319f0b547508d495626f5a62f646119a68b806138a1565b896119b18c806138a1565b8a6040516119c29493929190613bd1565b60405180910390a350506000805460ff19169055505050505050565b6119e6611c3a565b61013280546001600160a01b0319166001600160a01b0383169081179091556040519081527f412871529f3cedd6ca6f10784258f4965a5d6e254127593fe354e7a62f6d0a2390602001610bde565b611a3d611c3a565b6001600160a01b038116611ab95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108ec565b610ab881611e3c565b611acf602082018261353f565b6001600160a01b0316336001600160a01b031614611b2f5760405162461bcd60e51b815260206004820152601260248201527f4e6f742073656e7420627920747261646572000000000000000000000000000060448201526064016108ec565b6000611b468261012e836115de602084018461353f565b600081815261012d602052604090205490915060ff1615611ba95760405162461bcd60e51b815260206004820152601960248201527f4f726465722063616e63656c6c6564206f722066696c6c65640000000000000060448201526064016108ec565b600081815261012d602052604090819020805460ff19166001179055517f5152abf959f6564662358c2e52b702259b78bac5ee7842a0f01937e670efcc7d90611bf59083815260200190565b60405180910390a15050565b611c09611c3a565b6001610128556040517fd1dcd00534373f20882b79e6ab6875a5c358c5bd576448757ed50e63069ab51890600090a1565b6092546001600160a01b03163314610ed75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ec565b610ab8611c3a565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611ccf57611084836128eb565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611d29575060408051601f3d908101601f19168201909252611d2691810190613c0e565b60015b611d9b5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f74205555505300000000000000000000000000000000000060648201526084016108ec565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611e305760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c6555554944000000000000000000000000000000000000000000000060648201526084016108ec565b506110848383836129a9565b609280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610130548015610ab85760008060008084335af180610d5157600080fd5b605f54610100900460ff16611f175760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016108ec565b610ed76129d4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82600001518051906020012083602001518051906020012084604001518560600151604051602001611f9f9594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b604051602081830303815290604052805190602001209050919050565b60007f376bfbc394a7ba7fdf10f224572cef371358e3053e362f4554fcd2ad56329b3f611fec602085018561353f565b611ffc604086016020870161390f565b61200c606087016040880161353f565b61201c608088016060890161353f565b608088013560a089013561203660e08b0160c08c0161353f565b8a60e001358b61010001358c61012001356120608e80610140019061205b919061392c565b612a48565b8e61016001358f8061018001906120779190613c27565b604051612085929190613c6e565b6040519081900381206120a79e9d9c9b9a999897969594939291602001613c7e565b60408051601f1981840301815282825260208301859052910160408051601f19818403018152908290526120de9291602001613d1e565b6040516020818303038152906040528051906020012090505b92915050565b60008061210d602085018561353f565b6001600160a01b0316141580156121345750600082815261012d602052604090205460ff16155b8015612144575042836101000135105b8015612154575082610120013542105b9392505050565b60008061216884806138a1565b61217790610180810190613c27565b90501180156121de575061218b83806138a1565b61219a90610180810190613c27565b60008181106121ab576121ab61388b565b9050013560f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916600160f81b145b156122795761012c546121f560c085013543613d4d565b106122425760405162461bcd60e51b815260206004820181905260248201527f5369676e656420626c6f636b206e756d626572206f7574206f662072616e676560448201526064016108ec565b61226d8261225660c0860160a0870161390f565b6122636080870187613c27565b8760c00135612b1b565b612279575060006120f7565b3361228484806138a1565b61229290602081019061353f565b6001600160a01b0316036122a8575060016120f7565b612300826122b685806138a1565b6122c490602081019061353f565b6122d46040870160208801613d60565b604087013560608801356122ee60c08a0160a08b0161390f565b6122fb60808b018b613c27565b612bb1565b61230c575060006120f7565b50600192915050565b6000806000806000856101000135876101000135116124ab5761012a546001600160a01b031663874516cd61235060608a0160408b0161353f565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156123ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d09190613d93565b61241c5760405162461bcd60e51b815260206004820152601960248201527f506f6c696379206973206e6f742077686974656c69737465640000000000000060448201526064016108ec565b61242c606088016040890161353f565b6001600160a01b031663d5ec8c7788886040518363ffffffff1660e01b8152600401612459929190613dae565b60a060405180830381865afa158015612476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249a9190613dd3565b929850909650945092509050612624565b61012a546001600160a01b031663874516cd6124cd6060890160408a0161353f565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612529573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254d9190613d93565b6125995760405162461bcd60e51b815260206004820152601960248201527f506f6c696379206973206e6f742077686974656c69737465640000000000000060448201526064016108ec565b6125a9606087016040880161353f565b6001600160a01b0316630813a76687896040518363ffffffff1660e01b81526004016125d6929190613dae565b60a060405180830381865afa1580156125f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126179190613dd3565b9298509096509450925090505b806126715760405162461bcd60e51b815260206004820152601860248201527f4f72646572732063616e6e6f74206265206d617463686564000000000000000060448201526064016108ec565b5092959194509250565b6001600160a01b03861661274d57336001600160a01b038816146126e15760405162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207573652045544800000000000000000000000000000000000060448201526064016108ec565b806101305410156127345760405162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e742076616c7565000000000000000000000000000060448201526064016108ec565b8061013060008282546127479190613d4d565b90915550505b600061275e8686898b866001612cac565b9050600061277185858a8c876000612cac565b90506001600160a01b03881661279a578061013060008282546127949190613d4d565b90915550505b6127af888a8c6127aa8688613d4d565b612e1b565b50505050505050505050565b60008160018111156127cf576127cf6138e1565b036128505761012954604051633c4fc9fb60e11b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690529091169063789f93f690608401600060405180830381600087803b15801561283357600080fd5b505af1158015612847573d6000803e3d6000fd5b505050506128e3565b6001816001811115612864576128646138e1565b036128e35761012954604051633a54a01760e11b81526001600160a01b038881166004830152878116602483015286811660448301526064820186905260848201859052909116906374a9402e9060a401600060405180830381600087803b1580156128cf57600080fd5b505af11580156127af573d6000803e3d6000fd5b505050505050565b6001600160a01b0381163b6129685760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016108ec565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6129b28361312e565b6000825111806129bf5750805b15611084576129ce838361316e565b50505050565b605f54610100900460ff16612a3f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016108ec565b610ed733611e3c565b6000808267ffffffffffffffff811115612a6457612a64613585565b604051908082528060200260200182016040528015612a8d578160200160208202803683370190505b50905060005b83811015612aea57612abb858583818110612ab057612ab061388b565b905060400201613270565b828281518110612acd57612acd61388b565b602090810291909101015280612ae281613e27565b915050612a93565b5080604051602001612afc9190613e40565b6040516020818303038152906040528051906020012091505092915050565b600080612b2887846132e0565b90506000808080896001811115612b4157612b416138e1565b03612b5b5750508535905060208601356040870135612b87565b6001896001811115612b6f57612b6f6138e1565b03612b87575050506020850135604086013560608701355b61012b54612ba1906001600160a01b03168585858561335e565b9450505050505b95945050505050565b60008080856001811115612bc757612bc76138e1565b03612bdc57612bd58a61344f565b9050612c91565b6001856001811115612bf057612bf06138e1565b03612c91576000612c0384860186613e76565b90506000734c2bbdbeccae1c492c681158a46eae498a05627b639c7bf9388d846040518363ffffffff1660e01b8152600401612c40929190613f1c565b602060405180830381865af4158015612c5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c819190613c0e565b9050612c8c8161347a565b925050505b612c9e89828a8a8a61335e565b9a9950505050505050505050565b61013154600090819015801590612cc05750825b15612d0f5760006127106101315486612cd99190613f6a565b612ce39190613f81565b61013254909150612d0190889088906001600160a01b031684612e1b565b612d0b8183613878565b9150505b60005b60ff8116881115612dbf5760006127108a8a8460ff16818110612d3757612d3761388b565b612d4d9260206040909202019081019150613fa3565b612d5b9061ffff1688613f6a565b612d659190613f81565b9050612d9f88888c8c8660ff16818110612d8157612d8161388b565b9050604002016020016020810190612d99919061353f565b84612e1b565b612da98184613878565b9250508080612db7906138c2565b915050612d12565b5083811115612e105760405162461bcd60e51b815260206004820152601c60248201527f4665657320617265206d6f7265207468616e207468652070726963650000000060448201526064016108ec565b979650505050505050565b80156129ce576001600160a01b038416612f2e576001600160a01b038216612e855760405162461bcd60e51b815260206004820152601860248201527f5472616e7366657220746f207a65726f2061646472657373000000000000000060448201526064016108ec565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612ed2576040519150601f19603f3d011682016040523d82523d6000602084013e612ed7565b606091505b5050905080612f285760405162461bcd60e51b815260206004820152601360248201527f455448207472616e73666572206661696c65640000000000000000000000000060448201526064016108ec565b506129ce565b6ea39bb272e79075ade125fd351887ab196001600160a01b03851601613028576040516323b872dd60e01b81526001600160a01b03808516600483015283166024820152604481018290526000906ea39bb272e79075ade125fd351887ac906323b872dd906064016020604051808303816000875af1158015612fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd99190613d93565b905080612f285760405162461bcd60e51b815260206004820152601460248201527f506f6f6c207472616e73666572206661696c656400000000000000000000000060448201526064016108ec565b7fffffffffffffffffffffffff3fd555c64ddc0172f5f1a3b0d81526f7c38a933e6001600160a01b038516016130e6576101295460405163368fa33960e21b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201526001600160a01b0385811660248301528481166044830152606482018490529091169063da3e8ce490608401600060405180830381600087803b1580156130c957600080fd5b505af11580156130dd573d6000803e3d6000fd5b505050506129ce565b60405162461bcd60e51b815260206004820152601560248201527f496e76616c6964207061796d656e7420746f6b656e000000000000000000000060448201526064016108ec565b613137816128eb565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6131ed5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016108ec565b600080846001600160a01b0316846040516132089190613fbe565b600060405180830381855af49150503d8060008114613243576040519150601f19603f3d011682016040523d82523d6000602084013e613248565b606091505b5091509150612ba88282604051806060016040528060278152602001613fd1602791396134f1565b60007f05b43f730f67de334a342883f867101fc7ef3361dfdff4a29a7aa97e0920ef7a6132a06020840184613fa3565b6132b0604085016020860161353f565b604051602001611f9f9392919092835261ffff9190911660208301526001600160a01b0316604082015260600190565b603254604080517fd71080023d2f293ed0723dc287d6b2d4e7d27d0b6c12928e300721b7c78c748560208201529081018490526060810183905260009190608001604051602081830303815290604052805190602001206040516020016120de92919061190160f01b81526002810192909252602282015260420190565b60008360ff16601b148061337557508360ff16601c145b6133c15760405162461bcd60e51b815260206004820152601360248201527f496e76616c6964207620706172616d657465720000000000000000000000000060448201526064016108ec565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015613415573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661343a576000915050612ba8565b6001600160a01b038781169116149050612ba8565b60325460405161190160f01b6020820152602281019190915260428101829052600090606201611f9f565b603254604080517f5bcf4b2eaff7fcdeb49f0bda53026b9ebdd93db566fe4c447125cb899e598c9060208201529081018390526000919060600160405160208183030381529060405280519060200120604051602001611f9f92919061190160f01b81526002810192909252602282015260420190565b60608315613500575081612154565b8251156135105782518084602001fd5b8160405162461bcd60e51b81526004016108ec9190613714565b6001600160a01b0381168114610ab857600080fd5b60006020828403121561355157600080fd5b81356121548161352a565b80356135678161352a565b919050565b60006020828403121561357e57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156135c4576135c4613585565b604052919050565b600080604083850312156135df57600080fd5b82356135ea8161352a565b915060208381013567ffffffffffffffff8082111561360857600080fd5b818601915086601f83011261361c57600080fd5b81358181111561362e5761362e613585565b613640601f8201601f1916850161359b565b9150808252878482850101111561365657600080fd5b80848401858401376000848284010152508093505050509250929050565b600060e0828403121561368657600080fd5b50919050565b6000806040838503121561369f57600080fd5b823567ffffffffffffffff808211156136b757600080fd5b6136c386838701613674565b935060208501359150808211156136d957600080fd5b506136e685828601613674565b9150509250929050565b60005b8381101561370b5781810151838201526020016136f3565b50506000910152565b60208152600082518060208401526137338160408501602087016136f0565b601f01601f19169190910160400192915050565b60008083601f84011261375957600080fd5b50813567ffffffffffffffff81111561377157600080fd5b6020830191508360208260051b850101111561378c57600080fd5b9250929050565b600080602083850312156137a657600080fd5b823567ffffffffffffffff8111156137bd57600080fd5b6137c985828601613747565b90969095509350505050565b600080600080608085870312156137eb57600080fd5b84356137f68161352a565b935060208501356138068161352a565b925060408501356138168161352a565b9396929550929360600135925050565b60006020828403121561383857600080fd5b813567ffffffffffffffff81111561384f57600080fd5b82016101a0818503121561215457600080fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156120f7576120f7613862565b634e487b7160e01b600052603260045260246000fd5b6000823561019e198336030181126138b857600080fd5b9190910192915050565b600060ff821660ff81036138d8576138d8613862565b60010192915050565b634e487b7160e01b600052602160045260246000fd5b60028110610ab857600080fd5b8035613567816138f7565b60006020828403121561392157600080fd5b8135612154816138f7565b6000808335601e1984360301811261394357600080fd5b83018035915067ffffffffffffffff82111561395e57600080fd5b6020019150600681901b360382131561378c57600080fd5b6002811061399457634e487b7160e01b600052602160045260246000fd5b9052565b6000808335601e198436030181126139af57600080fd5b830160208101925035905067ffffffffffffffff8111156139cf57600080fd5b8060061b360382131561378c57600080fd5b803561ffff8116811461356757600080fd5b8183526000602080850194508260005b85811015613a475761ffff613a17836139e1565b16875282820135613a278161352a565b6001600160a01b0316878401526040968701969190910190600101613a03565b509495945050505050565b6000808335601e19843603018112613a6957600080fd5b830160208101925035905067ffffffffffffffff811115613a8957600080fd5b80360382131561378c57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006101a0613ae084613ad38561355c565b6001600160a01b03169052565b613aec60208401613904565b613af96020860182613976565b50613b066040840161355c565b6001600160a01b03166040850152613b206060840161355c565b6001600160a01b0381166060860152506080830135608085015260a083013560a0850152613b5060c0840161355c565b6001600160a01b031660c085015260e0838101359085015261010080840135908501526101208084013590850152610140613b8d81850185613998565b8383880152613b9f84880182846139f3565b9350505050610160808401358186015250610180613bbf81850185613a52565b86840383880152612e10848284613a98565b608081526000613be46080830187613ac1565b8560208401528281036040840152613bfc8186613ac1565b91505082606083015295945050505050565b600060208284031215613c2057600080fd5b5051919050565b6000808335601e19843603018112613c3e57600080fd5b83018035915067ffffffffffffffff821115613c5957600080fd5b60200191503681900382131561378c57600080fd5b8183823760009101908152919050565b8e81526001600160a01b038e1660208201526101c08101613ca2604083018f613976565b6001600160a01b038d1660608301526001600160a01b038c1660808301528a60a08301528960c0830152613ce160e083018a6001600160a01b03169052565b8761010083015286610120830152856101408301528461016083015283610180830152826101a08301529f9e505050505050505050505050505050565b60008351613d308184602088016136f0565b835190830190613d448183602088016136f0565b01949350505050565b818103818111156120f7576120f7613862565b600060208284031215613d7257600080fd5b813560ff8116811461215457600080fd5b8051801515811461356757600080fd5b600060208284031215613da557600080fd5b61215482613d83565b604081526000613dc16040830185613ac1565b8281036020840152612ba88185613ac1565b600080600080600060a08688031215613deb57600080fd5b613df486613d83565b94506020860151935060408601519250606086015191506080860151613e19816138f7565b809150509295509295909350565b600060018201613e3957613e39613862565b5060010190565b815160009082906020808601845b83811015613e6a57815185529382019390820190600101613e4e565b50929695505050505050565b60006020808385031215613e8957600080fd5b823567ffffffffffffffff80821115613ea157600080fd5b818501915085601f830112613eb557600080fd5b813581811115613ec757613ec7613585565b8060051b9150613ed884830161359b565b8181529183018401918481019088841115613ef257600080fd5b938501935b83851015613f1057843582529385019390850190613ef7565b98975050505050505050565b6000604082018483526020604081850152818551808452606086019150828701935060005b81811015613f5d57845183529383019391830191600101613f41565b5090979650505050505050565b80820281158282048414176120f7576120f7613862565b600082613f9e57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215613fb557600080fd5b612154826139e1565b600082516138b88184602087016136f056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000811000a
Deployed Bytecode
0x6080604052600436106102dc5760003560e01c80637ecebe0011610184578063b3be57f8116100d6578063e74b981b1161008a578063f973a20911610064578063f973a2091461081a578063fcfff16f1461084e578063ffa1ad741461086357600080fd5b8063e74b981b146107ba578063f2fde38b146107da578063f4acd740146107fa57600080fd5b8063cae6047f116100bb578063cae6047f14610771578063cf756fdf14610787578063e04d94ae146107a757600080fd5b8063b3be57f81461073e578063c42cf5351461075157600080fd5b8063a3f4df7e11610138578063ab7e8cba11610112578063ab7e8cba146106d6578063ad5c4648146106f6578063adde41e11461071e57600080fd5b8063a3f4df7e14610658578063a4b2c6741461069e578063ab3dbf3b146106b557600080fd5b8063978bbdb911610169578063978bbdb91461060d578063986c9b20146106245780639a1fc3a71461064557600080fd5b80637ecebe00146105c15780638da5cb5b146105ef57600080fd5b806347535d7b1161023d578063627cdcb9116101f15780637535d246116101cb5780637535d2461461055d5780637adbf973146105805780637dc0d1d0146105a057600080fd5b8063627cdcb9146105135780636992aa3614610528578063715018a61461054857600080fd5b80634f1ef286116102225780634f1ef286146104ba57806352d1902d146104cd5780635511f319146104e257600080fd5b806347535d7b1461046f5780634832ede11461048657600080fd5b806331e6d0fe1161029457806343d726d61161027957806343d726d61461041957806345596e2e1461042e578063469048401461044e57600080fd5b806331e6d0fe146103c55780633659cfe6146103f957600080fd5b806316e29d71116102c557806316e29d71146103415780631d97c9bb1461036c5780632c7acf8c146103ae57600080fd5b8063037c9be2146102e15780630c340a2414610303575b600080fd5b3480156102ed57600080fd5b506103016102fc36600461353f565b610892565b005b34801561030f57600080fd5b5061013354610324906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561034d57600080fd5b5061012f5461035c9060ff1681565b6040519015158152602001610338565b34801561037857600080fd5b506103a07fd71080023d2f293ed0723dc287d6b2d4e7d27d0b6c12928e300721b7c78c748581565b604051908152602001610338565b3480156103ba57600080fd5b506103a06101305481565b3480156103d157600080fd5b506103a07f5bcf4b2eaff7fcdeb49f0bda53026b9ebdd93db566fe4c447125cb899e598c9081565b34801561040557600080fd5b5061030161041436600461353f565b610940565b34801561042557600080fd5b50610301610abb565b34801561043a57600080fd5b5061030161044936600461356c565b610af4565b34801561045a57600080fd5b5061013254610324906001600160a01b031681565b34801561047b57600080fd5b506103a06101285481565b34801561049257600080fd5b506103a07f05b43f730f67de334a342883f867101fc7ef3361dfdff4a29a7aa97e0920ef7a81565b6103016104c83660046135cc565b610be9565b3480156104d957600080fd5b506103a0610d55565b3480156104ee57600080fd5b5061035c6104fd36600461356c565b61012d6020526000908152604090205460ff1681565b34801561051f57600080fd5b50610301610e1a565b34801561053457600080fd5b5061030161054336600461356c565b610e87565b34801561055457600080fd5b50610301610ec5565b34801561056957600080fd5b506103246ea39bb272e79075ade125fd351887ac81565b34801561058c57600080fd5b5061030161059b36600461353f565b610ed9565b3480156105ac57600080fd5b5061012b54610324906001600160a01b031681565b3480156105cd57600080fd5b506103a06105dc36600461353f565b61012e6020526000908152604090205481565b3480156105fb57600080fd5b506092546001600160a01b0316610324565b34801561061957600080fd5b506103a06101315481565b34801561063057600080fd5b5061012954610324906001600160a01b031681565b61030161065336600461368c565b610f82565b34801561066457600080fd5b506106916040518060400160405280600d81526020016c426c75722045786368616e676560981b81525081565b6040516103389190613714565b3480156106aa57600080fd5b506103a061012c5481565b3480156106c157600080fd5b5061012a54610324906001600160a01b031681565b3480156106e257600080fd5b506103016106f1366004613793565b61103a565b34801561070257600080fd5b5061032473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561072a57600080fd5b5061030161073936600461353f565b611089565b61030161074c366004613793565b611132565b34801561075d57600080fd5b5061030161076c36600461353f565b6112ae565b34801561077d57600080fd5b506103a061271081565b34801561079357600080fd5b506103016107a23660046137d5565b611305565b6103016107b536600461368c565b6114d8565b3480156107c657600080fd5b506103016107d536600461353f565b6119de565b3480156107e657600080fd5b506103016107f536600461353f565b611a35565b34801561080657600080fd5b50610301610815366004613826565b611ac2565b34801561082657600080fd5b506103a07f376bfbc394a7ba7fdf10f224572cef371358e3053e362f4554fcd2ad56329b3f81565b34801561085a57600080fd5b50610301611c01565b34801561086f57600080fd5b50610691604051806040016040528060038152602001620312e360ec1b81525081565b61089a611c3a565b6001600160a01b0381166108f55760405162461bcd60e51b815260206004820152601660248201527f416464726573732063616e6e6f74206265207a65726f0000000000000000000060448201526064015b60405180910390fd5b61012980546001600160a01b0319166001600160a01b0383169081179091556040517ff9a0f356a7ef079355de09d32ce45cc3cfabc8f118681c19a17501f005a376ac90600090a250565b6001600160a01b037f000000000000000000000000983e96c26782a8db500a6fb8ab47a52e1b44862d1630036109cd5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b60648201526084016108ec565b7f000000000000000000000000983e96c26782a8db500a6fb8ab47a52e1b44862d6001600160a01b0316610a287f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610a935760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b60648201526084016108ec565b610a9c81611c94565b60408051600080825260208201909252610ab891839190611c9c565b50565b610ac3611c3a565b60006101288190556040517f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a9190a1565b610133546001600160a01b03163314610b5b5760405162461bcd60e51b8152602060048201526024808201527f46656520726174652063616e206f6e6c792062652073657420627920676f7665604482015263393737b960e11b60648201526084016108ec565b60fa811115610bac5760405162461bcd60e51b815260206004820152601c60248201527f4665652063616e6e6f74206265206d6f7265207468616e20322e35250000000060448201526064016108ec565b6101318190556040518181527f788980e82f4651cc86d1cc00916685528f16c9abb21b2afe72325496c18c94ae906020015b60405180910390a150565b6001600160a01b037f000000000000000000000000983e96c26782a8db500a6fb8ab47a52e1b44862d163003610c765760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b19195b1959d85d1958d85b1b60a21b60648201526084016108ec565b7f000000000000000000000000983e96c26782a8db500a6fb8ab47a52e1b44862d6001600160a01b0316610cd17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610d3c5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201526b6163746976652070726f787960a01b60648201526084016108ec565b610d4582611c94565b610d5182826001611c9c565b5050565b6000306001600160a01b037f000000000000000000000000983e96c26782a8db500a6fb8ab47a52e1b44862d1614610df55760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016108ec565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b33600090815261012e60205260408120805460019290610e3b908490613878565b909155505033600081815261012e60209081526040918290205491519182527fa82a649bbd060c9099cd7b7326e2b0dc9e9af0836480e0f849dc9eaa79710b3b910160405180910390a2565b610e8f611c3a565b61012c8190556040518181527f7706177c541ba1b858371bfc568aa77450b4713bbdbba62c730d4484ab6c125190602001610bde565b610ecd611c3a565b610ed76000611e3c565b565b610ee1611c3a565b6001600160a01b038116610f375760405162461bcd60e51b815260206004820152601660248201527f416464726573732063616e6e6f74206265207a65726f0000000000000000000060448201526064016108ec565b61012b80546001600160a01b0319166001600160a01b0383169081179091556040517fb3eacd0e351fafdfefdec84e1cd19679b38dbcd63ea7c2c24da17fd2bc3b3c0e90600090a250565b61012854600114610fbe5760405162461bcd60e51b815260206004820152600660248201526510db1bdcd95960d21b60448201526064016108ec565b61012f5460ff16156110005760405162461bcd60e51b815260206004820152600b60248201526a155b9cd859994818d85b1b60aa1b60448201526064016108ec565b346101305561012f805460ff1916600117905561101d82826114d8565b611025611e8e565b505060006101305561012f805460ff19169055565b60005b60ff81168211156110845761107283838360ff168181106110605761106061388b565b905060200281019061081591906138a1565b8061107c816138c2565b91505061103d565b505050565b611091611c3a565b6001600160a01b0381166110e75760405162461bcd60e51b815260206004820152601660248201527f416464726573732063616e6e6f74206265207a65726f0000000000000000000060448201526064016108ec565b61012a80546001600160a01b0319166001600160a01b0383169081179091556040517fdbe18f3fd927cc2aefe380ffd2abfdb8e13f0239c0258ccfc84c3d8fdd8c041890600090a250565b6101285460011461116e5760405162461bcd60e51b815260206004820152600660248201526510db1bdcd95960d21b60448201526064016108ec565b61012f5460ff16156111b05760405162461bcd60e51b815260206004820152600b60248201526a155b9cd859994818d85b1b60aa1b60448201526064016108ec565b346101305561012f805460ff191660011790558060008190036112155760405162461bcd60e51b815260206004820152601460248201527f4e6f206f726465727320746f206578656375746500000000000000000000000060448201526064016108ec565b60005b818160ff16101561128f5760405160208202850135850160006001808501861490811461125557600185016020028801358801839003915061125b565b82360391505b50637026ca5760e11b8352808284600401376000806004830185305af4505050508080611287906138c2565b915050611218565b50611298611e8e565b50506000610130555061012f805460ff19169055565b6112b6611c3a565b61013380546001600160a01b0319166001600160a01b0383169081179091556040519081527f5425363a03f182281120f5919107c49c7a1a623acc1cbc6df468b6f0c11fcf8c90602001610bde565b605f54610100900460ff16158080156113255750605f54600160ff909116105b8061133f5750303b15801561133f5750605f5460ff166001145b6113b15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ec565b605f805460ff1916600117905580156113d457605f805461ff0019166101001790555b6113dc611eac565b6001610128556040805160c081018252600d608082019081526c426c75722045786368616e676560981b60a083015281528151808301835260038152620312e360ec1b602082810191909152820152469181019190915230606082015261144290611f1f565b60325561012980546001600160a01b038088166001600160a01b03199283161790925561012a805487841690831617905561012b80549286169290911691909117905561012c82905580156114d157605f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b61012f5460ff166115195760405162461bcd60e51b815260206004820152600b60248201526a155b9cd859994818d85b1b60aa1b60448201526064016108ec565b60005460ff161561156c5760405162461bcd60e51b815260206004820152601360248201527f5265656e7472616e63792064657465637465640000000000000000000000000060448201526064016108ec565b6000805460ff1916600190811790915561158683806138a1565b61159790604081019060200161390f565b60018111156115a8576115a86138e1565b146115b257600080fd5b60006116046115c184806138a1565b61012e60006115d087806138a1565b6115de90602081019061353f565b6001600160a01b03166001600160a01b0316815260200190815260200160002054611fbc565b905060006116156115c184806138a1565b905061162a61162485806138a1565b836120fd565b6116765760405162461bcd60e51b815260206004820152601b60248201527f53656c6c2068617320696e76616c696420706172616d6574657273000000000060448201526064016108ec565b61168961168384806138a1565b826120fd565b6116d55760405162461bcd60e51b815260206004820152601a60248201527f4275792068617320696e76616c696420706172616d657465727300000000000060448201526064016108ec565b6116df848361215b565b61172b5760405162461bcd60e51b815260206004820152601960248201527f53656c6c206661696c656420617574686f72697a6174696f6e0000000000000060448201526064016108ec565b611735838261215b565b6117815760405162461bcd60e51b815260206004820152601860248201527f427579206661696c656420617574686f72697a6174696f6e000000000000000060448201526064016108ec565b60008080806117a261179389806138a1565b61179d89806138a1565b612315565b60008a815261012d60205260408082208054600160ff1991821681179092558c84529190922080549091169091179055929650909450925090506118626117e989806138a1565b6117f790602081019061353f565b61180189806138a1565b61180f90602081019061353f565b6118198b806138a1565b61182a9060e081019060c00161353f565b6118348c806138a1565b6118439061014081019061392c565b61184d8d806138a1565b61185c9061014081019061392c565b8b61267b565b6118b861186f89806138a1565b61188090608081019060600161353f565b61188a8a806138a1565b61189890602081019061353f565b6118a28a806138a1565b6118b090602081019061353f565b8686866127bb565b6118c287806138a1565b61010001356118d189806138a1565b6101000135116118f8576118e587806138a1565b6118f390602081019061353f565b611910565b61190288806138a1565b61191090602081019061353f565b6001600160a01b031661192388806138a1565b61010001356119328a806138a1565b6101000135111561195a5761194788806138a1565b61195590602081019061353f565b611972565b61196489806138a1565b61197290602081019061353f565b6001600160a01b03167f61cbb2a3dee0b6064c2e681aadd61677fb4ef319f0b547508d495626f5a62f646119a68b806138a1565b896119b18c806138a1565b8a6040516119c29493929190613bd1565b60405180910390a350506000805460ff19169055505050505050565b6119e6611c3a565b61013280546001600160a01b0319166001600160a01b0383169081179091556040519081527f412871529f3cedd6ca6f10784258f4965a5d6e254127593fe354e7a62f6d0a2390602001610bde565b611a3d611c3a565b6001600160a01b038116611ab95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108ec565b610ab881611e3c565b611acf602082018261353f565b6001600160a01b0316336001600160a01b031614611b2f5760405162461bcd60e51b815260206004820152601260248201527f4e6f742073656e7420627920747261646572000000000000000000000000000060448201526064016108ec565b6000611b468261012e836115de602084018461353f565b600081815261012d602052604090205490915060ff1615611ba95760405162461bcd60e51b815260206004820152601960248201527f4f726465722063616e63656c6c6564206f722066696c6c65640000000000000060448201526064016108ec565b600081815261012d602052604090819020805460ff19166001179055517f5152abf959f6564662358c2e52b702259b78bac5ee7842a0f01937e670efcc7d90611bf59083815260200190565b60405180910390a15050565b611c09611c3a565b6001610128556040517fd1dcd00534373f20882b79e6ab6875a5c358c5bd576448757ed50e63069ab51890600090a1565b6092546001600160a01b03163314610ed75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ec565b610ab8611c3a565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611ccf57611084836128eb565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611d29575060408051601f3d908101601f19168201909252611d2691810190613c0e565b60015b611d9b5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f74205555505300000000000000000000000000000000000060648201526084016108ec565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611e305760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c6555554944000000000000000000000000000000000000000000000060648201526084016108ec565b506110848383836129a9565b609280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610130548015610ab85760008060008084335af180610d5157600080fd5b605f54610100900460ff16611f175760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016108ec565b610ed76129d4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82600001518051906020012083602001518051906020012084604001518560600151604051602001611f9f9594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b604051602081830303815290604052805190602001209050919050565b60007f376bfbc394a7ba7fdf10f224572cef371358e3053e362f4554fcd2ad56329b3f611fec602085018561353f565b611ffc604086016020870161390f565b61200c606087016040880161353f565b61201c608088016060890161353f565b608088013560a089013561203660e08b0160c08c0161353f565b8a60e001358b61010001358c61012001356120608e80610140019061205b919061392c565b612a48565b8e61016001358f8061018001906120779190613c27565b604051612085929190613c6e565b6040519081900381206120a79e9d9c9b9a999897969594939291602001613c7e565b60408051601f1981840301815282825260208301859052910160408051601f19818403018152908290526120de9291602001613d1e565b6040516020818303038152906040528051906020012090505b92915050565b60008061210d602085018561353f565b6001600160a01b0316141580156121345750600082815261012d602052604090205460ff16155b8015612144575042836101000135105b8015612154575082610120013542105b9392505050565b60008061216884806138a1565b61217790610180810190613c27565b90501180156121de575061218b83806138a1565b61219a90610180810190613c27565b60008181106121ab576121ab61388b565b9050013560f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916600160f81b145b156122795761012c546121f560c085013543613d4d565b106122425760405162461bcd60e51b815260206004820181905260248201527f5369676e656420626c6f636b206e756d626572206f7574206f662072616e676560448201526064016108ec565b61226d8261225660c0860160a0870161390f565b6122636080870187613c27565b8760c00135612b1b565b612279575060006120f7565b3361228484806138a1565b61229290602081019061353f565b6001600160a01b0316036122a8575060016120f7565b612300826122b685806138a1565b6122c490602081019061353f565b6122d46040870160208801613d60565b604087013560608801356122ee60c08a0160a08b0161390f565b6122fb60808b018b613c27565b612bb1565b61230c575060006120f7565b50600192915050565b6000806000806000856101000135876101000135116124ab5761012a546001600160a01b031663874516cd61235060608a0160408b0161353f565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156123ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d09190613d93565b61241c5760405162461bcd60e51b815260206004820152601960248201527f506f6c696379206973206e6f742077686974656c69737465640000000000000060448201526064016108ec565b61242c606088016040890161353f565b6001600160a01b031663d5ec8c7788886040518363ffffffff1660e01b8152600401612459929190613dae565b60a060405180830381865afa158015612476573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249a9190613dd3565b929850909650945092509050612624565b61012a546001600160a01b031663874516cd6124cd6060890160408a0161353f565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612529573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254d9190613d93565b6125995760405162461bcd60e51b815260206004820152601960248201527f506f6c696379206973206e6f742077686974656c69737465640000000000000060448201526064016108ec565b6125a9606087016040880161353f565b6001600160a01b0316630813a76687896040518363ffffffff1660e01b81526004016125d6929190613dae565b60a060405180830381865afa1580156125f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126179190613dd3565b9298509096509450925090505b806126715760405162461bcd60e51b815260206004820152601860248201527f4f72646572732063616e6e6f74206265206d617463686564000000000000000060448201526064016108ec565b5092959194509250565b6001600160a01b03861661274d57336001600160a01b038816146126e15760405162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207573652045544800000000000000000000000000000000000060448201526064016108ec565b806101305410156127345760405162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e742076616c7565000000000000000000000000000060448201526064016108ec565b8061013060008282546127479190613d4d565b90915550505b600061275e8686898b866001612cac565b9050600061277185858a8c876000612cac565b90506001600160a01b03881661279a578061013060008282546127949190613d4d565b90915550505b6127af888a8c6127aa8688613d4d565b612e1b565b50505050505050505050565b60008160018111156127cf576127cf6138e1565b036128505761012954604051633c4fc9fb60e11b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690529091169063789f93f690608401600060405180830381600087803b15801561283357600080fd5b505af1158015612847573d6000803e3d6000fd5b505050506128e3565b6001816001811115612864576128646138e1565b036128e35761012954604051633a54a01760e11b81526001600160a01b038881166004830152878116602483015286811660448301526064820186905260848201859052909116906374a9402e9060a401600060405180830381600087803b1580156128cf57600080fd5b505af11580156127af573d6000803e3d6000fd5b505050505050565b6001600160a01b0381163b6129685760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016108ec565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6129b28361312e565b6000825111806129bf5750805b15611084576129ce838361316e565b50505050565b605f54610100900460ff16612a3f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016108ec565b610ed733611e3c565b6000808267ffffffffffffffff811115612a6457612a64613585565b604051908082528060200260200182016040528015612a8d578160200160208202803683370190505b50905060005b83811015612aea57612abb858583818110612ab057612ab061388b565b905060400201613270565b828281518110612acd57612acd61388b565b602090810291909101015280612ae281613e27565b915050612a93565b5080604051602001612afc9190613e40565b6040516020818303038152906040528051906020012091505092915050565b600080612b2887846132e0565b90506000808080896001811115612b4157612b416138e1565b03612b5b5750508535905060208601356040870135612b87565b6001896001811115612b6f57612b6f6138e1565b03612b87575050506020850135604086013560608701355b61012b54612ba1906001600160a01b03168585858561335e565b9450505050505b95945050505050565b60008080856001811115612bc757612bc76138e1565b03612bdc57612bd58a61344f565b9050612c91565b6001856001811115612bf057612bf06138e1565b03612c91576000612c0384860186613e76565b90506000734c2bbdbeccae1c492c681158a46eae498a05627b639c7bf9388d846040518363ffffffff1660e01b8152600401612c40929190613f1c565b602060405180830381865af4158015612c5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c819190613c0e565b9050612c8c8161347a565b925050505b612c9e89828a8a8a61335e565b9a9950505050505050505050565b61013154600090819015801590612cc05750825b15612d0f5760006127106101315486612cd99190613f6a565b612ce39190613f81565b61013254909150612d0190889088906001600160a01b031684612e1b565b612d0b8183613878565b9150505b60005b60ff8116881115612dbf5760006127108a8a8460ff16818110612d3757612d3761388b565b612d4d9260206040909202019081019150613fa3565b612d5b9061ffff1688613f6a565b612d659190613f81565b9050612d9f88888c8c8660ff16818110612d8157612d8161388b565b9050604002016020016020810190612d99919061353f565b84612e1b565b612da98184613878565b9250508080612db7906138c2565b915050612d12565b5083811115612e105760405162461bcd60e51b815260206004820152601c60248201527f4665657320617265206d6f7265207468616e207468652070726963650000000060448201526064016108ec565b979650505050505050565b80156129ce576001600160a01b038416612f2e576001600160a01b038216612e855760405162461bcd60e51b815260206004820152601860248201527f5472616e7366657220746f207a65726f2061646472657373000000000000000060448201526064016108ec565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612ed2576040519150601f19603f3d011682016040523d82523d6000602084013e612ed7565b606091505b5050905080612f285760405162461bcd60e51b815260206004820152601360248201527f455448207472616e73666572206661696c65640000000000000000000000000060448201526064016108ec565b506129ce565b6ea39bb272e79075ade125fd351887ab196001600160a01b03851601613028576040516323b872dd60e01b81526001600160a01b03808516600483015283166024820152604481018290526000906ea39bb272e79075ade125fd351887ac906323b872dd906064016020604051808303816000875af1158015612fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd99190613d93565b905080612f285760405162461bcd60e51b815260206004820152601460248201527f506f6f6c207472616e73666572206661696c656400000000000000000000000060448201526064016108ec565b7fffffffffffffffffffffffff3fd555c64ddc0172f5f1a3b0d81526f7c38a933e6001600160a01b038516016130e6576101295460405163368fa33960e21b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201526001600160a01b0385811660248301528481166044830152606482018490529091169063da3e8ce490608401600060405180830381600087803b1580156130c957600080fd5b505af11580156130dd573d6000803e3d6000fd5b505050506129ce565b60405162461bcd60e51b815260206004820152601560248201527f496e76616c6964207061796d656e7420746f6b656e000000000000000000000060448201526064016108ec565b613137816128eb565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6131ed5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016108ec565b600080846001600160a01b0316846040516132089190613fbe565b600060405180830381855af49150503d8060008114613243576040519150601f19603f3d011682016040523d82523d6000602084013e613248565b606091505b5091509150612ba88282604051806060016040528060278152602001613fd1602791396134f1565b60007f05b43f730f67de334a342883f867101fc7ef3361dfdff4a29a7aa97e0920ef7a6132a06020840184613fa3565b6132b0604085016020860161353f565b604051602001611f9f9392919092835261ffff9190911660208301526001600160a01b0316604082015260600190565b603254604080517fd71080023d2f293ed0723dc287d6b2d4e7d27d0b6c12928e300721b7c78c748560208201529081018490526060810183905260009190608001604051602081830303815290604052805190602001206040516020016120de92919061190160f01b81526002810192909252602282015260420190565b60008360ff16601b148061337557508360ff16601c145b6133c15760405162461bcd60e51b815260206004820152601360248201527f496e76616c6964207620706172616d657465720000000000000000000000000060448201526064016108ec565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015613415573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661343a576000915050612ba8565b6001600160a01b038781169116149050612ba8565b60325460405161190160f01b6020820152602281019190915260428101829052600090606201611f9f565b603254604080517f5bcf4b2eaff7fcdeb49f0bda53026b9ebdd93db566fe4c447125cb899e598c9060208201529081018390526000919060600160405160208183030381529060405280519060200120604051602001611f9f92919061190160f01b81526002810192909252602282015260420190565b60608315613500575081612154565b8251156135105782518084602001fd5b8160405162461bcd60e51b81526004016108ec9190613714565b6001600160a01b0381168114610ab857600080fd5b60006020828403121561355157600080fd5b81356121548161352a565b80356135678161352a565b919050565b60006020828403121561357e57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156135c4576135c4613585565b604052919050565b600080604083850312156135df57600080fd5b82356135ea8161352a565b915060208381013567ffffffffffffffff8082111561360857600080fd5b818601915086601f83011261361c57600080fd5b81358181111561362e5761362e613585565b613640601f8201601f1916850161359b565b9150808252878482850101111561365657600080fd5b80848401858401376000848284010152508093505050509250929050565b600060e0828403121561368657600080fd5b50919050565b6000806040838503121561369f57600080fd5b823567ffffffffffffffff808211156136b757600080fd5b6136c386838701613674565b935060208501359150808211156136d957600080fd5b506136e685828601613674565b9150509250929050565b60005b8381101561370b5781810151838201526020016136f3565b50506000910152565b60208152600082518060208401526137338160408501602087016136f0565b601f01601f19169190910160400192915050565b60008083601f84011261375957600080fd5b50813567ffffffffffffffff81111561377157600080fd5b6020830191508360208260051b850101111561378c57600080fd5b9250929050565b600080602083850312156137a657600080fd5b823567ffffffffffffffff8111156137bd57600080fd5b6137c985828601613747565b90969095509350505050565b600080600080608085870312156137eb57600080fd5b84356137f68161352a565b935060208501356138068161352a565b925060408501356138168161352a565b9396929550929360600135925050565b60006020828403121561383857600080fd5b813567ffffffffffffffff81111561384f57600080fd5b82016101a0818503121561215457600080fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156120f7576120f7613862565b634e487b7160e01b600052603260045260246000fd5b6000823561019e198336030181126138b857600080fd5b9190910192915050565b600060ff821660ff81036138d8576138d8613862565b60010192915050565b634e487b7160e01b600052602160045260246000fd5b60028110610ab857600080fd5b8035613567816138f7565b60006020828403121561392157600080fd5b8135612154816138f7565b6000808335601e1984360301811261394357600080fd5b83018035915067ffffffffffffffff82111561395e57600080fd5b6020019150600681901b360382131561378c57600080fd5b6002811061399457634e487b7160e01b600052602160045260246000fd5b9052565b6000808335601e198436030181126139af57600080fd5b830160208101925035905067ffffffffffffffff8111156139cf57600080fd5b8060061b360382131561378c57600080fd5b803561ffff8116811461356757600080fd5b8183526000602080850194508260005b85811015613a475761ffff613a17836139e1565b16875282820135613a278161352a565b6001600160a01b0316878401526040968701969190910190600101613a03565b509495945050505050565b6000808335601e19843603018112613a6957600080fd5b830160208101925035905067ffffffffffffffff811115613a8957600080fd5b80360382131561378c57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006101a0613ae084613ad38561355c565b6001600160a01b03169052565b613aec60208401613904565b613af96020860182613976565b50613b066040840161355c565b6001600160a01b03166040850152613b206060840161355c565b6001600160a01b0381166060860152506080830135608085015260a083013560a0850152613b5060c0840161355c565b6001600160a01b031660c085015260e0838101359085015261010080840135908501526101208084013590850152610140613b8d81850185613998565b8383880152613b9f84880182846139f3565b9350505050610160808401358186015250610180613bbf81850185613a52565b86840383880152612e10848284613a98565b608081526000613be46080830187613ac1565b8560208401528281036040840152613bfc8186613ac1565b91505082606083015295945050505050565b600060208284031215613c2057600080fd5b5051919050565b6000808335601e19843603018112613c3e57600080fd5b83018035915067ffffffffffffffff821115613c5957600080fd5b60200191503681900382131561378c57600080fd5b8183823760009101908152919050565b8e81526001600160a01b038e1660208201526101c08101613ca2604083018f613976565b6001600160a01b038d1660608301526001600160a01b038c1660808301528a60a08301528960c0830152613ce160e083018a6001600160a01b03169052565b8761010083015286610120830152856101408301528461016083015283610180830152826101a08301529f9e505050505050505050505050505050565b60008351613d308184602088016136f0565b835190830190613d448183602088016136f0565b01949350505050565b818103818111156120f7576120f7613862565b600060208284031215613d7257600080fd5b813560ff8116811461215457600080fd5b8051801515811461356757600080fd5b600060208284031215613da557600080fd5b61215482613d83565b604081526000613dc16040830185613ac1565b8281036020840152612ba88185613ac1565b600080600080600060a08688031215613deb57600080fd5b613df486613d83565b94506020860151935060408601519250606086015191506080860151613e19816138f7565b809150509295509295909350565b600060018201613e3957613e39613862565b5060010190565b815160009082906020808601845b83811015613e6a57815185529382019390820190600101613e4e565b50929695505050505050565b60006020808385031215613e8957600080fd5b823567ffffffffffffffff80821115613ea157600080fd5b818501915085601f830112613eb557600080fd5b813581811115613ec757613ec7613585565b8060051b9150613ed884830161359b565b8181529183018401918481019088841115613ef257600080fd5b938501935b83851015613f1057843582529385019390850190613ef7565b98975050505050505050565b6000604082018483526020604081850152818551808452606086019150828701935060005b81811015613f5d57845183529383019391830191600101613f41565b5090979650505050505050565b80820281158282048414176120f7576120f7613862565b600082613f9e57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215613fb557600080fd5b612154826139e1565b600082516138b88184602087016136f056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000811000a
Loading...
Loading
Loading...
Loading

Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.