ETH Price: $3,067.06 (+3.23%)
Gas: 9 Gwei

Contract

0x0000000001474228ae1223661ef7Ab0d89773B0A
 

Overview

ETH Balance

0.258010192971296837 ETH

Eth Value

$791.33 (@ $3,067.06/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Withdraw190409422024-01-19 12:35:11172 days ago1705667711IN
MEV Bot: 0x000...b0a
0 ETH0.0006554221.58986281
Migrate Balance177755172023-07-26 6:38:35349 days ago1690353515IN
MEV Bot: 0x000...b0a
0 ETH0.0010186617.046248
Migrate Balance176953472023-07-15 0:47:35360 days ago1689382055IN
MEV Bot: 0x000...b0a
0 ETH0.0008084913.52931981
Migrate Balance176953122023-07-15 0:40:35360 days ago1689381635IN
MEV Bot: 0x000...b0a
0 ETH0.0004671313.28644912
Migrate Balance176936302023-07-14 18:58:59360 days ago1689361139IN
MEV Bot: 0x000...b0a
0 ETH0.0010431124.45231228
Deposit Self176902642023-07-14 7:37:23361 days ago1689320243IN
MEV Bot: 0x000...b0a
1.3 ETH0.0009256720.5884222
Migrate Balance176799972023-07-12 20:57:47362 days ago1689195467IN
MEV Bot: 0x000...b0a
0 ETH0.0014303923.93611077
Migrate Balance176799542023-07-12 20:49:11362 days ago1689194951IN
MEV Bot: 0x000...b0a
0 ETH0.0013773423.04834715
Migrate Balance176787932023-07-12 16:54:23362 days ago1689180863IN
MEV Bot: 0x000...b0a
0 ETH0.0032129453.76508108
Migrate Balance176785732023-07-12 16:09:35362 days ago1689178175IN
MEV Bot: 0x000...b0a
0 ETH0.0038363964.19774705
Migrate Balance176782422023-07-12 15:02:35363 days ago1689174155IN
MEV Bot: 0x000...b0a
0 ETH0.0019437855.28564931
Migrate Balance176739602023-07-12 0:34:47363 days ago1689122087IN
MEV Bot: 0x000...b0a
0 ETH0.000712611.92467741
Migrate Balance176739322023-07-12 0:29:11363 days ago1689121751IN
MEV Bot: 0x000...b0a
0 ETH0.0007295812.20884102
Migrate Balance176724412023-07-11 19:26:23363 days ago1689103583IN
MEV Bot: 0x000...b0a
0 ETH0.0009542422.36913465
Migrate Balance176724052023-07-11 19:19:11363 days ago1689103151IN
MEV Bot: 0x000...b0a
0 ETH0.0014023823.46730031
Migrate Balance176722062023-07-11 18:38:47363 days ago1689100727IN
MEV Bot: 0x000...b0a
0 ETH0.0020651734.55833403
Deposit176720432023-07-11 18:05:59363 days ago1689098759IN
MEV Bot: 0x000...b0a
3 ETH0.0018206440.0503079
Migrate Balance176719072023-07-11 17:38:47363 days ago1689097127IN
MEV Bot: 0x000...b0a
0 ETH0.0018775731.41903463
Migrate Balance176718952023-07-11 17:36:11363 days ago1689096971IN
MEV Bot: 0x000...b0a
0 ETH0.0020487234.28304313
Migrate Balance176717292023-07-11 17:02:59363 days ago1689094979IN
MEV Bot: 0x000...b0a
0 ETH0.002150535.98628096
Fulfill Order176700412023-07-11 11:21:47364 days ago1689074507IN
MEV Bot: 0x000...b0a
0 ETH0.0040975918.77160488
Migrate Balance176694612023-07-11 9:23:47364 days ago1689067427IN
MEV Bot: 0x000...b0a
0 ETH0.0010214117.09225178
Fulfill Non Comp...176694472023-07-11 9:20:59364 days ago1689067259IN
MEV Bot: 0x000...b0a
0 ETH0.0028409917.74416013
Migrate Balance176693962023-07-11 9:10:47364 days ago1689066647IN
MEV Bot: 0x000...b0a
0 ETH0.0035855460
Set Migration Ad...176690992023-07-11 8:10:23364 days ago1689063023IN
MEV Bot: 0x000...b0a
0 ETH0.0008760919.02734844
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
190409422024-01-19 12:35:11172 days ago1705667711
MEV Bot: 0x000...b0a
0.00000041 ETH
177755172023-07-26 6:38:35349 days ago1690353515
MEV Bot: 0x000...b0a
1.3 ETH
176953472023-07-15 0:47:35360 days ago1689382055
MEV Bot: 0x000...b0a
0.5 ETH
176936302023-07-14 18:58:59360 days ago1689361139
MEV Bot: 0x000...b0a
0.00099999 ETH
176799972023-07-12 20:57:47362 days ago1689195467
MEV Bot: 0x000...b0a
8.2 ETH
176799542023-07-12 20:49:11362 days ago1689194951
MEV Bot: 0x000...b0a
3 ETH
176787932023-07-12 16:54:23362 days ago1689180863
MEV Bot: 0x000...b0a
2.59483433 ETH
176785732023-07-12 16:09:35362 days ago1689178175
MEV Bot: 0x000...b0a
1.482 ETH
176739602023-07-12 0:34:47363 days ago1689122087
MEV Bot: 0x000...b0a
1.09479999 ETH
176739322023-07-12 0:29:11363 days ago1689121751
MEV Bot: 0x000...b0a
3 ETH
176724412023-07-11 19:26:23363 days ago1689103583
MEV Bot: 0x000...b0a
0.4 ETH
176724052023-07-11 19:19:11363 days ago1689103151
MEV Bot: 0x000...b0a
12.13392 ETH
176722062023-07-11 18:38:47363 days ago1689100727
MEV Bot: 0x000...b0a
0.01951678 ETH
176719072023-07-11 17:38:47363 days ago1689097127
MEV Bot: 0x000...b0a
5 ETH
176718952023-07-11 17:36:11363 days ago1689096971
MEV Bot: 0x000...b0a
8.77392494 ETH
176717292023-07-11 17:02:59363 days ago1689094979
MEV Bot: 0x000...b0a
2.25 ETH
176700412023-07-11 11:21:47364 days ago1689074507
MEV Bot: 0x000...b0a
0.00436859 ETH
176700412023-07-11 11:21:47364 days ago1689074507
MEV Bot: 0x000...b0a
0.149 ETH
176700412023-07-11 11:21:47364 days ago1689074507
MEV Bot: 0x000...b0a
0.0116314 ETH
176694612023-07-11 9:23:47364 days ago1689067427
MEV Bot: 0x000...b0a
0.04073976 ETH
176694472023-07-11 9:20:59364 days ago1689067259
MEV Bot: 0x000...b0a
0.005 ETH
176694472023-07-11 9:20:59364 days ago1689067259
MEV Bot: 0x000...b0a
0.44408535 ETH
176694472023-07-11 9:20:59364 days ago1689067259
MEV Bot: 0x000...b0a
0.44908535 ETH
176693962023-07-11 9:10:47364 days ago1689066647
MEV Bot: 0x000...b0a
0.712 ETH
176674582023-07-11 2:38:47364 days ago1689043127
MEV Bot: 0x000...b0a
0.01637894 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AutoSniper

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 11 : AutoSniper.sol
// // // SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.18;

import "./helpers/SniperStructs.sol";
import "./helpers/IWETH.sol";
import "./helpers/IPunk.sol";
import "./helpers/SniperErrors.sol";
import "solmate/src/auth/Owned.sol";
import "openzeppelin/contracts/token/ERC721/IERC721.sol";
import "openzeppelin/contracts/token/ERC20/IERC20.sol";
import "openzeppelin/contracts/token/ERC1155/IERC1155.sol";

/**
 * @title AutoSniper 2.0 for @oSnipeNFT
 * @author 0xQuit
 */

/*

        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*+=--::::::--=+*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*=:.       ......        :=*%@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#=.    .-+*%@@@@@@@@@@@@%#+=:    -@@@@@@=:::=#@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@%+.   :=#@@@@@@@@@@@@@@@@@@@@@@@@#+#@@@@@%**+-:::-%@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@#-   :+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%******+-::=@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@%:   =%@@@@@@@@@@@@@@@@%%%%@@@@@@@@@@@@@@%*++++++***+=+@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@=   -@@@@@@@@@@@@#+-:.         :-+%@@@@@%*+++++++++*#@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@#.  :%@@@@@@@@@%+:      ..:::::.  .*@@@%*+++++++++++#@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@*   =@@@@@@@@@#:    .=*%@@@@@@@@@@%@@@%+----======+#@@@@@%@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@+   *@@@@@@@@#:   .+%@@@@@@@@@@@@@@@@@@=-------==+#@@@@@%- -@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@#   #@@@@@@@@=   .*@@@@@@@@@#=.    .-+#+=--------*@@@@@@@%   +@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@.  =@@@@@@@@-   =@@@@@@@@@@:  -+**+-   .--=----+%@@@@@@@@@#   %@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@+  .@@@@@@@@-   +@@@@@@@@@@-  #@@@@%+-:.  :=*@#%@@@*%@@@@@@@=  -@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@.  #@@@@@@@+   =@@@@@@@@@@@:  @@@%=-----.  #@@@@@*. -@@@@@@@@   %@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@#   @@@@@@@@.  .@@@@@@@@@@@@%  :#=:::::--*+=@@@@@@-   %@@@@@@@-  +@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@+  :@@@@@@@%   =@@@@@@@@@@@@@%-:--::::-*@@@@@@@@@@*   *@@@@@@@+  :@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@=  -@@@@@@@#   +@@@@@@@@@@@@@#-:---:-*@@@@@@@@@@@@#   +@@@@@@@+  :@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@+  -@@@@@@@%   =@@@@@@*#@@@#-::---=. -@@@@@@@@@@@@*   +@@@@@@@+  :@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@#  .@@@@@@@@   .@@@@@+  #*-:::--*@@#  -@@@@@@@@@@@-   %@@@@@@@-  =@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@   #@@@@@@@+  =@@@@@%  .--:--+@@@@@=  %@@@@@@@@@#   :@@@@@@@@   %@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@=  :@@@@@@@@=%@@@@@@*:   :-*@@@@@@%. .@@@@@@@@@%    %@@@@@@@=  :@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@   +@@@@@@@@@@@@#+---:.  .=*###*-  :%@@@@@@@@#   .%@@@@@@@#   #@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@*   %@@@@@@@@@#=------*%+-      .-#@@@@@@@@%=   .%@@@@@@@@.  =@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@= .*@@@@@@@@+------=%@@@@@@%%%@@@@@@@@@@#-    +@@@@@@@@@:  :@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@#@@@@@@@@*===---=#@@@@@@@@@@@@@@@@@%*-     +@@@@@@@@@#   -@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@*=====+#%@@@@@%= .:--==--:.     .-*@@@@@@@@@@+   +@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@+--==+#@@@@@@@@=:.           :=*%@@@@@@@@@@@*.  .#@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@*===+-*@@@@@@@@@@@@@@%%#####%@@@@@@@@@@@@@@@*.   +@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@#+==#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#=   .+@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@+==+%@@@@@@@@@%*%@@@@@@@@@@@@@@@@@@@@@@@@@*-    -*@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@#=%@@@@@@@@@+    -=*%@@@@@@@@@@@@@@%*+-.    :+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%+-.      ..:::::::.      .-+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*+=-:........:-=+*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

*/

contract AutoSniper is Owned {
    event Snipe(
        SniperOrder order,
        Claim[] claims
    );

    event Deposit(
        address sniper,
        uint256 amount
    );

    event Withdrawal(
        address sniper,
        uint256 amount
    );

    string public constant name = "oSnipe: AutoSniper V2";

    address private constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address private fulfillerAddress = 0x816B65bd147df5C2566d2C9828815E85ff6055c6;
    address public nextContractVersionAddress;
    bool public migrationEnabled;
    mapping(address => bool) public allowedMarketplaces;
    mapping(address => uint256) public sniperBalances;
    mapping(address => SniperGuardrails) public sniperGuardrails;

    constructor() Owned(0x507c8252c764489Dc1150135CA7e41b01e10ee74) {}

    /**
    * @dev fulfillOrder conducts its own checks to ensure that the passed order is a valid sniper
    * before forwarding the snipe on to the appropriate marketplace. Snipers can block orders by setting
    * up guardrails that prevent orders from being fulfilled outside of allowlisted marketplaces or
    * nft contracts, or with tips that exceed a maximum tip amount. WETH is used to subsidize
    * the order in case the Sniper's deposited balance is too low. WETH must be approved in order for this to
    * work. Calculation is done off-chain and passed in via wethAmount. If for some reason there is an overpay,
    * the marketplace will refund the difference, which is added to the Sniper's balance.
    * @param wethSubsidy the amount of WETH that needs to be converted.
    * @param claims an array of claims that the sniped NFT is eligible for. Claims are claimed and
    * transferred to the sniper along with the sniped NFT.
    */
    function fulfillOrder(SniperOrder calldata order, Claim[] calldata claims, uint256 wethSubsidy) external onlyFulfiller {
        _checkGuardrails(order.tokenAddress, order.marketplace, order.autosniperTip, order.to);
        uint256 totalValue = order.value + order.autosniperTip + order.validatorTip;
        if (wethSubsidy > 0) _swapWeth(wethSubsidy, order.to);
        if (sniperBalances[order.to] < totalValue) revert InsufficientBalance();

        uint256 balanceBefore = address(this).balance;

        (bool autosniperPaid, ) = payable(fulfillerAddress).call{value: order.autosniperTip}("");
        if (!autosniperPaid) revert FailedToPayAutosniper();
        (bool orderFilled,) = order.marketplace.call{value: order.value}(order.data);
        if (!orderFilled) revert OrderFailed();
        (bool validatorPaid, ) = block.coinbase.call{value: order.validatorTip}("");
        if (!validatorPaid) revert FailedToPayValidator();

        uint256 balanceAfter = address(this).balance;
        uint256 spent = balanceBefore - balanceAfter;

        sniperBalances[order.to] -= spent;

        _claimAndTransferClaimableAssets(claims, order.to);
        _transferNftToSniper(order.tokenType, order.tokenAddress, order.tokenId, address(this), order.to);
        emit Snipe(order, claims);
    }

    /**
    * @dev fulfillNonCompliantMarketplaceOrder is a variant on fulfillOrder, used for markets that
    * don't allow purchases through contracts. The fulfiller EOA will fulfill the order, and then use
    * this function to get it to the sniper.
    * @param wethSubsidy the amount of WETH that needs to be converted.
    * @param claims an array of claims that the sniped NFT is eligible for. Claims are claimed and
    * transferred to the sniper along with the sniped NFT.
    */
    function fulfillNonCompliantMarketplaceOrder(SniperOrder calldata order, Claim[] calldata claims, uint256 wethSubsidy) external onlyFulfiller {
        _checkGuardrails(order.tokenAddress, order.marketplace, order.autosniperTip, order.to);
        uint256 totalValue = order.value + order.autosniperTip + order.validatorTip;
        if (wethSubsidy > 0) _swapWeth(wethSubsidy, order.to);
        if (sniperBalances[order.to] < totalValue) revert InsufficientBalance();

        uint256 balanceBefore = address(this).balance;

        (bool autosniperPaid, ) = payable(fulfillerAddress).call{value: order.autosniperTip + order.value}("");
        if (!autosniperPaid) revert FailedToPayAutosniper();
        (bool validatorPaid, ) = block.coinbase.call{value: order.validatorTip}("");
        if (!validatorPaid) revert FailedToPayValidator();

        uint256 balanceAfter = address(this).balance;
        uint256 spent = balanceBefore - balanceAfter;

        sniperBalances[order.to] -= spent;

        _transferNftToSniper(order.tokenType, order.tokenAddress, order.tokenId, fulfillerAddress, order.to);

        emit Snipe(order, claims);
    }

    /**
    * @dev solSnatch is a pure arbitrage function for fulfilling an order, and accepting a WETH offer in the same transaction.
    * Contract balance can be used, but user balances cannot be affected - the call will revert if the post-call contract
    * balance is lower than the pre-call balance.
    * @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 validatorTip the amount to send to block.coinbase. Reverts if this is 0.
    */
    function solSnatch(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();
        uint256 balanceBefore = address(this).balance;

        for (uint256 i = 0; i < contractAddresses.length;) {
            (bool success, ) = contractAddresses[i].call{value: values[i]}(calls[i]);
            if (!success) revert OrderFailed();

            unchecked { ++i; }
        }

        (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) revert NoMoneyMoProblems();
        sniperBalances[sniper] += balanceAfter - balanceBefore;

        emit Deposit(sniper, balanceAfter - balanceBefore);
    }

    /**
    * @dev In cases where we execute a snipe without using this contract, use this function as a solution to
    * bypass priority fee by tipping the coinbase directly, and emit Snipe event for logging purposes.
    * @param order this order contains a validator tip which is paid out, and is emitted in the Snipe event
    * @param claims these claims are unused, but are included in the event and should reflect the claims executed
    * as part of the snipe prior to calling this function.
    */
    function sendDirectTipToCoinbase(SniperOrder calldata order, Claim[] calldata claims) external payable onlyFulfiller {
        (bool validatorPaid, ) = block.coinbase.call{value: order.validatorTip}("");
        if (!validatorPaid) revert FailedToPayValidator();

        emit Snipe(order, claims);
    }

    /**
    * @dev deposit Ether into the contract. 
    * @param sniper is the address who's balance is affected.
    */
    function deposit(address sniper) public payable {
        sniperBalances[sniper] += 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 (sniperBalances[msg.sender] < amount) revert InsufficientBalance();
        sniperBalances[msg.sender] -= amount;
        (bool success, ) = payable(msg.sender).call{value: amount}("");
        if (!success) revert FailedToWithdraw();

        emit Withdrawal(msg.sender, amount);
    }

    /**
    * @dev set up a marketplace allowlist.
    * @param guardEnabled if false then marketplace allowlist will not be checked for this user
    * @param marketplaceAllowed boolean indicating whether the marketplace is allowed or not
    */
    function setUserAllowedMarketplaces(bool guardEnabled, bool marketplaceAllowed, address[] calldata marketplaces) external {
        sniperGuardrails[msg.sender].marketplaceGuardEnabled = guardEnabled;
        for (uint256 i = 0; i < marketplaces.length;) {
            sniperGuardrails[msg.sender].allowedMarketplaces[marketplaces[i]] = marketplaceAllowed;
            unchecked { ++i; }
        }
    }

    /**
    * @dev Set up a maximum tip guardrail (in wei). If set to 0, guardrail will be disabled.
    */
    function setUserMaxTip(uint256 maxTipInWei) external {
        sniperGuardrails[msg.sender].maxTip = maxTipInWei;
    }

    /**
    * @dev set up NFT contract allowlist
    * @param guardEnabled if false then NFT contract allowlist will not be checked for this user
    * @param nftAllowed boolean indicating whether the NFT contract is allowed or not
    */
    function setUserAllowedNfts(bool guardEnabled, bool nftAllowed, address[] calldata nfts) external {
        sniperGuardrails[msg.sender].nftContractGuardEnabled = guardEnabled;
        for (uint256 i = 0; i < nfts.length;) {
            sniperGuardrails[msg.sender].allowedNftContracts[nfts[i]] = nftAllowed;
            unchecked { ++i; }
        }
    }

    /**
    * @dev Owner function to set up global marketplace allowlist.
    */
    function configureMarkets(address[] calldata marketplaces, bool status) external onlyOwner {
        for (uint256 i = 0; i < marketplaces.length;) {
            allowedMarketplaces[marketplaces[i]] = status;

            unchecked { ++i; }
        }
    }

    /**
    * @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;
    }

    // getters to simplify web3js calls
    function marketplaceApprovedBySniper(address sniper, address marketplace) external view returns (bool) {
        return sniperGuardrails[sniper].allowedMarketplaces[marketplace];
    }

    function nftContractApprovedBySniper(address sniper, address nftContract) external view returns (bool) {
        return sniperGuardrails[sniper].allowedNftContracts[nftContract];
    }

    /**
    * @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 = sniperBalances[msg.sender];
        sniperBalances[msg.sender] = 0;

        (bool success, ) = nextContractVersionAddress.call{value: balanceToMigrate}(abi.encodeWithSelector(this.deposit.selector, msg.sender));
        if (!success) revert FailedToWithdraw();
    }

    // internal helpers
    function _swapWeth(uint256 wethAmount, address sniper) private onlyFulfiller {
        IWETH weth = IWETH(WETH_ADDRESS);
        weth.transferFrom(sniper, address(this), wethAmount);
        weth.withdraw(wethAmount);

        unchecked { sniperBalances[sniper] += wethAmount; }
    }

    function _transferNftToSniper(ItemType tokenType, address tokenAddress, uint256 tokenId, address source, address sniper) private {
        if (tokenType == ItemType.ERC721) {
            IERC721(tokenAddress).transferFrom(source, sniper, tokenId);
        } else if (tokenType == ItemType.ERC1155) {
            IERC1155(tokenAddress).safeTransferFrom(source, sniper, tokenId, 1, "");
        } else if (tokenType == ItemType.CRYPTOPUNKS) {
            IPunk(tokenAddress).transferPunk(sniper, tokenId);
        } else if (tokenType == ItemType.ERC20) {
            IERC20 token = IERC20(tokenAddress);
            token.transfer(sniper, token.balanceOf(source));
        }
    }

    function _claimAndTransferClaimableAssets(Claim[] calldata claims, address sniper) private {
        for (uint256 i = 0; i < claims.length; i++) {
            Claim memory claim = claims[i];

            (bool claimSuccess, ) = claim.tokenAddress.call(claim.claimData);
            if (!claimSuccess) revert ClaimFailed();

            _transferNftToSniper(claim.tokenType, claim.tokenAddress, claim.tokenId, address(this), sniper);
        }
    }

    function _checkGuardrails(address tokenAddress, address marketplace, uint256 tip, address sniper) private view {
        SniperGuardrails storage guardrails = sniperGuardrails[sniper];

        if (!allowedMarketplaces[marketplace]) revert MarketplaceNotAllowed();
        if (guardrails.maxTip > 0 && tip > guardrails.maxTip) revert MaxTipExceeded();
        if (guardrails.marketplaceGuardEnabled && !guardrails.allowedMarketplaces[marketplace]) revert MarketplaceNotAllowed();
        if (guardrails.nftContractGuardEnabled && !guardrails.allowedNftContracts[tokenAddress]) revert TokenContractNotAllowed();
    }

    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
        virtual
        view
        returns (bool)
    {
        return interfaceId == this.supportsInterface.selector;
    }

    receive() external payable {}

    // 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) onlyOwner external {
        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) onlyOwner external {
        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) onlyOwner external {
        for (uint256 i = 0; i < ids.length; i++) {
            IERC1155(asset).safeTransferFrom(address(this), recipient, ids[i], amounts[i], "");
        }
    }

    modifier onlyFulfiller() {
        if (msg.sender != fulfillerAddress) revert CallerNotFulfiller();
        _;
    }
}

File 2 of 11 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 3 of 11 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 4 of 11 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 5 of 11 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 6 of 11 : Owned.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event OwnershipTransferred(address indexed user, address indexed newOwner);

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(address _owner) {
        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function transferOwnership(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnershipTransferred(msg.sender, newOwner);
    }
}

File 7 of 11 : IPunk.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.18;

interface IPunk {
  function transferPunk(address to, uint punkIndex) external;
}

File 8 of 11 : IWETH.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.18;

interface IWETH {
  function transferFrom(address src, address dst, uint wad) external;
  function deposit() external payable;
  function withdraw(uint wad) external;
  function balanceOf(address user) external view returns (uint256);
  function approve(address guy, uint wad) external returns (bool);
}

File 9 of 11 : SniperEnums.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.18;

// from Seaport
enum ItemType {
    // 0: ETH on mainnet, MATIC on polygon, etc.
    NATIVE,

    // 1: ERC20 items (ERC777 and ERC20 analogues could also technically work)
    ERC20,

    // 2: ERC721 items
    ERC721,

    // 3: ERC1155 items
    ERC1155,

    // 4: ERC721 items where a number of tokenIds are supported
    ERC721_WITH_CRITERIA,

    // 5: ERC1155 items where a number of ids are supported
    ERC1155_WITH_CRITERIA,

    // 6: CryptoPunks
    CRYPTOPUNKS
}

File 10 of 11 : SniperErrors.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

error InsufficientBalance();
error FailedToWithdraw();
error FailedToPayAutosniper();
error FailedToPayValidator();
error MaxTipExceeded();
error MarketplaceNotAllowed();
error TokenContractNotAllowed();
error OrderFailed();
error CallerNotFulfiller();
error ClaimFailed();
error MigrationNotEnabled();
error ArrayLengthMismatch();
error NoMoneyMoProblems();

File 11 of 11 : SniperStructs.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.18;

import "./SniperEnums.sol";

struct SniperOrder {
    address to;
    address marketplace;
    uint256 value;
    uint256 autosniperTip;
    uint256 validatorTip;
    ItemType tokenType;
    bytes data;
    address tokenAddress;
    uint256 tokenId;
}

struct Claim {
    ItemType tokenType;
    address tokenAddress;
    uint256 tokenId;
    bytes claimData;
}

struct SniperGuardrails {
    bool marketplaceGuardEnabled;
    bool nftContractGuardEnabled;
    mapping(address => bool) allowedMarketplaces;
    mapping(address => bool) allowedNftContracts;
    uint256 maxTip;
}

Settings
{
  "remappings": [
    "ERC721A/=lib/ERC721A/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "openzeppelin/=lib/openzeppelin-contracts/",
    "solmate/=lib/solmate/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"CallerNotFulfiller","type":"error"},{"inputs":[],"name":"ClaimFailed","type":"error"},{"inputs":[],"name":"FailedToPayAutosniper","type":"error"},{"inputs":[],"name":"FailedToPayValidator","type":"error"},{"inputs":[],"name":"FailedToWithdraw","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"MarketplaceNotAllowed","type":"error"},{"inputs":[],"name":"MaxTipExceeded","type":"error"},{"inputs":[],"name":"MigrationNotEnabled","type":"error"},{"inputs":[],"name":"NoMoneyMoProblems","type":"error"},{"inputs":[],"name":"OrderFailed","type":"error"},{"inputs":[],"name":"TokenContractNotAllowed","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":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"marketplace","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"autosniperTip","type":"uint256"},{"internalType":"uint256","name":"validatorTip","type":"uint256"},{"internalType":"enum ItemType","name":"tokenType","type":"uint8"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"indexed":false,"internalType":"struct SniperOrder","name":"order","type":"tuple"},{"components":[{"internalType":"enum ItemType","name":"tokenType","type":"uint8"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"claimData","type":"bytes"}],"indexed":false,"internalType":"struct Claim[]","name":"claims","type":"tuple[]"}],"name":"Snipe","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":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMarketplaces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"marketplaces","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"configureMarkets","outputs":[],"stateMutability":"nonpayable","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":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"marketplace","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"autosniperTip","type":"uint256"},{"internalType":"uint256","name":"validatorTip","type":"uint256"},{"internalType":"enum ItemType","name":"tokenType","type":"uint8"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct SniperOrder","name":"order","type":"tuple"},{"components":[{"internalType":"enum ItemType","name":"tokenType","type":"uint8"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"claimData","type":"bytes"}],"internalType":"struct Claim[]","name":"claims","type":"tuple[]"},{"internalType":"uint256","name":"wethSubsidy","type":"uint256"}],"name":"fulfillNonCompliantMarketplaceOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"marketplace","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"autosniperTip","type":"uint256"},{"internalType":"uint256","name":"validatorTip","type":"uint256"},{"internalType":"enum ItemType","name":"tokenType","type":"uint8"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct SniperOrder","name":"order","type":"tuple"},{"components":[{"internalType":"enum ItemType","name":"tokenType","type":"uint8"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"claimData","type":"bytes"}],"internalType":"struct Claim[]","name":"claims","type":"tuple[]"},{"internalType":"uint256","name":"wethSubsidy","type":"uint256"}],"name":"fulfillOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sniper","type":"address"},{"internalType":"address","name":"marketplace","type":"address"}],"name":"marketplaceApprovedBySniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextContractVersionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sniper","type":"address"},{"internalType":"address","name":"nftContract","type":"address"}],"name":"nftContractApprovedBySniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"","type":"address"}],"stateMutability":"view","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":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"marketplace","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"autosniperTip","type":"uint256"},{"internalType":"uint256","name":"validatorTip","type":"uint256"},{"internalType":"enum ItemType","name":"tokenType","type":"uint8"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct SniperOrder","name":"order","type":"tuple"},{"components":[{"internalType":"enum ItemType","name":"tokenType","type":"uint8"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"claimData","type":"bytes"}],"internalType":"struct Claim[]","name":"claims","type":"tuple[]"}],"name":"sendDirectTipToCoinbase","outputs":[],"stateMutability":"payable","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":"guardEnabled","type":"bool"},{"internalType":"bool","name":"marketplaceAllowed","type":"bool"},{"internalType":"address[]","name":"marketplaces","type":"address[]"}],"name":"setUserAllowedMarketplaces","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"guardEnabled","type":"bool"},{"internalType":"bool","name":"nftAllowed","type":"bool"},{"internalType":"address[]","name":"nfts","type":"address[]"}],"name":"setUserAllowedNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTipInWei","type":"uint256"}],"name":"setUserMaxTip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sniperBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sniperGuardrails","outputs":[{"internalType":"bool","name":"marketplaceGuardEnabled","type":"bool"},{"internalType":"bool","name":"nftContractGuardEnabled","type":"bool"},{"internalType":"uint256","name":"maxTip","type":"uint256"}],"stateMutability":"view","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":"solSnatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600180546001600160a01b03191673816b65bd147df5c2566d2c9828815e85ff6055c617905534801561003657600080fd5b50600080546001600160a01b03191673507c8252c764489dc1150135ca7e41b01e10ee749081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350612afd8061009b6000396000f3fe6080604052600436106101e75760003560e01c80637f685c0411610102578063c9c50e2311610095578063f0b9e5ba11610064578063f0b9e5ba1461068c578063f23a6e61146106b7578063f2fde38b146106e4578063f340fa011461070457600080fd5b8063c9c50e23146105cf578063d0e4886d146105ef578063d2b102d71461061f578063d431cac61461066c57600080fd5b8063adb2234e116100d1578063adb2234e146104e7578063b1f9aa8214610545578063b7ce33a214610580578063bc197c81146105a057600080fd5b80637f685c041461045c5780638da5cb5b1461047c57806397ccb19d146104b4578063a2c5a942146104d457600080fd5b80634732a7dc1161017a5780635d0907fb116101495780635d0907fb146103cc5780635d799f87146103ec5780635f3603381461040c578063730ed97b1461042c57600080fd5b80634732a7dc146103645780634c412aa314610384578063530e5406146103a457806357323648146103c457600080fd5b8063270a6231116101b6578063270a6231146102ee5780632e1a7d4d146103035780633219524e1461032357806335b944bf1461034357600080fd5b806301ffc9a7146101f357806306fdde0314610239578063150b7a021461028757806326e2dca2146102cc57600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061022461020e366004611eb2565b6001600160e01b0319166301ffc9a760e01b1490565b60405190151581526020015b60405180910390f35b34801561024557600080fd5b5061027a6040518060400160405280601581526020017437a9b734b8329d1020baba37a9b734b832b9102b1960591b81525081565b6040516102309190611f07565b34801561029357600080fd5b506102b36102a2366004611f9e565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610230565b3480156102d857600080fd5b506102ec6102e7366004612050565b610717565b005b3480156102fa57600080fd5b506102ec610801565b34801561030f57600080fd5b506102ec61031e3660046120b4565b6108fd565b34801561032f57600080fd5b506102ec61033e3660046120de565b6109f7565b34801561034f57600080fd5b5060025461022490600160a01b900460ff1681565b34801561037057600080fd5b506102ec61037f366004612142565b610a8e565b34801561039057600080fd5b506102ec61039f366004612142565b610ae1565b3480156103b057600080fd5b506102246103bf36600461215d565b610b2d565b6102ec610b61565b3480156103d857600080fd5b506102ec6103e73660046121a9565b610b6c565b3480156103f857600080fd5b506102ec61040736600461215d565b610e4d565b34801561041857600080fd5b506102ec6104273660046121a9565b610f60565b34801561043857600080fd5b50610224610447366004612142565b60036020526000908152604090205460ff1681565b34801561046857600080fd5b506102ec6104773660046120de565b6112a8565b34801561048857600080fd5b5060005461049c906001600160a01b031681565b6040516001600160a01b039091168152602001610230565b3480156104c057600080fd5b506102ec6104cf366004612218565b61133a565b6102ec6104e23660046122d4565b61162f565b3480156104f357600080fd5b50610528610502366004612142565b6005602052600090815260409020805460039091015460ff808316926101009004169083565b604080519315158452911515602084015290820152606001610230565b34801561055157600080fd5b50610572610560366004612142565b60046020526000908152604090205481565b604051908152602001610230565b34801561058c57600080fd5b506102ec61059b36600461233c565b611708565b3480156105ac57600080fd5b506102b36105bb3660046123cb565b63bc197c8160e01b98975050505050505050565b3480156105db57600080fd5b5060025461049c906001600160a01b031681565b3480156105fb57600080fd5b506102ec61060a3660046120b4565b33600090815260056020526040902060030155565b34801561062b57600080fd5b5061022461063a36600461215d565b6001600160a01b0391821660009081526005602090815260408083209390941682526002909201909152205460ff1690565b34801561067857600080fd5b506102ec610687366004612485565b6117ed565b34801561069857600080fd5b506102b36106a73660046124db565b63785cf2dd60e11b949350505050565b3480156106c357600080fd5b506102b36106d2366004612528565b63f23a6e6160e01b9695505050505050565b3480156106f057600080fd5b506102ec6106ff366004612142565b61187e565b6102ec610712366004612142565b6118f3565b6000546001600160a01b0316331461074a5760405162461bcd60e51b81526004016107419061259f565b60405180910390fd5b60005b828110156107fa57846001600160a01b03166323b872dd3084878786818110610778576107786125c5565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156107cf57600080fd5b505af11580156107e3573d6000803e3d6000fd5b5050505080806107f2906125f1565b91505061074d565b5050505050565b600254600160a01b900460ff1661082b5760405163f6017bbd60e01b815260040160405180910390fd5b336000818152600460209081526040808320805490849055600254825160248082019790975283518082039097018752604401835292850180516001600160e01b031663f340fa0160e01b179052905190936001600160a01b03909216918491610895919061260a565b60006040518083038185875af1925050503d80600081146108d2576040519150601f19603f3d011682016040523d82523d6000602084013e6108d7565b606091505b50509050806108f957604051632684a07960e01b815260040160405180910390fd5b5050565b3360009081526004602052604090205481111561092d57604051631e9acf1760e31b815260040160405180910390fd5b336000908152600460205260408120805483929061094c908490612626565b9091555050604051600090339083908381818185875af1925050503d8060008114610993576040519150601f19603f3d011682016040523d82523d6000602084013e610998565b606091505b50509050806109ba57604051632684a07960e01b815260040160405180910390fd5b60408051338152602081018490527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65910160405180910390a15050565b336000908152600560205260408120805461ff001916610100871515021790555b818110156107fa573360009081526005602052604081208591600290910190858585818110610a4957610a496125c5565b9050602002016020810190610a5e9190612142565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610a18565b6000546001600160a01b03163314610ab85760405162461bcd60e51b81526004016107419061259f565b600280546001600160a01b039092166001600160a81b031990921691909117600160a01b179055565b6000546001600160a01b03163314610b0b5760405162461bcd60e51b81526004016107419061259f565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038083166000908152600560209081526040808320938516835260019093019052205460ff165b92915050565b610b6a336118f3565b565b6001546001600160a01b03163314610b97576040516319caaa0b60e01b815260040160405180910390fd5b610bd2610bab610100860160e08701612142565b610bbb6040870160208801612142565b6060870135610bcd6020890189612142565b611964565b60006080850135610beb60608701356040880135612639565b610bf59190612639565b90508115610c1357610c1382610c0e6020880188612142565b611a7b565b8060046000610c256020890189612142565b6001600160a01b03166001600160a01b03168152602001908152602001600020541015610c6557604051631e9acf1760e31b815260040160405180910390fd5b60015447906000906001600160a01b0316610c88604089013560608a0135612639565b604051600081818185875af1925050503d8060008114610cc4576040519150601f19603f3d011682016040523d82523d6000602084013e610cc9565b606091505b5050905080610ceb576040516305676c7160e41b815260040160405180910390fd5b604051600090419060808a0135908381818185875af1925050503d8060008114610d31576040519150601f19603f3d011682016040523d82523d6000602084013e610d36565b606091505b5050905080610d5857604051632d66518f60e01b815260040160405180910390fd5b476000610d658286612626565b90508060046000610d7960208e018e612142565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610da89190612626565b90915550610e069050610dc160c08c0160a08d0161265b565b610dd26101008d0160e08e01612142565b8c6101000135600160009054906101000a90046001600160a01b03168e6000016020810190610e019190612142565b611ba0565b7fdf03fa719a9597aa71cfc8cf37de74ffc35af96dca128759dde37afa90e34a298a8a8a604051610e39939291906127d5565b60405180910390a150505050505050505050565b6000546001600160a01b03163314610e775760405162461bcd60e51b81526004016107419061259f565b6040516370a0823160e01b815230600482015282906001600160a01b0382169063a9059cbb90849083906370a0823190602401602060405180830381865afa158015610ec7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eeb91906128b8565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5a91906128d1565b50505050565b6001546001600160a01b03163314610f8b576040516319caaa0b60e01b815260040160405180910390fd5b610f9f610bab610100860160e08701612142565b60006080850135610fb860608701356040880135612639565b610fc29190612639565b90508115610fdb57610fdb82610c0e6020880188612142565b8060046000610fed6020890189612142565b6001600160a01b03166001600160a01b0316815260200190815260200160002054101561102d57604051631e9acf1760e31b815260040160405180910390fd5b60015460405147916000916001600160a01b03909116906060890135908381818185875af1925050503d8060008114611082576040519150601f19603f3d011682016040523d82523d6000602084013e611087565b606091505b50509050806110a9576040516305676c7160e41b815260040160405180910390fd5b60006110bb6040890160208a01612142565b6001600160a01b031660408901356110d660c08b018b6128ee565b6040516110e4929190612934565b60006040518083038185875af1925050503d8060008114611121576040519150601f19603f3d011682016040523d82523d6000602084013e611126565b606091505b50509050806111485760405163e8d529f960e01b815260040160405180910390fd5b604051600090419060808b0135908381818185875af1925050503d806000811461118e576040519150601f19603f3d011682016040523d82523d6000602084013e611193565b606091505b50509050806111b557604051632d66518f60e01b815260040160405180910390fd5b4760006111c28287612626565b905080600460006111d660208f018f612142565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546112059190612626565b9091555061122290508a8a61121d60208f018f612142565b611dc2565b61126061123560c08d0160a08e0161265b565b6112466101008e0160e08f01612142565b8d6101000135308f6000016020810190610e019190612142565b7fdf03fa719a9597aa71cfc8cf37de74ffc35af96dca128759dde37afa90e34a298b8b8b604051611293939291906127d5565b60405180910390a15050505050505050505050565b336000908152600560205260408120805460ff19168615151790555b818110156107fa5733600090815260056020526040812085916001909101908585858181106112f5576112f56125c5565b905060200201602081019061130a9190612142565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556001016112c4565b6001546001600160a01b03163314611365576040516319caaa0b60e01b815260040160405180910390fd5b8786146113855760405163512509d360e11b815260040160405180910390fd5b8584146113a55760405163512509d360e11b815260040160405180910390fd5b4760005b8981101561149b5760008b8b838181106113c5576113c56125c5565b90506020020160208101906113da9190612142565b6001600160a01b03168888848181106113f5576113f56125c5565b905060200201358b8b8581811061140e5761140e6125c5565b905060200281019061142091906128ee565b60405161142e929190612934565b60006040518083038185875af1925050503d806000811461146b576040519150601f19603f3d011682016040523d82523d6000602084013e611470565b606091505b50509050806114925760405163e8d529f960e01b815260040160405180910390fd5b506001016113a9565b50604051600090419085908381818185875af1925050503d80600081146114de576040519150601f19603f3d011682016040523d82523d6000602084013e6114e3565b606091505b505090508061150557604051632d66518f60e01b815260040160405180910390fd5b6001546040516000916001600160a01b03169085908381818185875af1925050503d8060008114611552576040519150601f19603f3d011682016040523d82523d6000602084013e611557565b606091505b5050905080611579576040516305676c7160e41b815260040160405180910390fd5b4783811161159a5760405163104d28f560e21b815260040160405180910390fd5b6115a48482612626565b6001600160a01b038816600090815260046020526040812080549091906115cc908490612639565b909155507fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9050876115fe8684612626565b604080516001600160a01b03909316835260208301919091520160405180910390a150505050505050505050505050565b6001546001600160a01b0316331461165a576040516319caaa0b60e01b815260040160405180910390fd5b60405160009041906080860135908381818185875af1925050503d80600081146116a0576040519150601f19603f3d011682016040523d82523d6000602084013e6116a5565b606091505b50509050806116c757604051632d66518f60e01b815260040160405180910390fd5b7fdf03fa719a9597aa71cfc8cf37de74ffc35af96dca128759dde37afa90e34a298484846040516116fa939291906127d5565b60405180910390a150505050565b6000546001600160a01b031633146117325760405162461bcd60e51b81526004016107419061259f565b60005b848110156117e457866001600160a01b031663f242432a3084898986818110611760576117606125c5565b90506020020135888887818110611779576117796125c5565b905060200201356040518563ffffffff1660e01b815260040161179f9493929190612944565b600060405180830381600087803b1580156117b957600080fd5b505af11580156117cd573d6000803e3d6000fd5b5050505080806117dc906125f1565b915050611735565b50505050505050565b6000546001600160a01b031633146118175760405162461bcd60e51b81526004016107419061259f565b60005b82811015610f5a578160036000868685818110611839576118396125c5565b905060200201602081019061184e9190612142565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560010161181a565b6000546001600160a01b031633146118a85760405162461bcd60e51b81526004016107419061259f565b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6001600160a01b0381166000908152600460205260408120805434929061191b908490612639565b9091555050604080516001600160a01b03831681523460208201527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c910160405180910390a150565b6001600160a01b0380821660009081526005602090815260408083209387168352600390915290205460ff166119ad576040516311de472b60e11b815260040160405180910390fd5b600081600301541180156119c45750806003015483115b156119e25760405163c185173d60e01b815260040160405180910390fd5b805460ff168015611a0e57506001600160a01b038416600090815260018201602052604090205460ff16155b15611a2c576040516311de472b60e11b815260040160405180910390fd5b8054610100900460ff168015611a5d57506001600160a01b038516600090815260028201602052604090205460ff16155b156107fa57604051631a70568560e21b815260040160405180910390fd5b6001546001600160a01b03163314611aa6576040516319caaa0b60e01b815260040160405180910390fd5b6040516323b872dd60e01b81526001600160a01b03821660048201523060248201526044810183905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29081906323b872dd90606401600060405180830381600087803b158015611b0a57600080fd5b505af1158015611b1e573d6000803e3d6000fd5b5050604051632e1a7d4d60e01b8152600481018690526001600160a01b0384169250632e1a7d4d9150602401600060405180830381600087803b158015611b6457600080fd5b505af1158015611b78573d6000803e3d6000fd5b5050506001600160a01b03909216600090815260046020526040902080549093019092555050565b6002856006811115611bb457611bb4612676565b03611c29576040516323b872dd60e01b81526001600160a01b0383811660048301528281166024830152604482018590528516906323b872dd906064015b600060405180830381600087803b158015611c0c57600080fd5b505af1158015611c20573d6000803e3d6000fd5b505050506107fa565b6003856006811115611c3d57611c3d612676565b03611c7557604051637921219560e11b81526001600160a01b0385169063f242432a90611bf290859085908890600190600401612944565b6006856006811115611c8957611c89612676565b03611cc3576040516322dca8bb60e21b81526001600160a01b03828116600483015260248201859052851690638b72a2ec90604401611bf2565b6001856006811115611cd757611cd7612676565b036107fa576040516370a0823160e01b81526001600160a01b03838116600483015285919082169063a9059cbb90849083906370a0823190602401602060405180830381865afa158015611d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5391906128b8565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611d9e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e491906128d1565b60005b82811015610f5a576000848483818110611de157611de16125c5565b9050602002810190611df3919061297c565b611dfc90612a00565b9050600081602001516001600160a01b03168260600151604051611e20919061260a565b6000604051808303816000865af19150503d8060008114611e5d576040519150601f19603f3d011682016040523d82523d6000602084013e611e62565b606091505b5050905080611e845760405163360e42e160e01b815260040160405180910390fd5b611e9d8260000151836020015184604001513088611ba0565b50508080611eaa906125f1565b915050611dc5565b600060208284031215611ec457600080fd5b81356001600160e01b031981168114611edc57600080fd5b9392505050565b60005b83811015611efe578181015183820152602001611ee6565b50506000910152565b6020815260008251806020840152611f26816040850160208701611ee3565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114611f5157600080fd5b919050565b60008083601f840112611f6857600080fd5b5081356001600160401b03811115611f7f57600080fd5b602083019150836020828501011115611f9757600080fd5b9250929050565b600080600080600060808688031215611fb657600080fd5b611fbf86611f3a565b9450611fcd60208701611f3a565b93506040860135925060608601356001600160401b03811115611fef57600080fd5b611ffb88828901611f56565b969995985093965092949392505050565b60008083601f84011261201e57600080fd5b5081356001600160401b0381111561203557600080fd5b6020830191508360208260051b8501011115611f9757600080fd5b6000806000806060858703121561206657600080fd5b61206f85611f3a565b935060208501356001600160401b0381111561208a57600080fd5b6120968782880161200c565b90945092506120a9905060408601611f3a565b905092959194509250565b6000602082840312156120c657600080fd5b5035919050565b80151581146120db57600080fd5b50565b600080600080606085870312156120f457600080fd5b84356120ff816120cd565b9350602085013561210f816120cd565b925060408501356001600160401b0381111561212a57600080fd5b6121368782880161200c565b95989497509550505050565b60006020828403121561215457600080fd5b611edc82611f3a565b6000806040838503121561217057600080fd5b61217983611f3a565b915061218760208401611f3a565b90509250929050565b600061012082840312156121a357600080fd5b50919050565b600080600080606085870312156121bf57600080fd5b84356001600160401b03808211156121d657600080fd5b6121e288838901612190565b955060208701359150808211156121f857600080fd5b506122058782880161200c565b9598909750949560400135949350505050565b600080600080600080600080600060c08a8c03121561223657600080fd5b89356001600160401b038082111561224d57600080fd5b6122598d838e0161200c565b909b50995060208c013591508082111561227257600080fd5b61227e8d838e0161200c565b909950975060408c013591508082111561229757600080fd5b506122a48c828d0161200c565b90965094506122b7905060608b01611f3a565b925060808a0135915060a08a013590509295985092959850929598565b6000806000604084860312156122e957600080fd5b83356001600160401b038082111561230057600080fd5b61230c87838801612190565b9450602086013591508082111561232257600080fd5b5061232f8682870161200c565b9497909650939450505050565b6000806000806000806080878903121561235557600080fd5b61235e87611f3a565b955060208701356001600160401b038082111561237a57600080fd5b6123868a838b0161200c565b9097509550604089013591508082111561239f57600080fd5b506123ac89828a0161200c565b90945092506123bf905060608801611f3a565b90509295509295509295565b60008060008060008060008060a0898b0312156123e757600080fd5b6123f089611f3a565b97506123fe60208a01611f3a565b965060408901356001600160401b038082111561241a57600080fd5b6124268c838d0161200c565b909850965060608b013591508082111561243f57600080fd5b61244b8c838d0161200c565b909650945060808b013591508082111561246457600080fd5b506124718b828c01611f56565b999c989b5096995094979396929594505050565b60008060006040848603121561249a57600080fd5b83356001600160401b038111156124b057600080fd5b6124bc8682870161200c565b90945092505060208401356124d0816120cd565b809150509250925092565b600080600080606085870312156124f157600080fd5b6124fa85611f3a565b93506020850135925060408501356001600160401b0381111561251c57600080fd5b61213687828801611f56565b60008060008060008060a0878903121561254157600080fd5b61254a87611f3a565b955061255860208801611f3a565b9450604087013593506060870135925060808701356001600160401b0381111561258157600080fd5b61258d89828a01611f56565b979a9699509497509295939492505050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612603576126036125db565b5060010190565b6000825161261c818460208701611ee3565b9190910192915050565b81810381811115610b5b57610b5b6125db565b80820180821115610b5b57610b5b6125db565b803560078110611f5157600080fd5b60006020828403121561266d57600080fd5b611edc8261264c565b634e487b7160e01b600052602160045260246000fd5b600781106126aa57634e487b7160e01b600052602160045260246000fd5b9052565b6000808335601e198436030181126126c557600080fd5b83016020810192503590506001600160401b038111156126e457600080fd5b803603821315611f9757600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b81835260006020808501808196508560051b81019150846000805b888110156127c7578385038a528235607e19893603018112612757578283fd5b8801608061276d876127688461264c565b61268c565b6001600160a01b03612780838a01611f3a565b168789015260408281013590880152606061279d818401846126ae565b935082828a01526127b1838a0185836126f3565b9d8a019d98505050938701935050600101612737565b509298975050505050505050565b604081526127f6604082016127e986611f3a565b6001600160a01b03169052565b600061280460208601611f3a565b6001600160a01b03811660608401525060408501356080830152606085013560a0830152608085013560c083015261283e60a0860161264c565b61284b60e084018261268c565b5061285960c08601866126ae565b6101206101008181870152612873610160870184866126f3565b935061288160e08a01611f3a565b6001600160a01b0316918601919091528701356101408501525082810360208401526128ae81858761271c565b9695505050505050565b6000602082840312156128ca57600080fd5b5051919050565b6000602082840312156128e357600080fd5b8151611edc816120cd565b6000808335601e1984360301811261290557600080fd5b8301803591506001600160401b0382111561291f57600080fd5b602001915036819003821315611f9757600080fd5b8183823760009101908152919050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b60008235607e1983360301811261261c57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156129ca576129ca612992565b60405290565b604051601f8201601f191681016001600160401b03811182821017156129f8576129f8612992565b604052919050565b600060808236031215612a1257600080fd5b612a1a6129a8565b612a238361264c565b81526020612a32818501611f3a565b818301526040840135604083015260608401356001600160401b0380821115612a5a57600080fd5b9085019036601f830112612a6d57600080fd5b813581811115612a7f57612a7f612992565b612a91601f8201601f191685016129d0565b91508082523684828501011115612aa757600080fd5b80848401858401376000908201909301929092525060608201529291505056fea264697066735822122016d284d288885193d16164373e24ea34e6c6f64012461e73a700e14d9618f17b64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106101e75760003560e01c80637f685c0411610102578063c9c50e2311610095578063f0b9e5ba11610064578063f0b9e5ba1461068c578063f23a6e61146106b7578063f2fde38b146106e4578063f340fa011461070457600080fd5b8063c9c50e23146105cf578063d0e4886d146105ef578063d2b102d71461061f578063d431cac61461066c57600080fd5b8063adb2234e116100d1578063adb2234e146104e7578063b1f9aa8214610545578063b7ce33a214610580578063bc197c81146105a057600080fd5b80637f685c041461045c5780638da5cb5b1461047c57806397ccb19d146104b4578063a2c5a942146104d457600080fd5b80634732a7dc1161017a5780635d0907fb116101495780635d0907fb146103cc5780635d799f87146103ec5780635f3603381461040c578063730ed97b1461042c57600080fd5b80634732a7dc146103645780634c412aa314610384578063530e5406146103a457806357323648146103c457600080fd5b8063270a6231116101b6578063270a6231146102ee5780632e1a7d4d146103035780633219524e1461032357806335b944bf1461034357600080fd5b806301ffc9a7146101f357806306fdde0314610239578063150b7a021461028757806326e2dca2146102cc57600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061022461020e366004611eb2565b6001600160e01b0319166301ffc9a760e01b1490565b60405190151581526020015b60405180910390f35b34801561024557600080fd5b5061027a6040518060400160405280601581526020017437a9b734b8329d1020baba37a9b734b832b9102b1960591b81525081565b6040516102309190611f07565b34801561029357600080fd5b506102b36102a2366004611f9e565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610230565b3480156102d857600080fd5b506102ec6102e7366004612050565b610717565b005b3480156102fa57600080fd5b506102ec610801565b34801561030f57600080fd5b506102ec61031e3660046120b4565b6108fd565b34801561032f57600080fd5b506102ec61033e3660046120de565b6109f7565b34801561034f57600080fd5b5060025461022490600160a01b900460ff1681565b34801561037057600080fd5b506102ec61037f366004612142565b610a8e565b34801561039057600080fd5b506102ec61039f366004612142565b610ae1565b3480156103b057600080fd5b506102246103bf36600461215d565b610b2d565b6102ec610b61565b3480156103d857600080fd5b506102ec6103e73660046121a9565b610b6c565b3480156103f857600080fd5b506102ec61040736600461215d565b610e4d565b34801561041857600080fd5b506102ec6104273660046121a9565b610f60565b34801561043857600080fd5b50610224610447366004612142565b60036020526000908152604090205460ff1681565b34801561046857600080fd5b506102ec6104773660046120de565b6112a8565b34801561048857600080fd5b5060005461049c906001600160a01b031681565b6040516001600160a01b039091168152602001610230565b3480156104c057600080fd5b506102ec6104cf366004612218565b61133a565b6102ec6104e23660046122d4565b61162f565b3480156104f357600080fd5b50610528610502366004612142565b6005602052600090815260409020805460039091015460ff808316926101009004169083565b604080519315158452911515602084015290820152606001610230565b34801561055157600080fd5b50610572610560366004612142565b60046020526000908152604090205481565b604051908152602001610230565b34801561058c57600080fd5b506102ec61059b36600461233c565b611708565b3480156105ac57600080fd5b506102b36105bb3660046123cb565b63bc197c8160e01b98975050505050505050565b3480156105db57600080fd5b5060025461049c906001600160a01b031681565b3480156105fb57600080fd5b506102ec61060a3660046120b4565b33600090815260056020526040902060030155565b34801561062b57600080fd5b5061022461063a36600461215d565b6001600160a01b0391821660009081526005602090815260408083209390941682526002909201909152205460ff1690565b34801561067857600080fd5b506102ec610687366004612485565b6117ed565b34801561069857600080fd5b506102b36106a73660046124db565b63785cf2dd60e11b949350505050565b3480156106c357600080fd5b506102b36106d2366004612528565b63f23a6e6160e01b9695505050505050565b3480156106f057600080fd5b506102ec6106ff366004612142565b61187e565b6102ec610712366004612142565b6118f3565b6000546001600160a01b0316331461074a5760405162461bcd60e51b81526004016107419061259f565b60405180910390fd5b60005b828110156107fa57846001600160a01b03166323b872dd3084878786818110610778576107786125c5565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156107cf57600080fd5b505af11580156107e3573d6000803e3d6000fd5b5050505080806107f2906125f1565b91505061074d565b5050505050565b600254600160a01b900460ff1661082b5760405163f6017bbd60e01b815260040160405180910390fd5b336000818152600460209081526040808320805490849055600254825160248082019790975283518082039097018752604401835292850180516001600160e01b031663f340fa0160e01b179052905190936001600160a01b03909216918491610895919061260a565b60006040518083038185875af1925050503d80600081146108d2576040519150601f19603f3d011682016040523d82523d6000602084013e6108d7565b606091505b50509050806108f957604051632684a07960e01b815260040160405180910390fd5b5050565b3360009081526004602052604090205481111561092d57604051631e9acf1760e31b815260040160405180910390fd5b336000908152600460205260408120805483929061094c908490612626565b9091555050604051600090339083908381818185875af1925050503d8060008114610993576040519150601f19603f3d011682016040523d82523d6000602084013e610998565b606091505b50509050806109ba57604051632684a07960e01b815260040160405180910390fd5b60408051338152602081018490527f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65910160405180910390a15050565b336000908152600560205260408120805461ff001916610100871515021790555b818110156107fa573360009081526005602052604081208591600290910190858585818110610a4957610a496125c5565b9050602002016020810190610a5e9190612142565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610a18565b6000546001600160a01b03163314610ab85760405162461bcd60e51b81526004016107419061259f565b600280546001600160a01b039092166001600160a81b031990921691909117600160a01b179055565b6000546001600160a01b03163314610b0b5760405162461bcd60e51b81526004016107419061259f565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038083166000908152600560209081526040808320938516835260019093019052205460ff165b92915050565b610b6a336118f3565b565b6001546001600160a01b03163314610b97576040516319caaa0b60e01b815260040160405180910390fd5b610bd2610bab610100860160e08701612142565b610bbb6040870160208801612142565b6060870135610bcd6020890189612142565b611964565b60006080850135610beb60608701356040880135612639565b610bf59190612639565b90508115610c1357610c1382610c0e6020880188612142565b611a7b565b8060046000610c256020890189612142565b6001600160a01b03166001600160a01b03168152602001908152602001600020541015610c6557604051631e9acf1760e31b815260040160405180910390fd5b60015447906000906001600160a01b0316610c88604089013560608a0135612639565b604051600081818185875af1925050503d8060008114610cc4576040519150601f19603f3d011682016040523d82523d6000602084013e610cc9565b606091505b5050905080610ceb576040516305676c7160e41b815260040160405180910390fd5b604051600090419060808a0135908381818185875af1925050503d8060008114610d31576040519150601f19603f3d011682016040523d82523d6000602084013e610d36565b606091505b5050905080610d5857604051632d66518f60e01b815260040160405180910390fd5b476000610d658286612626565b90508060046000610d7960208e018e612142565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610da89190612626565b90915550610e069050610dc160c08c0160a08d0161265b565b610dd26101008d0160e08e01612142565b8c6101000135600160009054906101000a90046001600160a01b03168e6000016020810190610e019190612142565b611ba0565b7fdf03fa719a9597aa71cfc8cf37de74ffc35af96dca128759dde37afa90e34a298a8a8a604051610e39939291906127d5565b60405180910390a150505050505050505050565b6000546001600160a01b03163314610e775760405162461bcd60e51b81526004016107419061259f565b6040516370a0823160e01b815230600482015282906001600160a01b0382169063a9059cbb90849083906370a0823190602401602060405180830381865afa158015610ec7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eeb91906128b8565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5a91906128d1565b50505050565b6001546001600160a01b03163314610f8b576040516319caaa0b60e01b815260040160405180910390fd5b610f9f610bab610100860160e08701612142565b60006080850135610fb860608701356040880135612639565b610fc29190612639565b90508115610fdb57610fdb82610c0e6020880188612142565b8060046000610fed6020890189612142565b6001600160a01b03166001600160a01b0316815260200190815260200160002054101561102d57604051631e9acf1760e31b815260040160405180910390fd5b60015460405147916000916001600160a01b03909116906060890135908381818185875af1925050503d8060008114611082576040519150601f19603f3d011682016040523d82523d6000602084013e611087565b606091505b50509050806110a9576040516305676c7160e41b815260040160405180910390fd5b60006110bb6040890160208a01612142565b6001600160a01b031660408901356110d660c08b018b6128ee565b6040516110e4929190612934565b60006040518083038185875af1925050503d8060008114611121576040519150601f19603f3d011682016040523d82523d6000602084013e611126565b606091505b50509050806111485760405163e8d529f960e01b815260040160405180910390fd5b604051600090419060808b0135908381818185875af1925050503d806000811461118e576040519150601f19603f3d011682016040523d82523d6000602084013e611193565b606091505b50509050806111b557604051632d66518f60e01b815260040160405180910390fd5b4760006111c28287612626565b905080600460006111d660208f018f612142565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546112059190612626565b9091555061122290508a8a61121d60208f018f612142565b611dc2565b61126061123560c08d0160a08e0161265b565b6112466101008e0160e08f01612142565b8d6101000135308f6000016020810190610e019190612142565b7fdf03fa719a9597aa71cfc8cf37de74ffc35af96dca128759dde37afa90e34a298b8b8b604051611293939291906127d5565b60405180910390a15050505050505050505050565b336000908152600560205260408120805460ff19168615151790555b818110156107fa5733600090815260056020526040812085916001909101908585858181106112f5576112f56125c5565b905060200201602081019061130a9190612142565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556001016112c4565b6001546001600160a01b03163314611365576040516319caaa0b60e01b815260040160405180910390fd5b8786146113855760405163512509d360e11b815260040160405180910390fd5b8584146113a55760405163512509d360e11b815260040160405180910390fd5b4760005b8981101561149b5760008b8b838181106113c5576113c56125c5565b90506020020160208101906113da9190612142565b6001600160a01b03168888848181106113f5576113f56125c5565b905060200201358b8b8581811061140e5761140e6125c5565b905060200281019061142091906128ee565b60405161142e929190612934565b60006040518083038185875af1925050503d806000811461146b576040519150601f19603f3d011682016040523d82523d6000602084013e611470565b606091505b50509050806114925760405163e8d529f960e01b815260040160405180910390fd5b506001016113a9565b50604051600090419085908381818185875af1925050503d80600081146114de576040519150601f19603f3d011682016040523d82523d6000602084013e6114e3565b606091505b505090508061150557604051632d66518f60e01b815260040160405180910390fd5b6001546040516000916001600160a01b03169085908381818185875af1925050503d8060008114611552576040519150601f19603f3d011682016040523d82523d6000602084013e611557565b606091505b5050905080611579576040516305676c7160e41b815260040160405180910390fd5b4783811161159a5760405163104d28f560e21b815260040160405180910390fd5b6115a48482612626565b6001600160a01b038816600090815260046020526040812080549091906115cc908490612639565b909155507fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9050876115fe8684612626565b604080516001600160a01b03909316835260208301919091520160405180910390a150505050505050505050505050565b6001546001600160a01b0316331461165a576040516319caaa0b60e01b815260040160405180910390fd5b60405160009041906080860135908381818185875af1925050503d80600081146116a0576040519150601f19603f3d011682016040523d82523d6000602084013e6116a5565b606091505b50509050806116c757604051632d66518f60e01b815260040160405180910390fd5b7fdf03fa719a9597aa71cfc8cf37de74ffc35af96dca128759dde37afa90e34a298484846040516116fa939291906127d5565b60405180910390a150505050565b6000546001600160a01b031633146117325760405162461bcd60e51b81526004016107419061259f565b60005b848110156117e457866001600160a01b031663f242432a3084898986818110611760576117606125c5565b90506020020135888887818110611779576117796125c5565b905060200201356040518563ffffffff1660e01b815260040161179f9493929190612944565b600060405180830381600087803b1580156117b957600080fd5b505af11580156117cd573d6000803e3d6000fd5b5050505080806117dc906125f1565b915050611735565b50505050505050565b6000546001600160a01b031633146118175760405162461bcd60e51b81526004016107419061259f565b60005b82811015610f5a578160036000868685818110611839576118396125c5565b905060200201602081019061184e9190612142565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905560010161181a565b6000546001600160a01b031633146118a85760405162461bcd60e51b81526004016107419061259f565b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6001600160a01b0381166000908152600460205260408120805434929061191b908490612639565b9091555050604080516001600160a01b03831681523460208201527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c910160405180910390a150565b6001600160a01b0380821660009081526005602090815260408083209387168352600390915290205460ff166119ad576040516311de472b60e11b815260040160405180910390fd5b600081600301541180156119c45750806003015483115b156119e25760405163c185173d60e01b815260040160405180910390fd5b805460ff168015611a0e57506001600160a01b038416600090815260018201602052604090205460ff16155b15611a2c576040516311de472b60e11b815260040160405180910390fd5b8054610100900460ff168015611a5d57506001600160a01b038516600090815260028201602052604090205460ff16155b156107fa57604051631a70568560e21b815260040160405180910390fd5b6001546001600160a01b03163314611aa6576040516319caaa0b60e01b815260040160405180910390fd5b6040516323b872dd60e01b81526001600160a01b03821660048201523060248201526044810183905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29081906323b872dd90606401600060405180830381600087803b158015611b0a57600080fd5b505af1158015611b1e573d6000803e3d6000fd5b5050604051632e1a7d4d60e01b8152600481018690526001600160a01b0384169250632e1a7d4d9150602401600060405180830381600087803b158015611b6457600080fd5b505af1158015611b78573d6000803e3d6000fd5b5050506001600160a01b03909216600090815260046020526040902080549093019092555050565b6002856006811115611bb457611bb4612676565b03611c29576040516323b872dd60e01b81526001600160a01b0383811660048301528281166024830152604482018590528516906323b872dd906064015b600060405180830381600087803b158015611c0c57600080fd5b505af1158015611c20573d6000803e3d6000fd5b505050506107fa565b6003856006811115611c3d57611c3d612676565b03611c7557604051637921219560e11b81526001600160a01b0385169063f242432a90611bf290859085908890600190600401612944565b6006856006811115611c8957611c89612676565b03611cc3576040516322dca8bb60e21b81526001600160a01b03828116600483015260248201859052851690638b72a2ec90604401611bf2565b6001856006811115611cd757611cd7612676565b036107fa576040516370a0823160e01b81526001600160a01b03838116600483015285919082169063a9059cbb90849083906370a0823190602401602060405180830381865afa158015611d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5391906128b8565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611d9e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e491906128d1565b60005b82811015610f5a576000848483818110611de157611de16125c5565b9050602002810190611df3919061297c565b611dfc90612a00565b9050600081602001516001600160a01b03168260600151604051611e20919061260a565b6000604051808303816000865af19150503d8060008114611e5d576040519150601f19603f3d011682016040523d82523d6000602084013e611e62565b606091505b5050905080611e845760405163360e42e160e01b815260040160405180910390fd5b611e9d8260000151836020015184604001513088611ba0565b50508080611eaa906125f1565b915050611dc5565b600060208284031215611ec457600080fd5b81356001600160e01b031981168114611edc57600080fd5b9392505050565b60005b83811015611efe578181015183820152602001611ee6565b50506000910152565b6020815260008251806020840152611f26816040850160208701611ee3565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114611f5157600080fd5b919050565b60008083601f840112611f6857600080fd5b5081356001600160401b03811115611f7f57600080fd5b602083019150836020828501011115611f9757600080fd5b9250929050565b600080600080600060808688031215611fb657600080fd5b611fbf86611f3a565b9450611fcd60208701611f3a565b93506040860135925060608601356001600160401b03811115611fef57600080fd5b611ffb88828901611f56565b969995985093965092949392505050565b60008083601f84011261201e57600080fd5b5081356001600160401b0381111561203557600080fd5b6020830191508360208260051b8501011115611f9757600080fd5b6000806000806060858703121561206657600080fd5b61206f85611f3a565b935060208501356001600160401b0381111561208a57600080fd5b6120968782880161200c565b90945092506120a9905060408601611f3a565b905092959194509250565b6000602082840312156120c657600080fd5b5035919050565b80151581146120db57600080fd5b50565b600080600080606085870312156120f457600080fd5b84356120ff816120cd565b9350602085013561210f816120cd565b925060408501356001600160401b0381111561212a57600080fd5b6121368782880161200c565b95989497509550505050565b60006020828403121561215457600080fd5b611edc82611f3a565b6000806040838503121561217057600080fd5b61217983611f3a565b915061218760208401611f3a565b90509250929050565b600061012082840312156121a357600080fd5b50919050565b600080600080606085870312156121bf57600080fd5b84356001600160401b03808211156121d657600080fd5b6121e288838901612190565b955060208701359150808211156121f857600080fd5b506122058782880161200c565b9598909750949560400135949350505050565b600080600080600080600080600060c08a8c03121561223657600080fd5b89356001600160401b038082111561224d57600080fd5b6122598d838e0161200c565b909b50995060208c013591508082111561227257600080fd5b61227e8d838e0161200c565b909950975060408c013591508082111561229757600080fd5b506122a48c828d0161200c565b90965094506122b7905060608b01611f3a565b925060808a0135915060a08a013590509295985092959850929598565b6000806000604084860312156122e957600080fd5b83356001600160401b038082111561230057600080fd5b61230c87838801612190565b9450602086013591508082111561232257600080fd5b5061232f8682870161200c565b9497909650939450505050565b6000806000806000806080878903121561235557600080fd5b61235e87611f3a565b955060208701356001600160401b038082111561237a57600080fd5b6123868a838b0161200c565b9097509550604089013591508082111561239f57600080fd5b506123ac89828a0161200c565b90945092506123bf905060608801611f3a565b90509295509295509295565b60008060008060008060008060a0898b0312156123e757600080fd5b6123f089611f3a565b97506123fe60208a01611f3a565b965060408901356001600160401b038082111561241a57600080fd5b6124268c838d0161200c565b909850965060608b013591508082111561243f57600080fd5b61244b8c838d0161200c565b909650945060808b013591508082111561246457600080fd5b506124718b828c01611f56565b999c989b5096995094979396929594505050565b60008060006040848603121561249a57600080fd5b83356001600160401b038111156124b057600080fd5b6124bc8682870161200c565b90945092505060208401356124d0816120cd565b809150509250925092565b600080600080606085870312156124f157600080fd5b6124fa85611f3a565b93506020850135925060408501356001600160401b0381111561251c57600080fd5b61213687828801611f56565b60008060008060008060a0878903121561254157600080fd5b61254a87611f3a565b955061255860208801611f3a565b9450604087013593506060870135925060808701356001600160401b0381111561258157600080fd5b61258d89828a01611f56565b979a9699509497509295939492505050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612603576126036125db565b5060010190565b6000825161261c818460208701611ee3565b9190910192915050565b81810381811115610b5b57610b5b6125db565b80820180821115610b5b57610b5b6125db565b803560078110611f5157600080fd5b60006020828403121561266d57600080fd5b611edc8261264c565b634e487b7160e01b600052602160045260246000fd5b600781106126aa57634e487b7160e01b600052602160045260246000fd5b9052565b6000808335601e198436030181126126c557600080fd5b83016020810192503590506001600160401b038111156126e457600080fd5b803603821315611f9757600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b81835260006020808501808196508560051b81019150846000805b888110156127c7578385038a528235607e19893603018112612757578283fd5b8801608061276d876127688461264c565b61268c565b6001600160a01b03612780838a01611f3a565b168789015260408281013590880152606061279d818401846126ae565b935082828a01526127b1838a0185836126f3565b9d8a019d98505050938701935050600101612737565b509298975050505050505050565b604081526127f6604082016127e986611f3a565b6001600160a01b03169052565b600061280460208601611f3a565b6001600160a01b03811660608401525060408501356080830152606085013560a0830152608085013560c083015261283e60a0860161264c565b61284b60e084018261268c565b5061285960c08601866126ae565b6101206101008181870152612873610160870184866126f3565b935061288160e08a01611f3a565b6001600160a01b0316918601919091528701356101408501525082810360208401526128ae81858761271c565b9695505050505050565b6000602082840312156128ca57600080fd5b5051919050565b6000602082840312156128e357600080fd5b8151611edc816120cd565b6000808335601e1984360301811261290557600080fd5b8301803591506001600160401b0382111561291f57600080fd5b602001915036819003821315611f9757600080fd5b8183823760009101908152919050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b60008235607e1983360301811261261c57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156129ca576129ca612992565b60405290565b604051601f8201601f191681016001600160401b03811182821017156129f8576129f8612992565b604052919050565b600060808236031215612a1257600080fd5b612a1a6129a8565b612a238361264c565b81526020612a32818501611f3a565b818301526040840135604083015260608401356001600160401b0380821115612a5a57600080fd5b9085019036601f830112612a6d57600080fd5b813581811115612a7f57612a7f612992565b612a91601f8201601f191685016129d0565b91508082523684828501011115612aa757600080fd5b80848401858401376000908201909301929092525060608201529291505056fea264697066735822122016d284d288885193d16164373e24ea34e6c6f64012461e73a700e14d9618f17b64736f6c63430008120033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.