Overview
APE Balance
4,715.674733102600636341 APE
APE Value
$5,284.61 (@ $1.12/APE)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 744 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Snipe_2572234525 | 8351072 | 3 hrs ago | IN | 0 APE | 0.00712064 | ||||
Snipe_2572234525 | 8350547 | 3 hrs ago | IN | 0 APE | 0.00694305 | ||||
Snipe_2572234525 | 8329684 | 12 hrs ago | IN | 0 APE | 0.00648652 | ||||
Snipe_2572234525 | 8327376 | 13 hrs ago | IN | 0 APE | 0.0064478 | ||||
Snipe_2572234525 | 8325569 | 14 hrs ago | IN | 0 APE | 0.00664842 | ||||
Snipe_2572234525 | 8311600 | 22 hrs ago | IN | 0 APE | 0.00726019 | ||||
Snipe_2572234525 | 8307889 | 25 hrs ago | IN | 0 APE | 0.00720513 | ||||
Snipe_2572234525 | 8305409 | 26 hrs ago | IN | 0 APE | 0.00712465 | ||||
Snipe_2572234525 | 8265664 | 43 hrs ago | IN | 0 APE | 0.00730313 | ||||
Snipe_2572234525 | 8250330 | 2 days ago | IN | 0 APE | 0.00794958 | ||||
Snipe_2572234525 | 8245167 | 2 days ago | IN | 0 APE | 0.00716911 | ||||
Snipe_2572234525 | 8239839 | 2 days ago | IN | 0 APE | 0.00768075 | ||||
Snipe_2572234525 | 8238297 | 2 days ago | IN | 0 APE | 0.00610643 | ||||
Snipe_2572234525 | 8231840 | 2 days ago | IN | 0 APE | 0.00641646 | ||||
Snipe_2572234525 | 8216737 | 2 days ago | IN | 0 APE | 0.00714916 | ||||
Snipe_2572234525 | 8209574 | 2 days ago | IN | 0 APE | 0.00698278 | ||||
Snipe_2572234525 | 8206326 | 2 days ago | IN | 0 APE | 0.00156299 | ||||
Snipe_2572234525 | 8201451 | 2 days ago | IN | 0 APE | 0.00387258 | ||||
Snipe_2572234525 | 8188807 | 3 days ago | IN | 0 APE | 0.00694185 | ||||
Snipe_2572234525 | 8186321 | 3 days ago | IN | 0 APE | 0.00712005 | ||||
Snipe_2572234525 | 8182537 | 3 days ago | IN | 0 APE | 0.00694429 | ||||
Snipe_2572234525 | 8172421 | 3 days ago | IN | 0 APE | 0.00676292 | ||||
Snipe_2572234525 | 8168101 | 3 days ago | IN | 0 APE | 0.00735771 | ||||
Snipe_2572234525 | 8141032 | 4 days ago | IN | 0 APE | 0.00539416 | ||||
Snipe_2572234525 | 8117710 | 4 days ago | IN | 0 APE | 0.00674469 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
8351072 | 3 hrs ago | 1.134 APE | ||||
8351072 | 3 hrs ago | 3.78 APE | ||||
8351072 | 3 hrs ago | 4.914 APE | ||||
8350547 | 3 hrs ago | 0.304 APE | ||||
8350547 | 3 hrs ago | 1.39 APE | ||||
8350547 | 3 hrs ago | 1.694 APE | ||||
8329684 | 12 hrs ago | 0.1082 APE | ||||
8329684 | 12 hrs ago | 0.4 APE | ||||
8329684 | 12 hrs ago | 0.5082 APE | ||||
8327376 | 13 hrs ago | 2.685 APE | ||||
8327376 | 13 hrs ago | 15 APE | ||||
8327376 | 13 hrs ago | 17.685 APE | ||||
8325569 | 14 hrs ago | 2.88299999 APE | ||||
8325569 | 14 hrs ago | 6 APE | ||||
8325569 | 14 hrs ago | 8.88299999 APE | ||||
8311600 | 22 hrs ago | 0.719 APE | ||||
8311600 | 22 hrs ago | 45 APE | ||||
8311600 | 22 hrs ago | 45.719 APE | ||||
8307889 | 25 hrs ago | 0.1995 APE | ||||
8307889 | 25 hrs ago | 66 APE | ||||
8307889 | 25 hrs ago | 66.1995 APE | ||||
8305409 | 26 hrs ago | 6.22441531 APE | ||||
8305409 | 26 hrs ago | 26.999999 APE | ||||
8305409 | 26 hrs ago | 33.22441431 APE | ||||
8265664 | 43 hrs ago | 2.4459 APE |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
AutoSniper
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import {SniperState} from "./helpers/SniperStructs.sol"; import {IERC721} from "forge-std/interfaces/IERC721.sol"; import {IERC20} from "forge-std/interfaces/IERC20.sol"; import {IERC1155} from "forge-std/interfaces/IERC1155.sol"; import {Ownable} from "solady/auth/Ownable.sol"; /** * @title AutoSniper 4.0 for @oSnipeNFT * @author 0xQuit */ /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*+=--::::::--=+*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*=:. ...... :=*%@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#=. .-+*%@@@@@@@@@@@@%#+=: -@@@@@@=:::=#@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@%+. :=#@@@@@@@@@@@@@@@@@@@@@@@@#+#@@@@@%**+-:::-%@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@#- :+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%******+-::=@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@%: =%@@@@@@@@@@@@@@@@%%%%@@@@@@@@@@@@@@%*++++++***+=+@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@= -@@@@@@@@@@@@#+-:. :-+%@@@@@%*+++++++++*#@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@#. :%@@@@@@@@@%+: ..:::::. .*@@@%*+++++++++++#@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@* =@@@@@@@@@#: .=*%@@@@@@@@@@%@@@%+----======+#@@@@@%@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@+ *@@@@@@@@#: .+%@@@@@@@@@@@@@@@@@@=-------==+#@@@@@%- -@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@# #@@@@@@@@= .*@@@@@@@@@#=. .-+#+=--------*@@@@@@@% +@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@. =@@@@@@@@- =@@@@@@@@@@: -+**+- .--=----+%@@@@@@@@@# %@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@+ .@@@@@@@@- +@@@@@@@@@@- #@@@@%+-:. :=*@#%@@@*%@@@@@@@= -@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@. #@@@@@@@+ =@@@@@@@@@@@: @@@%=-----. #@@@@@*. -@@@@@@@@ %@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@# @@@@@@@@. .@@@@@@@@@@@@% :#=:::::--*+=@@@@@@- %@@@@@@@- +@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@+ :@@@@@@@% =@@@@@@@@@@@@@%-:--::::-*@@@@@@@@@@* *@@@@@@@+ :@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@= -@@@@@@@# +@@@@@@@@@@@@@#-:---:-*@@@@@@@@@@@@# +@@@@@@@+ :@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@+ -@@@@@@@% =@@@@@@*#@@@#-::---=. -@@@@@@@@@@@@* +@@@@@@@+ :@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@# .@@@@@@@@ .@@@@@+ #*-:::--*@@# -@@@@@@@@@@@- %@@@@@@@- =@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ #@@@@@@@+ =@@@@@% .--:--+@@@@@= %@@@@@@@@@# :@@@@@@@@ %@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@= :@@@@@@@@=%@@@@@@*: :-*@@@@@@%. .@@@@@@@@@% %@@@@@@@= :@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@#+---:. .=*###*- :%@@@@@@@@# .%@@@@@@@# #@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@* %@@@@@@@@@#=------*%+- .-#@@@@@@@@%= .%@@@@@@@@. =@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@= .*@@@@@@@@+------=%@@@@@@%%%@@@@@@@@@@#- +@@@@@@@@@: :@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@#@@@@@@@@*===---=#@@@@@@@@@@@@@@@@@%*- +@@@@@@@@@# -@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@*=====+#%@@@@@%= .:--==--:. .-*@@@@@@@@@@+ +@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@+--==+#@@@@@@@@=:. :=*%@@@@@@@@@@@*. .#@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@*===+-*@@@@@@@@@@@@@@%%#####%@@@@@@@@@@@@@@@*. +@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@#+==#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#= .+@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@+==+%@@@@@@@@@%*%@@@@@@@@@@@@@@@@@@@@@@@@@*- -*@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@#=%@@@@@@@@@+ -=*%@@@@@@@@@@@@@@%*+-. :+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%+-. ..:::::::. .-+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*+=-:........:-=+*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ contract AutoSniper is Ownable { error InsufficientBalance(); error FailedToWithdraw(); error FailedToPayAutosniper(); error FailedToPayValidator(); error OrderFailed(); error CallerNotFulfiller(); error MigrationNotEnabled(); error ArrayLengthMismatch(); error SniperIsPaused(); error FulfillerCannotHaveBalance(); event Deposit(address sniper, uint256 amount); event Withdrawal(address sniper, uint256 amount); address private fulfillerAddress = 0x7D79Bd0E4B3dC90665A3ed30Aa6C6c06c89D224E; address public nextContractVersionAddress; bool public migrationEnabled; mapping(address => SniperState) public sniperStates; constructor() { _initializeOwner(tx.origin); } // only the fulfiller can call this function modifier onlyFulfiller() { if (msg.sender != fulfillerAddress) revert CallerNotFulfiller(); _; } // allow the contract to receive Ether receive() external payable {} /** * @dev Generalized function for fulfilling orders * @param contractAddresses a list of contract addresses that will be called * @param calls a matching array to contractAddresses, each index being a call to make to a given contract * @param values a matching array to contractAddresses, each index being the value to send with the call * @param sniper the address of the sniper * @param validatorTip the amount to send to block.coinbase. Reverts if this is 0. * @param fulfillerTip the amount to send to fulfillerAddress. Reverts if this is 0. */ function snipe_2572234525( address[] calldata contractAddresses, bytes[] calldata calls, uint256[] calldata values, address sniper, uint256 validatorTip, uint256 fulfillerTip ) external onlyFulfiller { if (contractAddresses.length != calls.length) revert ArrayLengthMismatch(); if (calls.length != values.length) revert ArrayLengthMismatch(); if (sniperStates[sniper].isPaused) revert SniperIsPaused(); uint256 balanceBefore = address(this).balance; for (uint256 i = 0; i < contractAddresses.length; ++i) { (bool success,) = contractAddresses[i].call{value: values[i]}(calls[i]); if (!success) revert OrderFailed(); } (bool validatorPaid,) = block.coinbase.call{value: validatorTip}(""); if (!validatorPaid) revert FailedToPayValidator(); (bool fulfillerPaid,) = fulfillerAddress.call{value: fulfillerTip}(""); if (!fulfillerPaid) revert FailedToPayAutosniper(); uint256 balanceAfter = address(this).balance; if (balanceAfter < balanceBefore) { uint128 spent = uint128(balanceBefore - balanceAfter); if (sniperStates[sniper].ethBalance < spent) revert InsufficientBalance(); unchecked { sniperStates[sniper].ethBalance -= spent; } emit Withdrawal(sniper, spent); } else if (balanceAfter > balanceBefore) { unchecked { sniperStates[sniper].ethBalance += uint128(balanceAfter - balanceBefore); } emit Deposit(sniper, balanceAfter - balanceBefore); } } /** * @dev deposit Ether into the contract. * @param sniper is the address who's balance is affected. */ function deposit(address sniper) public payable { if (tx.origin == fulfillerAddress) revert FulfillerCannotHaveBalance(); unchecked { sniperStates[sniper].ethBalance += uint128(msg.value); } emit Deposit(sniper, msg.value); } /** * @dev deposit Ether into your own contract balance. */ function depositSelf() external payable { deposit(msg.sender); } /** * @dev withdraw Ether from your contract balance * @param amount the amount of Ether to be withdrawn */ function withdraw(uint256 amount) external { if (tx.origin == fulfillerAddress) revert FulfillerCannotHaveBalance(); if (sniperStates[msg.sender].ethBalance < amount) revert InsufficientBalance(); unchecked { sniperStates[msg.sender].ethBalance -= uint128(amount); } (bool success,) = payable(msg.sender).call{value: amount}(""); if (!success) revert FailedToWithdraw(); emit Withdrawal(msg.sender, amount); } function setUserIsPaused(bool isPaused) external { sniperStates[msg.sender].isPaused = isPaused; } /** * @dev Owner function to change fulfiller address if needed. */ function setFulfillerAddress(address _fulfiller) external onlyOwner { fulfillerAddress = _fulfiller; } /** * Enables migration and sets a destination address (the new contract) * @param _destination the new AutoSniper version to allow migration to. */ function setMigrationAddress(address _destination) external onlyOwner { migrationEnabled = true; nextContractVersionAddress = _destination; } /** * @dev in the event of a future contract upgrade, this function allows snipers to * easily move their ether balance to the new contract. This can only be called by * the sniper to move their personal balance - the contract owner or anybody else * does not have the power to migrate balances for users. */ function migrateBalance() external { if (!migrationEnabled) revert MigrationNotEnabled(); uint256 balanceToMigrate = sniperStates[msg.sender].ethBalance; sniperStates[msg.sender].ethBalance = 0; (bool success,) = nextContractVersionAddress.call{value: balanceToMigrate}( abi.encodeWithSelector(this.deposit.selector, msg.sender) ); if (!success) revert FailedToWithdraw(); } function sniperBalance(address sniper) external view returns (uint128) { return sniperStates[sniper].ethBalance; } function onERC1155Received(address, address, uint256, uint256, bytes calldata) public virtual returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata) public virtual returns (bytes4) { return this.onERC1155BatchReceived.selector; } function onERC721Received(address, address, uint256, bytes calldata) external virtual returns (bytes4) { return 0x150b7a02; } // Used by ERC721BasicToken.sol function onERC721Received(address, uint256, bytes calldata) external virtual returns (bytes4) { return 0xf0b9e5ba; } function supportsInterface(bytes4 interfaceId) external view virtual returns (bool) { return interfaceId == this.supportsInterface.selector; } // Emergency function: In case any ERC20 tokens get stuck in the contract unintentionally // Only owner can retrieve the asset balance to a recipient address function rescueERC20(address asset, address recipient) external onlyOwner { IERC20 token = IERC20(asset); token.transfer(recipient, token.balanceOf(address(this))); } // Emergency function: In case any ERC721 tokens get stuck in the contract unintentionally // Only owner can retrieve the asset balance to a recipient address function rescueERC721(address asset, uint256[] calldata ids, address recipient) external onlyOwner { for (uint256 i = 0; i < ids.length; i++) { IERC721(asset).transferFrom(address(this), recipient, ids[i]); } } // Emergency function: In case any ERC1155 tokens get stuck in the contract unintentionally // Only owner can retrieve the asset balance to a recipient address function rescueERC1155(address asset, uint256[] calldata ids, uint256[] calldata amounts, address recipient) external onlyOwner { for (uint256 i = 0; i < ids.length; i++) { IERC1155(asset).safeTransferFrom(address(this), recipient, ids[i], amounts[i], ""); } } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.24; struct SniperState { uint128 ethBalance; bool isPaused; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; import "./IERC165.sol"; /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x80ac58cd. interface IERC721 is IERC165 { /// @dev This emits when ownership of any NFT changes by any mechanism. /// This event emits when NFTs are created (`from` == 0) and destroyed /// (`to` == 0). Exception: during contract creation, any number of NFTs /// may be created and assigned without emitting Transfer. At the time of /// any transfer, the approved address for that NFT (if any) is reset to none. event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); /// @dev This emits when the approved address for an NFT is changed or /// reaffirmed. The zero address indicates there is no approved address. /// When a Transfer event emits, this also indicates that the approved /// address for that NFT (if any) is reset to none. event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); /// @dev This emits when an operator is enabled or disabled for an owner. /// The operator can manage all NFTs of the owner. event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid, and this /// function throws for queries about the zero address. /// @param _owner An address for whom to query the balance /// @return The number of NFTs owned by `_owner`, possibly zero function balanceOf(address _owner) external view returns (uint256); /// @notice Find the owner of an NFT /// @dev NFTs assigned to zero address are considered invalid, and queries /// about them do throw. /// @param _tokenId The identifier for an NFT /// @return The address of the owner of the NFT function ownerOf(uint256 _tokenId) external view returns (address); /// @notice Transfers the ownership of an NFT from one address to another address /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. When transfer is complete, this function /// checks if `_to` is a smart contract (code size > 0). If so, it calls /// `onERC721Received` on `_to` and throws if the return value is not /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer /// @param data Additional data with no specified format, sent in call to `_to` function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable; /// @notice Transfers the ownership of an NFT from one address to another address /// @dev This works identically to the other function with an extra data parameter, /// except this function just sets data to "". /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE /// THEY MAY BE PERMANENTLY LOST /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function transferFrom(address _from, address _to, uint256 _tokenId) external payable; /// @notice Change or reaffirm the approved address for an NFT /// @dev The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized /// operator of the current owner. /// @param _approved The new approved NFT controller /// @param _tokenId The NFT to approve function approve(address _approved, uint256 _tokenId) external payable; /// @notice Enable or disable approval for a third party ("operator") to manage /// all of `msg.sender`'s assets /// @dev Emits the ApprovalForAll event. The contract MUST allow /// multiple operators per owner. /// @param _operator Address to add to the set of authorized operators /// @param _approved True if the operator is approved, false to revoke approval function setApprovalForAll(address _operator, bool _approved) external; /// @notice Get the approved address for a single NFT /// @dev Throws if `_tokenId` is not a valid NFT. /// @param _tokenId The NFT to find the approved address for /// @return The approved address for this NFT, or the zero address if there is none function getApproved(uint256 _tokenId) external view returns (address); /// @notice Query if an address is an authorized operator for another address /// @param _owner The address that owns the NFTs /// @param _operator The address that acts on behalf of the owner /// @return True if `_operator` is an approved operator for `_owner`, false otherwise function isApprovedForAll(address _owner, address _operator) external view returns (bool); } /// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02. interface IERC721TokenReceiver { /// @notice Handle the receipt of an NFT /// @dev The ERC721 smart contract calls this function on the recipient /// after a `transfer`. This function MAY throw to revert and reject the /// transfer. Return of other than the magic value MUST result in the /// transaction being reverted. /// Note: the contract address is always the message sender. /// @param _operator The address which called `safeTransferFrom` function /// @param _from The address which previously owned the token /// @param _tokenId The NFT identifier which is being transferred /// @param _data Additional data with no specified format /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` /// unless throwing function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns (bytes4); } /// @title ERC-721 Non-Fungible Token Standard, optional metadata extension /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x5b5e139f. interface IERC721Metadata is IERC721 { /// @notice A descriptive name for a collection of NFTs in this contract function name() external view returns (string memory _name); /// @notice An abbreviated name for NFTs in this contract function symbol() external view returns (string memory _symbol); /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC /// 3986. The URI may point to a JSON file that conforms to the "ERC721 /// Metadata JSON Schema". function tokenURI(uint256 _tokenId) external view returns (string memory); } /// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x780e9d63. interface IERC721Enumerable is IERC721 { /// @notice Count NFTs tracked by this contract /// @return A count of valid NFTs tracked by this contract, where each one of /// them has an assigned and queryable owner not equal to the zero address function totalSupply() external view returns (uint256); /// @notice Enumerate valid NFTs /// @dev Throws if `_index` >= `totalSupply()`. /// @param _index A counter less than `totalSupply()` /// @return The token identifier for the `_index`th NFT, /// (sort order not specified) function tokenByIndex(uint256 _index) external view returns (uint256); /// @notice Enumerate NFTs assigned to an owner /// @dev Throws if `_index` >= `balanceOf(_owner)` or if /// `_owner` is the zero address, representing invalid NFTs. /// @param _owner An address where we are interested in NFTs owned by them /// @param _index A counter less than `balanceOf(_owner)` /// @return The token identifier for the `_index`th NFT assigned to `_owner`, /// (sort order not specified) function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; /// @dev Interface of the ERC20 standard as defined in the EIP. /// @dev This includes the optional name, symbol, and decimals metadata. interface IERC20 { /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`). event Transfer(address indexed from, address indexed to, uint256 value); /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value` /// is the new allowance. event Approval(address indexed owner, address indexed spender, uint256 value); /// @notice Returns the amount of tokens in existence. function totalSupply() external view returns (uint256); /// @notice Returns the amount of tokens owned by `account`. function balanceOf(address account) external view returns (uint256); /// @notice Moves `amount` tokens from the caller's account to `to`. function transfer(address to, uint256 amount) external returns (bool); /// @notice Returns the remaining number of tokens that `spender` is allowed /// to spend on behalf of `owner` function allowance(address owner, address spender) external view returns (uint256); /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens. /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 function approve(address spender, uint256 amount) external returns (bool); /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism. /// `amount` is then deducted from the caller's allowance. function transferFrom(address from, address to, uint256 amount) external returns (bool); /// @notice Returns the name of the token. function name() external view returns (string memory); /// @notice Returns the symbol of the token. function symbol() external view returns (string memory); /// @notice Returns the decimals places of the token. function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; import "./IERC165.sol"; /// @title ERC-1155 Multi Token Standard /// @dev See https://eips.ethereum.org/EIPS/eip-1155 /// Note: The ERC-165 identifier for this interface is 0xd9b67a26. interface IERC1155 is IERC165 { /// @dev /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender). /// - The `_from` argument MUST be the address of the holder whose balance is decreased. /// - The `_to` argument MUST be the address of the recipient whose balance is increased. /// - The `_id` argument MUST be the token type being transferred. /// - The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by. /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). event TransferSingle( address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value ); /// @dev /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender). /// - The `_from` argument MUST be the address of the holder whose balance is decreased. /// - The `_to` argument MUST be the address of the recipient whose balance is increased. /// - The `_ids` argument MUST be the list of tokens being transferred. /// - The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by. /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). event TransferBatch( address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values ); /// @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absence of an event assumes disabled). event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /// @dev MUST emit when the URI is updated for a token ID. URIs are defined in RFC 3986. /// The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema". event URI(string _value, uint256 indexed _id); /// @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call). /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). /// - MUST revert if `_to` is the zero address. /// - MUST revert if balance of holder for token `_id` is lower than the `_value` sent. /// - MUST revert on any other error. /// - MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard). /// - After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). /// @param _from Source address /// @param _to Target address /// @param _id ID of the token type /// @param _value Transfer amount /// @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to` function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external; /// @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call). /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). /// - MUST revert if `_to` is the zero address. /// - MUST revert if length of `_ids` is not the same as length of `_values`. /// - MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient. /// - MUST revert on any other error. /// - MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard). /// - Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc). /// - After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). /// @param _from Source address /// @param _to Target address /// @param _ids IDs of each token type (order and length must match _values array) /// @param _values Transfer amounts per token type (order and length must match _ids array) /// @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to` function safeBatchTransferFrom( address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data ) external; /// @notice Get the balance of an account's tokens. /// @param _owner The address of the token holder /// @param _id ID of the token /// @return The _owner's balance of the token type requested function balanceOf(address _owner, uint256 _id) external view returns (uint256); /// @notice Get the balance of multiple account/token pairs /// @param _owners The addresses of the token holders /// @param _ids ID of the tokens /// @return The _owner's balance of the token types requested (i.e. balance for each (owner, id) pair) function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory); /// @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens. /// @dev MUST emit the ApprovalForAll event on success. /// @param _operator Address to add to the set of authorized operators /// @param _approved True if the operator is approved, false to revoke approval function setApprovalForAll(address _operator, bool _approved) external; /// @notice Queries the approval status of an operator for a given owner. /// @param _owner The owner of the tokens /// @param _operator Address of authorized operator /// @return True if the operator is approved, false if not function isApprovedForAll(address _owner, address _operator) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice Simple single owner authorization mixin. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol) /// /// @dev Note: /// This implementation does NOT auto-initialize the owner to `msg.sender`. /// You MUST call the `_initializeOwner` in the constructor / initializer. /// /// While the ownable portion follows /// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility, /// the nomenclature for the 2-step ownership handover may be unique to this codebase. abstract contract Ownable { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The caller is not authorized to call the function. error Unauthorized(); /// @dev The `newOwner` cannot be the zero address. error NewOwnerIsZeroAddress(); /// @dev The `pendingOwner` does not have a valid handover request. error NoHandoverRequest(); /// @dev Cannot double-initialize. error AlreadyInitialized(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The ownership is transferred from `oldOwner` to `newOwner`. /// This event is intentionally kept the same as OpenZeppelin's Ownable to be /// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173), /// despite it not being as lightweight as a single argument event. event OwnershipTransferred(address indexed oldOwner, address indexed newOwner); /// @dev An ownership handover to `pendingOwner` has been requested. event OwnershipHandoverRequested(address indexed pendingOwner); /// @dev The ownership handover to `pendingOwner` has been canceled. event OwnershipHandoverCanceled(address indexed pendingOwner); /// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`. uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE = 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0; /// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`. uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE = 0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d; /// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`. uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE = 0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The owner slot is given by: /// `bytes32(~uint256(uint32(bytes4(keccak256("_OWNER_SLOT_NOT")))))`. /// It is intentionally chosen to be a high value /// to avoid collision with lower slots. /// The choice of manual storage layout is to enable compatibility /// with both regular and upgradeable contracts. bytes32 internal constant _OWNER_SLOT = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927; /// The ownership handover slot of `newOwner` is given by: /// ``` /// mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED)) /// let handoverSlot := keccak256(0x00, 0x20) /// ``` /// It stores the expiry timestamp of the two-step ownership handover. uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Override to return true to make `_initializeOwner` prevent double-initialization. function _guardInitializeOwner() internal pure virtual returns (bool guard) {} /// @dev Initializes the owner directly without authorization guard. /// This function must be called upon initialization, /// regardless of whether the contract is upgradeable or not. /// This is to enable generalization to both regular and upgradeable contracts, /// and to save gas in case the initial owner is not the caller. /// For performance reasons, this function will not check if there /// is an existing owner. function _initializeOwner(address newOwner) internal virtual { if (_guardInitializeOwner()) { /// @solidity memory-safe-assembly assembly { let ownerSlot := _OWNER_SLOT if sload(ownerSlot) { mstore(0x00, 0x0dc149f0) // `AlreadyInitialized()`. revert(0x1c, 0x04) } // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Store the new value. sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner)))) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner) } } else { /// @solidity memory-safe-assembly assembly { // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Store the new value. sstore(_OWNER_SLOT, newOwner) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner) } } } /// @dev Sets the owner directly without authorization guard. function _setOwner(address newOwner) internal virtual { if (_guardInitializeOwner()) { /// @solidity memory-safe-assembly assembly { let ownerSlot := _OWNER_SLOT // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner) // Store the new value. sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner)))) } } else { /// @solidity memory-safe-assembly assembly { let ownerSlot := _OWNER_SLOT // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner) // Store the new value. sstore(ownerSlot, newOwner) } } } /// @dev Throws if the sender is not the owner. function _checkOwner() internal view virtual { /// @solidity memory-safe-assembly assembly { // If the caller is not the stored owner, revert. if iszero(eq(caller(), sload(_OWNER_SLOT))) { mstore(0x00, 0x82b42900) // `Unauthorized()`. revert(0x1c, 0x04) } } } /// @dev Returns how long a two-step ownership handover is valid for in seconds. /// Override to return a different value if needed. /// Made internal to conserve bytecode. Wrap it in a public function if needed. function _ownershipHandoverValidFor() internal view virtual returns (uint64) { return 48 * 3600; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PUBLIC UPDATE FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Allows the owner to transfer the ownership to `newOwner`. function transferOwnership(address newOwner) public payable virtual onlyOwner { /// @solidity memory-safe-assembly assembly { if iszero(shl(96, newOwner)) { mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`. revert(0x1c, 0x04) } } _setOwner(newOwner); } /// @dev Allows the owner to renounce their ownership. function renounceOwnership() public payable virtual onlyOwner { _setOwner(address(0)); } /// @dev Request a two-step ownership handover to the caller. /// The request will automatically expire in 48 hours (172800 seconds) by default. function requestOwnershipHandover() public payable virtual { unchecked { uint256 expires = block.timestamp + _ownershipHandoverValidFor(); /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to `expires`. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x20), expires) // Emit the {OwnershipHandoverRequested} event. log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller()) } } } /// @dev Cancels the two-step ownership handover to the caller, if any. function cancelOwnershipHandover() public payable virtual { /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to 0. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x20), 0) // Emit the {OwnershipHandoverCanceled} event. log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller()) } } /// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`. /// Reverts if there is no existing ownership handover requested by `pendingOwner`. function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner { /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to 0. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, pendingOwner) let handoverSlot := keccak256(0x0c, 0x20) // If the handover does not exist, or has expired. if gt(timestamp(), sload(handoverSlot)) { mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`. revert(0x1c, 0x04) } // Set the handover slot to 0. sstore(handoverSlot, 0) } _setOwner(pendingOwner); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PUBLIC READ FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the owner of the contract. function owner() public view virtual returns (address result) { /// @solidity memory-safe-assembly assembly { result := sload(_OWNER_SLOT) } } /// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`. function ownershipHandoverExpiresAt(address pendingOwner) public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { // Compute the handover slot. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, pendingOwner) // Load the handover slot. result := sload(keccak256(0x0c, 0x20)) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* MODIFIERS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Marks a function as only callable by the owner. modifier onlyOwner() virtual { _checkOwner(); _; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; interface IERC165 { /// @notice Query if a contract implements an interface /// @param interfaceID The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceID) external view returns (bool); }
{ "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "solady/=lib/solady/src/", "soladytest/=lib/solady/test/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "paris", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"CallerNotFulfiller","type":"error"},{"inputs":[],"name":"FailedToPayAutosniper","type":"error"},{"inputs":[],"name":"FailedToPayValidator","type":"error"},{"inputs":[],"name":"FailedToWithdraw","type":"error"},{"inputs":[],"name":"FulfillerCannotHaveBalance","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"MigrationNotEnabled","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"OrderFailed","type":"error"},{"inputs":[],"name":"SniperIsPaused","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sniper","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sniper","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sniper","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositSelf","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"migrateBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextContractVersionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescueERC1155","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":"_fulfiller","type":"address"}],"name":"setFulfillerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_destination","type":"address"}],"name":"setMigrationAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPaused","type":"bool"}],"name":"setUserIsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"contractAddresses","type":"address[]"},{"internalType":"bytes[]","name":"calls","type":"bytes[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"address","name":"sniper","type":"address"},{"internalType":"uint256","name":"validatorTip","type":"uint256"},{"internalType":"uint256","name":"fulfillerTip","type":"uint256"}],"name":"snipe_2572234525","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sniper","type":"address"}],"name":"sniperBalance","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sniperStates","outputs":[{"internalType":"uint128","name":"ethBalance","type":"uint128"},{"internalType":"bool","name":"isPaused","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600080546001600160a01b031916737d79bd0e4b3dc90665a3ed30aa6c6c06c89d224e17905534801561003657600080fd5b5061004032610045565b610081565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b611736806100906000396000f3fe6080604052600436106101a05760003560e01c80635d799f87116100ec578063e339d9f11161008a578063f23a6e6111610064578063f23a6e6114610527578063f2fde38b14610554578063f340fa0114610567578063fee81cf41461057a57600080fd5b8063e339d9f114610492578063f04e283e146104e9578063f0b9e5ba146104fc57600080fd5b8063b00b1e50116100c6578063b00b1e5014610403578063b7ce33a214610423578063bc197c8114610443578063c9c50e231461047257600080fd5b80635d799f87146103ae578063715018a6146103ce5780638da5cb5b146103d657600080fd5b8063270a6231116101595780634732a7dc116101335780634732a7dc1461035e5780634c412aa31461037e57806354d1f13d1461039e57806357323648146103a657600080fd5b8063270a6231146103085780632e1a7d4d1461031d57806335b944bf1461033d57600080fd5b806301ffc9a7146101ac578063115b7940146101f2578063150b7a021461023a5780631a21241c1461027f57806325692962146102e057806326e2dca2146102e857600080fd5b366101a757005b600080fd5b3480156101b857600080fd5b506101dd6101c73660046110ec565b6001600160e01b0319166301ffc9a760e01b1490565b60405190151581526020015b60405180910390f35b3480156101fe57600080fd5b5061023861020d36600461112b565b3360009081526002602052604090208054911515600160801b0260ff60801b19909216919091179055565b005b34801561024657600080fd5b506102666102553660046111ad565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016101e9565b34801561028b57600080fd5b506102c161029a36600461121c565b6002602052600090815260409020546001600160801b03811690600160801b900460ff1682565b604080516001600160801b0390931683529015156020830152016101e9565b6102386105bb565b3480156102f457600080fd5b5061023861030336600461127c565b61060b565b34801561031457600080fd5b506102386106c3565b34801561032957600080fd5b506102386103383660046112e1565b6107d3565b34801561034957600080fd5b506001546101dd90600160a01b900460ff1681565b34801561036a57600080fd5b5061023861037936600461121c565b610909565b34801561038a57600080fd5b5061023861039936600461121c565b61093a565b610238610964565b6102386109a0565b3480156103ba57600080fd5b506102386103c93660046112fa565b6109ab565b610238610a9c565b3480156103e257600080fd5b50638b78c6d819545b6040516001600160a01b0390911681526020016101e9565b34801561040f57600080fd5b5061023861041e36600461132d565b610aae565b34801561042f57600080fd5b5061023861043e3660046113ea565b610ea3565b34801561044f57600080fd5b5061026661045e36600461147a565b63bc197c8160e01b98975050505050505050565b34801561047e57600080fd5b506001546103eb906001600160a01b031681565b34801561049e57600080fd5b506104d16104ad36600461121c565b6001600160a01b03166000908152600260205260409020546001600160801b031690565b6040516001600160801b0390911681526020016101e9565b6102386104f736600461121c565b610f8c565b34801561050857600080fd5b50610266610517366004611535565b63785cf2dd60e11b949350505050565b34801561053357600080fd5b5061026661054236600461158f565b63f23a6e6160e01b9695505050505050565b61023861056236600461121c565b610fcc565b61023861057536600461121c565b610ff3565b34801561058657600080fd5b506105ad61059536600461121c565b63389a75e1600c908152600091909152602090205490565b6040519081526020016101e9565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b610613611093565b60005b828110156106bc57846001600160a01b03166323b872dd308487878681811061064157610641611607565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561069857600080fd5b505af11580156106ac573d6000803e3d6000fd5b5050600190920191506106169050565b5050505050565b600154600160a01b900460ff166106ed5760405163f6017bbd60e01b815260040160405180910390fd5b33600081815260026020908152604080832080546001600160801b03198116909155600154825160248082019790975283518082039097018752604401835292850180516001600160e01b031663f340fa0160e01b17905290516001600160801b03909116936001600160a01b0390921691849161076b919061161d565b60006040518083038185875af1925050503d80600081146107a8576040519150601f19603f3d011682016040523d82523d6000602084013e6107ad565b606091505b50509050806107cf57604051632684a07960e01b815260040160405180910390fd5b5050565b6000546001600160a01b031632036107fe57604051630d45e68960e21b815260040160405180910390fd5b336000908152600260205260409020546001600160801b031681111561083757604051631e9acf1760e31b815260040160405180910390fd5b3360008181526002602052604080822080546001600160801b03808216879003166001600160801b03199091161790555190919083908381818185875af1925050503d80600081146108a5576040519150601f19603f3d011682016040523d82523d6000602084013e6108aa565b606091505b50509050806108cc57604051632684a07960e01b815260040160405180910390fd5b60408051338152602081018490527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65910160405180910390a15050565b610911611093565b600180546001600160a01b039092166001600160a81b031990921691909117600160a01b179055565b610942611093565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b6109a933610ff3565b565b6109b3611093565b6040516370a0823160e01b815230600482015282906001600160a01b0382169063a9059cbb90849083906370a0823190602401602060405180830381865afa158015610a03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a27919061164c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610a72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a969190611665565b50505050565b610aa4611093565b6109a960006110ae565b6000546001600160a01b03163314610ad9576040516319caaa0b60e01b815260040160405180910390fd5b878614610af95760405163512509d360e11b815260040160405180910390fd5b858414610b195760405163512509d360e11b815260040160405180910390fd5b6001600160a01b038316600090815260026020526040902054600160801b900460ff1615610b5a57604051634e2916b760e01b815260040160405180910390fd5b4760005b89811015610c505760008b8b83818110610b7a57610b7a611607565b9050602002016020810190610b8f919061121c565b6001600160a01b0316888884818110610baa57610baa611607565b905060200201358b8b85818110610bc357610bc3611607565b9050602002810190610bd59190611682565b604051610be39291906116c9565b60006040518083038185875af1925050503d8060008114610c20576040519150601f19603f3d011682016040523d82523d6000602084013e610c25565b606091505b5050905080610c475760405163e8d529f960e01b815260040160405180910390fd5b50600101610b5e565b50604051600090419085908381818185875af1925050503d8060008114610c93576040519150601f19603f3d011682016040523d82523d6000602084013e610c98565b606091505b5050905080610cba57604051632d66518f60e01b815260040160405180910390fd5b600080546040516001600160a01b039091169085908381818185875af1925050503d8060008114610d07576040519150601f19603f3d011682016040523d82523d6000602084013e610d0c565b606091505b5050905080610d2e576040516305676c7160e41b815260040160405180910390fd5b4783811015610e04576000610d4382866116d9565b6001600160a01b0389166000908152600260205260409020549091506001600160801b0380831691161015610d8b57604051631e9acf1760e31b815260040160405180910390fd5b6001600160a01b03881660008181526002602090815260409182902080546001600160801b031981166001600160801b0391821687900382161790915582519384528416908301527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65910160405180910390a150610e94565b83811115610e94576001600160a01b038716600090815260026020526040902080546001600160801b0380821687850301166001600160801b03199091161790557fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c87610e7186846116d9565b604080516001600160a01b03909316835260208301919091520160405180910390a15b50505050505050505050505050565b610eab611093565b60005b84811015610f8357866001600160a01b031663f242432a3084898986818110610ed957610ed9611607565b90506020020135888887818110610ef257610ef2611607565b6040516001600160e01b031960e089901b1681526001600160a01b03968716600482015295909416602486015250604484019190915260209091020135606482015260a06084820152600060a482015260c401600060405180830381600087803b158015610f5f57600080fd5b505af1158015610f73573d6000803e3d6000fd5b505060019092019150610eae9050565b50505050505050565b610f94611093565b63389a75e1600c52806000526020600c208054421115610fbc57636f5e88186000526004601cfd5b60009055610fc9816110ae565b50565b610fd4611093565b8060601b610fea57637448fbae6000526004601cfd5b610fc9816110ae565b6000546001600160a01b0316320361101e57604051630d45e68960e21b815260040160405180910390fd5b6001600160a01b03811660008181526002602090815260409182902080546001600160801b03198116346001600160801b039283168101909216179091558251938452908301527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c910160405180910390a150565b638b78c6d8195433146109a9576382b429006000526004601cfd5b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b6000602082840312156110fe57600080fd5b81356001600160e01b03198116811461111657600080fd5b9392505050565b8015158114610fc957600080fd5b60006020828403121561113d57600080fd5b81356111168161111d565b80356001600160a01b038116811461115f57600080fd5b919050565b60008083601f84011261117657600080fd5b50813567ffffffffffffffff81111561118e57600080fd5b6020830191508360208285010111156111a657600080fd5b9250929050565b6000806000806000608086880312156111c557600080fd5b6111ce86611148565b94506111dc60208701611148565b935060408601359250606086013567ffffffffffffffff8111156111ff57600080fd5b61120b88828901611164565b969995985093965092949392505050565b60006020828403121561122e57600080fd5b61111682611148565b60008083601f84011261124957600080fd5b50813567ffffffffffffffff81111561126157600080fd5b6020830191508360208260051b85010111156111a657600080fd5b6000806000806060858703121561129257600080fd5b61129b85611148565b9350602085013567ffffffffffffffff8111156112b757600080fd5b6112c387828801611237565b90945092506112d6905060408601611148565b905092959194509250565b6000602082840312156112f357600080fd5b5035919050565b6000806040838503121561130d57600080fd5b61131683611148565b915061132460208401611148565b90509250929050565b600080600080600080600080600060c08a8c03121561134b57600080fd5b893567ffffffffffffffff8082111561136357600080fd5b61136f8d838e01611237565b909b50995060208c013591508082111561138857600080fd5b6113948d838e01611237565b909950975060408c01359150808211156113ad57600080fd5b506113ba8c828d01611237565b90965094506113cd905060608b01611148565b925060808a0135915060a08a013590509295985092959850929598565b6000806000806000806080878903121561140357600080fd5b61140c87611148565b9550602087013567ffffffffffffffff8082111561142957600080fd5b6114358a838b01611237565b9097509550604089013591508082111561144e57600080fd5b5061145b89828a01611237565b909450925061146e905060608801611148565b90509295509295509295565b60008060008060008060008060a0898b03121561149657600080fd5b61149f89611148565b97506114ad60208a01611148565b9650604089013567ffffffffffffffff808211156114ca57600080fd5b6114d68c838d01611237565b909850965060608b01359150808211156114ef57600080fd5b6114fb8c838d01611237565b909650945060808b013591508082111561151457600080fd5b506115218b828c01611164565b999c989b5096995094979396929594505050565b6000806000806060858703121561154b57600080fd5b61155485611148565b935060208501359250604085013567ffffffffffffffff81111561157757600080fd5b61158387828801611164565b95989497509550505050565b60008060008060008060a087890312156115a857600080fd5b6115b187611148565b95506115bf60208801611148565b94506040870135935060608701359250608087013567ffffffffffffffff8111156115e957600080fd5b6115f589828a01611164565b979a9699509497509295939492505050565b634e487b7160e01b600052603260045260246000fd5b6000825160005b8181101561163e5760208186018101518583015201611624565b506000920191825250919050565b60006020828403121561165e57600080fd5b5051919050565b60006020828403121561167757600080fd5b81516111168161111d565b6000808335601e1984360301811261169957600080fd5b83018035915067ffffffffffffffff8211156116b457600080fd5b6020019150368190038213156111a657600080fd5b8183823760009101908152919050565b818103818111156116fa57634e487b7160e01b600052601160045260246000fd5b9291505056fea264697066735822122099f26400b19fe201093c3be496bdd2867f8be30cb5161aaec0711f3c99a6c1b064736f6c63430008180033
Deployed Bytecode
0x6080604052600436106101a05760003560e01c80635d799f87116100ec578063e339d9f11161008a578063f23a6e6111610064578063f23a6e6114610527578063f2fde38b14610554578063f340fa0114610567578063fee81cf41461057a57600080fd5b8063e339d9f114610492578063f04e283e146104e9578063f0b9e5ba146104fc57600080fd5b8063b00b1e50116100c6578063b00b1e5014610403578063b7ce33a214610423578063bc197c8114610443578063c9c50e231461047257600080fd5b80635d799f87146103ae578063715018a6146103ce5780638da5cb5b146103d657600080fd5b8063270a6231116101595780634732a7dc116101335780634732a7dc1461035e5780634c412aa31461037e57806354d1f13d1461039e57806357323648146103a657600080fd5b8063270a6231146103085780632e1a7d4d1461031d57806335b944bf1461033d57600080fd5b806301ffc9a7146101ac578063115b7940146101f2578063150b7a021461023a5780631a21241c1461027f57806325692962146102e057806326e2dca2146102e857600080fd5b366101a757005b600080fd5b3480156101b857600080fd5b506101dd6101c73660046110ec565b6001600160e01b0319166301ffc9a760e01b1490565b60405190151581526020015b60405180910390f35b3480156101fe57600080fd5b5061023861020d36600461112b565b3360009081526002602052604090208054911515600160801b0260ff60801b19909216919091179055565b005b34801561024657600080fd5b506102666102553660046111ad565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016101e9565b34801561028b57600080fd5b506102c161029a36600461121c565b6002602052600090815260409020546001600160801b03811690600160801b900460ff1682565b604080516001600160801b0390931683529015156020830152016101e9565b6102386105bb565b3480156102f457600080fd5b5061023861030336600461127c565b61060b565b34801561031457600080fd5b506102386106c3565b34801561032957600080fd5b506102386103383660046112e1565b6107d3565b34801561034957600080fd5b506001546101dd90600160a01b900460ff1681565b34801561036a57600080fd5b5061023861037936600461121c565b610909565b34801561038a57600080fd5b5061023861039936600461121c565b61093a565b610238610964565b6102386109a0565b3480156103ba57600080fd5b506102386103c93660046112fa565b6109ab565b610238610a9c565b3480156103e257600080fd5b50638b78c6d819545b6040516001600160a01b0390911681526020016101e9565b34801561040f57600080fd5b5061023861041e36600461132d565b610aae565b34801561042f57600080fd5b5061023861043e3660046113ea565b610ea3565b34801561044f57600080fd5b5061026661045e36600461147a565b63bc197c8160e01b98975050505050505050565b34801561047e57600080fd5b506001546103eb906001600160a01b031681565b34801561049e57600080fd5b506104d16104ad36600461121c565b6001600160a01b03166000908152600260205260409020546001600160801b031690565b6040516001600160801b0390911681526020016101e9565b6102386104f736600461121c565b610f8c565b34801561050857600080fd5b50610266610517366004611535565b63785cf2dd60e11b949350505050565b34801561053357600080fd5b5061026661054236600461158f565b63f23a6e6160e01b9695505050505050565b61023861056236600461121c565b610fcc565b61023861057536600461121c565b610ff3565b34801561058657600080fd5b506105ad61059536600461121c565b63389a75e1600c908152600091909152602090205490565b6040519081526020016101e9565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b610613611093565b60005b828110156106bc57846001600160a01b03166323b872dd308487878681811061064157610641611607565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561069857600080fd5b505af11580156106ac573d6000803e3d6000fd5b5050600190920191506106169050565b5050505050565b600154600160a01b900460ff166106ed5760405163f6017bbd60e01b815260040160405180910390fd5b33600081815260026020908152604080832080546001600160801b03198116909155600154825160248082019790975283518082039097018752604401835292850180516001600160e01b031663f340fa0160e01b17905290516001600160801b03909116936001600160a01b0390921691849161076b919061161d565b60006040518083038185875af1925050503d80600081146107a8576040519150601f19603f3d011682016040523d82523d6000602084013e6107ad565b606091505b50509050806107cf57604051632684a07960e01b815260040160405180910390fd5b5050565b6000546001600160a01b031632036107fe57604051630d45e68960e21b815260040160405180910390fd5b336000908152600260205260409020546001600160801b031681111561083757604051631e9acf1760e31b815260040160405180910390fd5b3360008181526002602052604080822080546001600160801b03808216879003166001600160801b03199091161790555190919083908381818185875af1925050503d80600081146108a5576040519150601f19603f3d011682016040523d82523d6000602084013e6108aa565b606091505b50509050806108cc57604051632684a07960e01b815260040160405180910390fd5b60408051338152602081018490527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65910160405180910390a15050565b610911611093565b600180546001600160a01b039092166001600160a81b031990921691909117600160a01b179055565b610942611093565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b6109a933610ff3565b565b6109b3611093565b6040516370a0823160e01b815230600482015282906001600160a01b0382169063a9059cbb90849083906370a0823190602401602060405180830381865afa158015610a03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a27919061164c565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610a72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a969190611665565b50505050565b610aa4611093565b6109a960006110ae565b6000546001600160a01b03163314610ad9576040516319caaa0b60e01b815260040160405180910390fd5b878614610af95760405163512509d360e11b815260040160405180910390fd5b858414610b195760405163512509d360e11b815260040160405180910390fd5b6001600160a01b038316600090815260026020526040902054600160801b900460ff1615610b5a57604051634e2916b760e01b815260040160405180910390fd5b4760005b89811015610c505760008b8b83818110610b7a57610b7a611607565b9050602002016020810190610b8f919061121c565b6001600160a01b0316888884818110610baa57610baa611607565b905060200201358b8b85818110610bc357610bc3611607565b9050602002810190610bd59190611682565b604051610be39291906116c9565b60006040518083038185875af1925050503d8060008114610c20576040519150601f19603f3d011682016040523d82523d6000602084013e610c25565b606091505b5050905080610c475760405163e8d529f960e01b815260040160405180910390fd5b50600101610b5e565b50604051600090419085908381818185875af1925050503d8060008114610c93576040519150601f19603f3d011682016040523d82523d6000602084013e610c98565b606091505b5050905080610cba57604051632d66518f60e01b815260040160405180910390fd5b600080546040516001600160a01b039091169085908381818185875af1925050503d8060008114610d07576040519150601f19603f3d011682016040523d82523d6000602084013e610d0c565b606091505b5050905080610d2e576040516305676c7160e41b815260040160405180910390fd5b4783811015610e04576000610d4382866116d9565b6001600160a01b0389166000908152600260205260409020549091506001600160801b0380831691161015610d8b57604051631e9acf1760e31b815260040160405180910390fd5b6001600160a01b03881660008181526002602090815260409182902080546001600160801b031981166001600160801b0391821687900382161790915582519384528416908301527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65910160405180910390a150610e94565b83811115610e94576001600160a01b038716600090815260026020526040902080546001600160801b0380821687850301166001600160801b03199091161790557fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c87610e7186846116d9565b604080516001600160a01b03909316835260208301919091520160405180910390a15b50505050505050505050505050565b610eab611093565b60005b84811015610f8357866001600160a01b031663f242432a3084898986818110610ed957610ed9611607565b90506020020135888887818110610ef257610ef2611607565b6040516001600160e01b031960e089901b1681526001600160a01b03968716600482015295909416602486015250604484019190915260209091020135606482015260a06084820152600060a482015260c401600060405180830381600087803b158015610f5f57600080fd5b505af1158015610f73573d6000803e3d6000fd5b505060019092019150610eae9050565b50505050505050565b610f94611093565b63389a75e1600c52806000526020600c208054421115610fbc57636f5e88186000526004601cfd5b60009055610fc9816110ae565b50565b610fd4611093565b8060601b610fea57637448fbae6000526004601cfd5b610fc9816110ae565b6000546001600160a01b0316320361101e57604051630d45e68960e21b815260040160405180910390fd5b6001600160a01b03811660008181526002602090815260409182902080546001600160801b03198116346001600160801b039283168101909216179091558251938452908301527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c910160405180910390a150565b638b78c6d8195433146109a9576382b429006000526004601cfd5b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b6000602082840312156110fe57600080fd5b81356001600160e01b03198116811461111657600080fd5b9392505050565b8015158114610fc957600080fd5b60006020828403121561113d57600080fd5b81356111168161111d565b80356001600160a01b038116811461115f57600080fd5b919050565b60008083601f84011261117657600080fd5b50813567ffffffffffffffff81111561118e57600080fd5b6020830191508360208285010111156111a657600080fd5b9250929050565b6000806000806000608086880312156111c557600080fd5b6111ce86611148565b94506111dc60208701611148565b935060408601359250606086013567ffffffffffffffff8111156111ff57600080fd5b61120b88828901611164565b969995985093965092949392505050565b60006020828403121561122e57600080fd5b61111682611148565b60008083601f84011261124957600080fd5b50813567ffffffffffffffff81111561126157600080fd5b6020830191508360208260051b85010111156111a657600080fd5b6000806000806060858703121561129257600080fd5b61129b85611148565b9350602085013567ffffffffffffffff8111156112b757600080fd5b6112c387828801611237565b90945092506112d6905060408601611148565b905092959194509250565b6000602082840312156112f357600080fd5b5035919050565b6000806040838503121561130d57600080fd5b61131683611148565b915061132460208401611148565b90509250929050565b600080600080600080600080600060c08a8c03121561134b57600080fd5b893567ffffffffffffffff8082111561136357600080fd5b61136f8d838e01611237565b909b50995060208c013591508082111561138857600080fd5b6113948d838e01611237565b909950975060408c01359150808211156113ad57600080fd5b506113ba8c828d01611237565b90965094506113cd905060608b01611148565b925060808a0135915060a08a013590509295985092959850929598565b6000806000806000806080878903121561140357600080fd5b61140c87611148565b9550602087013567ffffffffffffffff8082111561142957600080fd5b6114358a838b01611237565b9097509550604089013591508082111561144e57600080fd5b5061145b89828a01611237565b909450925061146e905060608801611148565b90509295509295509295565b60008060008060008060008060a0898b03121561149657600080fd5b61149f89611148565b97506114ad60208a01611148565b9650604089013567ffffffffffffffff808211156114ca57600080fd5b6114d68c838d01611237565b909850965060608b01359150808211156114ef57600080fd5b6114fb8c838d01611237565b909650945060808b013591508082111561151457600080fd5b506115218b828c01611164565b999c989b5096995094979396929594505050565b6000806000806060858703121561154b57600080fd5b61155485611148565b935060208501359250604085013567ffffffffffffffff81111561157757600080fd5b61158387828801611164565b95989497509550505050565b60008060008060008060a087890312156115a857600080fd5b6115b187611148565b95506115bf60208801611148565b94506040870135935060608701359250608087013567ffffffffffffffff8111156115e957600080fd5b6115f589828a01611164565b979a9699509497509295939492505050565b634e487b7160e01b600052603260045260246000fd5b6000825160005b8181101561163e5760208186018101518583015201611624565b506000920191825250919050565b60006020828403121561165e57600080fd5b5051919050565b60006020828403121561167757600080fd5b81516111168161111d565b6000808335601e1984360301811261169957600080fd5b83018035915067ffffffffffffffff8211156116b457600080fd5b6020019150368190038213156111a657600080fd5b8183823760009101908152919050565b818103818111156116fa57634e487b7160e01b600052601160045260246000fd5b9291505056fea264697066735822122099f26400b19fe201093c3be496bdd2867f8be30cb5161aaec0711f3c99a6c1b064736f6c63430008180033
Deployed Bytecode Sourcemap
5138:8154:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11877:154;;;;;;;;;;-1:-1:-1;11877:154:5;;;;;:::i;:::-;-1:-1:-1;;;;;;11978:46:5;-1:-1:-1;;;11978:46:5;;11877:154;;;;470:14:7;;463:22;445:41;;433:2;418:18;11877:154:5;;;;;;;;9592:110;;;;;;;;;;-1:-1:-1;9592:110:5;;;;;:::i;:::-;9664:10;9651:24;;;;:12;:24;;;;;:44;;;;;-1:-1:-1;;;9651:44:5;-1:-1:-1;;;;9651:44:5;;;;;;;;;9592:110;;;11564:137;;;;;;;;;;-1:-1:-1;11564:137:5;;;;;:::i;:::-;-1:-1:-1;;;11564:137:5;;;;;;;;;;;-1:-1:-1;;;;;;2189:33:7;;;2171:52;;2159:2;2144:18;11564:137:5;2027:202:7;5769:51:5;;;;;;;;;;-1:-1:-1;5769:51:5;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;5769:51:5;;;-1:-1:-1;;;5769:51:5;;;;;;;;;;-1:-1:-1;;;;;2611:47:7;;;2593:66;;2702:14;;2695:22;2690:2;2675:18;;2668:50;2566:18;5769:51:5;2425:299:7;9021:617:4;;;:::i;12562:242:5:-;;;;;;;;;;-1:-1:-1;12562:242:5;;;;;:::i;:::-;;:::i;10583:439::-;;;;;;;;;;;;;:::i;9102:484::-;;;;;;;;;;-1:-1:-1;9102:484:5;;;;;:::i;:::-;;:::i;5735:28::-;;;;;;;;;;-1:-1:-1;5735:28:5;;;;-1:-1:-1;;;5735:28:5;;;;;;10078:161;;;;;;;;;;-1:-1:-1;10078:161:5;;;;;:::i;:::-;;:::i;9790:114::-;;;;;;;;;;-1:-1:-1;9790:114:5;;;;;:::i;:::-;;:::i;9720:456:4:-;;;:::i;8893:76:5:-;;;:::i;12203:186::-;;;;;;;;;;-1:-1:-1;12203:186:5;;;;;:::i;:::-;;:::i;8762:100:4:-;;;:::i;11408:182::-;;;;;;;;;;-1:-1:-1;;;11556:18:4;11408:182;;;-1:-1:-1;;;;;4305:32:7;;;4287:51;;4275:2;4260:18;11408:182:4;4141:203:7;6735:1674:5;;;;;;;;;;-1:-1:-1;6735:1674:5;;;;;:::i;:::-;;:::i;12978:312::-;;;;;;;;;;-1:-1:-1;12978:312:5;;;;;:::i;:::-;;:::i;11332:226::-;;;;;;;;;;-1:-1:-1;11332:226:5;;;;;:::i;:::-;-1:-1:-1;;;11332:226:5;;;;;;;;;;;5688:41;;;;;;;;;;-1:-1:-1;5688:41:5;;;;-1:-1:-1;;;;;5688:41:5;;;11028:126;;;;;;;;;;-1:-1:-1;11028:126:5;;;;;:::i;:::-;-1:-1:-1;;;;;11116:20:5;11090:7;11116:20;;;:12;:20;;;;;:31;-1:-1:-1;;;;;11116:31:5;;11028:126;;;;-1:-1:-1;;;;;7972:47:7;;;7954:66;;7942:2;7927:18;11028:126:5;7808:218:7;10363:708:4;;;;;;:::i;:::-;;:::i;11743:128:5:-;;;;;;;;;;-1:-1:-1;11743:128:5;;;;;:::i;:::-;-1:-1:-1;;;11743:128:5;;;;;;;11160:166;;;;;;;;;;-1:-1:-1;11160:166:5;;;;;:::i;:::-;-1:-1:-1;;;11160:166:5;;;;;;;;;8348:349:4;;;;;;:::i;:::-;;:::i;8539:274:5:-;;;;;;:::i;:::-;;:::i;11693:435:4:-;;;;;;;;;;-1:-1:-1;11693:435:4;;;;;:::i;:::-;11963:19;11957:4;11950:33;;;11812:14;11996:26;;;;12106:4;12090:21;;12084:28;;11693:435;;;;9433:25:7;;;9421:2;9406:18;11693:435:4;9287:177:7;9021:617:4;9114:15;7972:9;9132:46;;:15;:46;9114:64;;9346:19;9340:4;9333:33;9396:8;9390:4;9383:22;9452:7;9445:4;9439;9429:21;9422:38;9599:8;9552:45;9549:1;9546;9541:67;9248:374;9021:617::o;12562:242:5:-;12517:13:4;:11;:13::i;:::-;12676:9:5::1;12671:127;12691:14:::0;;::::1;12671:127;;;12734:5;-1:-1:-1::0;;;;;12726:27:5::1;;12762:4;12769:9;12780:3;;12784:1;12780:6;;;;;;;:::i;:::-;12726:61;::::0;-1:-1:-1;;;;;;12726:61:5::1;::::0;;;;;;-1:-1:-1;;;;;9859:15:7;;;12726:61:5::1;::::0;::::1;9841:34:7::0;9911:15;;;;9891:18;;;9884:43;-1:-1:-1;12780:6:5::1;::::0;;::::1;;;9943:18:7::0;;;9936:34;9776:18;;12726:61:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;12707:3:5::1;::::0;;::::1;::::0;-1:-1:-1;12671:127:5::1;::::0;-1:-1:-1;12671:127:5::1;;;12562:242:::0;;;;:::o;10583:439::-;10633:16;;-1:-1:-1;;;10633:16:5;;;;10628:51;;10658:21;;-1:-1:-1;;;10658:21:5;;;;;;;;;;;10628:51;10729:10;10689:24;10716;;;:12;:24;;;;;;;;:35;;-1:-1:-1;;;;;;10761:39:5;;;;;-1:-1:-1;10829:26:5;10899:57;;;;;;4287:51:7;;;;10899:57:5;;;;;;;;;;4260:18:7;;10899:57:5;;;;;;;-1:-1:-1;;;;;10899:57:5;-1:-1:-1;;;10899:57:5;;;10829:137;;-1:-1:-1;;;;;10716:35:5;;;;-1:-1:-1;;;;;10829:26:5;;;;10716:35;;10829:137;;10899:57;10829:137;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10811:155;;;10981:7;10976:39;;10997:18;;-1:-1:-1;;;10997:18:5;;;;;;;;;;;10976:39;10618:404;;10583:439::o;9102:484::-;9172:16;;-1:-1:-1;;;;;9172:16:5;9159:9;:29;9155:70;;9197:28;;-1:-1:-1;;;9197:28:5;;;;;;;;;;;9155:70;9253:10;9240:24;;;;:12;:24;;;;;:35;-1:-1:-1;;;;;9240:35:5;:44;-1:-1:-1;9236:78:5;;;9293:21;;-1:-1:-1;;;9293:21:5;;;;;;;;;;;9236:78;9361:10;9348:24;;;;:12;:24;;;;;;:54;;-1:-1:-1;;;;;9348:54:5;;;;;;;-1:-1:-1;;;;;;9348:54:5;;;;;;9441:43;9348:24;;9361:10;9348:54;;:24;9441:43;9348:24;9441:43;9348:54;9361:10;9441:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9423:61;;;9499:7;9494:39;;9515:18;;-1:-1:-1;;;9515:18:5;;;;;;;;;;;9494:39;9549:30;;;9560:10;10782:51:7;;10864:2;10849:18;;10842:34;;;9549:30:5;;10755:18:7;9549:30:5;;;;;;;9145:441;9102:484;:::o;10078:161::-;12517:13:4;:11;:13::i;:::-;10177:4:5::1;10158:23:::0;;-1:-1:-1;;;;;10191:41:5;;::::1;-1:-1:-1::0;;;;;;10191:41:5;;;;;;;-1:-1:-1;;;10191:41:5;;;10078:161::o;9790:114::-;12517:13:4;:11;:13::i;:::-;9868:16:5::1;:29:::0;;-1:-1:-1;;;;;;9868:29:5::1;-1:-1:-1::0;;;;;9868:29:5;;;::::1;::::0;;;::::1;::::0;;9790:114::o;9720:456:4:-;9922:19;9916:4;9909:33;9968:8;9962:4;9955:22;10020:1;10013:4;10007;9997:21;9990:32;10151:8;10105:44;10102:1;10099;10094:66;9720:456::o;8893:76:5:-;8943:19;8951:10;8943:7;:19::i;:::-;8893:76::o;12203:186::-;12517:13:4;:11;:13::i;:::-;12351:30:5::1;::::0;-1:-1:-1;;;12351:30:5;;12375:4:::1;12351:30;::::0;::::1;4287:51:7::0;12309:5:5;;-1:-1:-1;;;;;12325:14:5;::::1;::::0;::::1;::::0;12340:9;;12325:14;;12351:15:::1;::::0;4260:18:7;;12351:30:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12325:57;::::0;-1:-1:-1;;;;;;12325:57:5::1;::::0;;;;;;-1:-1:-1;;;;;10800:32:7;;;12325:57:5::1;::::0;::::1;10782:51:7::0;10849:18;;;10842:34;10755:18;;12325:57:5::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12277:112;12203:186:::0;;:::o;8762:100:4:-;12517:13;:11;:13::i;:::-;8834:21:::1;8852:1;8834:9;:21::i;6735:1674:5:-:0;5993:16;;-1:-1:-1;;;;;5993:16:5;5979:10;:30;5975:63;;6018:20;;-1:-1:-1;;;6018:20:5;;;;;;;;;;;5975:63;7001:40;;::::1;6997:74;;7050:21;;-1:-1:-1::0;;;7050:21:5::1;;;;;;;;;;;6997:74;7085:29:::0;;::::1;7081:63;;7123:21;;-1:-1:-1::0;;;7123:21:5::1;;;;;;;;;;;7081:63;-1:-1:-1::0;;;;;7158:20:5;::::1;;::::0;;;:12:::1;:20;::::0;;;;:29;-1:-1:-1;;;7158:29:5;::::1;;;7154:58;;;7196:16;;-1:-1:-1::0;;;7196:16:5::1;;;;;;;;;;;7154:58;7247:21;7223;7279:199;7299:28:::0;;::::1;7279:199;;;7349:12;7366:17;;7384:1;7366:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7366:25:5::1;7399:6;;7406:1;7399:9;;;;;;;:::i;:::-;;;;;;;7410:5;;7416:1;7410:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;7366:53;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7348:71;;;7438:7;7433:34;;7454:13;;-1:-1:-1::0;;;7454:13:5::1;;;;;;;;;;;7433:34;-1:-1:-1::0;7329:3:5::1;;7279:199;;;-1:-1:-1::0;7512:44:5::1;::::0;7489:18:::1;::::0;7512:14:::1;::::0;7539:12;;7489:18;7512:44;7489:18;7512:44;7539:12;7512:14;:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7488:68;;;7571:13;7566:49;;7593:22;;-1:-1:-1::0;;;7593:22:5::1;;;;;;;;;;;7566:49;7626:18;7649:16:::0;;:46:::1;::::0;-1:-1:-1;;;;;7649:16:5;;::::1;::::0;7678:12;;7626:18;7649:46;7626:18;7649:46;7678:12;7649:16;:46:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7625:70;;;7710:13;7705:50;;7732:23;;-1:-1:-1::0;;;7732:23:5::1;;;;;;;;;;;7705:50;7789:21;7825:28:::0;;::::1;7821:582;;;7869:13;7893:28;7909:12:::0;7893:13;:28:::1;:::i;:::-;-1:-1:-1::0;;;;;7940:20:5;::::1;;::::0;;;:12:::1;:20;::::0;;;;:31;7869:53;;-1:-1:-1;;;;;;7940:39:5;;::::1;:31:::0;::::1;:39;7936:73;;;7988:21;;-1:-1:-1::0;;;7988:21:5::1;;;;;;;;;;;7936:73;-1:-1:-1::0;;;;;8051:20:5;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;;;:40;;-1:-1:-1;;;;;;8051:40:5;::::1;-1:-1:-1::0;;;;;8051:40:5;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;8124:25;;12532:51:7;;;12619:47;;12599:18;;;12592:75;8124:25:5::1;::::0;12505:18:7;8124:25:5::1;;;;;;;7855:305;7821:582;;;8185:13;8170:12;:28;8166:237;;;-1:-1:-1::0;;;;;8242:20:5;::::1;;::::0;;;:12:::1;:20;::::0;;;;:72;;-1:-1:-1;;;;;8242:72:5;;::::1;8285:28:::0;;::::1;8242:72;;-1:-1:-1::0;;;;;;8242:72:5;;::::1;;::::0;;8347:45:::1;8255:6:::0;8363:28:::1;8300:13:::0;8285:12;8363:28:::1;:::i;:::-;8347:45;::::0;;-1:-1:-1;;;;;10800:32:7;;;10782:51;;10864:2;10849:18;;10842:34;;;;10755:18;8347:45:5::1;;;;;;;8166:237;6987:1422;;;;6735:1674:::0;;;;;;;;;:::o;12978:312::-;12517:13:4;:11;:13::i;:::-;13141:9:5::1;13136:148;13156:14:::0;;::::1;13136:148;;;13200:5;-1:-1:-1::0;;;;;13191:32:5::1;;13232:4;13239:9;13250:3;;13254:1;13250:6;;;;;;;:::i;:::-;;;;;;;13258:7;;13266:1;13258:10;;;;;;;:::i;:::-;13191:82;::::0;-1:-1:-1;;;;;;13191:82:5::1;::::0;;;;;;-1:-1:-1;;;;;13029:15:7;;;13191:82:5::1;::::0;::::1;13011:34:7::0;13081:15;;;;13061:18;;;13054:43;-1:-1:-1;13113:18:7;;;13106:34;;;;13258:10:5::1;::::0;;::::1;;;13156:18:7::0;;;13149:34;12991:3;13199:19;;;13192:32;-1:-1:-1;13240:19:7;;;13233:30;13280:19;;13191:82:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;13172:3:5::1;::::0;;::::1;::::0;-1:-1:-1;13136:148:5::1;::::0;-1:-1:-1;13136:148:5::1;;;12978:312:::0;;;;;;:::o;10363:708:4:-;12517:13;:11;:13::i;:::-;10597:19:::1;10591:4;10584:33;10643:12;10637:4;10630:26;10705:4;10699;10689:21;10811:12;10805:19;10792:11;10789:36;10786:157;;;10857:10;10851:4;10844:24;10924:4;10918;10911:18;10786:157;11020:1;10999:23:::0;;11041::::1;11051:12:::0;11041:9:::1;:23::i;:::-;10363:708:::0;:::o;8348:349::-;12517:13;:11;:13::i;:::-;8520:8:::1;8516:2;8512:17;8502:150;;8562:10;8556:4;8549:24;8633:4;8627;8620:18;8502:150;8671:19;8681:8;8671:9;:19::i;8539:274:5:-:0;8614:16;;-1:-1:-1;;;;;8614:16:5;8601:9;:29;8597:70;;8639:28;;-1:-1:-1;;;8639:28:5;;;;;;;;;;;8597:70;-1:-1:-1;;;;;8701:20:5;;;;;;:12;:20;;;;;;;;;:53;;-1:-1:-1;;;;;;8701:53:5;;8744:9;-1:-1:-1;;;;;8701:53:5;;;;;;;;;;;;8780:26;;10782:51:7;;;10849:18;;;10842:34;8780:26:5;;10755:18:7;8780:26:5;;;;;;;8539:274;:::o;7292:355:4:-;-1:-1:-1;;7498:18:4;7488:8;7485:32;7475:156;;7550:10;7544:4;7537:24;7612:4;7606;7599:18;6145:1089;-1:-1:-1;;7093:16:4;;-1:-1:-1;;;;;6941:26:4;;;;;;7053:38;7050:1;;7042:78;7177:27;6145:1089::o;14:286:7:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:7;;209:43;;199:71;;266:1;263;256:12;199:71;289:5;14:286;-1:-1:-1;;;14:286:7:o;497:118::-;583:5;576:13;569:21;562:5;559:32;549:60;;605:1;602;595:12;620:241;676:6;729:2;717:9;708:7;704:23;700:32;697:52;;;745:1;742;735:12;697:52;784:9;771:23;803:28;825:5;803:28;:::i;866:173::-;934:20;;-1:-1:-1;;;;;983:31:7;;973:42;;963:70;;1029:1;1026;1019:12;963:70;866:173;;;:::o;1044:347::-;1095:8;1105:6;1159:3;1152:4;1144:6;1140:17;1136:27;1126:55;;1177:1;1174;1167:12;1126:55;-1:-1:-1;1200:20:7;;1243:18;1232:30;;1229:50;;;1275:1;1272;1265:12;1229:50;1312:4;1304:6;1300:17;1288:29;;1364:3;1357:4;1348:6;1340;1336:19;1332:30;1329:39;1326:59;;;1381:1;1378;1371:12;1326:59;1044:347;;;;;:::o;1396:626::-;1493:6;1501;1509;1517;1525;1578:3;1566:9;1557:7;1553:23;1549:33;1546:53;;;1595:1;1592;1585:12;1546:53;1618:29;1637:9;1618:29;:::i;:::-;1608:39;;1666:38;1700:2;1689:9;1685:18;1666:38;:::i;:::-;1656:48;;1751:2;1740:9;1736:18;1723:32;1713:42;;1806:2;1795:9;1791:18;1778:32;1833:18;1825:6;1822:30;1819:50;;;1865:1;1862;1855:12;1819:50;1904:58;1954:7;1945:6;1934:9;1930:22;1904:58;:::i;:::-;1396:626;;;;-1:-1:-1;1396:626:7;;-1:-1:-1;1981:8:7;;1878:84;1396:626;-1:-1:-1;;;1396:626:7:o;2234:186::-;2293:6;2346:2;2334:9;2325:7;2321:23;2317:32;2314:52;;;2362:1;2359;2352:12;2314:52;2385:29;2404:9;2385:29;:::i;2729:367::-;2792:8;2802:6;2856:3;2849:4;2841:6;2837:17;2833:27;2823:55;;2874:1;2871;2864:12;2823:55;-1:-1:-1;2897:20:7;;2940:18;2929:30;;2926:50;;;2972:1;2969;2962:12;2926:50;3009:4;3001:6;2997:17;2985:29;;3069:3;3062:4;3052:6;3049:1;3045:14;3037:6;3033:27;3029:38;3026:47;3023:67;;;3086:1;3083;3076:12;3101:585;3205:6;3213;3221;3229;3282:2;3270:9;3261:7;3257:23;3253:32;3250:52;;;3298:1;3295;3288:12;3250:52;3321:29;3340:9;3321:29;:::i;:::-;3311:39;;3401:2;3390:9;3386:18;3373:32;3428:18;3420:6;3417:30;3414:50;;;3460:1;3457;3450:12;3414:50;3499:70;3561:7;3552:6;3541:9;3537:22;3499:70;:::i;:::-;3588:8;;-1:-1:-1;3473:96:7;-1:-1:-1;3642:38:7;;-1:-1:-1;3676:2:7;3661:18;;3642:38;:::i;:::-;3632:48;;3101:585;;;;;;;:::o;3691:180::-;3750:6;3803:2;3791:9;3782:7;3778:23;3774:32;3771:52;;;3819:1;3816;3809:12;3771:52;-1:-1:-1;3842:23:7;;3691:180;-1:-1:-1;3691:180:7:o;3876:260::-;3944:6;3952;4005:2;3993:9;3984:7;3980:23;3976:32;3973:52;;;4021:1;4018;4011:12;3973:52;4044:29;4063:9;4044:29;:::i;:::-;4034:39;;4092:38;4126:2;4115:9;4111:18;4092:38;:::i;:::-;4082:48;;3876:260;;;;;:::o;4349:1312::-;4545:6;4553;4561;4569;4577;4585;4593;4601;4609;4662:3;4650:9;4641:7;4637:23;4633:33;4630:53;;;4679:1;4676;4669:12;4630:53;4719:9;4706:23;4748:18;4789:2;4781:6;4778:14;4775:34;;;4805:1;4802;4795:12;4775:34;4844:70;4906:7;4897:6;4886:9;4882:22;4844:70;:::i;:::-;4933:8;;-1:-1:-1;4818:96:7;-1:-1:-1;5021:2:7;5006:18;;4993:32;;-1:-1:-1;5037:16:7;;;5034:36;;;5066:1;5063;5056:12;5034:36;5105:72;5169:7;5158:8;5147:9;5143:24;5105:72;:::i;:::-;5196:8;;-1:-1:-1;5079:98:7;-1:-1:-1;5284:2:7;5269:18;;5256:32;;-1:-1:-1;5300:16:7;;;5297:36;;;5329:1;5326;5319:12;5297:36;;5368:72;5432:7;5421:8;5410:9;5406:24;5368:72;:::i;:::-;5459:8;;-1:-1:-1;5342:98:7;-1:-1:-1;5513:38:7;;-1:-1:-1;5547:2:7;5532:18;;5513:38;:::i;:::-;5503:48;;5598:3;5587:9;5583:19;5570:33;5560:43;;5650:3;5639:9;5635:19;5622:33;5612:43;;4349:1312;;;;;;;;;;;:::o;5666:922::-;5806:6;5814;5822;5830;5838;5846;5899:3;5887:9;5878:7;5874:23;5870:33;5867:53;;;5916:1;5913;5906:12;5867:53;5939:29;5958:9;5939:29;:::i;:::-;5929:39;;6019:2;6008:9;6004:18;5991:32;6042:18;6083:2;6075:6;6072:14;6069:34;;;6099:1;6096;6089:12;6069:34;6138:70;6200:7;6191:6;6180:9;6176:22;6138:70;:::i;:::-;6227:8;;-1:-1:-1;6112:96:7;-1:-1:-1;6315:2:7;6300:18;;6287:32;;-1:-1:-1;6331:16:7;;;6328:36;;;6360:1;6357;6350:12;6328:36;;6399:72;6463:7;6452:8;6441:9;6437:24;6399:72;:::i;:::-;6490:8;;-1:-1:-1;6373:98:7;-1:-1:-1;6544:38:7;;-1:-1:-1;6578:2:7;6563:18;;6544:38;:::i;:::-;6534:48;;5666:922;;;;;;;;:::o;6593:1210::-;6753:6;6761;6769;6777;6785;6793;6801;6809;6862:3;6850:9;6841:7;6837:23;6833:33;6830:53;;;6879:1;6876;6869:12;6830:53;6902:29;6921:9;6902:29;:::i;:::-;6892:39;;6950:38;6984:2;6973:9;6969:18;6950:38;:::i;:::-;6940:48;;7039:2;7028:9;7024:18;7011:32;7062:18;7103:2;7095:6;7092:14;7089:34;;;7119:1;7116;7109:12;7089:34;7158:70;7220:7;7211:6;7200:9;7196:22;7158:70;:::i;:::-;7247:8;;-1:-1:-1;7132:96:7;-1:-1:-1;7335:2:7;7320:18;;7307:32;;-1:-1:-1;7351:16:7;;;7348:36;;;7380:1;7377;7370:12;7348:36;7419:72;7483:7;7472:8;7461:9;7457:24;7419:72;:::i;:::-;7510:8;;-1:-1:-1;7393:98:7;-1:-1:-1;7598:3:7;7583:19;;7570:33;;-1:-1:-1;7615:16:7;;;7612:36;;;7644:1;7641;7634:12;7612:36;;7683:60;7735:7;7724:8;7713:9;7709:24;7683:60;:::i;:::-;6593:1210;;;;-1:-1:-1;6593:1210:7;;-1:-1:-1;6593:1210:7;;;;;;7762:8;-1:-1:-1;;;6593:1210:7:o;8031:551::-;8119:6;8127;8135;8143;8196:2;8184:9;8175:7;8171:23;8167:32;8164:52;;;8212:1;8209;8202:12;8164:52;8235:29;8254:9;8235:29;:::i;:::-;8225:39;;8311:2;8300:9;8296:18;8283:32;8273:42;;8366:2;8355:9;8351:18;8338:32;8393:18;8385:6;8382:30;8379:50;;;8425:1;8422;8415:12;8379:50;8464:58;8514:7;8505:6;8494:9;8490:22;8464:58;:::i;:::-;8031:551;;;;-1:-1:-1;8541:8:7;-1:-1:-1;;;;8031:551:7:o;8587:695::-;8693:6;8701;8709;8717;8725;8733;8786:3;8774:9;8765:7;8761:23;8757:33;8754:53;;;8803:1;8800;8793:12;8754:53;8826:29;8845:9;8826:29;:::i;:::-;8816:39;;8874:38;8908:2;8897:9;8893:18;8874:38;:::i;:::-;8864:48;;8959:2;8948:9;8944:18;8931:32;8921:42;;9010:2;8999:9;8995:18;8982:32;8972:42;;9065:3;9054:9;9050:19;9037:33;9093:18;9085:6;9082:30;9079:50;;;9125:1;9122;9115:12;9079:50;9164:58;9214:7;9205:6;9194:9;9190:22;9164:58;:::i;:::-;8587:695;;;;-1:-1:-1;8587:695:7;;-1:-1:-1;8587:695:7;;9241:8;;8587:695;-1:-1:-1;;;8587:695:7:o;9469:127::-;9530:10;9525:3;9521:20;9518:1;9511:31;9561:4;9558:1;9551:15;9585:4;9582:1;9575:15;9981:412;10110:3;10148:6;10142:13;10173:1;10183:129;10197:6;10194:1;10191:13;10183:129;;;10295:4;10279:14;;;10275:25;;10269:32;10256:11;;;10249:53;10212:12;10183:129;;;-1:-1:-1;10367:1:7;10331:16;;10356:13;;;-1:-1:-1;10331:16:7;9981:412;-1:-1:-1;9981:412:7:o;10887:184::-;10957:6;11010:2;10998:9;10989:7;10985:23;10981:32;10978:52;;;11026:1;11023;11016:12;10978:52;-1:-1:-1;11049:16:7;;10887:184;-1:-1:-1;10887:184:7:o;11076:245::-;11143:6;11196:2;11184:9;11175:7;11171:23;11167:32;11164:52;;;11212:1;11209;11202:12;11164:52;11244:9;11238:16;11263:28;11285:5;11263:28;:::i;11326:521::-;11403:4;11409:6;11469:11;11456:25;11563:2;11559:7;11548:8;11532:14;11528:29;11524:43;11504:18;11500:68;11490:96;;11582:1;11579;11572:12;11490:96;11609:33;;11661:20;;;-1:-1:-1;11704:18:7;11693:30;;11690:50;;;11736:1;11733;11726:12;11690:50;11769:4;11757:17;;-1:-1:-1;11800:14:7;11796:27;;;11786:38;;11783:58;;;11837:1;11834;11827:12;11852:271;12035:6;12027;12022:3;12009:33;11991:3;12061:16;;12086:13;;;12061:16;11852:271;-1:-1:-1;11852:271:7:o;12128:225::-;12195:9;;;12216:11;;;12213:134;;;12269:10;12264:3;12260:20;12257:1;12250:31;12304:4;12301:1;12294:15;12332:4;12329:1;12322:15;12213:134;12128:225;;;;:::o
Swarm Source
ipfs://99f26400b19fe201093c3be496bdd2867f8be30cb5161aaec0711f3c99a6c1b0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 73.10% | $3,313.28 | 10.6104 | $35,155.2 | |
ETH | 1.04% | $3,313.28 | 0.1509 | $500.08 | |
APE | Ape (APE) | 10.98% | $1.12 | 4,715.6747 | $5,279.37 |
BASE | 10.29% | $3,310.64 | 1.4953 | $4,950.41 | |
BLAST | 4.56% | $3,311.85 | 0.6616 | $2,191.12 | |
BSC | 0.02% | $0.000011 | 804,828 | $8.59 | |
ARB | <0.01% | $3,312.58 | 0.001 | $3.31 | |
POL | <0.01% | $0.482824 | 4.5692 | $2.21 |
[ 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.