More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x287e984c7c22e67ce79e46b0f160bb6629028cedcd764d136c9afa3313b09a0c | Batch Buy With E... | (pending) | 14 hrs ago | IN | 0.00039 ETH | (Pending) | |||
Batch Buy With E... | 21463414 | 7 mins ago | IN | 0.114 ETH | 0.00145269 | ||||
Batch Buy With E... | 21463389 | 13 mins ago | IN | 0.0419 ETH | 0.00098795 | ||||
Batch Buy With E... | 21461180 | 7 hrs ago | IN | 0.13 ETH | 0.00119914 | ||||
Batch Buy With E... | 21460494 | 9 hrs ago | IN | 0.0132 ETH | 0.00147784 | ||||
Batch Buy With E... | 21459365 | 13 hrs ago | IN | 0.013 ETH | 0.00121407 | ||||
Batch Buy With E... | 21459235 | 14 hrs ago | IN | 0.013 ETH | 0.00140324 | ||||
Batch Buy With E... | 21459139 | 14 hrs ago | IN | 0.013 ETH | 0.00139693 | ||||
Batch Buy With E... | 21457869 | 18 hrs ago | IN | 0.0686 ETH | 0.00147568 | ||||
Batch Buy With E... | 21457808 | 18 hrs ago | IN | 0.069 ETH | 0.00145057 | ||||
Batch Buy With E... | 21457793 | 19 hrs ago | IN | 0.06899643 ETH | 0.00222161 | ||||
Batch Buy With E... | 21457791 | 19 hrs ago | IN | 0.1799 ETH | 0.00168959 | ||||
Batch Buy With E... | 21457773 | 19 hrs ago | IN | 0.07 ETH | 0.00129924 | ||||
Batch Buy With E... | 21457712 | 19 hrs ago | IN | 0.298151 ETH | 0.0034926 | ||||
Batch Buy With E... | 21457648 | 19 hrs ago | IN | 0.08 ETH | 0.00141288 | ||||
Batch Buy With E... | 21457642 | 19 hrs ago | IN | 0.30515 ETH | 0.0037204 | ||||
Batch Buy With E... | 21457640 | 19 hrs ago | IN | 0.08 ETH | 0.00138717 | ||||
Batch Buy With E... | 21457581 | 19 hrs ago | IN | 0.2716 ETH | 0.00282268 | ||||
Batch Buy With E... | 21454400 | 30 hrs ago | IN | 0.008 ETH | 0.0010935 | ||||
Batch Buy With E... | 21454031 | 31 hrs ago | IN | 0.0001 ETH | 0.00097163 | ||||
Batch Buy With E... | 21453954 | 31 hrs ago | IN | 0.00799 ETH | 0.00126354 | ||||
Batch Buy With E... | 21450007 | 45 hrs ago | IN | 0.03 ETH | 0.0018053 | ||||
Batch Buy With E... | 21448381 | 2 days ago | IN | 0.116 ETH | 0.00253908 | ||||
Batch Buy With E... | 21446513 | 2 days ago | IN | 0.07383832 ETH | 0.00593619 | ||||
Batch Buy With E... | 21446503 | 2 days ago | IN | 0.0135 ETH | 0.00213094 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21463414 | 7 mins ago | 0.038 ETH | ||||
21463414 | 7 mins ago | 0.038 ETH | ||||
21463414 | 7 mins ago | 0.038 ETH | ||||
21463389 | 13 mins ago | 0.0419 ETH | ||||
21461180 | 7 hrs ago | 0.13 ETH | ||||
21460494 | 9 hrs ago | 0.0132 ETH | ||||
21459365 | 13 hrs ago | 0.013 ETH | ||||
21459235 | 14 hrs ago | 0.013 ETH | ||||
21459139 | 14 hrs ago | 0.013 ETH | ||||
21457869 | 18 hrs ago | 0.0686 ETH | ||||
21457808 | 18 hrs ago | 0.069 ETH | ||||
21457793 | 19 hrs ago | 0.068999 ETH | ||||
21457793 | 19 hrs ago | 0.00000256 ETH | ||||
21457791 | 19 hrs ago | 0.1799 ETH | ||||
21457773 | 19 hrs ago | 0.07 ETH | ||||
21457712 | 19 hrs ago | 0.060851 ETH | ||||
21457712 | 19 hrs ago | 0.0832 ETH | ||||
21457712 | 19 hrs ago | 0.0821 ETH | ||||
21457712 | 19 hrs ago | 0.072 ETH | ||||
21457712 | 19 hrs ago | 0.060851 ETH | ||||
21457648 | 19 hrs ago | 0.08 ETH | ||||
21457642 | 19 hrs ago | 0.08 ETH | ||||
21457642 | 19 hrs ago | 0.08 ETH | ||||
21457642 | 19 hrs ago | 0.08 ETH | ||||
21457642 | 19 hrs ago | 0.06515 ETH |
Loading...
Loading
Contract Name:
ElementExSwapV2
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; import "./storage/LibFeatureStorage.sol"; import "./Aggregator.sol"; import "./libs/Ownable.sol"; contract ElementExSwapV2 is Aggregator, Ownable { struct Method { bytes4 methodID; string methodName; } struct Feature { address feature; string name; Method[] methods; } event FeatureFunctionUpdated( bytes4 indexed methodID, address oldFeature, address newFeature ); function registerFeatures(Feature[] calldata features) external onlyOwner { unchecked { for (uint256 i = 0; i < features.length; ++i) { registerFeature(features[i]); } } } function registerFeature(Feature calldata feature) public onlyOwner { unchecked { address impl = feature.feature; require(impl != address(0), "registerFeature: invalid feature address."); LibFeatureStorage.Storage storage stor = LibFeatureStorage.getStorage(); stor.featureNames[impl] = feature.name; Method[] calldata methods = feature.methods; for (uint256 i = 0; i < methods.length; ++i) { bytes4 methodID = methods[i].methodID; address oldFeature = stor.featureImpls[methodID]; if (oldFeature == address(0)) { stor.methodIDs.push(methodID); } stor.featureImpls[methodID] = impl; stor.methodNames[methodID] = methods[i].methodName; emit FeatureFunctionUpdated(methodID, oldFeature, impl); } } } function unregister(bytes4[] calldata methodIDs) external onlyOwner { unchecked { uint256 removedFeatureCount; LibFeatureStorage.Storage storage stor = LibFeatureStorage.getStorage(); // Update storage.featureImpls for (uint256 i = 0; i < methodIDs.length; ++i) { bytes4 methodID = methodIDs[i]; address impl = stor.featureImpls[methodID]; if (impl != address(0)) { removedFeatureCount++; stor.featureImpls[methodID] = address(0); } emit FeatureFunctionUpdated(methodID, impl, address(0)); } if (removedFeatureCount == 0) { return; } // Remove methodIDs from storage.methodIDs bytes4[] storage storMethodIDs = stor.methodIDs; for (uint256 i = storMethodIDs.length; i > 0; --i) { bytes4 methodID = storMethodIDs[i - 1]; if (stor.featureImpls[methodID] == address(0)) { if (i != storMethodIDs.length) { storMethodIDs[i - 1] = storMethodIDs[storMethodIDs.length - 1]; } delete storMethodIDs[storMethodIDs.length - 1]; storMethodIDs.pop(); if (removedFeatureCount == 1) { // Finished return; } --removedFeatureCount; } } } } /// @dev Fallback for just receiving ether. receive() external payable {} /// @dev Forwards calls to the appropriate implementation contract. uint256 private constant STORAGE_ID_FEATURE = 1 << 128; fallback() external payable { assembly { // Copy methodID to memory 0x00~0x04 calldatacopy(0, 0, 4) // Store LibFeatureStorage.slot to memory 0x20~0x3F mstore(0x20, STORAGE_ID_FEATURE) // Calculate impl.slot and load impl from storage let impl := sload(keccak256(0, 0x40)) if iszero(impl) { // revert("Not implemented method.") mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000) mstore(0x20, 0x0000002000000000000000000000000000000000000000000000000000000000) mstore(0x40, 0x000000174e6f7420696d706c656d656e746564206d6574686f642e0000000000) mstore(0x60, 0) revert(0, 0x64) } calldatacopy(0, 0, calldatasize()) if iszero(delegatecall(gas(), impl, 0, calldatasize(), 0, 0)) { // Failed, copy the returned data and revert. returndatacopy(0, 0, returndatasize()) revert(0, returndatasize()) } // Success, copy the returned data and return. returndatacopy(0, 0, returndatasize()) return(0, returndatasize()) } } function approveERC20(IERC20 token, address operator, uint256 amount) external onlyOwner { token.approve(operator, amount); } function rescueETH(address recipient) external onlyOwner { address to = (recipient != address(0)) ? recipient : msg.sender; _transferEth(to, address(this).balance); } function rescueERC20(address asset, address recipient) external onlyOwner { address to = (recipient != address(0)) ? recipient : msg.sender; _transferERC20(asset, to, IERC20(asset).balanceOf(address(this))); } function rescueERC721(address asset, uint256[] calldata ids , address recipient) external onlyOwner { assembly { // selector for transferFrom(address,address,uint256) mstore(0, 0x23b872dd00000000000000000000000000000000000000000000000000000000) mstore(0x4, address()) switch recipient case 0 { mstore(0x24, caller()) } default { mstore(0x24, recipient) } for { let offset := ids.offset } lt(offset, calldatasize()) { offset := add(offset, 0x20) } { // tokenID mstore(0x44, calldataload(offset)) if iszero(call(gas(), asset, 0, 0, 0x64, 0, 0)) { returndatacopy(0, 0, returndatasize()) revert(0, returndatasize()) } } } } function onERC1155Received(address, address, uint256, uint256, bytes calldata) external virtual returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata) external virtual returns (bytes4) { return this.onERC1155BatchReceived.selector; } function onERC721Received(address, address, uint256, bytes calldata) external virtual returns (bytes4) { return 0x150b7a02; } function onERC721Received(address, uint256, bytes calldata) external virtual returns (bytes4) { return 0xf0b9e5ba; } function supportsInterface(bytes4 interfaceId) external virtual returns (bool) { return interfaceId == this.supportsInterface.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; library LibFeatureStorage { uint256 constant STORAGE_ID_FEATURE = 1 << 128; struct Storage { // Mapping of methodID -> feature implementation mapping(bytes4 => address) featureImpls; // Mapping of feature implementation -> feature name mapping(address => string) featureNames; // Record methodIDs bytes4[] methodIDs; // Mapping of methodID -> method name mapping(bytes4 => string) methodNames; } /// @dev Get the storage bucket for this contract. function getStorage() internal pure returns (Storage storage stor) { // Dip into assembly to change the slot pointed to by the local // variable `stor`. // See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries assembly { stor.slot := STORAGE_ID_FEATURE } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./interfaces/IAggregator.sol"; import "./libs/FixinTokenSpender.sol"; import "./libs/ReentrancyGuard.sol"; abstract contract Aggregator is IAggregator, ReentrancyGuard, FixinTokenSpender { uint256 private constant SEAPORT_MARKET_ID = 1; address private constant SEAPORT = 0x00000000006c3852cbEf3e08E8dF289169EdE581; uint256 private constant ELEMENT_MARKET_ID = 2; address private constant ELEMENT = 0x20F780A973856B93f63670377900C1d2a50a77c4; uint256 private constant WETH_MARKET_ID = 999; address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // markets.slot == 0 // markets.data.slot == keccak256(markets.slot) == 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563 uint256 private constant MARKETS_DATA_SLOT = 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563; // 168 bits(ethValue) uint256 private constant ETH_VALUE_MASK = (1 << 168) - 1; // 160 bits(proxy) uint256 private constant PROXY_MASK = (1 << 160) - 1; function batchBuyWithETH(bytes calldata tradeBytes) external override payable { uint256 ethBalanceBefore; assembly { ethBalanceBefore := sub(selfbalance(), callvalue()) } // trade _trade(tradeBytes); // return remaining ETH (if any) assembly { if eq(selfbalance(), ethBalanceBefore) { return(0, 0) } if gt(selfbalance(), ethBalanceBefore) { let success := call(gas(), caller(), sub(selfbalance(), ethBalanceBefore), 0, 0, 0, 0) return(0, 0) } } revert("Failed to return ETH."); } function batchBuyWithERC20s( ERC20Pair[] calldata erc20Pairs, bytes calldata tradeBytes, address[] calldata dustTokens ) external override payable nonReentrant { // transfer ERC20 tokens from the sender to this contract _transferERC20Pairs(erc20Pairs); // trade _trade(tradeBytes); // return dust tokens (if any) _returnDust(dustTokens); // return remaining ETH (if any) assembly { if gt(selfbalance(), 0) { let success := call(gas(), caller(), selfbalance(), 0, 0, 0, 0) } } } function _trade(bytes calldata tradeBytes) internal { assembly { let anySuccess let itemLength let end := add(tradeBytes.offset, tradeBytes.length) let ptr := mload(0x40) // free memory pointer // nextOffset == offset + 28bytes[2 + 1 + 21 + 4] + itemLength for { let offset := tradeBytes.offset } lt(offset, end) { offset := add(add(offset, 28), itemLength) } { // head == [2 bytes(marketId) + 1 bytes(continueIfFailed) + 21 bytes(ethValue) + 4 bytes(itemLength) + 4 bytes(item)] // head == [16 bits(marketId) + 8 bits(continueIfFailed) + 168 bits(ethValue) + 32 bits(itemLength) + 32 bits(item)] let head := calldataload(offset) // itemLength = (head >> 32) & 0xffffffff itemLength := and(shr(32, head), 0xffffffff) // itemOffset == offset + 28 // copy item.data to memory ptr calldatacopy(ptr, add(offset, 28), itemLength) // marketId = head >> (8 + 168 + 32 + 32) = head >> 240 let marketId := shr(240, head) // Seaport if eq(marketId, SEAPORT_MARKET_ID) { // ethValue = (head >> 64) & ETH_VALUE_MASK // SEAPORT.call{value: ethValue}(item) if iszero(call(gas(), SEAPORT, and(shr(64, head), ETH_VALUE_MASK), ptr, itemLength, 0, 0)) { _revertOrContinue(head) continue } anySuccess := 1 continue } // ElementEx if eq(marketId, ELEMENT_MARKET_ID) { // ethValue = (head >> 64) & ETH_VALUE_MASK // ELEMENT.call{value: ethValue}(item) if iszero(call(gas(), ELEMENT, and(shr(64, head), ETH_VALUE_MASK), ptr, itemLength, 0, 0)) { _revertOrContinue(head) continue } anySuccess := 1 continue } // WETH if eq(marketId, WETH_MARKET_ID) { let methodId := and(head, 0xffffffff) // WETH.deposit(); if eq(methodId, 0xd0e30db0) { if iszero(call(gas(), WETH, and(shr(64, head), ETH_VALUE_MASK), ptr, itemLength, 0, 0)) { _revertOrContinue(head) continue } anySuccess := 1 continue } // WETH.withdraw(); if eq(methodId, 0x2e1a7d4d) { if iszero(call(gas(), WETH, 0, ptr, itemLength, 0, 0)) { _revertOrContinue(head) continue } anySuccess := 1 continue } // Do not support other methods. _revertOrContinue(head) continue } // Others // struct Market { // address proxy; // bool isLibrary; // bool isActive; // } // [80 bits(unused) + 8 bits(isActive) + 8 bits(isLibrary) + 160 bits(proxy)] // [10 bytes(unused) + 1 bytes(isActive) + 1 bytes(isLibrary) + 20 bytes(proxy)] // market.slot = markets.data.slot + marketId // market = sload(market.slot) let market := sload(add(MARKETS_DATA_SLOT, marketId)) // if (!market.isActive) if iszero(byte(10, market)) { // if (!continueIfFailed) if iszero(byte(2, head)) { // revert("Inactive market.") mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000) mstore(0x20, 0x0000002000000000000000000000000000000000000000000000000000000000) mstore(0x40, 0x00000010496e616374697665206d61726b65742e000000000000000000000000) mstore(0x60, 0) revert(0, 0x64) } continue } // if (!market.isLibrary) if iszero(byte(11, market)) { // ethValue = (head >> 64) & ETH_VALUE_MASK // market.proxy.call{value: ethValue}(item) if iszero(call(gas(), and(market, PROXY_MASK), and(shr(64, head), ETH_VALUE_MASK), ptr, itemLength, 0, 0)) { _revertOrContinue(head) continue } anySuccess := 1 continue } // market.proxy.delegatecall(item) if iszero(delegatecall(gas(), and(market, PROXY_MASK), ptr, itemLength, 0, 0)) { _revertOrContinue(head) continue } anySuccess := 1 } // if (!anySuccess) if iszero(anySuccess) { if gt(tradeBytes.length, 0) { if iszero(returndatasize()) { // revert("No order succeeded.") mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000) mstore(0x20, 0x0000002000000000000000000000000000000000000000000000000000000000) mstore(0x40, 0x000000134e6f206f72646572207375636365656465642e000000000000000000) mstore(0x60, 0) revert(0, 0x64) } // revert(returnData) returndatacopy(0, 0, returndatasize()) revert(0, returndatasize()) } } function _revertOrContinue(head) { // head == [2 bytes(marketId) + 1 bytes(continueIfFailed) + 21 bytes(ethValue) + 4 bytes(itemLength) + 4 bytes(item)] // if (!continueIfFailed) if iszero(byte(2, head)) { if iszero(returndatasize()) { mstore(0, head) revert(0, 0x20) } returndatacopy(0, 0, returndatasize()) revert(0, returndatasize()) } } } } function _transferERC20Pairs(ERC20Pair[] calldata erc20Pairs) internal { // transfer ERC20 tokens from the sender to this contract if (erc20Pairs.length > 0) { assembly { let ptr := mload(0x40) let end := add(erc20Pairs.offset, mul(erc20Pairs.length, 0x40)) // selector for transferFrom(address,address,uint256) mstore(ptr, 0x23b872dd00000000000000000000000000000000000000000000000000000000) mstore(add(ptr, 0x04), caller()) mstore(add(ptr, 0x24), address()) for { let offset := erc20Pairs.offset } lt(offset, end) { offset := add(offset, 0x40) } { let amount := calldataload(add(offset, 0x20)) if gt(amount, 0) { mstore(add(ptr, 0x44), amount) let success := call(gas(), calldataload(offset), 0, ptr, 0x64, 0, 0) } } } } } function _returnDust(address[] calldata tokens) internal { // return remaining tokens (if any) for (uint256 i; i < tokens.length; ) { _transferERC20WithoutCheck(tokens[i], msg.sender, IERC20(tokens[i]).balanceOf(address(this))); unchecked { ++i; } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "../storage/LibOwnableStorage.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 Ownable { event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { if (owner() == address(0)) { _transferOwnership(msg.sender); } } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return LibOwnableStorage.getStorage().owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == msg.sender, "Ownable: caller is not the owner"); _; } /** * @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) private { LibOwnableStorage.Storage storage stor = LibOwnableStorage.getStorage(); address oldOwner = stor.owner; stor.owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; interface IAggregator { struct ERC20Pair { address token; uint256 amount; } function batchBuyWithETH(bytes calldata tradeBytes) external payable; function batchBuyWithERC20s( ERC20Pair[] calldata erc20Pairs, bytes calldata tradeBytes, address[] calldata dustTokens ) external payable; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; /// @dev Helpers for moving tokens around. abstract contract FixinTokenSpender { // Mask of the lower 20 bytes of a bytes32. uint256 constant private ADDRESS_MASK = (1 << 160) - 1; /// @dev Transfers ERC20 tokens from `owner` to `to`. /// @param token The token to spend. /// @param owner The owner of the tokens. /// @param to The recipient of the tokens. /// @param amount The amount of `token` to transfer. function _transferERC20From(address token, address owner, address to, uint256 amount) internal { uint256 success; assembly { let ptr := mload(0x40) // free memory pointer // selector for transferFrom(address,address,uint256) mstore(ptr, 0x23b872dd00000000000000000000000000000000000000000000000000000000) mstore(add(ptr, 0x04), and(owner, ADDRESS_MASK)) mstore(add(ptr, 0x24), and(to, ADDRESS_MASK)) mstore(add(ptr, 0x44), amount) success := call(gas(), and(token, ADDRESS_MASK), 0, ptr, 0x64, ptr, 32) let rdsize := returndatasize() // Check for ERC20 success. ERC20 tokens should return a boolean, // but some don't. We accept 0-length return data as success, or at // least 32 bytes that starts with a 32-byte boolean true. success := and( success, // call itself succeeded or( iszero(rdsize), // no return data, or and( iszero(lt(rdsize, 32)), // at least 32 bytes eq(mload(ptr), 1) // starts with uint256(1) ) ) ) } require(success != 0, "_transferERC20/TRANSFER_FAILED"); } /// @dev Transfers ERC20 tokens from ourselves to `to`. /// @param token The token to spend. /// @param to The recipient of the tokens. /// @param amount The amount of `token` to transfer. function _transferERC20(address token, address to, uint256 amount) internal { uint256 success; assembly { let ptr := mload(0x40) // free memory pointer // selector for transfer(address,uint256) mstore(ptr, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) mstore(add(ptr, 0x04), and(to, ADDRESS_MASK)) mstore(add(ptr, 0x24), amount) success := call(gas(), and(token, ADDRESS_MASK), 0, ptr, 0x44, ptr, 32) let rdsize := returndatasize() // Check for ERC20 success. ERC20 tokens should return a boolean, // but some don't. We accept 0-length return data as success, or at // least 32 bytes that starts with a 32-byte boolean true. success := and( success, // call itself succeeded or( iszero(rdsize), // no return data, or and( iszero(lt(rdsize, 32)), // at least 32 bytes eq(mload(ptr), 1) // starts with uint256(1) ) ) ) } require(success != 0, "_transferERC20/TRANSFER_FAILED"); } function _transferERC20FromWithoutCheck(address token, address owner, address to, uint256 amount) internal { assembly { if gt(amount, 0) { let ptr := mload(0x40) // free memory pointer // selector for transferFrom(address,address,uint256) mstore(ptr, 0x23b872dd00000000000000000000000000000000000000000000000000000000) mstore(add(ptr, 0x04), and(owner, ADDRESS_MASK)) mstore(add(ptr, 0x24), and(to, ADDRESS_MASK)) mstore(add(ptr, 0x44), amount) let success := call(gas(), and(token, ADDRESS_MASK), 0, ptr, 0x64, 0, 0) } } } function _transferERC20WithoutCheck(address token, address to, uint256 amount) internal { assembly { if gt(amount, 0) { let ptr := mload(0x40) // free memory pointer // selector for transfer(address,uint256) mstore(ptr, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) mstore(add(ptr, 0x04), and(to, ADDRESS_MASK)) mstore(add(ptr, 0x24), amount) let success := call(gas(), and(token, ADDRESS_MASK), 0, ptr, 0x44, 0, 0) } } } /// @dev Transfers some amount of ETH to the given recipient and /// reverts if the transfer fails. /// @param recipient The recipient of the ETH. /// @param amount The amount of ETH to transfer. function _transferEth(address recipient, uint256 amount) internal { assembly { if gt(amount, 0) { if iszero(call(gas(), recipient, amount, 0, 0, 0, 0)) { // revert("_transferEth/TRANSFER_FAILED") mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000) mstore(0x20, 0x0000002000000000000000000000000000000000000000000000000000000000) mstore(0x40, 0x0000001c5f7472616e736665724574682f5452414e534645525f4641494c4544) mstore(0x60, 0) revert(0, 0x64) } } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "../storage/LibOwnableStorage.sol"; abstract contract ReentrancyGuard { constructor() { LibOwnableStorage.Storage storage stor = LibOwnableStorage.getStorage(); if (stor.reentrancyStatus == 0) { stor.reentrancyStatus = 1; } } modifier nonReentrant() { LibOwnableStorage.Storage storage stor = LibOwnableStorage.getStorage(); require(stor.reentrancyStatus == 1, "ReentrancyGuard: reentrant call"); stor.reentrancyStatus = 2; _; stor.reentrancyStatus = 1; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.15; library LibOwnableStorage { uint256 constant STORAGE_ID_OWNABLE = 2 << 128; struct Storage { uint256 reentrancyStatus; address owner; } /// @dev Get the storage bucket for this contract. function getStorage() internal pure returns (Storage storage stor) { assembly { stor.slot := STORAGE_ID_OWNABLE } } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes4","name":"methodID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"oldFeature","type":"address"},{"indexed":false,"internalType":"address","name":"newFeature","type":"address"}],"name":"FeatureFunctionUpdated","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IAggregator.ERC20Pair[]","name":"erc20Pairs","type":"tuple[]"},{"internalType":"bytes","name":"tradeBytes","type":"bytes"},{"internalType":"address[]","name":"dustTokens","type":"address[]"}],"name":"batchBuyWithERC20s","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"tradeBytes","type":"bytes"}],"name":"batchBuyWithETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"feature","type":"address"},{"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"bytes4","name":"methodID","type":"bytes4"},{"internalType":"string","name":"methodName","type":"string"}],"internalType":"struct ElementExSwapV2.Method[]","name":"methods","type":"tuple[]"}],"internalType":"struct ElementExSwapV2.Feature","name":"feature","type":"tuple"}],"name":"registerFeature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"feature","type":"address"},{"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"bytes4","name":"methodID","type":"bytes4"},{"internalType":"string","name":"methodName","type":"string"}],"internalType":"struct ElementExSwapV2.Method[]","name":"methods","type":"tuple[]"}],"internalType":"struct ElementExSwapV2.Feature[]","name":"features","type":"tuple[]"}],"name":"registerFeatures","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescueERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4[]","name":"methodIDs","type":"bytes4[]"}],"name":"unregister","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50600062000029620000a060201b6200152e1760201c565b905060008160000154036200004357600181600001819055505b50600073ffffffffffffffffffffffffffffffffffffffff166200006c620000b960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16036200009a576200009933620000f960201b60201c565b5b620001dd565b6000700200000000000000000000000000000000905090565b6000620000d0620000a060201b6200152e1760201c565b60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600062000110620000a060201b6200152e1760201c565b905060008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b612fa280620001ed6000396000f3fe6080604052600436106100f75760003560e01c8063a8e5e4aa1161008a578063d750e2a511610059578063d750e2a5146103cb578063f0b9e5ba146103f4578063f23a6e6114610431578063f2fde38b1461046e576100fe565b8063a8e5e4aa14610313578063ab65a1f71461033c578063bc197c8114610365578063c12e5d54146103a2576100fe565b80634c674c2d116100c65780634c674c2d146102875780635d578816146102a35780635d799f87146102bf5780638da5cb5b146102e8576100fe565b806301ffc9a7146101bb57806304824e70146101f8578063150b7a021461022157806326e2dca21461025e576100fe565b366100fe57005b60046000803770010000000000000000000000000000000060205260406000205480610195577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c174e6f7420696d706c656d656e746564206d6574686f642e0000000000604052600060605260646000fd5b3660008037600080366000845af46101b1573d6000803e3d6000fd5b3d6000803e3d6000f35b3480156101c757600080fd5b506101e260048036038101906101dd9190611da8565b610497565b6040516101ef9190611df0565b60405180910390f35b34801561020457600080fd5b5061021f600480360381019061021a9190611e69565b6104e8565b005b34801561022d57600080fd5b5061024860048036038101906102439190611f31565b6105aa565b6040516102559190611fc8565b60405180910390f35b34801561026a57600080fd5b5061028560048036038101906102809190612039565b6105bf565b005b6102a1600480360381019061029c91906120ad565b6106ae565b005b6102bd60048036038101906102b891906121a6565b61071f565b005b3480156102cb57600080fd5b506102e660048036038101906102e1919061225a565b6107c2565b005b3480156102f457600080fd5b506102fd6108ff565b60405161030a91906122a9565b60405180910390f35b34801561031f57600080fd5b5061033a60048036038101906103359190612302565b610932565b005b34801561034857600080fd5b50610363600480360381019061035e91906123ab565b610a2b565b005b34801561037157600080fd5b5061038c600480360381019061038791906123f8565b610ee7565b6040516103999190611fc8565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c491906124f8565b610eff565b005b3480156103d757600080fd5b506103f260048036038101906103ed9190612597565b611354565b005b34801561040057600080fd5b5061041b600480360381019061041691906125e4565b611414565b6040516104289190611fc8565b60405180910390f35b34801561043d57600080fd5b5061045860048036038101906104539190612658565b611428565b6040516104659190611fc8565b60405180910390f35b34801561047a57600080fd5b5061049560048036038101906104909190611e69565b61143e565b005b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b3373ffffffffffffffffffffffffffffffffffffffff166105076108ff565b73ffffffffffffffffffffffffffffffffffffffff161461055d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105549061274f565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610598573361059a565b815b90506105a68147611547565b5050565b600063150b7a0260e01b905095945050505050565b3373ffffffffffffffffffffffffffffffffffffffff166105de6108ff565b73ffffffffffffffffffffffffffffffffffffffff1614610634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061274f565b60405180910390fd5b7f23b872dd0000000000000000000000000000000000000000000000000000000060005230600452806000811461066e5781602452610673565b336024525b50825b368110156106a75780356044526000806064600080895af161069c573d6000803e3d6000fd5b602081019050610676565b5050505050565b600034470390506106bf83836115d4565b8047036106cb57600080f35b804711156106e457600080600080844703335af1600080f35b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610716906127bb565b60405180910390fd5b600061072961152e565b90506001816000015414610772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076990612827565b60405180910390fd5b60028160000181905550610786878761199d565b61079085856115d4565b61079a8383611a21565b60004711156107af5760008060008047335af1505b6001816000018190555050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff166107e16108ff565b73ffffffffffffffffffffffffffffffffffffffff1614610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082e9061274f565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108725733610874565b815b90506108fa83828573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108b491906122a9565b602060405180830381865afa1580156108d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f5919061285c565b611b11565b505050565b600061090961152e565b60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff166109516108ff565b73ffffffffffffffffffffffffffffffffffffffff16146109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099e9061274f565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b383836040518363ffffffff1660e01b81526004016109e2929190612898565b6020604051808303816000875af1158015610a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2591906128ed565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16610a4a6108ff565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a979061274f565b60405180910390fd5b600080610aab611bdc565b905060005b84849050811015610c96576000858583818110610ad057610acf61291a565b5b9050602002016020810190610ae59190611da8565b90506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c2f5784806001019550506000846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167ff05686f2e12debc00665cd81463f2ae8ae5b4f167ea8dead964a3235a7d2a767826000604051610c81929190612949565b60405180910390a25050806001019050610ab0565b5060008203610ca6575050610ee3565b60008160020190506000818054905090505b6000811115610ede576000826001830381548110610cd957610cd861291a565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b9050600073ffffffffffffffffffffffffffffffffffffffff16846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610ed15782805490508214610e345782600184805490500381548110610dca57610dc961291a565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b836001840381548110610e0357610e0261291a565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c02179055505b82600184805490500381548110610e4e57610e4d61291a565b5b90600052602060002090600891828204019190066004026101000a81549063ffffffff021916905582805480610e8757610e86612972565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff0219169055905560018503610ec9575050505050610ee3565b846001900394505b5080600190039050610cb8565b505050505b5050565b600063bc197c8160e01b905098975050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16610f1e6108ff565b73ffffffffffffffffffffffffffffffffffffffff1614610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b9061274f565b60405180910390fd5b6000816000016020810190610f899190611e69565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff190612a13565b60405180910390fd5b6000611004611bdc565b90508280602001906110169190612a42565b8260010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209182611064929190612ceb565b503660008480604001906110789190612dbb565b9150915060005b8282905081101561134c57600083838381811061109f5761109e61291a565b5b90506020028101906110b19190612e1e565b60000160208101906110c39190611da8565b90506000856000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111bf57856002018290806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c02179055505b86866000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508484848181106112645761126361291a565b5b90506020028101906112769190612e1e565b80602001906112859190612a42565b876003016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002091826112e5929190612ceb565b50817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167ff05686f2e12debc00665cd81463f2ae8ae5b4f167ea8dead964a3235a7d2a7678289604051611337929190612949565b60405180910390a2505080600101905061107f565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff166113736108ff565b73ffffffffffffffffffffffffffffffffffffffff16146113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c09061274f565b60405180910390fd5b60005b8282905081101561140f576114048383838181106113ed576113ec61291a565b5b90506020028101906113ff9190612e46565b610eff565b8060010190506113cc565b505050565b600063f0b9e5ba60e01b9050949350505050565b600063f23a6e6160e01b90509695505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1661145d6108ff565b73ffffffffffffffffffffffffffffffffffffffff16146114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa9061274f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151990612ee0565b60405180910390fd5b61152b81611bf5565b50565b6000700200000000000000000000000000000000905090565b60008111156115d05760008060008084865af16115cf577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c1c5f7472616e736665724574682f5452414e534645525f4641494c4544604052600060605260646000fd5b5b5050565b600080828401604051855b828110156118dc57803563ffffffff8160201c16945084601c830184378060f01c6001810361165957600080878674ffffffffffffffffffffffffffffffffffffffffff8660401c166e6c3852cbef3e08e8df289169ede5815af161164e5761164782611971565b50506118cf565b6001965050506118cf565b600281036116b757600080878674ffffffffffffffffffffffffffffffffffffffffff8660401c167320f780a973856b93f63670377900c1d2a50a77c45af16116ac576116a582611971565b50506118cf565b6001965050506118cf565b6103e781036117855763ffffffff821663d0e30db0810361172a57600080888774ffffffffffffffffffffffffffffffffffffffffff8760401c1673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161171e5761171683611971565b5050506118cf565b600197505050506118cf565b632e1a7d4d8103611774576000808887600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16117685761176083611971565b5050506118cf565b600197505050506118cf565b61177d83611971565b5050506118cf565b807f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563015480600a1a611832578260021a61182a577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c10496e616374697665206d61726b65742e000000000000000000000000604052600060605260646000fd5b5050506118cf565b80600b1a61189457600080888774ffffffffffffffffffffffffffffffffffffffffff8760401c1673ffffffffffffffffffffffffffffffffffffffff86165af16118885761188083611971565b5050506118cf565b600197505050506118cf565b600080888773ffffffffffffffffffffffffffffffffffffffff85165af46118c7576118bf83611971565b5050506118cf565b600197505050505b83601c82010190506115df565b508361196c57600085111561196b573d611961577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c134e6f206f72646572207375636365656465642e000000000000000000604052600060605260646000fd5b3d6000803e3d6000fd5b5b611995565b8060021a611992573d611988578060005260206000fd5b3d6000803e3d6000fd5b50565b505050505050565b6000828290501115611a1d576040516040820283017f23b872dd000000000000000000000000000000000000000000000000000000008252336004830152306024830152835b81811015611a195760208101356000811115611a0d57806044850152600080606486600086355af1505b506040810190506119e3565b5050505b5050565b60005b82829050811015611b0c57611b01838383818110611a4557611a4461291a565b5b9050602002016020810190611a5a9190611e69565b33858585818110611a6e57611a6d61291a565b5b9050602002016020810190611a839190611e69565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611abb91906122a9565b602060405180830381865afa158015611ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afc919061285c565b611ccc565b806001019050611a24565b505050565b60006040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152826024820152602081604483600073ffffffffffffffffffffffffffffffffffffffff8a165af191503d600182511460208210151681151783169250505060008103611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd90612f4c565b60405180910390fd5b50505050565b6000700100000000000000000000000000000000905090565b6000611bff61152e565b905060008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b6000811115611d41576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152816024820152600080604483600073ffffffffffffffffffffffffffffffffffffffff89165af150505b505050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d8581611d50565b8114611d9057600080fd5b50565b600081359050611da281611d7c565b92915050565b600060208284031215611dbe57611dbd611d46565b5b6000611dcc84828501611d93565b91505092915050565b60008115159050919050565b611dea81611dd5565b82525050565b6000602082019050611e056000830184611de1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e3682611e0b565b9050919050565b611e4681611e2b565b8114611e5157600080fd5b50565b600081359050611e6381611e3d565b92915050565b600060208284031215611e7f57611e7e611d46565b5b6000611e8d84828501611e54565b91505092915050565b6000819050919050565b611ea981611e96565b8114611eb457600080fd5b50565b600081359050611ec681611ea0565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611ef157611ef0611ecc565b5b8235905067ffffffffffffffff811115611f0e57611f0d611ed1565b5b602083019150836001820283011115611f2a57611f29611ed6565b5b9250929050565b600080600080600060808688031215611f4d57611f4c611d46565b5b6000611f5b88828901611e54565b9550506020611f6c88828901611e54565b9450506040611f7d88828901611eb7565b935050606086013567ffffffffffffffff811115611f9e57611f9d611d4b565b5b611faa88828901611edb565b92509250509295509295909350565b611fc281611d50565b82525050565b6000602082019050611fdd6000830184611fb9565b92915050565b60008083601f840112611ff957611ff8611ecc565b5b8235905067ffffffffffffffff81111561201657612015611ed1565b5b60208301915083602082028301111561203257612031611ed6565b5b9250929050565b6000806000806060858703121561205357612052611d46565b5b600061206187828801611e54565b945050602085013567ffffffffffffffff81111561208257612081611d4b565b5b61208e87828801611fe3565b935093505060406120a187828801611e54565b91505092959194509250565b600080602083850312156120c4576120c3611d46565b5b600083013567ffffffffffffffff8111156120e2576120e1611d4b565b5b6120ee85828601611edb565b92509250509250929050565b60008083601f8401126121105761210f611ecc565b5b8235905067ffffffffffffffff81111561212d5761212c611ed1565b5b60208301915083604082028301111561214957612148611ed6565b5b9250929050565b60008083601f84011261216657612165611ecc565b5b8235905067ffffffffffffffff81111561218357612182611ed1565b5b60208301915083602082028301111561219f5761219e611ed6565b5b9250929050565b600080600080600080606087890312156121c3576121c2611d46565b5b600087013567ffffffffffffffff8111156121e1576121e0611d4b565b5b6121ed89828a016120fa565b9650965050602087013567ffffffffffffffff8111156122105761220f611d4b565b5b61221c89828a01611edb565b9450945050604087013567ffffffffffffffff81111561223f5761223e611d4b565b5b61224b89828a01612150565b92509250509295509295509295565b6000806040838503121561227157612270611d46565b5b600061227f85828601611e54565b925050602061229085828601611e54565b9150509250929050565b6122a381611e2b565b82525050565b60006020820190506122be600083018461229a565b92915050565b60006122cf82611e2b565b9050919050565b6122df816122c4565b81146122ea57600080fd5b50565b6000813590506122fc816122d6565b92915050565b60008060006060848603121561231b5761231a611d46565b5b6000612329868287016122ed565b935050602061233a86828701611e54565b925050604061234b86828701611eb7565b9150509250925092565b60008083601f84011261236b5761236a611ecc565b5b8235905067ffffffffffffffff81111561238857612387611ed1565b5b6020830191508360208202830111156123a4576123a3611ed6565b5b9250929050565b600080602083850312156123c2576123c1611d46565b5b600083013567ffffffffffffffff8111156123e0576123df611d4b565b5b6123ec85828601612355565b92509250509250929050565b60008060008060008060008060a0898b03121561241857612417611d46565b5b60006124268b828c01611e54565b98505060206124378b828c01611e54565b975050604089013567ffffffffffffffff81111561245857612457611d4b565b5b6124648b828c01611fe3565b9650965050606089013567ffffffffffffffff81111561248757612486611d4b565b5b6124938b828c01611fe3565b9450945050608089013567ffffffffffffffff8111156124b6576124b5611d4b565b5b6124c28b828c01611edb565b92509250509295985092959890939650565b600080fd5b6000606082840312156124ef576124ee6124d4565b5b81905092915050565b60006020828403121561250e5761250d611d46565b5b600082013567ffffffffffffffff81111561252c5761252b611d4b565b5b612538848285016124d9565b91505092915050565b60008083601f84011261255757612556611ecc565b5b8235905067ffffffffffffffff81111561257457612573611ed1565b5b6020830191508360208202830111156125905761258f611ed6565b5b9250929050565b600080602083850312156125ae576125ad611d46565b5b600083013567ffffffffffffffff8111156125cc576125cb611d4b565b5b6125d885828601612541565b92509250509250929050565b600080600080606085870312156125fe576125fd611d46565b5b600061260c87828801611e54565b945050602061261d87828801611eb7565b935050604085013567ffffffffffffffff81111561263e5761263d611d4b565b5b61264a87828801611edb565b925092505092959194509250565b60008060008060008060a0878903121561267557612674611d46565b5b600061268389828a01611e54565b965050602061269489828a01611e54565b95505060406126a589828a01611eb7565b94505060606126b689828a01611eb7565b935050608087013567ffffffffffffffff8111156126d7576126d6611d4b565b5b6126e389828a01611edb565b92509250509295509295509295565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006127396020836126f2565b915061274482612703565b602082019050919050565b600060208201905081810360008301526127688161272c565b9050919050565b7f4661696c656420746f2072657475726e204554482e0000000000000000000000600082015250565b60006127a56015836126f2565b91506127b08261276f565b602082019050919050565b600060208201905081810360008301526127d481612798565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612811601f836126f2565b915061281c826127db565b602082019050919050565b6000602082019050818103600083015261284081612804565b9050919050565b60008151905061285681611ea0565b92915050565b60006020828403121561287257612871611d46565b5b600061288084828501612847565b91505092915050565b61289281611e96565b82525050565b60006040820190506128ad600083018561229a565b6128ba6020830184612889565b9392505050565b6128ca81611dd5565b81146128d557600080fd5b50565b6000815190506128e7816128c1565b92915050565b60006020828403121561290357612902611d46565b5b6000612911848285016128d8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060408201905061295e600083018561229a565b61296b602083018461229a565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f7265676973746572466561747572653a20696e76616c6964206665617475726560008201527f20616464726573732e0000000000000000000000000000000000000000000000602082015250565b60006129fd6029836126f2565b9150612a08826129a1565b604082019050919050565b60006020820190508181036000830152612a2c816129f0565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612a5f57612a5e612a33565b5b80840192508235915067ffffffffffffffff821115612a8157612a80612a38565b5b602083019250600182023603831315612a9d57612a9c612a3d565b5b509250929050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612b2657607f821691505b602082108103612b3957612b38612adf565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612ba17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612b64565b612bab8683612b64565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612be8612be3612bde84611e96565b612bc3565b611e96565b9050919050565b6000819050919050565b612c0283612bcd565b612c16612c0e82612bef565b848454612b71565b825550505050565b600090565b612c2b612c1e565b612c36818484612bf9565b505050565b5b81811015612c5a57612c4f600082612c23565b600181019050612c3c565b5050565b601f821115612c9f57612c7081612b3f565b612c7984612b54565b81016020851015612c88578190505b612c9c612c9485612b54565b830182612c3b565b50505b505050565b600082821c905092915050565b6000612cc260001984600802612ca4565b1980831691505092915050565b6000612cdb8383612cb1565b9150826002028217905092915050565b612cf58383612aa5565b67ffffffffffffffff811115612d0e57612d0d612ab0565b5b612d188254612b0e565b612d23828285612c5e565b6000601f831160018114612d525760008415612d40578287013590505b612d4a8582612ccf565b865550612db2565b601f198416612d6086612b3f565b60005b82811015612d8857848901358255600182019150602085019450602081019050612d63565b86831015612da55784890135612da1601f891682612cb1565b8355505b6001600288020188555050505b50505050505050565b60008083356001602003843603038112612dd857612dd7612a33565b5b80840192508235915067ffffffffffffffff821115612dfa57612df9612a38565b5b602083019250602082023603831315612e1657612e15612a3d565b5b509250929050565b600082356001604003833603038112612e3a57612e39612a33565b5b80830191505092915050565b600082356001606003833603038112612e6257612e61612a33565b5b80830191505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612eca6026836126f2565b9150612ed582612e6e565b604082019050919050565b60006020820190508181036000830152612ef981612ebd565b9050919050565b7f5f7472616e7366657245524332302f5452414e534645525f4641494c45440000600082015250565b6000612f36601e836126f2565b9150612f4182612f00565b602082019050919050565b60006020820190508181036000830152612f6581612f29565b905091905056fea264697066735822122042513ac134aada67d2438215eee2a96cfb013008497a650cfb4688a1328823c264736f6c63430008100033
Deployed Bytecode
0x6080604052600436106100f75760003560e01c8063a8e5e4aa1161008a578063d750e2a511610059578063d750e2a5146103cb578063f0b9e5ba146103f4578063f23a6e6114610431578063f2fde38b1461046e576100fe565b8063a8e5e4aa14610313578063ab65a1f71461033c578063bc197c8114610365578063c12e5d54146103a2576100fe565b80634c674c2d116100c65780634c674c2d146102875780635d578816146102a35780635d799f87146102bf5780638da5cb5b146102e8576100fe565b806301ffc9a7146101bb57806304824e70146101f8578063150b7a021461022157806326e2dca21461025e576100fe565b366100fe57005b60046000803770010000000000000000000000000000000060205260406000205480610195577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c174e6f7420696d706c656d656e746564206d6574686f642e0000000000604052600060605260646000fd5b3660008037600080366000845af46101b1573d6000803e3d6000fd5b3d6000803e3d6000f35b3480156101c757600080fd5b506101e260048036038101906101dd9190611da8565b610497565b6040516101ef9190611df0565b60405180910390f35b34801561020457600080fd5b5061021f600480360381019061021a9190611e69565b6104e8565b005b34801561022d57600080fd5b5061024860048036038101906102439190611f31565b6105aa565b6040516102559190611fc8565b60405180910390f35b34801561026a57600080fd5b5061028560048036038101906102809190612039565b6105bf565b005b6102a1600480360381019061029c91906120ad565b6106ae565b005b6102bd60048036038101906102b891906121a6565b61071f565b005b3480156102cb57600080fd5b506102e660048036038101906102e1919061225a565b6107c2565b005b3480156102f457600080fd5b506102fd6108ff565b60405161030a91906122a9565b60405180910390f35b34801561031f57600080fd5b5061033a60048036038101906103359190612302565b610932565b005b34801561034857600080fd5b50610363600480360381019061035e91906123ab565b610a2b565b005b34801561037157600080fd5b5061038c600480360381019061038791906123f8565b610ee7565b6040516103999190611fc8565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c491906124f8565b610eff565b005b3480156103d757600080fd5b506103f260048036038101906103ed9190612597565b611354565b005b34801561040057600080fd5b5061041b600480360381019061041691906125e4565b611414565b6040516104289190611fc8565b60405180910390f35b34801561043d57600080fd5b5061045860048036038101906104539190612658565b611428565b6040516104659190611fc8565b60405180910390f35b34801561047a57600080fd5b5061049560048036038101906104909190611e69565b61143e565b005b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b3373ffffffffffffffffffffffffffffffffffffffff166105076108ff565b73ffffffffffffffffffffffffffffffffffffffff161461055d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105549061274f565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610598573361059a565b815b90506105a68147611547565b5050565b600063150b7a0260e01b905095945050505050565b3373ffffffffffffffffffffffffffffffffffffffff166105de6108ff565b73ffffffffffffffffffffffffffffffffffffffff1614610634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061274f565b60405180910390fd5b7f23b872dd0000000000000000000000000000000000000000000000000000000060005230600452806000811461066e5781602452610673565b336024525b50825b368110156106a75780356044526000806064600080895af161069c573d6000803e3d6000fd5b602081019050610676565b5050505050565b600034470390506106bf83836115d4565b8047036106cb57600080f35b804711156106e457600080600080844703335af1600080f35b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610716906127bb565b60405180910390fd5b600061072961152e565b90506001816000015414610772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076990612827565b60405180910390fd5b60028160000181905550610786878761199d565b61079085856115d4565b61079a8383611a21565b60004711156107af5760008060008047335af1505b6001816000018190555050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff166107e16108ff565b73ffffffffffffffffffffffffffffffffffffffff1614610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082e9061274f565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108725733610874565b815b90506108fa83828573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108b491906122a9565b602060405180830381865afa1580156108d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f5919061285c565b611b11565b505050565b600061090961152e565b60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff166109516108ff565b73ffffffffffffffffffffffffffffffffffffffff16146109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099e9061274f565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b383836040518363ffffffff1660e01b81526004016109e2929190612898565b6020604051808303816000875af1158015610a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2591906128ed565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16610a4a6108ff565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a979061274f565b60405180910390fd5b600080610aab611bdc565b905060005b84849050811015610c96576000858583818110610ad057610acf61291a565b5b9050602002016020810190610ae59190611da8565b90506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c2f5784806001019550506000846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167ff05686f2e12debc00665cd81463f2ae8ae5b4f167ea8dead964a3235a7d2a767826000604051610c81929190612949565b60405180910390a25050806001019050610ab0565b5060008203610ca6575050610ee3565b60008160020190506000818054905090505b6000811115610ede576000826001830381548110610cd957610cd861291a565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b9050600073ffffffffffffffffffffffffffffffffffffffff16846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610ed15782805490508214610e345782600184805490500381548110610dca57610dc961291a565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b836001840381548110610e0357610e0261291a565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c02179055505b82600184805490500381548110610e4e57610e4d61291a565b5b90600052602060002090600891828204019190066004026101000a81549063ffffffff021916905582805480610e8757610e86612972565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff0219169055905560018503610ec9575050505050610ee3565b846001900394505b5080600190039050610cb8565b505050505b5050565b600063bc197c8160e01b905098975050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16610f1e6108ff565b73ffffffffffffffffffffffffffffffffffffffff1614610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b9061274f565b60405180910390fd5b6000816000016020810190610f899190611e69565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff190612a13565b60405180910390fd5b6000611004611bdc565b90508280602001906110169190612a42565b8260010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209182611064929190612ceb565b503660008480604001906110789190612dbb565b9150915060005b8282905081101561134c57600083838381811061109f5761109e61291a565b5b90506020028101906110b19190612e1e565b60000160208101906110c39190611da8565b90506000856000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111bf57856002018290806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c02179055505b86866000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508484848181106112645761126361291a565b5b90506020028101906112769190612e1e565b80602001906112859190612a42565b876003016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002091826112e5929190612ceb565b50817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167ff05686f2e12debc00665cd81463f2ae8ae5b4f167ea8dead964a3235a7d2a7678289604051611337929190612949565b60405180910390a2505080600101905061107f565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff166113736108ff565b73ffffffffffffffffffffffffffffffffffffffff16146113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c09061274f565b60405180910390fd5b60005b8282905081101561140f576114048383838181106113ed576113ec61291a565b5b90506020028101906113ff9190612e46565b610eff565b8060010190506113cc565b505050565b600063f0b9e5ba60e01b9050949350505050565b600063f23a6e6160e01b90509695505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1661145d6108ff565b73ffffffffffffffffffffffffffffffffffffffff16146114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa9061274f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151990612ee0565b60405180910390fd5b61152b81611bf5565b50565b6000700200000000000000000000000000000000905090565b60008111156115d05760008060008084865af16115cf577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c1c5f7472616e736665724574682f5452414e534645525f4641494c4544604052600060605260646000fd5b5b5050565b600080828401604051855b828110156118dc57803563ffffffff8160201c16945084601c830184378060f01c6001810361165957600080878674ffffffffffffffffffffffffffffffffffffffffff8660401c166e6c3852cbef3e08e8df289169ede5815af161164e5761164782611971565b50506118cf565b6001965050506118cf565b600281036116b757600080878674ffffffffffffffffffffffffffffffffffffffffff8660401c167320f780a973856b93f63670377900c1d2a50a77c45af16116ac576116a582611971565b50506118cf565b6001965050506118cf565b6103e781036117855763ffffffff821663d0e30db0810361172a57600080888774ffffffffffffffffffffffffffffffffffffffffff8760401c1673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161171e5761171683611971565b5050506118cf565b600197505050506118cf565b632e1a7d4d8103611774576000808887600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16117685761176083611971565b5050506118cf565b600197505050506118cf565b61177d83611971565b5050506118cf565b807f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563015480600a1a611832578260021a61182a577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c10496e616374697665206d61726b65742e000000000000000000000000604052600060605260646000fd5b5050506118cf565b80600b1a61189457600080888774ffffffffffffffffffffffffffffffffffffffffff8760401c1673ffffffffffffffffffffffffffffffffffffffff86165af16118885761188083611971565b5050506118cf565b600197505050506118cf565b600080888773ffffffffffffffffffffffffffffffffffffffff85165af46118c7576118bf83611971565b5050506118cf565b600197505050505b83601c82010190506115df565b508361196c57600085111561196b573d611961577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c134e6f206f72646572207375636365656465642e000000000000000000604052600060605260646000fd5b3d6000803e3d6000fd5b5b611995565b8060021a611992573d611988578060005260206000fd5b3d6000803e3d6000fd5b50565b505050505050565b6000828290501115611a1d576040516040820283017f23b872dd000000000000000000000000000000000000000000000000000000008252336004830152306024830152835b81811015611a195760208101356000811115611a0d57806044850152600080606486600086355af1505b506040810190506119e3565b5050505b5050565b60005b82829050811015611b0c57611b01838383818110611a4557611a4461291a565b5b9050602002016020810190611a5a9190611e69565b33858585818110611a6e57611a6d61291a565b5b9050602002016020810190611a839190611e69565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611abb91906122a9565b602060405180830381865afa158015611ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afc919061285c565b611ccc565b806001019050611a24565b505050565b60006040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152826024820152602081604483600073ffffffffffffffffffffffffffffffffffffffff8a165af191503d600182511460208210151681151783169250505060008103611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd90612f4c565b60405180910390fd5b50505050565b6000700100000000000000000000000000000000905090565b6000611bff61152e565b905060008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b6000811115611d41576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152816024820152600080604483600073ffffffffffffffffffffffffffffffffffffffff89165af150505b505050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611d8581611d50565b8114611d9057600080fd5b50565b600081359050611da281611d7c565b92915050565b600060208284031215611dbe57611dbd611d46565b5b6000611dcc84828501611d93565b91505092915050565b60008115159050919050565b611dea81611dd5565b82525050565b6000602082019050611e056000830184611de1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e3682611e0b565b9050919050565b611e4681611e2b565b8114611e5157600080fd5b50565b600081359050611e6381611e3d565b92915050565b600060208284031215611e7f57611e7e611d46565b5b6000611e8d84828501611e54565b91505092915050565b6000819050919050565b611ea981611e96565b8114611eb457600080fd5b50565b600081359050611ec681611ea0565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611ef157611ef0611ecc565b5b8235905067ffffffffffffffff811115611f0e57611f0d611ed1565b5b602083019150836001820283011115611f2a57611f29611ed6565b5b9250929050565b600080600080600060808688031215611f4d57611f4c611d46565b5b6000611f5b88828901611e54565b9550506020611f6c88828901611e54565b9450506040611f7d88828901611eb7565b935050606086013567ffffffffffffffff811115611f9e57611f9d611d4b565b5b611faa88828901611edb565b92509250509295509295909350565b611fc281611d50565b82525050565b6000602082019050611fdd6000830184611fb9565b92915050565b60008083601f840112611ff957611ff8611ecc565b5b8235905067ffffffffffffffff81111561201657612015611ed1565b5b60208301915083602082028301111561203257612031611ed6565b5b9250929050565b6000806000806060858703121561205357612052611d46565b5b600061206187828801611e54565b945050602085013567ffffffffffffffff81111561208257612081611d4b565b5b61208e87828801611fe3565b935093505060406120a187828801611e54565b91505092959194509250565b600080602083850312156120c4576120c3611d46565b5b600083013567ffffffffffffffff8111156120e2576120e1611d4b565b5b6120ee85828601611edb565b92509250509250929050565b60008083601f8401126121105761210f611ecc565b5b8235905067ffffffffffffffff81111561212d5761212c611ed1565b5b60208301915083604082028301111561214957612148611ed6565b5b9250929050565b60008083601f84011261216657612165611ecc565b5b8235905067ffffffffffffffff81111561218357612182611ed1565b5b60208301915083602082028301111561219f5761219e611ed6565b5b9250929050565b600080600080600080606087890312156121c3576121c2611d46565b5b600087013567ffffffffffffffff8111156121e1576121e0611d4b565b5b6121ed89828a016120fa565b9650965050602087013567ffffffffffffffff8111156122105761220f611d4b565b5b61221c89828a01611edb565b9450945050604087013567ffffffffffffffff81111561223f5761223e611d4b565b5b61224b89828a01612150565b92509250509295509295509295565b6000806040838503121561227157612270611d46565b5b600061227f85828601611e54565b925050602061229085828601611e54565b9150509250929050565b6122a381611e2b565b82525050565b60006020820190506122be600083018461229a565b92915050565b60006122cf82611e2b565b9050919050565b6122df816122c4565b81146122ea57600080fd5b50565b6000813590506122fc816122d6565b92915050565b60008060006060848603121561231b5761231a611d46565b5b6000612329868287016122ed565b935050602061233a86828701611e54565b925050604061234b86828701611eb7565b9150509250925092565b60008083601f84011261236b5761236a611ecc565b5b8235905067ffffffffffffffff81111561238857612387611ed1565b5b6020830191508360208202830111156123a4576123a3611ed6565b5b9250929050565b600080602083850312156123c2576123c1611d46565b5b600083013567ffffffffffffffff8111156123e0576123df611d4b565b5b6123ec85828601612355565b92509250509250929050565b60008060008060008060008060a0898b03121561241857612417611d46565b5b60006124268b828c01611e54565b98505060206124378b828c01611e54565b975050604089013567ffffffffffffffff81111561245857612457611d4b565b5b6124648b828c01611fe3565b9650965050606089013567ffffffffffffffff81111561248757612486611d4b565b5b6124938b828c01611fe3565b9450945050608089013567ffffffffffffffff8111156124b6576124b5611d4b565b5b6124c28b828c01611edb565b92509250509295985092959890939650565b600080fd5b6000606082840312156124ef576124ee6124d4565b5b81905092915050565b60006020828403121561250e5761250d611d46565b5b600082013567ffffffffffffffff81111561252c5761252b611d4b565b5b612538848285016124d9565b91505092915050565b60008083601f84011261255757612556611ecc565b5b8235905067ffffffffffffffff81111561257457612573611ed1565b5b6020830191508360208202830111156125905761258f611ed6565b5b9250929050565b600080602083850312156125ae576125ad611d46565b5b600083013567ffffffffffffffff8111156125cc576125cb611d4b565b5b6125d885828601612541565b92509250509250929050565b600080600080606085870312156125fe576125fd611d46565b5b600061260c87828801611e54565b945050602061261d87828801611eb7565b935050604085013567ffffffffffffffff81111561263e5761263d611d4b565b5b61264a87828801611edb565b925092505092959194509250565b60008060008060008060a0878903121561267557612674611d46565b5b600061268389828a01611e54565b965050602061269489828a01611e54565b95505060406126a589828a01611eb7565b94505060606126b689828a01611eb7565b935050608087013567ffffffffffffffff8111156126d7576126d6611d4b565b5b6126e389828a01611edb565b92509250509295509295509295565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006127396020836126f2565b915061274482612703565b602082019050919050565b600060208201905081810360008301526127688161272c565b9050919050565b7f4661696c656420746f2072657475726e204554482e0000000000000000000000600082015250565b60006127a56015836126f2565b91506127b08261276f565b602082019050919050565b600060208201905081810360008301526127d481612798565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612811601f836126f2565b915061281c826127db565b602082019050919050565b6000602082019050818103600083015261284081612804565b9050919050565b60008151905061285681611ea0565b92915050565b60006020828403121561287257612871611d46565b5b600061288084828501612847565b91505092915050565b61289281611e96565b82525050565b60006040820190506128ad600083018561229a565b6128ba6020830184612889565b9392505050565b6128ca81611dd5565b81146128d557600080fd5b50565b6000815190506128e7816128c1565b92915050565b60006020828403121561290357612902611d46565b5b6000612911848285016128d8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060408201905061295e600083018561229a565b61296b602083018461229a565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f7265676973746572466561747572653a20696e76616c6964206665617475726560008201527f20616464726573732e0000000000000000000000000000000000000000000000602082015250565b60006129fd6029836126f2565b9150612a08826129a1565b604082019050919050565b60006020820190508181036000830152612a2c816129f0565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612a5f57612a5e612a33565b5b80840192508235915067ffffffffffffffff821115612a8157612a80612a38565b5b602083019250600182023603831315612a9d57612a9c612a3d565b5b509250929050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612b2657607f821691505b602082108103612b3957612b38612adf565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612ba17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612b64565b612bab8683612b64565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612be8612be3612bde84611e96565b612bc3565b611e96565b9050919050565b6000819050919050565b612c0283612bcd565b612c16612c0e82612bef565b848454612b71565b825550505050565b600090565b612c2b612c1e565b612c36818484612bf9565b505050565b5b81811015612c5a57612c4f600082612c23565b600181019050612c3c565b5050565b601f821115612c9f57612c7081612b3f565b612c7984612b54565b81016020851015612c88578190505b612c9c612c9485612b54565b830182612c3b565b50505b505050565b600082821c905092915050565b6000612cc260001984600802612ca4565b1980831691505092915050565b6000612cdb8383612cb1565b9150826002028217905092915050565b612cf58383612aa5565b67ffffffffffffffff811115612d0e57612d0d612ab0565b5b612d188254612b0e565b612d23828285612c5e565b6000601f831160018114612d525760008415612d40578287013590505b612d4a8582612ccf565b865550612db2565b601f198416612d6086612b3f565b60005b82811015612d8857848901358255600182019150602085019450602081019050612d63565b86831015612da55784890135612da1601f891682612cb1565b8355505b6001600288020188555050505b50505050505050565b60008083356001602003843603038112612dd857612dd7612a33565b5b80840192508235915067ffffffffffffffff821115612dfa57612df9612a38565b5b602083019250602082023603831315612e1657612e15612a3d565b5b509250929050565b600082356001604003833603038112612e3a57612e39612a33565b5b80830191505092915050565b600082356001606003833603038112612e6257612e61612a33565b5b80830191505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612eca6026836126f2565b9150612ed582612e6e565b604082019050919050565b60006020820190508181036000830152612ef981612ebd565b9050919050565b7f5f7472616e7366657245524332302f5452414e534645525f4641494c45440000600082015250565b6000612f36601e836126f2565b9150612f4182612f00565b602082019050919050565b60006020820190508181036000830152612f6581612f29565b905091905056fea264697066735822122042513ac134aada67d2438215eee2a96cfb013008497a650cfb4688a1328823c264736f6c63430008100033
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.