FRAX Price: $0.85 (+6.11%)

Contract

0xf52A7743032D29a3A3CFaDf01BAe660d373AFB88

Overview

FRAX Balance | FXTL Balance

0 FRAX | 0 FXTL

FRAX Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

Please try again later

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SafuLens

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at fraxscan.com on 2024-03-13
*/

// File: contracts/IERC20.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.7.6;

/**
 * @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);
    function symbol() external view returns (string memory);
}

// File: contracts/IRamsesV2Pool.sol


pragma solidity ^0.7.6;

interface IRamsesV2Pool {
    function liquidity() external view returns (uint128);
    function boostedLiquidity() external view returns (uint128);
    function slot0() external view returns (uint160, int24, uint16, uint16, uint16, uint8, bool);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function fee() external view returns (uint24);
}



// File: contracts/IRamsesGaugeV2.sol


pragma solidity >=0.5.0 <0.9.0;

interface IRamsesGaugeV2 {
    /// @notice Emitted when a reward notification is made.
    /// @param from The address from which the reward is notified.
    /// @param reward The address of the reward token.
    /// @param amount The amount of rewards notified.
    /// @param period The period for which the rewards are notified.
    event NotifyReward(
        address indexed from,
        address indexed reward,
        uint256 amount,
        uint256 period
    );

    /// @notice Emitted when a bribe is made.
    /// @param from The address from which the bribe is made.
    /// @param reward The address of the reward token.
    /// @param amount The amount of tokens bribed.
    /// @param period The period for which the bribe is made.
    event Bribe(
        address indexed from,
        address indexed reward,
        uint256 amount,
        uint256 period
    );

    /// @notice Emitted when rewards are claimed.
    /// @param period The period for which the rewards are claimed.
    /// @param _positionHash The identifier of the NFP for which rewards are claimed.
    /// @param receiver The address of the receiver of the claimed rewards.
    /// @param reward The address of the reward token.
    /// @param amount The amount of rewards claimed.
    event ClaimRewards(
        uint256 period,
        bytes32 _positionHash,
        address receiver,
        address reward,
        uint256 amount
    );

    /// @notice Initializes the contract with the provided gaugeFactory, voter, and pool addresses.
    /// @param _gaugeFactory The address of the gaugeFactory to set.
    /// @param _voter The address of the voter to set.
    /// @param _nfpManager The address of the NFP manager to set.
    /// @param _feeCollector The address of the fee collector to set.
    /// @param _pool The address of the pool to set.
    function initialize(
        address _gaugeFactory,
        address _voter,
        address _nfpManager,
        address _feeCollector,
        address _pool
    ) external;

    /// @notice Retrieves the value of the firstPeriod variable.
    /// @return The value of the firstPeriod variable.
    function firstPeriod() external returns (uint256);

    /// @notice Retrieves the total supply of a specific token for a given period.
    /// @param period The period for which to retrieve the total supply.
    /// @param token The address of the token for which to retrieve the total supply.
    /// @return The total supply of the specified token for the given period.
    function tokenTotalSupplyByPeriod(
        uint256 period,
        address token
    ) external view returns (uint256);

    /// @notice Retrieves the total boosted seconds for a specific period.
    /// @param period The period for which to retrieve the total boosted seconds.
    /// @return The total boosted seconds for the specified period.
    function periodTotalBoostedSeconds(
        uint256 period
    ) external view returns (uint256);

    /// @notice Retrieves the getTokenTotalSupplyByPeriod of the current period.
    /// @dev included to support voter's left() check during distribute().
    /// @param token The address of the token for which to retrieve the remaining amount.
    /// @return The amount of tokens left to distribute in this period.
    function left(address token) external view returns (uint256);

    /// @notice Retrieves the reward rate for a specific reward address.
    /// @dev this method returns the base rate without boost
    /// @param token The address of the reward for which to retrieve the reward rate.
    /// @return The reward rate for the specified reward address.
    function rewardRate(address token) external view returns (uint256);

    /// @notice Retrieves the claimed amount for a specific period, position hash, and user address.
    /// @param period The period for which to retrieve the claimed amount.
    /// @param _positionHash The identifier of the NFP for which to retrieve the claimed amount.
    /// @param reward The address of the token for the claimed amount.
    /// @return The claimed amount for the specified period, token ID, and user address.
    function periodClaimedAmount(
        uint256 period,
        bytes32 _positionHash,
        address reward
    ) external view returns (uint256);

    /// @notice Retrieves the last claimed period for a specific token, token ID combination.
    /// @param token The address of the reward token for which to retrieve the last claimed period.
    /// @param _positionHash The identifier of the NFP for which to retrieve the last claimed period.
    /// @return The last claimed period for the specified token and token ID.
    function lastClaimByToken(
        address token,
        bytes32 _positionHash
    ) external view returns (uint256);

    /// @notice Retrieves the reward address at the specified index in the rewards array.
    /// @param index The index of the reward address to retrieve.
    /// @return The reward address at the specified index.
    function rewards(uint256 index) external view returns (address);

    /// @notice Checks if a given address is a valid reward.
    /// @param reward The address to check.
    /// @return A boolean indicating whether the address is a valid reward.
    function isReward(address reward) external view returns (bool);

    /// @notice Returns an array of reward token addresses.
    /// @return An array of reward token addresses.
    function getRewardTokens() external view returns (address[] memory);

    /// @notice Returns the hash used to store positions in a mapping
    /// @param owner The address of the position owner
    /// @param index The index of the position
    /// @param tickLower The lower tick boundary of the position
    /// @param tickUpper The upper tick boundary of the position
    /// @return _hash The hash used to store positions in a mapping
    function positionHash(
        address owner,
        uint256 index,
        int24 tickLower,
        int24 tickUpper
    ) external pure returns (bytes32);

    /// @notice Retrieves the liquidity and boosted liquidity for a specific NFP.
    /// @param tokenId The identifier of the NFP.
    /// @return liquidity The liquidity of the position token.
    /// @return boostedLiquidity The boosted liquidity of the position token.
    /// @return veNftTokenId The attached veNFT
    function positionInfo(
        uint256 tokenId
    )
        external
        view
        returns (
            uint128 liquidity,
            uint128 boostedLiquidity,
            uint256 veNftTokenId
        );

    /// @notice Returns the amount of rewards earned for an NFP.
    /// @param token The address of the token for which to retrieve the earned rewards.
    /// @param tokenId The identifier of the specific NFP for which to retrieve the earned rewards.
    /// @return reward The amount of rewards earned for the specified NFP and tokens.
    function earned(
        address token,
        uint256 tokenId
    ) external view returns (uint256 reward);

    /// @notice Returns the amount of rewards earned during a period for an NFP.
    /// @param period The period for which to retrieve the earned rewards.
    /// @param token The address of the token for which to retrieve the earned rewards.
    /// @param tokenId The identifier of the specific NFP for which to retrieve the earned rewards.
    /// @return reward The amount of rewards earned for the specified NFP and tokens.
    function periodEarned(
        uint256 period,
        address token,
        uint256 tokenId
    ) external view returns (uint256);

    /// @notice Retrieves the earned rewards for a specific period, token, owner, index, tickLower, and tickUpper.
    /// @param period The period for which to retrieve the earned rewards.
    /// @param token The address of the token for which to retrieve the earned rewards.
    /// @param owner The address of the owner for which to retrieve the earned rewards.
    /// @param index The index for which to retrieve the earned rewards.
    /// @param tickLower The tick lower bound for which to retrieve the earned rewards.
    /// @param tickUpper The tick upper bound for which to retrieve the earned rewards.
    /// @return The earned rewards for the specified period, token, owner, index, tickLower, and tickUpper.
    function periodEarned(
        uint256 period,
        address token,
        address owner,
        uint256 index,
        int24 tickLower,
        int24 tickUpper
    ) external view returns (uint256);

    /// @notice Retrieves the earned rewards for a specific period, token, owner, index, tickLower, and tickUpper.
    /// @dev used by getReward() and saves gas by saving states
    /// @param period The period for which to retrieve the earned rewards.
    /// @param token The address of the token for which to retrieve the earned rewards.
    /// @param owner The address of the owner for which to retrieve the earned rewards.
    /// @param index The index for which to retrieve the earned rewards.
    /// @param tickLower The tick lower bound for which to retrieve the earned rewards.
    /// @param tickUpper The tick upper bound for which to retrieve the earned rewards.
    /// @param caching Whether to cache the results or not.
    /// @return The earned rewards for the specified period, token, owner, index, tickLower, and tickUpper.
    function cachePeriodEarned(
        uint256 period,
        address token,
        address owner,
        uint256 index,
        int24 tickLower,
        int24 tickUpper,
        bool caching
    ) external returns (uint256);

    /// @notice Notifies the contract about the amount of rewards to be distributed for a specific token.
    /// @param token The address of the token for which to notify the reward amount.
    /// @param amount The amount of rewards to be distributed.
    function notifyRewardAmount(address token, uint256 amount) external;

    /// @notice Retrieves the reward amount for a specific period, NFP, and token addresses.
    /// @param period The period for which to retrieve the reward amount.
    /// @param tokens The addresses of the tokens for which to retrieve the reward amount.
    /// @param tokenId The identifier of the specific NFP for which to retrieve the reward amount.
    /// @param receiver The address of the receiver of the reward amount.
    function getPeriodReward(
        uint256 period,
        address[] calldata tokens,
        uint256 tokenId,
        address receiver
    ) external;

    /// @notice Retrieves the rewards for a specific period, set of tokens, owner, index, tickLower, tickUpper, and receiver.
    /// @param period The period for which to retrieve the rewards.
    /// @param tokens An array of token addresses for which to retrieve the rewards.
    /// @param owner The address of the owner for which to retrieve the rewards.
    /// @param index The index for which to retrieve the rewards.
    /// @param tickLower The tick lower bound for which to retrieve the rewards.
    /// @param tickUpper The tick upper bound for which to retrieve the rewards.
    /// @param receiver The address of the receiver of the rewards.
    function getPeriodReward(
        uint256 period,
        address[] calldata tokens,
        address owner,
        uint256 index,
        int24 tickLower,
        int24 tickUpper,
        address receiver
    ) external;

    function getRewardForOwner(
        uint256 tokenId,
        address[] memory tokens
    ) external;
}
// File: contracts/IRamsesVoter.sol


pragma solidity ^0.7.6;

interface IRamsesVoter {
    function gauges(address) external view returns (address);
    function length() external view returns (uint256);
    function pools(uint256) external view returns (address);
}


// File: contracts/IRamsesClFactory.sol


pragma solidity ^0.7.6;

interface IRamsesClFactory {
    function getPool(address, address, uint24) external view returns (address);
}

// File: contracts/IRamsesNfpManager.sol


pragma solidity ^0.7.6;

interface IRamsesNfpManager {
    function balanceOf(address) external view returns (uint256);
    function tokenOfOwnerByIndex(address, uint256) external view returns (uint256);
    function positions(uint256) external view returns (uint96,address,address,address,uint24,int24,int24,uint128,uint256,uint256,uint128,uint128);
    function ownerOf(uint256) external view returns (address);
}
// File: contracts/SafuLensNoBoost.sol



pragma solidity ^0.7.6;
pragma abicoder v2;








struct ClData {
    uint256 nft_id;
    address token0;
    address token1;
    string symbol0;
    string symbol1;
    uint24 fee;
    address pool_address;
    address gauge_address;
    uint256 pool_liquidity;
    uint256 pool_boostedliq;
    uint256 boostedliq;
    int24 tick;
    int24 tick_lower;
    int24 tick_upper;
    uint128 liquidity;
    address[] rewardTokens;
    uint256[] earnedTokens;
}

contract SafuLens {
    IRamsesNfpManager public ramsesNfpManager =
        IRamsesNfpManager(0xAAA78E8C4241990B4ce159E105dA08129345946A);
    IRamsesClFactory public ramsesClFactory =
        IRamsesClFactory(0xAAA32926fcE6bE95ea2c51cB4Fcb60836D320C42);
    IRamsesVoter public ramsesVoter =
        IRamsesVoter(0xAAAf3D9CDD3602d117c67D80eEC37a160C8d9869);

    function nftIdsOfOwner(address owner) public view returns (uint256[] memory) {
        uint256[] memory nft_ids = new uint256[](
            ramsesNfpManager.balanceOf(owner)
        );
        for (uint256 i = 0; i < nft_ids.length; i++) {
            nft_ids[i] = ramsesNfpManager.tokenOfOwnerByIndex(owner, i);
        }

        return nft_ids;
    }

    function getClData(uint256 nft_id) public view returns (ClData memory) {
        ClData memory clData;

        clData.nft_id = nft_id;
        (
            ,
            ,
            clData.token0,
            clData.token1,
            clData.fee,
            clData.tick_lower,
            clData.tick_upper,
            clData.liquidity,
            ,
            ,
            ,

        ) = ramsesNfpManager.positions(nft_id);

        clData.pool_address = ramsesClFactory.getPool(
            clData.token0,
            clData.token1,
            clData.fee
        );
        clData.gauge_address = ramsesVoter.gauges(clData.pool_address);
        clData.symbol0 = IERC20(clData.token0).symbol();
        clData.symbol1 = IERC20(clData.token1).symbol();
        clData.pool_liquidity = IRamsesV2Pool(clData.pool_address).liquidity();
        clData.pool_boostedliq = 0;
        (, clData.tick, , , , , ) = IRamsesV2Pool(clData.pool_address).slot0();

        clData.rewardTokens = IRamsesGaugeV2(clData.gauge_address).getRewardTokens();
        clData.earnedTokens = new uint256[](clData.rewardTokens.length);
        for (uint256 i = 0; i < clData.rewardTokens.length; i++) {
            clData.earnedTokens[i] = IRamsesGaugeV2(clData.gauge_address).earned(clData.rewardTokens[i], clData.nft_id);
        }

        return clData;
    }

    function getClDataBatched(
        uint256[] memory nft_ids
    ) public view returns (ClData[] memory) {
        ClData[] memory clData = new ClData[](nft_ids.length);
        for (uint256 i = 0; i < nft_ids.length; i++) {
            clData[i] = getClData(nft_ids[i]);
        }

        return clData;
    }

    function clDataOfOwner(
        address owner
    ) public view returns (ClData[] memory) {
        uint256[] memory nft_ids = nftIdsOfOwner(owner);

        // Determine the starting index based on the length of the nft_ids array.
        uint256 startIndex = nft_ids.length > 200 ? nft_ids.length - 200 : 0;
        uint256 length = nft_ids.length - startIndex;

        // Create a new array to store the last 200 (or less) NFT IDs.
        uint256[] memory lastNftIds = new uint256[](length);

        for (uint256 i = 0; i < length; i++) {
            lastNftIds[i] = nft_ids[startIndex + i];
        }

        return getClDataBatched(lastNftIds);
    }

    function checkNFTsExistence(uint256[] memory nftIds) public view returns (uint256[] memory) {
        uint256[] memory existingNFTs = new uint256[](nftIds.length);
        uint256 count = 0;

        for (uint256 i = 0; i < nftIds.length; i++) {
            try ramsesNfpManager.ownerOf(nftIds[i]) {
                // If the call doesn't revert, the NFT exists
                existingNFTs[count] = nftIds[i];
                count++;
            } catch {
                // If the call reverts, the NFT doesn't exist, do nothing
            }
        }

        // Resize the array to fit the actual number of existing NFTs
        uint256[] memory resizedArray = new uint256[](count);
        for (uint256 i = 0; i < count; i++) {
            resizedArray[i] = existingNFTs[i];
        }

        return resizedArray;
    }

}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"checkNFTsExistence","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"clDataOfOwner","outputs":[{"components":[{"internalType":"uint256","name":"nft_id","type":"uint256"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"string","name":"symbol0","type":"string"},{"internalType":"string","name":"symbol1","type":"string"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"address","name":"pool_address","type":"address"},{"internalType":"address","name":"gauge_address","type":"address"},{"internalType":"uint256","name":"pool_liquidity","type":"uint256"},{"internalType":"uint256","name":"pool_boostedliq","type":"uint256"},{"internalType":"uint256","name":"boostedliq","type":"uint256"},{"internalType":"int24","name":"tick","type":"int24"},{"internalType":"int24","name":"tick_lower","type":"int24"},{"internalType":"int24","name":"tick_upper","type":"int24"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"earnedTokens","type":"uint256[]"}],"internalType":"struct ClData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nft_id","type":"uint256"}],"name":"getClData","outputs":[{"components":[{"internalType":"uint256","name":"nft_id","type":"uint256"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"string","name":"symbol0","type":"string"},{"internalType":"string","name":"symbol1","type":"string"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"address","name":"pool_address","type":"address"},{"internalType":"address","name":"gauge_address","type":"address"},{"internalType":"uint256","name":"pool_liquidity","type":"uint256"},{"internalType":"uint256","name":"pool_boostedliq","type":"uint256"},{"internalType":"uint256","name":"boostedliq","type":"uint256"},{"internalType":"int24","name":"tick","type":"int24"},{"internalType":"int24","name":"tick_lower","type":"int24"},{"internalType":"int24","name":"tick_upper","type":"int24"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"earnedTokens","type":"uint256[]"}],"internalType":"struct ClData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nft_ids","type":"uint256[]"}],"name":"getClDataBatched","outputs":[{"components":[{"internalType":"uint256","name":"nft_id","type":"uint256"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"string","name":"symbol0","type":"string"},{"internalType":"string","name":"symbol1","type":"string"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"address","name":"pool_address","type":"address"},{"internalType":"address","name":"gauge_address","type":"address"},{"internalType":"uint256","name":"pool_liquidity","type":"uint256"},{"internalType":"uint256","name":"pool_boostedliq","type":"uint256"},{"internalType":"uint256","name":"boostedliq","type":"uint256"},{"internalType":"int24","name":"tick","type":"int24"},{"internalType":"int24","name":"tick_lower","type":"int24"},{"internalType":"int24","name":"tick_upper","type":"int24"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"earnedTokens","type":"uint256[]"}],"internalType":"struct ClData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nftIdsOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ramsesClFactory","outputs":[{"internalType":"contract IRamsesClFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ramsesNfpManager","outputs":[{"internalType":"contract IRamsesNfpManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ramsesVoter","outputs":[{"internalType":"contract IRamsesVoter","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6080604052600080546001600160a01b031990811673aaa78e8c4241990b4ce159e105da08129345946a1790915560018054821673aaa32926fce6be95ea2c51cb4fcb60836d320c421790556002805490911673aaaf3d9cdd3602d117c67d80eec37a160c8d986917905534801561007657600080fd5b50611440806100866000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638b9b48071161005b5780638b9b4807146100fc5780638e03b42214610111578063c3bc213f14610119578063cdafe32d1461013957610088565b8063435520a11461008d5780634babecad146100b65780636a4417d9146100d657806387ed26df146100e9575b600080fd5b6100a061009b366004610ced565b610141565b6040516100ad9190611351565b60405180910390f35b6100c96100c4366004610dca565b6102bd565b6040516100ad91906112f1565b6100c96100e4366004610ced565b61035d565b6100a06100f7366004610dca565b610426565b6101046105dd565b6040516100ad919061129c565b6101046105ec565b61012c610127366004610f80565b6105fb565b6040516100ad9190611364565b610104610bc6565b600080546040516370a0823160e01b8152606092916001600160a01b0316906370a082319061017490869060040161129c565b60206040518083038186803b15801561018c57600080fd5b505afa1580156101a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c49190610f98565b67ffffffffffffffff811180156101da57600080fd5b50604051908082528060200260200182016040528015610204578160200160208202803683370190505b50905060005b81518110156102b457600054604051632f745c5960e01b81526001600160a01b0390911690632f745c599061024590879085906004016112d8565b60206040518083038186803b15801561025d57600080fd5b505afa158015610271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102959190610f98565b8282815181106102a157fe5b602090810291909101015260010161020a565b5090505b919050565b60606000825167ffffffffffffffff811180156102d957600080fd5b5060405190808252806020026020018201604052801561031357816020015b610300610bd5565b8152602001906001900390816102f85790505b50905060005b83518110156102b45761033e84828151811061033157fe5b60200260200101516105fb565b82828151811061034a57fe5b6020908102919091010152600101610319565b6060600061036a83610141565b9050600060c882511161037e576000610384565b60c88251035b825190915081900360008167ffffffffffffffff811180156103a557600080fd5b506040519080825280602002602001820160405280156103cf578160200160208202803683370190505b50905060005b828110156104125784818501815181106103eb57fe5b60200260200101518282815181106103ff57fe5b60209081029190910101526001016103d5565b5061041c816102bd565b9695505050505050565b60606000825167ffffffffffffffff8111801561044257600080fd5b5060405190808252806020026020018201604052801561046c578160200160208202803683370190505b5090506000805b845181101561054f5760005485516001600160a01b0390911690636352211e9087908490811061049f57fe5b60200260200101516040518263ffffffff1660e01b81526004016104c39190611377565b60206040518083038186803b1580156104db57600080fd5b505afa92505050801561050b575060408051601f3d908101601f1916820190925261050891810190610d10565b60015b61051457610547565b5084818151811061052157fe5b602002602001015183838151811061053557fe5b60209081029190910101526001909101905b600101610473565b5060008167ffffffffffffffff8111801561056957600080fd5b50604051908082528060200260200182016040528015610593578160200160208202803683370190505b50905060005b828110156105d4578381815181106105ad57fe5b60200260200101518282815181106105c157fe5b6020908102919091010152600101610599565b50949350505050565b6002546001600160a01b031681565b6001546001600160a01b031681565b610603610bd5565b61060b610bd5565b82815260005460405163133f757160e31b81526001600160a01b03909116906399fbab889061063e908690600401611377565b6101806040518083038186803b15801561065757600080fd5b505afa15801561066b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068f9190610fb0565b505050506001600160801b03166101c0890152600290810b810b6101a089015290810b900b61018087015262ffffff1660a086018190526001600160a01b039182166040808801829052938316602088018190526001549451630b4c774160e11b8152949093169550631698ee82945061070e939091906004016112b0565b60206040518083038186803b15801561072657600080fd5b505afa15801561073a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075e9190610d10565b6001600160a01b0390811660c0830181905260025460405163b9a09fd560e01b815292169163b9a09fd5916107959160040161129c565b60206040518083038186803b1580156107ad57600080fd5b505afa1580156107c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e59190610d10565b8160e001906001600160a01b031690816001600160a01b03168152505080602001516001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561083f57600080fd5b505afa158015610853573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261087b9190810190610e4e565b816060018190525080604001516001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156108c057600080fd5b505afa1580156108d4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108fc9190810190610e4e565b81608001819052508060c001516001600160a01b0316631a6865026040518163ffffffff1660e01b815260040160206040518083038186803b15801561094157600080fd5b505afa158015610955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109799190610ecf565b6001600160801b0316816101000181815250506000816101200181815250508060c001516001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156109d557600080fd5b505afa1580156109e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0d9190610ee9565b5050505050600290810b900b6101608301525060e08101516040805163c4f59f9b60e01b815290516001600160a01b039092169163c4f59f9b91600480820192600092909190829003018186803b158015610a6757600080fd5b505afa158015610a7b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aa39190810190610d2c565b6101e082018190525167ffffffffffffffff81118015610ac257600080fd5b50604051908082528060200260200182016040528015610aec578160200160208202803683370190505b5061020082015260005b816101e00151518110156102b4578160e001516001600160a01b0316633e491d47836101e001518381518110610b2857fe5b602002602001015184600001516040518363ffffffff1660e01b8152600401610b529291906112d8565b60206040518083038186803b158015610b6a57600080fd5b505afa158015610b7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba29190610f98565b8261020001518281518110610bb357fe5b6020908102919091010152600101610af6565b6000546001600160a01b031681565b6040518061022001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016060815260200160608152602001600062ffffff16815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600060020b8152602001600060020b8152602001600060020b815260200160006001600160801b0316815260200160608152602001606081525090565b80516102b8816113f2565b8051600281900b81146102b857600080fd5b80516001600160801b03811681146102b857600080fd5b805161ffff811681146102b857600080fd5b805162ffffff811681146102b857600080fd5b600060208284031215610cfe578081fd5b8135610d09816113f2565b9392505050565b600060208284031215610d21578081fd5b8151610d09816113f2565b60006020808385031215610d3e578182fd5b825167ffffffffffffffff811115610d54578283fd5b8301601f81018513610d64578283fd5b8051610d77610d72826113a4565b611380565b8181528381019083850185840285018601891015610d93578687fd5b8694505b83851015610dbe578051610daa816113f2565b835260019490940193918501918501610d97565b50979650505050505050565b60006020808385031215610ddc578182fd5b823567ffffffffffffffff811115610df2578283fd5b8301601f81018513610e02578283fd5b8035610e10610d72826113a4565b8181528381019083850185840285018601891015610e2c578687fd5b8694505b83851015610dbe578035835260019490940193918501918501610e30565b600060208284031215610e5f578081fd5b815167ffffffffffffffff80821115610e76578283fd5b818401915084601f830112610e89578283fd5b815181811115610e9557fe5b610ea8601f8201601f1916602001611380565b9150808252856020828501011115610ebe578384fd5b6105d48160208401602086016113c2565b600060208284031215610ee0578081fd5b610d0982610cb1565b600080600080600080600060e0888a031215610f03578283fd5b8751610f0e816113f2565b9650610f1c60208901610c9f565b9550610f2a60408901610cc8565b9450610f3860608901610cc8565b9350610f4660808901610cc8565b925060a088015160ff81168114610f5b578283fd5b60c08901519092508015158114610f70578182fd5b8091505092959891949750929550565b600060208284031215610f91578081fd5b5035919050565b600060208284031215610fa9578081fd5b5051919050565b6000806000806000806000806000806000806101808d8f031215610fd2578586fd5b8c516bffffffffffffffffffffffff81168114610fed578687fd5b9b50610ffb60208e01610c94565b9a5061100960408e01610c94565b995061101760608e01610c94565b985061102560808e01610cda565b975061103360a08e01610c9f565b965061104160c08e01610c9f565b955061104f60e08e01610cb1565b94506101008d015193506101208d0151925061106e6101408e01610cb1565b915061107d6101608e01610cb1565b90509295989b509295989b509295989b565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156110d45781516001600160a01b0316875295820195908201906001016110af565b509495945050505050565b6000815180845260208085019450808401835b838110156110d4578151875295820195908201906001016110f2565b60020b9052565b6000815180845261112d8160208601602086016113c2565b601f01601f19169290920160200192915050565b600061022082518452602083015161115c602086018261108f565b50604083015161116f604086018261108f565b50606083015181606086015261118782860182611115565b915050608083015184820360808601526111a18282611115565b91505060a08301516111b660a0860182611293565b5060c08301516111c960c086018261108f565b5060e08301516111dc60e086018261108f565b50610100838101519085015261012080840151908501526101408084015190850152610160808401516112118287018261110e565b5050610180808401516112268287018261110e565b50506101a08084015161123b8287018261110e565b50506101c08084015161125082870182611286565b50506101e0808401518583038287015261126a838261109c565b92505050610200808401518583038287015261041c83826110df565b6001600160801b03169052565b62ffffff169052565b6001600160a01b0391909116815260200190565b6001600160a01b03938416815291909216602082015262ffffff909116604082015260600190565b6001600160a01b03929092168252602082015260400190565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561134457603f19888603018452611332858351611141565b94509285019290850190600101611316565b5092979650505050505050565b600060208252610d0960208301846110df565b600060208252610d096020830184611141565b90815260200190565b60405181810167ffffffffffffffff8111828210171561139c57fe5b604052919050565b600067ffffffffffffffff8211156113b857fe5b5060209081020190565b60005b838110156113dd5781810151838201526020016113c5565b838111156113ec576000848401525b50505050565b6001600160a01b038116811461140757600080fd5b5056fea2646970667358221220481d98ee60fe8bb7b39e64250b1c09a778856b622a76861c18a7abd24261536f64736f6c63430007060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100885760003560e01c80638b9b48071161005b5780638b9b4807146100fc5780638e03b42214610111578063c3bc213f14610119578063cdafe32d1461013957610088565b8063435520a11461008d5780634babecad146100b65780636a4417d9146100d657806387ed26df146100e9575b600080fd5b6100a061009b366004610ced565b610141565b6040516100ad9190611351565b60405180910390f35b6100c96100c4366004610dca565b6102bd565b6040516100ad91906112f1565b6100c96100e4366004610ced565b61035d565b6100a06100f7366004610dca565b610426565b6101046105dd565b6040516100ad919061129c565b6101046105ec565b61012c610127366004610f80565b6105fb565b6040516100ad9190611364565b610104610bc6565b600080546040516370a0823160e01b8152606092916001600160a01b0316906370a082319061017490869060040161129c565b60206040518083038186803b15801561018c57600080fd5b505afa1580156101a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c49190610f98565b67ffffffffffffffff811180156101da57600080fd5b50604051908082528060200260200182016040528015610204578160200160208202803683370190505b50905060005b81518110156102b457600054604051632f745c5960e01b81526001600160a01b0390911690632f745c599061024590879085906004016112d8565b60206040518083038186803b15801561025d57600080fd5b505afa158015610271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102959190610f98565b8282815181106102a157fe5b602090810291909101015260010161020a565b5090505b919050565b60606000825167ffffffffffffffff811180156102d957600080fd5b5060405190808252806020026020018201604052801561031357816020015b610300610bd5565b8152602001906001900390816102f85790505b50905060005b83518110156102b45761033e84828151811061033157fe5b60200260200101516105fb565b82828151811061034a57fe5b6020908102919091010152600101610319565b6060600061036a83610141565b9050600060c882511161037e576000610384565b60c88251035b825190915081900360008167ffffffffffffffff811180156103a557600080fd5b506040519080825280602002602001820160405280156103cf578160200160208202803683370190505b50905060005b828110156104125784818501815181106103eb57fe5b60200260200101518282815181106103ff57fe5b60209081029190910101526001016103d5565b5061041c816102bd565b9695505050505050565b60606000825167ffffffffffffffff8111801561044257600080fd5b5060405190808252806020026020018201604052801561046c578160200160208202803683370190505b5090506000805b845181101561054f5760005485516001600160a01b0390911690636352211e9087908490811061049f57fe5b60200260200101516040518263ffffffff1660e01b81526004016104c39190611377565b60206040518083038186803b1580156104db57600080fd5b505afa92505050801561050b575060408051601f3d908101601f1916820190925261050891810190610d10565b60015b61051457610547565b5084818151811061052157fe5b602002602001015183838151811061053557fe5b60209081029190910101526001909101905b600101610473565b5060008167ffffffffffffffff8111801561056957600080fd5b50604051908082528060200260200182016040528015610593578160200160208202803683370190505b50905060005b828110156105d4578381815181106105ad57fe5b60200260200101518282815181106105c157fe5b6020908102919091010152600101610599565b50949350505050565b6002546001600160a01b031681565b6001546001600160a01b031681565b610603610bd5565b61060b610bd5565b82815260005460405163133f757160e31b81526001600160a01b03909116906399fbab889061063e908690600401611377565b6101806040518083038186803b15801561065757600080fd5b505afa15801561066b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068f9190610fb0565b505050506001600160801b03166101c0890152600290810b810b6101a089015290810b900b61018087015262ffffff1660a086018190526001600160a01b039182166040808801829052938316602088018190526001549451630b4c774160e11b8152949093169550631698ee82945061070e939091906004016112b0565b60206040518083038186803b15801561072657600080fd5b505afa15801561073a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075e9190610d10565b6001600160a01b0390811660c0830181905260025460405163b9a09fd560e01b815292169163b9a09fd5916107959160040161129c565b60206040518083038186803b1580156107ad57600080fd5b505afa1580156107c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e59190610d10565b8160e001906001600160a01b031690816001600160a01b03168152505080602001516001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561083f57600080fd5b505afa158015610853573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261087b9190810190610e4e565b816060018190525080604001516001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156108c057600080fd5b505afa1580156108d4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108fc9190810190610e4e565b81608001819052508060c001516001600160a01b0316631a6865026040518163ffffffff1660e01b815260040160206040518083038186803b15801561094157600080fd5b505afa158015610955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109799190610ecf565b6001600160801b0316816101000181815250506000816101200181815250508060c001516001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156109d557600080fd5b505afa1580156109e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0d9190610ee9565b5050505050600290810b900b6101608301525060e08101516040805163c4f59f9b60e01b815290516001600160a01b039092169163c4f59f9b91600480820192600092909190829003018186803b158015610a6757600080fd5b505afa158015610a7b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aa39190810190610d2c565b6101e082018190525167ffffffffffffffff81118015610ac257600080fd5b50604051908082528060200260200182016040528015610aec578160200160208202803683370190505b5061020082015260005b816101e00151518110156102b4578160e001516001600160a01b0316633e491d47836101e001518381518110610b2857fe5b602002602001015184600001516040518363ffffffff1660e01b8152600401610b529291906112d8565b60206040518083038186803b158015610b6a57600080fd5b505afa158015610b7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba29190610f98565b8261020001518281518110610bb357fe5b6020908102919091010152600101610af6565b6000546001600160a01b031681565b6040518061022001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016060815260200160608152602001600062ffffff16815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600060020b8152602001600060020b8152602001600060020b815260200160006001600160801b0316815260200160608152602001606081525090565b80516102b8816113f2565b8051600281900b81146102b857600080fd5b80516001600160801b03811681146102b857600080fd5b805161ffff811681146102b857600080fd5b805162ffffff811681146102b857600080fd5b600060208284031215610cfe578081fd5b8135610d09816113f2565b9392505050565b600060208284031215610d21578081fd5b8151610d09816113f2565b60006020808385031215610d3e578182fd5b825167ffffffffffffffff811115610d54578283fd5b8301601f81018513610d64578283fd5b8051610d77610d72826113a4565b611380565b8181528381019083850185840285018601891015610d93578687fd5b8694505b83851015610dbe578051610daa816113f2565b835260019490940193918501918501610d97565b50979650505050505050565b60006020808385031215610ddc578182fd5b823567ffffffffffffffff811115610df2578283fd5b8301601f81018513610e02578283fd5b8035610e10610d72826113a4565b8181528381019083850185840285018601891015610e2c578687fd5b8694505b83851015610dbe578035835260019490940193918501918501610e30565b600060208284031215610e5f578081fd5b815167ffffffffffffffff80821115610e76578283fd5b818401915084601f830112610e89578283fd5b815181811115610e9557fe5b610ea8601f8201601f1916602001611380565b9150808252856020828501011115610ebe578384fd5b6105d48160208401602086016113c2565b600060208284031215610ee0578081fd5b610d0982610cb1565b600080600080600080600060e0888a031215610f03578283fd5b8751610f0e816113f2565b9650610f1c60208901610c9f565b9550610f2a60408901610cc8565b9450610f3860608901610cc8565b9350610f4660808901610cc8565b925060a088015160ff81168114610f5b578283fd5b60c08901519092508015158114610f70578182fd5b8091505092959891949750929550565b600060208284031215610f91578081fd5b5035919050565b600060208284031215610fa9578081fd5b5051919050565b6000806000806000806000806000806000806101808d8f031215610fd2578586fd5b8c516bffffffffffffffffffffffff81168114610fed578687fd5b9b50610ffb60208e01610c94565b9a5061100960408e01610c94565b995061101760608e01610c94565b985061102560808e01610cda565b975061103360a08e01610c9f565b965061104160c08e01610c9f565b955061104f60e08e01610cb1565b94506101008d015193506101208d0151925061106e6101408e01610cb1565b915061107d6101608e01610cb1565b90509295989b509295989b509295989b565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156110d45781516001600160a01b0316875295820195908201906001016110af565b509495945050505050565b6000815180845260208085019450808401835b838110156110d4578151875295820195908201906001016110f2565b60020b9052565b6000815180845261112d8160208601602086016113c2565b601f01601f19169290920160200192915050565b600061022082518452602083015161115c602086018261108f565b50604083015161116f604086018261108f565b50606083015181606086015261118782860182611115565b915050608083015184820360808601526111a18282611115565b91505060a08301516111b660a0860182611293565b5060c08301516111c960c086018261108f565b5060e08301516111dc60e086018261108f565b50610100838101519085015261012080840151908501526101408084015190850152610160808401516112118287018261110e565b5050610180808401516112268287018261110e565b50506101a08084015161123b8287018261110e565b50506101c08084015161125082870182611286565b50506101e0808401518583038287015261126a838261109c565b92505050610200808401518583038287015261041c83826110df565b6001600160801b03169052565b62ffffff169052565b6001600160a01b0391909116815260200190565b6001600160a01b03938416815291909216602082015262ffffff909116604082015260600190565b6001600160a01b03929092168252602082015260400190565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561134457603f19888603018452611332858351611141565b94509285019290850190600101611316565b5092979650505050505050565b600060208252610d0960208301846110df565b600060208252610d096020830184611141565b90815260200190565b60405181810167ffffffffffffffff8111828210171561139c57fe5b604052919050565b600067ffffffffffffffff8211156113b857fe5b5060209081020190565b60005b838110156113dd5781810151838201526020016113c5565b838111156113ec576000848401525b50505050565b6001600160a01b038116811461140757600080fd5b5056fea2646970667358221220481d98ee60fe8bb7b39e64250b1c09a778856b622a76861c18a7abd24261536f64736f6c63430007060033

Deployed Bytecode Sourcemap

16702:4001:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17074:363;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18839:319;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;19166:676::-;;;;;;:::i;:::-;;:::i;19850:848::-;;;;;;:::i;:::-;;:::i;16966:99::-;;;:::i;:::-;;;;;;;:::i;16848:111::-;;;:::i;17445:1386::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16727:114::-;;;:::i;17074:363::-;17162:24;17217:16;;:33;;-1:-1:-1;;;17217:33:0;;17133:16;;17162:24;-1:-1:-1;;;;;17217:16:0;;:26;;:33;;17244:5;;17217:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17189:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17189:72:0;;17162:99;;17277:9;17272:131;17296:7;:14;17292:1;:18;17272:131;;;17345:16;;:46;;-1:-1:-1;;;17345:46:0;;-1:-1:-1;;;;;17345:16:0;;;;:36;;:46;;17382:5;;17389:1;;17345:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17332:7;17340:1;17332:10;;;;;;;;;;;;;;;;;:59;17312:3;;17272:131;;;-1:-1:-1;17422:7:0;-1:-1:-1;17074:363:0;;;;:::o;18839:319::-;18928:15;18956:22;18994:7;:14;18981:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;18956:53;;19025:9;19020:105;19044:7;:14;19040:1;:18;19020:105;;;19092:21;19102:7;19110:1;19102:10;;;;;;;;;;;;;;19092:9;:21::i;:::-;19080:6;19087:1;19080:9;;;;;;;;;;;;;;;;;:33;19060:3;;19020:105;;19166:676;19241:15;19269:24;19296:20;19310:5;19296:13;:20::i;:::-;19269:47;;19412:18;19450:3;19433:7;:14;:20;:47;;19479:1;19433:47;;;19473:3;19456:7;:14;:20;19433:47;19508:14;;19412:68;;-1:-1:-1;19508:27:0;;;19491:14;19508:27;19650:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19650:21:0;;19620:51;;19689:9;19684:103;19708:6;19704:1;:10;19684:103;;;19752:7;19773:1;19760:10;:14;19752:23;;;;;;;;;;;;;;19736:10;19747:1;19736:13;;;;;;;;;;;;;;;;;:39;19716:3;;19684:103;;;;19806:28;19823:10;19806:16;:28::i;:::-;19799:35;19166:676;-1:-1:-1;;;;;;19166:676:0:o;19850:848::-;19924:16;19953:29;19999:6;:13;19985:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19985:28:0;;19953:60;;20024:13;20059:9;20054:363;20078:6;:13;20074:1;:17;20054:363;;;20117:16;;20142:9;;-1:-1:-1;;;;;20117:16:0;;;;:24;;20142:6;;20149:1;;20142:9;;;;;;;;;;;;20117:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20117:35:0;;;;;;;;-1:-1:-1;;20117:35:0;;;;;;;;;;;;:::i;:::-;;;20113:293;;;;;;20257:6;20264:1;20257:9;;;;;;;;;;;;;;20235:12;20248:5;20235:19;;;;;;;;;;;;;;;;;:31;20285:7;;;;;20113:293;20093:3;;20054:363;;;;20500:29;20546:5;20532:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20532:20:0;;20500:52;;20568:9;20563:96;20587:5;20583:1;:9;20563:96;;;20632:12;20645:1;20632:15;;;;;;;;;;;;;;20614:12;20627:1;20614:15;;;;;;;;;;;;;;;;;:33;20594:3;;20563:96;;;-1:-1:-1;20678:12:0;19850:848;-1:-1:-1;;;;19850:848:0:o;16966:99::-;;;-1:-1:-1;;;;;16966:99:0;;:::o;16848:111::-;;;-1:-1:-1;;;;;16848:111:0;;:::o;17445:1386::-;17501:13;;:::i;:::-;17527:20;;:::i;:::-;17560:22;;;:13;17861:16;:34;;-1:-1:-1;;;17861:34:0;;-1:-1:-1;;;;;17861:16:0;;;;:26;;:34;;17576:6;;17861:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;17593:302:0;17783:16;;;17593:302;;;;;;;17751:17;;;17593:302;;;;;;17719:17;;;17593:302;;;17694:10;;;17593:302;;;-1:-1:-1;;;;;17593:302:0;;;-1:-1:-1;17666:13:0;;;17593:302;;;;;;-1:-1:-1;17638:13:0;;17593:302;;;17930:15;;:115;;-1:-1:-1;;;17930:115:0;;:15;;;;;-1:-1:-1;17930:23:0;;-1:-1:-1;17930:115:0;;17593:302;;;17930:115;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;17908:137:0;;;:19;;;:137;;;18079:11;;:39;;-1:-1:-1;;;18079:39:0;;:11;;;:18;;:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18056:6;:20;;:62;-1:-1:-1;;;;;18056:62:0;;;-1:-1:-1;;;;;18056:62:0;;;;;18153:6;:13;;;-1:-1:-1;;;;;18146:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18146:30:0;;;;;;;;;;;;:::i;:::-;18129:6;:14;;:47;;;;18211:6;:13;;;-1:-1:-1;;;;;18204:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18204:30:0;;;;;;;;;;;;:::i;:::-;18187:6;:14;;:47;;;;18283:6;:19;;;-1:-1:-1;;;;;18269:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18245:70:0;:6;:21;;:70;;;;;18351:1;18326:6;:22;;:26;;;;;18405:6;:19;;;-1:-1:-1;;;;;18391:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18363:70:0;;;;;;18366:11;;;18363:70;-1:-1:-1;18483:20:0;;;;18468:54;;;-1:-1:-1;;;18468:54:0;;;;-1:-1:-1;;;;;18468:52:0;;;;;;:54;;;;;;;;;;;;;;;:52;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18468:54:0;;;;;;;;;;;;:::i;:::-;18446:19;;;:76;;;18569:26;18555:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18555:41:0;-1:-1:-1;18533:19:0;;;:63;18612:9;18607:191;18631:6;:19;;;:26;18627:1;:30;18607:191;;;18719:6;:20;;;-1:-1:-1;;;;;18704:43:0;;18748:6;:19;;;18768:1;18748:22;;;;;;;;;;;;;;18772:6;:13;;;18704:82;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18679:6;:19;;;18699:1;18679:22;;;;;;;;;;;;;;;;;:107;18659:3;;18607:191;;16727:114;;;-1:-1:-1;;;;;16727:114:0;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:142:1:-;95:13;;117:33;95:13;117:33;:::i;161:166::-;240:13;;293:1;282:20;;;272:31;;262:2;;317:1;314;307:12;332:194;413:13;;-1:-1:-1;;;;;455:46:1;;445:57;;435:2;;516:1;513;506:12;531:165;611:13;;664:6;653:18;;643:29;;633:2;;686:1;683;676:12;701:167;781:13;;834:8;823:20;;813:31;;803:2;;858:1;855;848:12;873:259;;985:2;973:9;964:7;960:23;956:32;953:2;;;1006:6;998;991:22;953:2;1050:9;1037:23;1069:33;1096:5;1069:33;:::i;:::-;1121:5;943:189;-1:-1:-1;;;943:189:1:o;1137:263::-;;1260:2;1248:9;1239:7;1235:23;1231:32;1228:2;;;1281:6;1273;1266:22;1228:2;1318:9;1312:16;1337:33;1364:5;1337:33;:::i;1405:1020::-;;1531:2;1574;1562:9;1553:7;1549:23;1545:32;1542:2;;;1595:6;1587;1580:22;1542:2;1633:9;1627:16;1666:18;1658:6;1655:30;1652:2;;;1703:6;1695;1688:22;1652:2;1731:22;;1784:4;1776:13;;1772:27;-1:-1:-1;1762:2:1;;1818:6;1810;1803:22;1762:2;1852;1846:9;1875:65;1890:49;1936:2;1890:49;:::i;:::-;1875:65;:::i;:::-;1974:15;;;2005:12;;;;2037:11;;;2075;;;2067:20;;2063:29;;2060:42;-1:-1:-1;2057:2:1;;;2120:6;2112;2105:22;2057:2;2147:6;2138:15;;2162:233;2176:2;2173:1;2170:9;2162:233;;;2240:3;2234:10;2257:33;2284:5;2257:33;:::i;:::-;2303:18;;2194:1;2187:9;;;;;2341:12;;;;2373;;2162:233;;;-1:-1:-1;2414:5:1;1511:914;-1:-1:-1;;;;;;;1511:914:1:o;2430:953::-;;2545:2;2588;2576:9;2567:7;2563:23;2559:32;2556:2;;;2609:6;2601;2594:22;2556:2;2654:9;2641:23;2687:18;2679:6;2676:30;2673:2;;;2724:6;2716;2709:22;2673:2;2752:22;;2805:4;2797:13;;2793:27;-1:-1:-1;2783:2:1;;2839:6;2831;2824:22;2783:2;2880;2867:16;2903:65;2918:49;2964:2;2918:49;:::i;2903:65::-;3002:15;;;3033:12;;;;3065:11;;;3103;;;3095:20;;3091:29;;3088:42;-1:-1:-1;3085:2:1;;;3148:6;3140;3133:22;3085:2;3175:6;3166:15;;3190:163;3204:2;3201:1;3198:9;3190:163;;;3261:17;;3249:30;;3222:1;3215:9;;;;;3299:12;;;;3331;;3190:163;;3388:736;;3521:2;3509:9;3500:7;3496:23;3492:32;3489:2;;;3542:6;3534;3527:22;3489:2;3580:9;3574:16;3609:18;3650:2;3642:6;3639:14;3636:2;;;3671:6;3663;3656:22;3636:2;3714:6;3703:9;3699:22;3689:32;;3759:7;3752:4;3748:2;3744:13;3740:27;3730:2;;3786:6;3778;3771:22;3730:2;3820;3814:9;3842:2;3838;3835:10;3832:2;;;3848:9;3832:2;3881:52;3923:2;3904:13;;-1:-1:-1;;3900:27:1;3929:2;3896:36;3881:52;:::i;:::-;3868:65;;3956:2;3949:5;3942:17;3996:7;3991:2;3986;3982;3978:11;3974:20;3971:33;3968:2;;;4022:6;4014;4007:22;3968:2;4040:54;4091:2;4086;4079:5;4075:14;4070:2;4066;4062:11;4040:54;:::i;4129:220::-;;4252:2;4240:9;4231:7;4227:23;4223:32;4220:2;;;4273:6;4265;4258:22;4220:2;4301:42;4333:9;4301:42;:::i;4354:945::-;;;;;;;;4569:3;4557:9;4548:7;4544:23;4540:33;4537:2;;;4591:6;4583;4576:22;4537:2;4628:9;4622:16;4647:33;4674:5;4647:33;:::i;:::-;4699:5;-1:-1:-1;4723:49:1;4768:2;4753:18;;4723:49;:::i;:::-;4713:59;;4791:50;4837:2;4826:9;4822:18;4791:50;:::i;:::-;4781:60;;4860:50;4906:2;4895:9;4891:18;4860:50;:::i;:::-;4850:60;;4929:51;4975:3;4964:9;4960:19;4929:51;:::i;:::-;4919:61;;5025:3;5014:9;5010:19;5004:26;5074:4;5065:7;5061:18;5052:7;5049:31;5039:2;;5099:6;5091;5084:22;5039:2;5179:3;5164:19;;5158:26;5127:7;;-1:-1:-1;5222:15:1;;5215:23;5203:36;;5193:2;;5258:6;5250;5243:22;5193:2;5286:7;5276:17;;;4527:772;;;;;;;;;;:::o;5304:190::-;;5416:2;5404:9;5395:7;5391:23;5387:32;5384:2;;;5437:6;5429;5422:22;5384:2;-1:-1:-1;5465:23:1;;5374:120;-1:-1:-1;5374:120:1:o;5499:194::-;;5622:2;5610:9;5601:7;5597:23;5593:32;5590:2;;;5643:6;5635;5628:22;5590:2;-1:-1:-1;5671:16:1;;5580:113;-1:-1:-1;5580:113:1:o;5698:1224::-;;;;;;;;;;;;;6004:3;5992:9;5983:7;5979:23;5975:33;5972:2;;;6026:6;6018;6011:22;5972:2;6063:9;6057:16;6113:26;6106:5;6102:38;6095:5;6092:49;6082:2;;6160:6;6152;6145:22;6082:2;6188:5;-1:-1:-1;6212:51:1;6259:2;6244:18;;6212:51;:::i;:::-;6202:61;;6282:51;6329:2;6318:9;6314:18;6282:51;:::i;:::-;6272:61;;6352:51;6399:2;6388:9;6384:18;6352:51;:::i;:::-;6342:61;;6422:51;6468:3;6457:9;6453:19;6422:51;:::i;:::-;6412:61;;6492:50;6537:3;6526:9;6522:19;6492:50;:::i;:::-;6482:60;;6561:50;6606:3;6595:9;6591:19;6561:50;:::i;:::-;6551:60;;6630:52;6677:3;6666:9;6662:19;6630:52;:::i;:::-;6620:62;;6722:3;6711:9;6707:19;6701:26;6691:36;;6767:3;6756:9;6752:19;6746:26;6736:36;;6792:52;6839:3;6828:9;6824:19;6792:52;:::i;:::-;6781:63;;6864:52;6911:3;6900:9;6896:19;6864:52;:::i;:::-;6853:63;;5962:960;;;;;;;;;;;;;;:::o;6927:106::-;-1:-1:-1;;;;;6995:31:1;6983:44;;6973:60::o;7038:469::-;;7135:5;7129:12;7162:6;7157:3;7150:19;7188:4;7217:2;7212:3;7208:12;7201:19;;7254:2;7247:5;7243:14;7275:3;7287:195;7301:6;7298:1;7295:13;7287:195;;;7366:13;;-1:-1:-1;;;;;7362:39:1;7350:52;;7422:12;;;;7457:15;;;;7398:1;7316:9;7287:195;;;-1:-1:-1;7498:3:1;;7105:402;-1:-1:-1;;;;;7105:402:1:o;7512:443::-;;7609:5;7603:12;7636:6;7631:3;7624:19;7662:4;7691:2;7686:3;7682:12;7675:19;;7728:2;7721:5;7717:14;7749:3;7761:169;7775:6;7772:1;7769:13;7761:169;;;7836:13;;7824:26;;7870:12;;;;7905:15;;;;7797:1;7790:9;7761:169;;7960:93;8037:1;8026:20;8014:33;;8004:49::o;8058:260::-;;8140:5;8134:12;8167:6;8162:3;8155:19;8183:63;8239:6;8232:4;8227:3;8223:14;8216:4;8209:5;8205:16;8183:63;:::i;:::-;8300:2;8279:15;-1:-1:-1;;8275:29:1;8266:39;;;;8307:4;8262:50;;8110:208;-1:-1:-1;;8110:208:1:o;8323:2201::-;;8403:6;8436:5;8430:12;8425:3;8418:25;8489:4;8482:5;8478:16;8472:23;8504:50;8548:4;8543:3;8539:14;8525:12;8504:50;:::i;:::-;;8602:4;8595:5;8591:16;8585:23;8617:52;8663:4;8658:3;8654:14;8638;8617:52;:::i;:::-;;8717:4;8710:5;8706:16;8700:23;8755:2;8748:4;8743:3;8739:14;8732:26;8779:49;8824:2;8819:3;8815:12;8799:14;8779:49;:::i;:::-;8767:61;;;8876:4;8869:5;8865:16;8859:23;8924:3;8918:4;8914:14;8907:4;8902:3;8898:14;8891:38;8952:41;8988:4;8972:14;8952:41;:::i;:::-;8938:55;;;9041:4;9034:5;9030:16;9024:23;9056:51;9101:4;9096:3;9092:14;9076;9056:51;:::i;:::-;;9155:4;9148:5;9144:16;9138:23;9170:52;9216:4;9211:3;9207:14;9191;9170:52;:::i;:::-;;9270:4;9263:5;9259:16;9253:23;9285:52;9331:4;9326:3;9322:14;9306;9285:52;:::i;:::-;-1:-1:-1;9356:6:1;9398:14;;;9392:21;9378:12;;;9371:43;9433:6;9475:14;;;9469:21;9455:12;;;9448:43;9510:6;9552:14;;;9546:21;9532:12;;;9525:43;9587:6;9630:14;;;9624:21;9654:48;9689:12;;;9624:21;9654:48;:::i;:::-;;;9721:6;9775:2;9768:5;9764:14;9758:21;9788:48;9832:2;9827:3;9823:12;9807:14;9788:48;:::i;:::-;;;9855:6;9909:2;9902:5;9898:14;9892:21;9922:48;9966:2;9961:3;9957:12;9941:14;9922:48;:::i;:::-;;;9989:6;10044:2;10037:5;10033:14;10027:21;10057:51;10104:2;10099:3;10095:12;10078:15;10057:51;:::i;:::-;;;10127:6;10182:2;10175:5;10171:14;10165:21;10228:3;10220:6;10216:16;10211:2;10206:3;10202:12;10195:38;10256:59;10308:6;10291:15;10256:59;:::i;:::-;10242:73;;;;10335:6;10390:3;10383:5;10379:15;10373:22;10438:3;10430:6;10426:16;10420:3;10415;10411:13;10404:39;10459:59;10511:6;10494:15;10459:59;:::i;10529:121::-;-1:-1:-1;;;;;10597:46:1;10585:59;;10575:75::o;10655:94::-;10733:8;10722:20;10710:33;;10700:49::o;10754:203::-;-1:-1:-1;;;;;10918:32:1;;;;10900:51;;10888:2;10873:18;;10855:102::o;10962:388::-;-1:-1:-1;;;;;11218:15:1;;;11200:34;;11270:15;;;;11265:2;11250:18;;11243:43;11334:8;11322:21;;;11317:2;11302:18;;11295:49;11150:2;11135:18;;11117:233::o;11355:274::-;-1:-1:-1;;;;;11547:32:1;;;;11529:51;;11611:2;11596:18;;11589:34;11517:2;11502:18;;11484:145::o;11634:843::-;;11851:2;11891;11880:9;11876:18;11921:2;11910:9;11903:21;11944:6;11979;11973:13;12010:6;12002;11995:22;12048:2;12037:9;12033:18;12026:25;;12111:2;12105;12097:6;12093:15;12082:9;12078:31;12074:40;12060:54;;12149:2;12141:6;12137:15;12170:4;12183:265;12197:6;12194:1;12191:13;12183:265;;;12290:2;12286:7;12274:9;12266:6;12262:22;12258:36;12253:3;12246:49;12318:50;12361:6;12352;12346:13;12318:50;:::i;:::-;12308:60;-1:-1:-1;12426:12:1;;;;12391:15;;;;12219:1;12212:9;12183:265;;;-1:-1:-1;12465:6:1;;11831:646;-1:-1:-1;;;;;;;11831:646:1:o;12482:267::-;;12661:2;12650:9;12643:21;12681:62;12739:2;12728:9;12724:18;12716:6;12681:62;:::i;13447:256::-;;13622:2;13611:9;13604:21;13642:55;13693:2;13682:9;13678:18;13670:6;13642:55;:::i;13708:177::-;13854:25;;;13842:2;13827:18;;13809:76::o;13890:242::-;13960:2;13954:9;13990:17;;;14037:18;14022:34;;14058:22;;;14019:62;14016:2;;;14084:9;14016:2;14111;14104:22;13934:198;;-1:-1:-1;13934:198:1:o;14137:183::-;;14236:18;14228:6;14225:30;14222:2;;;14258:9;14222:2;-1:-1:-1;14309:4:1;14290:17;;;14286:28;;14212:108::o;14325:258::-;14397:1;14407:113;14421:6;14418:1;14415:13;14407:113;;;14497:11;;;14491:18;14478:11;;;14471:39;14443:2;14436:10;14407:113;;;14538:6;14535:1;14532:13;14529:2;;;14573:1;14564:6;14559:3;14555:16;14548:27;14529:2;;14378:205;;;:::o;14588:133::-;-1:-1:-1;;;;;14665:31:1;;14655:42;;14645:2;;14711:1;14708;14701:12;14645:2;14635:86;:::o

Swarm Source

ipfs://481d98ee60fe8bb7b39e64250b1c09a778856b622a76861c18a7abd24261536f

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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.