ETH Price: $1,970.03 (-2.05%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Emergency Withdr...237606722025-11-09 9:00:11112 days ago1762678811IN
0xcDB87367...85D074B3c
0 ETH0.000200863
Unstake237563792025-11-08 18:37:47113 days ago1762627067IN
0xcDB87367...85D074B3c
0 ETH0.000244032.0800349
Unstake237560232025-11-08 17:26:35113 days ago1762622795IN
0xcDB87367...85D074B3c
0 ETH0.000351963
Unstake237559952025-11-08 17:20:59113 days ago1762622459IN
0xcDB87367...85D074B3c
0 ETH0.000351963
Unstake237559862025-11-08 17:19:11113 days ago1762622351IN
0xcDB87367...85D074B3c
0 ETH0.000213422.1295644
Unstake237556912025-11-08 16:20:11113 days ago1762618811IN
0xcDB87367...85D074B3c
0 ETH0.000263422.24535245
Unstake237555872025-11-08 15:59:23113 days ago1762617563IN
0xcDB87367...85D074B3c
0 ETH0.000259162.20902664
Unstake237535412025-11-08 9:06:59113 days ago1762592819IN
0xcDB87367...85D074B3c
0 ETH0.000249172.12383704
Unstake237535382025-11-08 9:06:23113 days ago1762592783IN
0xcDB87367...85D074B3c
0 ETH0.000242922.12122258
Unstake237535362025-11-08 9:05:59113 days ago1762592759IN
0xcDB87367...85D074B3c
0 ETH0.000248422.11750106
Unstake237535292025-11-08 9:04:35113 days ago1762592675IN
0xcDB87367...85D074B3c
0 ETH0.000247422.10896298
Unstake237535232025-11-08 9:03:23113 days ago1762592603IN
0xcDB87367...85D074B3c
0 ETH0.000250732.13716094
Unstake237535172025-11-08 9:02:11113 days ago1762592531IN
0xcDB87367...85D074B3c
0 ETH0.000251762.14591746
Unstake237535142025-11-08 9:01:35113 days ago1762592495IN
0xcDB87367...85D074B3c
0 ETH0.00025132.14201091
Unstake237535122025-11-08 9:01:11113 days ago1762592471IN
0xcDB87367...85D074B3c
0 ETH0.000252042.14829083
Unstake237535102025-11-08 9:00:47113 days ago1762592447IN
0xcDB87367...85D074B3c
0 ETH0.000251722.14560605
Unstake237535082025-11-08 9:00:23113 days ago1762592423IN
0xcDB87367...85D074B3c
0 ETH0.00025092.13864294
Unstake237535052025-11-08 8:59:47113 days ago1762592387IN
0xcDB87367...85D074B3c
0 ETH0.000249962.13058808
Unstake237535002025-11-08 8:58:47113 days ago1762592327IN
0xcDB87367...85D074B3c
0 ETH0.000251062.1399985
Unstake237534962025-11-08 8:57:59113 days ago1762592279IN
0xcDB87367...85D074B3c
0 ETH0.000249222.1242967
Unstake237534932025-11-08 8:57:23113 days ago1762592243IN
0xcDB87367...85D074B3c
0 ETH0.000249212.12422847
Unstake237534912025-11-08 8:56:59113 days ago1762592219IN
0xcDB87367...85D074B3c
0 ETH0.000248612.11907704
Unstake237534892025-11-08 8:56:35113 days ago1762592195IN
0xcDB87367...85D074B3c
0 ETH0.000252.13090681
Unstake237534862025-11-08 8:55:59113 days ago1762592159IN
0xcDB87367...85D074B3c
0 ETH0.000248382.11714436
Unstake237534792025-11-08 8:54:35113 days ago1762592075IN
0xcDB87367...85D074B3c
0 ETH0.000251232.14141616
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
DiamondStakingMigrated

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";

interface IPrivixNFTPass {
    function getTier(uint256 tokenId) external view returns (string memory);
    function ownerOf(uint256 tokenId) external view returns (address);
    function balanceOf(address owner) external view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
}

contract DiamondStakingMigrated is Ownable, ReentrancyGuard {
    using SafeMath for uint256;

    /* ─────────────────── Constants ─────────────────── */
    uint256 public constant STAKING_AMOUNT = 5000 * 10**9;  // 5000 PRIVIX (9 decimals)
    uint256 public constant LOCKUP_PERIOD = 30 days;        // 30 days lockup
    uint256 public constant REWARD_PERIOD = 30 days;        // 30 days reward period
    uint256 public constant DIAMOND_START = 501;            // Diamond NFT range start
    uint256 public constant DIAMOND_END = 1000;             // Diamond NFT range end

    /* ─────────────────── Contract References ─────────────────── */
    IERC20 public immutable privixToken;
    IERC20 public immutable usdtToken;
    IPrivixNFTPass public immutable nftContract;

    /* ─────────────────── Staking Data ─────────────────── */
    struct StakeInfo {
        uint256 amount;              // Amount of PRIVIX staked
        uint256 stakeTime;           // Timestamp when staked
        uint256 lastClaimTime;       // Last time rewards were claimed
        uint256 diamondTokenId;      // Diamond NFT token ID used for staking
        bool isActive;               // Whether stake is active
        uint256 totalClaimed;        // Total USDT claimed by this user
        bool isMigrated;             // Whether this stake was migrated from old contract
        uint256 originalStakeTime;   // Original stake time from old contract (for migrated stakes)
    }

    mapping(address => StakeInfo) public stakes;
    mapping(uint256 => bool) public nftUsedForStaking;  // Track which NFTs are being used for staking

    /* ─────────────────── Staker Tracking ─────────────────── */
    address[] public activeStakers;  // Array of all active staker addresses
    mapping(address => uint256) public stakerIndex;  // Maps staker address to their index in activeStakers array

    /* ─────────────────── Pool Stats ─────────────────── */
    uint256 public totalStaked;
    uint256 public totalStakers;
    uint256 public totalRewardsPaid;
    uint256 public totalMigratedStakers;  // Track migrated stakers
    uint256 public totalMigratedAmount;   // Track migrated amounts

    /* ─────────────────── Migration Support ─────────────────── */
    bool public migrationMode = true;     // Allow migration initially
    address public migrationOperator;     // Address authorized to perform migrations
    uint256 public migrationDeadline;     // After this, migration is locked forever
    
    /* ─────────────────── Events ─────────────────── */
    event Staked(address indexed user, uint256 amount, uint256 diamondTokenId, uint256 timestamp);
    event Unstaked(address indexed user, uint256 amount, uint256 timestamp);
    event RewardsClaimed(address indexed user, uint256 amount, uint256 timestamp);
    event StakeMigrated(address indexed user, uint256 amount, uint256 diamondTokenId, uint256 originalStakeTime);
    event MigrationCompleted(uint256 totalMigrated, uint256 totalAmount);
    event MigrationModeDisabled();

    /* ─────────────────── Constructor ─────────────────── */
    constructor(
        address _privixToken,
        address _usdtToken,
        address _nftContract,
        address _migrationOperator
    ) {
        require(_privixToken != address(0), "Invalid PRIVIX token address");
        require(_usdtToken != address(0), "Invalid USDT token address");
        require(_nftContract != address(0), "Invalid NFT contract address");
        require(_migrationOperator != address(0), "Invalid migration operator address");

        privixToken = IERC20(_privixToken);
        usdtToken = IERC20(_usdtToken);
        nftContract = IPrivixNFTPass(_nftContract);
        migrationOperator = _migrationOperator;
        
        // Set migration deadline to 30 days from deployment
        migrationDeadline = block.timestamp + 30 days;
    }

    /* ─────────────────── Migration Functions ─────────────────── */
    
    /// Migrate a staker from the old contract
    function migrateStaker(
        address staker,
        uint256 amount,
        uint256 originalStakeTime,
        uint256 lastClaimTime,
        uint256 diamondTokenId,
        uint256 totalClaimed
    ) external {
        require(migrationMode, "Migration mode disabled");
        require(msg.sender == migrationOperator || msg.sender == owner(), "Not authorized for migration");
        require(block.timestamp <= migrationDeadline, "Migration deadline passed");
        require(!stakes[staker].isActive, "Staker already active");
        require(amount == STAKING_AMOUNT, "Invalid stake amount");
        require(diamondTokenId >= DIAMOND_START && diamondTokenId <= DIAMOND_END, "Invalid diamond token ID");

        // Verify NFT ownership (current owner should still own the NFT)
        require(nftContract.ownerOf(diamondTokenId) == staker, "Staker no longer owns NFT");
        
        // Verify NFT tier
        string memory tier = nftContract.getTier(diamondTokenId);
        require(keccak256(bytes(tier)) == keccak256(bytes("Diamond")), "NFT is not Diamond tier");
        
        require(!nftUsedForStaking[diamondTokenId], "NFT already used for staking");

        // Create migrated stake record
        stakes[staker] = StakeInfo({
            amount: amount,
            stakeTime: block.timestamp,           // Current time for lockup calculations
            lastClaimTime: lastClaimTime,         // Preserve last claim time
            diamondTokenId: diamondTokenId,
            isActive: true,
            totalClaimed: totalClaimed,           // Preserve total claimed
            isMigrated: true,                     // Mark as migrated
            originalStakeTime: originalStakeTime  // Preserve original stake time
        });

        // Mark NFT as used for staking
        nftUsedForStaking[diamondTokenId] = true;

        // Add to active stakers tracking
        _addStaker(staker);

        // Update pool stats
        totalStaked = totalStaked.add(amount);
        totalStakers = totalStakers.add(1);
        totalMigratedStakers = totalMigratedStakers.add(1);
        totalMigratedAmount = totalMigratedAmount.add(amount);

        emit StakeMigrated(staker, amount, diamondTokenId, originalStakeTime);
    }

    /// Migrate multiple stakers in batch
    function batchMigrateStakers(
        address[] calldata stakers,
        uint256[] calldata amounts,
        uint256[] calldata originalStakeTimes,
        uint256[] calldata lastClaimTimes,
        uint256[] calldata diamondTokenIds,
        uint256[] calldata totalClaimeds
    ) external {
        require(migrationMode, "Migration mode disabled");
        require(msg.sender == migrationOperator || msg.sender == owner(), "Not authorized for migration");
        require(block.timestamp <= migrationDeadline, "Migration deadline passed");
        
        uint256 length = stakers.length;
        require(length == amounts.length, "Arrays length mismatch");
        require(length == originalStakeTimes.length, "Arrays length mismatch");
        require(length == lastClaimTimes.length, "Arrays length mismatch");
        require(length == diamondTokenIds.length, "Arrays length mismatch");
        require(length == totalClaimeds.length, "Arrays length mismatch");

        for (uint256 i = 0; i < length; i++) {
            // Call individual migration function for each staker
            this.migrateStaker(
                stakers[i],
                amounts[i],
                originalStakeTimes[i],
                lastClaimTimes[i],
                diamondTokenIds[i],
                totalClaimeds[i]
            );
        }
    }

    /// Complete migration and disable migration mode
    function completeMigration() external onlyOwner {
        require(migrationMode, "Migration already completed");
        
        migrationMode = false;
        
        emit MigrationCompleted(totalMigratedStakers, totalMigratedAmount);
        emit MigrationModeDisabled();
    }

    /* ─────────────────── Staking Functions ─────────────────── */

    /// Stake PRIVIX tokens with diamond NFT verification (for new stakers post-migration)
    function stake(uint256 diamondTokenId) external nonReentrant {
        require(!migrationMode, "Contract in migration mode - new staking disabled");
        require(!stakes[msg.sender].isActive, "Already staking");
        require(diamondTokenId >= DIAMOND_START && diamondTokenId <= DIAMOND_END, "Invalid diamond token ID");
        require(nftContract.ownerOf(diamondTokenId) == msg.sender, "Not owner of this NFT");
        require(!nftUsedForStaking[diamondTokenId], "NFT already used for staking");

        // Verify NFT tier
        string memory tier = nftContract.getTier(diamondTokenId);
        require(keccak256(bytes(tier)) == keccak256(bytes("Diamond")), "NFT is not Diamond tier");

        // Transfer PRIVIX tokens
        require(
            privixToken.transferFrom(msg.sender, address(this), STAKING_AMOUNT),
            "PRIVIX transfer failed"
        );

        // Record stake
        stakes[msg.sender] = StakeInfo({
            amount: STAKING_AMOUNT,
            stakeTime: block.timestamp,
            lastClaimTime: block.timestamp,
            diamondTokenId: diamondTokenId,
            isActive: true,
            totalClaimed: 0,
            isMigrated: false,
            originalStakeTime: block.timestamp
        });

        // Mark NFT as used for staking
        nftUsedForStaking[diamondTokenId] = true;

        // Add to active stakers tracking
        _addStaker(msg.sender);

        // Update pool stats
        totalStaked = totalStaked.add(STAKING_AMOUNT);
        totalStakers = totalStakers.add(1);

        emit Staked(msg.sender, STAKING_AMOUNT, diamondTokenId, block.timestamp);
    }

    /// Claim rewards
    function claimRewards() external nonReentrant {
        require(!migrationMode, "Contract in migration mode");
        require(stakes[msg.sender].isActive, "No active stake");
        
        uint256 pendingRewards = getPendingRewards(msg.sender);
        require(pendingRewards > 0, "No rewards to claim");
        
        // Check if enough time has passed since last claim
        require(
            block.timestamp >= stakes[msg.sender].lastClaimTime.add(REWARD_PERIOD),
            "Reward period not elapsed"
        );

        // Update last claim time
        stakes[msg.sender].lastClaimTime = block.timestamp;
        stakes[msg.sender].totalClaimed = stakes[msg.sender].totalClaimed.add(pendingRewards);

        // Update total rewards paid
        totalRewardsPaid = totalRewardsPaid.add(pendingRewards);

        // Transfer USDT rewards
        require(usdtToken.transfer(msg.sender, pendingRewards), "USDT transfer failed");

        emit RewardsClaimed(msg.sender, pendingRewards, block.timestamp);
    }

    /// Unstake PRIVIX tokens
    function unstake() external nonReentrant {
        require(!migrationMode, "Contract in migration mode");
        require(stakes[msg.sender].isActive, "No active stake");
        require(canUnstake(msg.sender), "Cannot unstake yet");

        StakeInfo memory stakeInfo = stakes[msg.sender];
        
        // Clear stake data
        stakes[msg.sender].isActive = false;
        nftUsedForStaking[stakeInfo.diamondTokenId] = false;

        // Remove from active stakers
        _removeStaker(msg.sender);

        // Update pool stats
        totalStaked = totalStaked.sub(stakeInfo.amount);
        totalStakers = totalStakers.sub(1);

        // Transfer PRIVIX tokens back
        require(privixToken.transfer(msg.sender, stakeInfo.amount), "PRIVIX transfer failed");

        emit Unstaked(msg.sender, stakeInfo.amount, block.timestamp);
    }

    /* ─────────────────── View Functions ─────────────────── */

    /// Get pending rewards for a staker
    function getPendingRewards(address staker) public view returns (uint256) {
        if (!stakes[staker].isActive) return 0;
        
        uint256 contractUsdtBalance = usdtToken.balanceOf(address(this));
        if (contractUsdtBalance == 0 || totalStakers == 0) return 0;

        // Simple equal distribution among all stakers
        return contractUsdtBalance.div(totalStakers);
    }

    /// Check if a staker can unstake (30 days lockup from stake time)
    function canUnstake(address staker) public view returns (bool) {
        if (!stakes[staker].isActive) return false;
        return block.timestamp >= stakes[staker].stakeTime.add(LOCKUP_PERIOD);
    }

    /// Check if staker still owns their NFT
    function stakerStillOwnsNFT(address staker) public view returns (bool) {
        if (!stakes[staker].isActive) return false;
        try nftContract.ownerOf(stakes[staker].diamondTokenId) returns (address owner) {
            return owner == staker;
        } catch {
            return false;
        }
    }

    /// Get comprehensive staker info
    function getStakeInfo(address staker) external view returns (
        uint256 amount,
        uint256 stakeTime,
        uint256 lastClaimTime,
        uint256 diamondTokenId,
        bool isActive,
        bool canUnstakeNow,
        bool isMigrated,
        uint256 originalStakeTime
    ) {
        StakeInfo memory stakeInfo = stakes[staker];
        return (
            stakeInfo.amount,
            stakeInfo.stakeTime,
            stakeInfo.lastClaimTime,
            stakeInfo.diamondTokenId,
            stakeInfo.isActive,
            canUnstake(staker),
            stakeInfo.isMigrated,
            stakeInfo.originalStakeTime
        );
    }

    /// Get pool statistics
    function getPoolStats() external view returns (
        uint256 _totalStaked,
        uint256 _totalStakers,
        uint256 _totalRewardsPaid,
        uint256 _contractUsdtBalance,
        uint256 _contractPrivixBalance,
        uint256 _totalMigratedStakers,
        uint256 _totalMigratedAmount
    ) {
        return (
            totalStaked,
            totalStakers,
            totalRewardsPaid,
            usdtToken.balanceOf(address(this)),
            privixToken.balanceOf(address(this)),
            totalMigratedStakers,
            totalMigratedAmount
        );
    }

    /// Get all active stakers
    function getAllStakers() external view returns (address[] memory) {
        return activeStakers;
    }

    /// Get all stakers with details (for compatibility with existing scripts)
    function getAllStakersWithDetails() external view returns (
        address[] memory stakers,
        uint256[] memory amounts,
        uint256[] memory stakeTimes,
        uint256[] memory diamondTokenIds,
        bool[] memory canUnstakeFlags
    ) {
        uint256 count = activeStakers.length;
        stakers = new address[](count);
        amounts = new uint256[](count);
        stakeTimes = new uint256[](count);
        diamondTokenIds = new uint256[](count);
        canUnstakeFlags = new bool[](count);

        for (uint256 i = 0; i < count; i++) {
            address staker = activeStakers[i];
            StakeInfo memory stakeInfo = stakes[staker];
            
            stakers[i] = staker;
            amounts[i] = stakeInfo.amount;
            stakeTimes[i] = stakeInfo.originalStakeTime; // Use original stake time for migrated stakers
            diamondTokenIds[i] = stakeInfo.diamondTokenId;
            canUnstakeFlags[i] = canUnstake(staker);
        }

        return (stakers, amounts, stakeTimes, diamondTokenIds, canUnstakeFlags);
    }

    /* ─────────────────── Helper Functions ─────────────────── */

    /// Add staker to active stakers array
    function _addStaker(address staker) internal {
        activeStakers.push(staker);
        stakerIndex[staker] = activeStakers.length - 1;
    }

    /// Remove staker from active stakers array
    function _removeStaker(address staker) internal {
        uint256 index = stakerIndex[staker];
        uint256 lastIndex = activeStakers.length - 1;

        if (index != lastIndex) {
            address lastStaker = activeStakers[lastIndex];
            activeStakers[index] = lastStaker;
            stakerIndex[lastStaker] = index;
        }

        activeStakers.pop();
        delete stakerIndex[staker];
    }

    /* ─────────────────── Owner Functions ─────────────────── */

    /// Emergency withdraw USDT (owner only)
    function emergencyWithdrawUSDT(uint256 amount) external onlyOwner {
        require(amount <= usdtToken.balanceOf(address(this)), "Insufficient USDT balance");
        require(usdtToken.transfer(owner(), amount), "USDT transfer failed");
    }

    /// Emergency withdraw PRIVIX (owner only)
    function emergencyWithdrawPrivix(uint256 amount) external onlyOwner {
        require(amount <= privixToken.balanceOf(address(this)), "Insufficient PRIVIX balance");
        require(privixToken.transfer(owner(), amount), "PRIVIX transfer failed");
    }

    /// Set migration operator
    function setMigrationOperator(address newOperator) external onlyOwner {
        require(newOperator != address(0), "Invalid operator address");
        migrationOperator = newOperator;
    }

    /// Extend migration deadline (can only extend, not reduce)
    function extendMigrationDeadline(uint256 newDeadline) external onlyOwner {
        require(migrationMode, "Migration already completed");
        require(newDeadline > migrationDeadline, "Can only extend deadline");
        migrationDeadline = newDeadline;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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

pragma solidity ^0.8.0;

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_privixToken","type":"address"},{"internalType":"address","name":"_usdtToken","type":"address"},{"internalType":"address","name":"_nftContract","type":"address"},{"internalType":"address","name":"_migrationOperator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalMigrated","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalAmount","type":"uint256"}],"name":"MigrationCompleted","type":"event"},{"anonymous":false,"inputs":[],"name":"MigrationModeDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"diamondTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"originalStakeTime","type":"uint256"}],"name":"StakeMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"diamondTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"DIAMOND_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DIAMOND_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCKUP_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activeStakers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"stakers","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"originalStakeTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"lastClaimTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"diamondTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"totalClaimeds","type":"uint256[]"}],"name":"batchMigrateStakers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"canUnstake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"completeMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdrawPrivix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdrawUSDT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDeadline","type":"uint256"}],"name":"extendMigrationDeadline","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllStakers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllStakersWithDetails","outputs":[{"internalType":"address[]","name":"stakers","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"stakeTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"diamondTokenIds","type":"uint256[]"},{"internalType":"bool[]","name":"canUnstakeFlags","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getPendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPoolStats","outputs":[{"internalType":"uint256","name":"_totalStaked","type":"uint256"},{"internalType":"uint256","name":"_totalStakers","type":"uint256"},{"internalType":"uint256","name":"_totalRewardsPaid","type":"uint256"},{"internalType":"uint256","name":"_contractUsdtBalance","type":"uint256"},{"internalType":"uint256","name":"_contractPrivixBalance","type":"uint256"},{"internalType":"uint256","name":"_totalMigratedStakers","type":"uint256"},{"internalType":"uint256","name":"_totalMigratedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakeInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"stakeTime","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"diamondTokenId","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"bool","name":"canUnstakeNow","type":"bool"},{"internalType":"bool","name":"isMigrated","type":"bool"},{"internalType":"uint256","name":"originalStakeTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"originalStakeTime","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"diamondTokenId","type":"uint256"},{"internalType":"uint256","name":"totalClaimed","type":"uint256"}],"name":"migrateStaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrationMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrationOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftContract","outputs":[{"internalType":"contract IPrivixNFTPass","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftUsedForStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privixToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"setMigrationOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"diamondTokenId","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakerIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"stakerStillOwnsNFT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"stakeTime","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"diamondTokenId","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"totalClaimed","type":"uint256"},{"internalType":"bool","name":"isMigrated","type":"bool"},{"internalType":"uint256","name":"originalStakeTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMigratedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMigratedStakers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardsPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdtToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60e0604052600b805460ff191660011790553480156200001e57600080fd5b506040516200340e3803806200340e833981016040819052620000419162000281565b6200004c3362000214565b600180556001600160a01b038416620000ac5760405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642050524956495820746f6b656e20616464726573730000000060448201526064015b60405180910390fd5b6001600160a01b038316620001045760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964205553445420746f6b656e20616464726573730000000000006044820152606401620000a3565b6001600160a01b0382166200015c5760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964204e465420636f6e74726163742061646472657373000000006044820152606401620000a3565b6001600160a01b038116620001bf5760405162461bcd60e51b815260206004820152602260248201527f496e76616c6964206d6967726174696f6e206f70657261746f72206164647265604482015261737360f01b6064820152608401620000a3565b6001600160a01b0380851660805283811660a05282811660c052600b805491831661010002610100600160a81b0319909216919091179055620002064262278d00620002de565b600c55506200030692505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200027c57600080fd5b919050565b600080600080608085870312156200029857600080fd5b620002a38562000264565b9350620002b36020860162000264565b9250620002c36040860162000264565b9150620002d36060860162000264565b905092959194509250565b808201808211156200030057634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c05161306f6200039f600039600081816105b7015281816116a4015281816117a001528181611bfb01528181611d2c01526126410152600081816104d3015281816106d90152818161079d0152818161103e0152818161204601526127880152600081816103f901528181610d610152818161121e015281816112e201528181611e5a01526120f5015261306f6000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806385f4498b1161013b578063bfbfeb4e116100b8578063ec16d0761161007c578063ec16d07614610262578063ed49893d146105f9578063f2fde38b14610602578063f6ed201714610615578063fb99c0641461062857600080fd5b8063bfbfeb4e14610545578063c34531531461055e578063d56d229d146105b2578063ddd710fb146105d9578063e7f5aad9146105ec57600080fd5b8063a694fc3a116100ff578063a694fc3a146104a3578063a7d4e89d146104b6578063a98ad46c146104ce578063bbb85188146104f5578063be75fec51461053257600080fd5b806385f4498b1461045a578063869890381461046d5780638da5cb5b14610476578063a082f83014610487578063a61d20071461049a57600080fd5b806361a88204116101c95780637628fd401161018d5780637628fd40146103f457806378d60a5b1461041b5780637a01e2bd1461043b578063817b1cd21461044857806383924de01461045157600080fd5b806361a88204146103b257806366b2f67d146103bb5780636e4f88c8146103ce578063715018a6146103e357806374958e35146103eb57600080fd5b806329c449101161021057806329c449101461035c5780632def66201461036f57806331b7f25d14610377578063372500ab146103a25780634886f62c146103aa57600080fd5b806303ee83f11461024d5780630a171df81461026257806316934fc41461027f5780631d7fa77f1461031657806326d02dea14610329575b600080fd5b61026061025b366004612aed565b610631565b005b61026c62278d0081565b6040519081526020015b60405180910390f35b6102d761028d366004612aed565b6002602081905260009182526040909120805460018201549282015460038301546004840154600585015460068601546007909601549496959394929360ff928316939192169088565b6040805198895260208901979097529587019490945260608601929092521515608085015260a0840152151560c083015260e082015261010001610276565b610260610324366004612b0a565b6106bc565b61034c610337366004612b0a565b60036020526000908152604090205460ff1681565b6040519015158152602001610276565b61026061036a366004612b6e565b610893565b610260610b8a565b61038a610385366004612b0a565b610e3b565b6040516001600160a01b039091168152602001610276565b610260610e65565b61026061112d565b61026c600a5481565b6102606103c9366004612b0a565b611201565b6103d66113ae565b6040516102769190612cf0565b610260611410565b61026c60085481565b61038a7f000000000000000000000000000000000000000000000000000000000000000081565b61026c610429366004612aed565b60056020526000908152604090205481565b600b5461034c9060ff1681565b61026c60065481565b61026c600c5481565b61034c610468366004612aed565b611422565b61026c60075481565b6000546001600160a01b031661038a565b610260610495366004612d03565b61147f565b61026c60095481565b6102606104b1366004612b0a565b611ab6565b600b5461038a9061010090046001600160a01b031681565b61038a7f000000000000000000000000000000000000000000000000000000000000000081565b6104fd612030565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610276565b610260610540366004612b0a565b612184565b61054d612234565b604051610276959493929190612d80565b61057161056c366004612aed565b61251d565b60408051988952602089019790975295870194909452606086019290925215156080850152151560a0840152151560c083015260e082015261010001610276565b61038a7f000000000000000000000000000000000000000000000000000000000000000081565b61034c6105e7366004612aed565b6125e1565b61026c65048c2739500081565b61026c6101f581565b610260610610366004612aed565b6126cf565b61026c610623366004612aed565b612745565b61026c6103e881565b61063961282d565b6001600160a01b0381166106945760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206f70657261746f722061646472657373000000000000000060448201526064015b60405180910390fd5b600b80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6106c461282d565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074c9190612e18565b81111561079b5760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420555344542062616c616e636500000000000000604482015260640161068b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6107dc6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084d9190612e31565b6108905760405162461bcd60e51b81526020600482015260146024820152731554d115081d1c985b9cd9995c8819985a5b195960621b604482015260640161068b565b50565b600b5460ff166108df5760405162461bcd60e51b8152602060048201526017602482015276135a59dc985d1a5bdb881b5bd91948191a5cd8589b1959604a1b604482015260640161068b565b600b5461010090046001600160a01b031633148061090757506000546001600160a01b031633145b6109535760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420617574686f72697a656420666f72206d6967726174696f6e00000000604482015260640161068b565b600c544211156109a15760405162461bcd60e51b8152602060048201526019602482015278135a59dc985d1a5bdb88191958591b1a5b99481c185cdcd959603a1b604482015260640161068b565b8a8981146109c15760405162461bcd60e51b815260040161068b90612e53565b8088146109e05760405162461bcd60e51b815260040161068b90612e53565b8086146109ff5760405162461bcd60e51b815260040161068b90612e53565b808414610a1e5760405162461bcd60e51b815260040161068b90612e53565b808214610a3d5760405162461bcd60e51b815260040161068b90612e53565b60005b81811015610b7a573063a082f8308f8f84818110610a6057610a60612e83565b9050602002016020810190610a759190612aed565b8e8e85818110610a8757610a87612e83565b905060200201358d8d86818110610aa057610aa0612e83565b905060200201358c8c87818110610ab957610ab9612e83565b905060200201358b8b88818110610ad257610ad2612e83565b905060200201358a8a89818110610aeb57610aeb612e83565b6040516001600160e01b031960e08b901b1681526001600160a01b0390981660048901526024880196909652506044860193909352606485019190915260848401526020909102013560a482015260c401600060405180830381600087803b158015610b5657600080fd5b505af1158015610b6a573d6000803e3d6000fd5b505060019092019150610a409050565b5050505050505050505050505050565b610b92612887565b600b5460ff1615610be55760405162461bcd60e51b815260206004820152601a60248201527f436f6e747261637420696e206d6967726174696f6e206d6f6465000000000000604482015260640161068b565b3360009081526002602052604090206004015460ff16610c395760405162461bcd60e51b815260206004820152600f60248201526e4e6f20616374697665207374616b6560881b604482015260640161068b565b610c4233611422565b610c835760405162461bcd60e51b815260206004820152601260248201527110d85b9b9bdd081d5b9cdd185ad9481e595d60721b604482015260640161068b565b3360008181526002602081815260408084208151610100810183528154815260018201548185015281850154818401526003808301546060830190815260048401805460ff80821615156080870152600587015460a0870152600687015416151560c086015260079095015460e085015289895296865260ff199384169096559451865293909252909220805490921690915590610d20906128e0565b8051600654610d2e916129e6565b600655600754610d3f9060016129e6565b600755805160405163a9059cbb60e01b815233600482015260248101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd69190612e31565b610df25760405162461bcd60e51b815260040161068b90612e99565b80516040805191825242602083015233917f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e91015b60405180910390a250610e3960018055565b565b60048181548110610e4b57600080fd5b6000918252602090912001546001600160a01b0316905081565b610e6d612887565b600b5460ff1615610ec05760405162461bcd60e51b815260206004820152601a60248201527f436f6e747261637420696e206d6967726174696f6e206d6f6465000000000000604482015260640161068b565b3360009081526002602052604090206004015460ff16610f145760405162461bcd60e51b815260206004820152600f60248201526e4e6f20616374697665207374616b6560881b604482015260640161068b565b6000610f1f33612745565b905060008111610f675760405162461bcd60e51b81526020600482015260136024820152724e6f207265776172647320746f20636c61696d60681b604482015260640161068b565b3360009081526002602081905260409091200154610f889062278d006129fb565b421015610fd75760405162461bcd60e51b815260206004820152601960248201527f52657761726420706572696f64206e6f7420656c617073656400000000000000604482015260640161068b565b336000908152600260208190526040909120429181019190915560050154610fff90826129fb565b3360009081526002602052604090206005015560085461101f90826129fb565b60085560405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af115801561108f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b39190612e31565b6110f65760405162461bcd60e51b81526020600482015260146024820152731554d115081d1c985b9cd9995c8819985a5b195960621b604482015260640161068b565b6040805182815242602082015233917fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e3259101610e27565b61113561282d565b600b5460ff166111875760405162461bcd60e51b815260206004820152601b60248201527f4d6967726174696f6e20616c726561647920636f6d706c657465640000000000604482015260640161068b565b600b805460ff19169055600954600a546040517f52db71cf1e1db1c5c31bf1d59b27ac4eac1c7d596d5fee6aa8d822e59e0aaa6a926111ce92908252602082015260400190565b60405180910390a16040517f696f10054d6c1ede8f1a191c155c7e36b572da39bbd1faba110b029df808b1b790600090a1565b61120961282d565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561126d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112919190612e18565b8111156112e05760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e74205052495649582062616c616e63650000000000604482015260640161068b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6113216000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af115801561136e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113929190612e31565b6108905760405162461bcd60e51b815260040161068b90612e99565b6060600480548060200260200160405190810160405280929190818152602001828054801561140657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116113e8575b5050505050905090565b61141861282d565b610e396000612a07565b6001600160a01b03811660009081526002602052604081206004015460ff1661144d57506000919050565b6001600160a01b0382166000908152600260205260409020600101546114769062278d006129fb565b42101592915050565b600b5460ff166114cb5760405162461bcd60e51b8152602060048201526017602482015276135a59dc985d1a5bdb881b5bd91948191a5cd8589b1959604a1b604482015260640161068b565b600b5461010090046001600160a01b03163314806114f357506000546001600160a01b031633145b61153f5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420617574686f72697a656420666f72206d6967726174696f6e00000000604482015260640161068b565b600c5442111561158d5760405162461bcd60e51b8152602060048201526019602482015278135a59dc985d1a5bdb88191958591b1a5b99481c185cdcd959603a1b604482015260640161068b565b6001600160a01b03861660009081526002602052604090206004015460ff16156115f15760405162461bcd60e51b81526020600482015260156024820152745374616b657220616c72656164792061637469766560581b604482015260640161068b565b65048c27395000851461163d5760405162461bcd60e51b8152602060048201526014602482015273125b9d985b1a59081cdd185ad948185b5bdd5b9d60621b604482015260640161068b565b6101f5821015801561165157506103e88211155b6116985760405162461bcd60e51b8152602060048201526018602482015277125b9d985b1a5908191a585b5bdb99081d1bdad95b88125160421b604482015260640161068b565b856001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636352211e846040518263ffffffff1660e01b81526004016116f091815260200190565b602060405180830381865afa15801561170d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117319190612ec9565b6001600160a01b0316146117875760405162461bcd60e51b815260206004820152601960248201527f5374616b6572206e6f206c6f6e676572206f776e73204e465400000000000000604482015260640161068b565b604051632783162d60e11b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634f062c5a90602401600060405180830381865afa1580156117ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118179190810190612efc565b604080518082019091526007815266111a585b5bdb9960ca1b6020918201528151908201209091507faadb29765cb3e4f21bde5ecd65db8e565d901b6c9394dcec22aa81b8ff2d6e2f146118a75760405162461bcd60e51b815260206004820152601760248201527627232a1034b9903737ba102234b0b6b7b732103a34b2b960491b604482015260640161068b565b60008381526003602052604090205460ff16156119065760405162461bcd60e51b815260206004820152601c60248201527f4e465420616c7265616479207573656420666f72207374616b696e6700000000604482015260640161068b565b6040518061010001604052808781526020014281526020018581526020018481526020016001151581526020018381526020016001151581526020018681525060026000896001600160a01b03166001600160a01b031681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555060e0820151816007015590505060016003600085815260200190815260200160002060006101000a81548160ff021916908315150217905550611a1f87612a57565b600654611a2c90876129fb565b600655600754611a3d9060016129fb565b600755600954611a4e9060016129fb565b600955600a54611a5e90876129fb565b600a5560408051878152602081018590529081018690526001600160a01b038816907f578e36e2593159a433c62763b901e31f4530d19b7534fd31cab8e00c0b6137f29060600160405180910390a250505050505050565b611abe612887565b600b5460ff1615611b2b5760405162461bcd60e51b815260206004820152603160248201527f436f6e747261637420696e206d6967726174696f6e206d6f6465202d206e6577604482015270081cdd185ada5b99c8191a5cd8589b1959607a1b606482015260840161068b565b3360009081526002602052604090206004015460ff1615611b805760405162461bcd60e51b815260206004820152600f60248201526e416c7265616479207374616b696e6760881b604482015260640161068b565b6101f58110158015611b9457506103e88111155b611bdb5760405162461bcd60e51b8152602060048201526018602482015277125b9d985b1a5908191a585b5bdb99081d1bdad95b88125160421b604482015260640161068b565b6040516331a9108f60e11b81526004810182905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015611c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c669190612ec9565b6001600160a01b031614611cb45760405162461bcd60e51b8152602060048201526015602482015274139bdd081bdddb995c881bd9881d1a1a5cc8139195605a1b604482015260640161068b565b60008181526003602052604090205460ff1615611d135760405162461bcd60e51b815260206004820152601c60248201527f4e465420616c7265616479207573656420666f72207374616b696e6700000000604482015260640161068b565b604051632783162d60e11b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634f062c5a90602401600060405180830381865afa158015611d7b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611da39190810190612efc565b604080518082019091526007815266111a585b5bdb9960ca1b6020918201528151908201209091507faadb29765cb3e4f21bde5ecd65db8e565d901b6c9394dcec22aa81b8ff2d6e2f14611e335760405162461bcd60e51b815260206004820152601760248201527627232a1034b9903737ba102234b0b6b7b732103a34b2b960491b604482015260640161068b565b6040516323b872dd60e01b815233600482015230602482015265048c2739500060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af1158015611eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecf9190612e31565b611eeb5760405162461bcd60e51b815260040161068b90612e99565b604080516101008101825265048c27395000815242602080830182815283850183815260608501888152600160808701818152600060a0890181815260c08a0182815260e08b01998a52338084526002808b528d85209c518d5598518c8701559651978b019790975593516003808b0191909155915160048a01805491151560ff19928316179055935160058a015594516006890180549115159185169190911790559551600790970196909655888352939092529390932080549091169091179055611fb790612a57565b600654611fca9065048c273950006129fb565b600655600754611fdb9060016129fb565b6007556040805165048c273950008152602081018490524281830152905133917fb4caaf29adda3eefee3ad552a8e85058589bf834c7466cae4ee58787f70589ed919081900360600190a25061089060018055565b60008060008060008060006006546007546008547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161209f91906001600160a01b0391909116815260200190565b602060405180830381865afa1580156120bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e09190612e18565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612144573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121689190612e18565b600954600a54959d949c50929a50909850965094509092509050565b61218c61282d565b600b5460ff166121de5760405162461bcd60e51b815260206004820152601b60248201527f4d6967726174696f6e20616c726561647920636f6d706c657465640000000000604482015260640161068b565b600c54811161222f5760405162461bcd60e51b815260206004820152601860248201527f43616e206f6e6c7920657874656e6420646561646c696e650000000000000000604482015260640161068b565b600c55565b6004546060908190819081908190806001600160401b0381111561225a5761225a612ee6565b604051908082528060200260200182016040528015612283578160200160208202803683370190505b509550806001600160401b0381111561229e5761229e612ee6565b6040519080825280602002602001820160405280156122c7578160200160208202803683370190505b509450806001600160401b038111156122e2576122e2612ee6565b60405190808252806020026020018201604052801561230b578160200160208202803683370190505b509350806001600160401b0381111561232657612326612ee6565b60405190808252806020026020018201604052801561234f578160200160208202803683370190505b509250806001600160401b0381111561236a5761236a612ee6565b604051908082528060200260200182016040528015612393578160200160208202803683370190505b50915060005b81811015612514576000600482815481106123b6576123b6612e83565b60009182526020808320909101546001600160a01b0316808352600280835260409384902084516101008101865281548152600182015494810194909452908101549383019390935260038301546060830152600483015460ff90811615156080840152600584015460a0840152600684015416151560c083015260079092015460e082015289519192509082908a908590811061245657612456612e83565b60200260200101906001600160a01b031690816001600160a01b031681525050806000015188848151811061248d5761248d612e83565b6020026020010181815250508060e001518784815181106124b0576124b0612e83565b60200260200101818152505080606001518684815181106124d3576124d3612e83565b6020026020010181815250506124e882611422565b8584815181106124fa576124fa612e83565b911515602092830291909101909101525050600101612399565b50509091929394565b6001600160a01b03811660009081526002602081815260408084208151610100810183528154808252600183015494820185905294820154928101839052600382015460608201819052600483015460ff908116151560808401819052600585015460a08501526006850154909116151560c084015260079093015460e083015286958695869586958695869586959194919391926125bb8f611422565b8660c001518760e001519850985098509850985098509850985050919395975091939597565b6001600160a01b03811660009081526002602052604081206004015460ff1661260c57506000919050565b6001600160a01b03828116600090815260026020526040908190206003015490516331a9108f60e11b815260048101919091527f000000000000000000000000000000000000000000000000000000000000000090911690636352211e90602401602060405180830381865afa9250505080156126a6575060408051601f3d908101601f191682019092526126a391810190612ec9565b60015b6126b257506000919050565b826001600160a01b0316816001600160a01b031614915050919050565b6126d761282d565b6001600160a01b03811661273c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068b565b61089081612a07565b6001600160a01b03811660009081526002602052604081206004015460ff1661277057506000919050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156127d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fb9190612e18565b905080158061280a5750600754155b156128185750600092915050565b600754612826908290612acc565b9392505050565b6000546001600160a01b03163314610e395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161068b565b6002600154036128d95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161068b565b6002600155565b6001600160a01b03811660009081526005602052604081205460045490919061290b90600190612fdb565b90508082146129935760006004828154811061292957612929612e83565b600091825260209091200154600480546001600160a01b03909216925082918590811061295857612958612e83565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559290911681526005909152604090208290555b60048054806129a4576129a4612fee565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03949094168152600590935250506040812055565b60006129f28284612fdb565b90505b92915050565b60006129f28284613004565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600480546001808201835560008390527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b90910180546001600160a01b0319166001600160a01b0385161790559054612ab09190612fdb565b6001600160a01b03909116600090815260056020526040902055565b60006129f28284613017565b6001600160a01b038116811461089057600080fd5b600060208284031215612aff57600080fd5b813561282681612ad8565b600060208284031215612b1c57600080fd5b5035919050565b60008083601f840112612b3557600080fd5b5081356001600160401b03811115612b4c57600080fd5b6020830191508360208260051b8501011115612b6757600080fd5b9250929050565b60008060008060008060008060008060008060c08d8f031215612b9057600080fd5b6001600160401b038d351115612ba557600080fd5b612bb28e8e358f01612b23565b909c509a506001600160401b0360208e01351115612bcf57600080fd5b612bdf8e60208f01358f01612b23565b909a5098506001600160401b0360408e01351115612bfc57600080fd5b612c0c8e60408f01358f01612b23565b90985096506001600160401b0360608e01351115612c2957600080fd5b612c398e60608f01358f01612b23565b90965094506001600160401b0360808e01351115612c5657600080fd5b612c668e60808f01358f01612b23565b90945092506001600160401b0360a08e01351115612c8357600080fd5b612c938e60a08f01358f01612b23565b81935080925050509295989b509295989b509295989b565b60008151808452602080850194506020840160005b83811015612ce55781516001600160a01b031687529582019590820190600101612cc0565b509495945050505050565b6020815260006129f26020830184612cab565b60008060008060008060c08789031215612d1c57600080fd5b8635612d2781612ad8565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b60008151808452602080850194506020840160005b83811015612ce557815187529582019590820190600101612d64565b60a081526000612d9360a0830188612cab565b60208382036020850152612da78289612d4f565b91508382036040850152612dbb8288612d4f565b91508382036060850152612dcf8287612d4f565b84810360808601528551808252602080880194509091019060005b81811015612e08578451151583529383019391830191600101612dea565b50909a9950505050505050505050565b600060208284031215612e2a57600080fd5b5051919050565b600060208284031215612e4357600080fd5b8151801515811461282657600080fd5b602080825260169082015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260169082015275141492559256081d1c985b9cd9995c8819985a5b195960521b604082015260600190565b600060208284031215612edb57600080fd5b815161282681612ad8565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215612f0f57600080fd5b82516001600160401b0380821115612f2657600080fd5b818501915085601f830112612f3a57600080fd5b815181811115612f4c57612f4c612ee6565b604051601f8201601f19908116603f01168101908382118183101715612f7457612f74612ee6565b816040528281528886848701011115612f8c57600080fd5b600093505b82841015612fae5784840186015181850187015292850192612f91565b600086848301015280965050505050505092915050565b634e487b7160e01b600052601160045260246000fd5b818103818111156129f5576129f5612fc5565b634e487b7160e01b600052603160045260246000fd5b808201808211156129f5576129f5612fc5565b60008261303457634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220afcd9fec63e793b4db772bd970877a64de73ab49564f86ad4c19da1205d1476d64736f6c63430008170033000000000000000000000000b1205f513c0f157363f79ffb5455907685ab34ce000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000e0d947b837b42ea1bcd7dec7640d5b3bb2455d4e000000000000000000000000d6afecb82e5e23829085069dda33a8b73fa0465a

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102485760003560e01c806385f4498b1161013b578063bfbfeb4e116100b8578063ec16d0761161007c578063ec16d07614610262578063ed49893d146105f9578063f2fde38b14610602578063f6ed201714610615578063fb99c0641461062857600080fd5b8063bfbfeb4e14610545578063c34531531461055e578063d56d229d146105b2578063ddd710fb146105d9578063e7f5aad9146105ec57600080fd5b8063a694fc3a116100ff578063a694fc3a146104a3578063a7d4e89d146104b6578063a98ad46c146104ce578063bbb85188146104f5578063be75fec51461053257600080fd5b806385f4498b1461045a578063869890381461046d5780638da5cb5b14610476578063a082f83014610487578063a61d20071461049a57600080fd5b806361a88204116101c95780637628fd401161018d5780637628fd40146103f457806378d60a5b1461041b5780637a01e2bd1461043b578063817b1cd21461044857806383924de01461045157600080fd5b806361a88204146103b257806366b2f67d146103bb5780636e4f88c8146103ce578063715018a6146103e357806374958e35146103eb57600080fd5b806329c449101161021057806329c449101461035c5780632def66201461036f57806331b7f25d14610377578063372500ab146103a25780634886f62c146103aa57600080fd5b806303ee83f11461024d5780630a171df81461026257806316934fc41461027f5780631d7fa77f1461031657806326d02dea14610329575b600080fd5b61026061025b366004612aed565b610631565b005b61026c62278d0081565b6040519081526020015b60405180910390f35b6102d761028d366004612aed565b6002602081905260009182526040909120805460018201549282015460038301546004840154600585015460068601546007909601549496959394929360ff928316939192169088565b6040805198895260208901979097529587019490945260608601929092521515608085015260a0840152151560c083015260e082015261010001610276565b610260610324366004612b0a565b6106bc565b61034c610337366004612b0a565b60036020526000908152604090205460ff1681565b6040519015158152602001610276565b61026061036a366004612b6e565b610893565b610260610b8a565b61038a610385366004612b0a565b610e3b565b6040516001600160a01b039091168152602001610276565b610260610e65565b61026061112d565b61026c600a5481565b6102606103c9366004612b0a565b611201565b6103d66113ae565b6040516102769190612cf0565b610260611410565b61026c60085481565b61038a7f000000000000000000000000b1205f513c0f157363f79ffb5455907685ab34ce81565b61026c610429366004612aed565b60056020526000908152604090205481565b600b5461034c9060ff1681565b61026c60065481565b61026c600c5481565b61034c610468366004612aed565b611422565b61026c60075481565b6000546001600160a01b031661038a565b610260610495366004612d03565b61147f565b61026c60095481565b6102606104b1366004612b0a565b611ab6565b600b5461038a9061010090046001600160a01b031681565b61038a7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec781565b6104fd612030565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610276565b610260610540366004612b0a565b612184565b61054d612234565b604051610276959493929190612d80565b61057161056c366004612aed565b61251d565b60408051988952602089019790975295870194909452606086019290925215156080850152151560a0840152151560c083015260e082015261010001610276565b61038a7f000000000000000000000000e0d947b837b42ea1bcd7dec7640d5b3bb2455d4e81565b61034c6105e7366004612aed565b6125e1565b61026c65048c2739500081565b61026c6101f581565b610260610610366004612aed565b6126cf565b61026c610623366004612aed565b612745565b61026c6103e881565b61063961282d565b6001600160a01b0381166106945760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206f70657261746f722061646472657373000000000000000060448201526064015b60405180910390fd5b600b80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6106c461282d565b6040516370a0823160e01b81523060048201527f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b0316906370a0823190602401602060405180830381865afa158015610728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074c9190612e18565b81111561079b5760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420555344542062616c616e636500000000000000604482015260640161068b565b7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b031663a9059cbb6107dc6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084d9190612e31565b6108905760405162461bcd60e51b81526020600482015260146024820152731554d115081d1c985b9cd9995c8819985a5b195960621b604482015260640161068b565b50565b600b5460ff166108df5760405162461bcd60e51b8152602060048201526017602482015276135a59dc985d1a5bdb881b5bd91948191a5cd8589b1959604a1b604482015260640161068b565b600b5461010090046001600160a01b031633148061090757506000546001600160a01b031633145b6109535760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420617574686f72697a656420666f72206d6967726174696f6e00000000604482015260640161068b565b600c544211156109a15760405162461bcd60e51b8152602060048201526019602482015278135a59dc985d1a5bdb88191958591b1a5b99481c185cdcd959603a1b604482015260640161068b565b8a8981146109c15760405162461bcd60e51b815260040161068b90612e53565b8088146109e05760405162461bcd60e51b815260040161068b90612e53565b8086146109ff5760405162461bcd60e51b815260040161068b90612e53565b808414610a1e5760405162461bcd60e51b815260040161068b90612e53565b808214610a3d5760405162461bcd60e51b815260040161068b90612e53565b60005b81811015610b7a573063a082f8308f8f84818110610a6057610a60612e83565b9050602002016020810190610a759190612aed565b8e8e85818110610a8757610a87612e83565b905060200201358d8d86818110610aa057610aa0612e83565b905060200201358c8c87818110610ab957610ab9612e83565b905060200201358b8b88818110610ad257610ad2612e83565b905060200201358a8a89818110610aeb57610aeb612e83565b6040516001600160e01b031960e08b901b1681526001600160a01b0390981660048901526024880196909652506044860193909352606485019190915260848401526020909102013560a482015260c401600060405180830381600087803b158015610b5657600080fd5b505af1158015610b6a573d6000803e3d6000fd5b505060019092019150610a409050565b5050505050505050505050505050565b610b92612887565b600b5460ff1615610be55760405162461bcd60e51b815260206004820152601a60248201527f436f6e747261637420696e206d6967726174696f6e206d6f6465000000000000604482015260640161068b565b3360009081526002602052604090206004015460ff16610c395760405162461bcd60e51b815260206004820152600f60248201526e4e6f20616374697665207374616b6560881b604482015260640161068b565b610c4233611422565b610c835760405162461bcd60e51b815260206004820152601260248201527110d85b9b9bdd081d5b9cdd185ad9481e595d60721b604482015260640161068b565b3360008181526002602081815260408084208151610100810183528154815260018201548185015281850154818401526003808301546060830190815260048401805460ff80821615156080870152600587015460a0870152600687015416151560c086015260079095015460e085015289895296865260ff199384169096559451865293909252909220805490921690915590610d20906128e0565b8051600654610d2e916129e6565b600655600754610d3f9060016129e6565b600755805160405163a9059cbb60e01b815233600482015260248101919091527f000000000000000000000000b1205f513c0f157363f79ffb5455907685ab34ce6001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd69190612e31565b610df25760405162461bcd60e51b815260040161068b90612e99565b80516040805191825242602083015233917f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e91015b60405180910390a250610e3960018055565b565b60048181548110610e4b57600080fd5b6000918252602090912001546001600160a01b0316905081565b610e6d612887565b600b5460ff1615610ec05760405162461bcd60e51b815260206004820152601a60248201527f436f6e747261637420696e206d6967726174696f6e206d6f6465000000000000604482015260640161068b565b3360009081526002602052604090206004015460ff16610f145760405162461bcd60e51b815260206004820152600f60248201526e4e6f20616374697665207374616b6560881b604482015260640161068b565b6000610f1f33612745565b905060008111610f675760405162461bcd60e51b81526020600482015260136024820152724e6f207265776172647320746f20636c61696d60681b604482015260640161068b565b3360009081526002602081905260409091200154610f889062278d006129fb565b421015610fd75760405162461bcd60e51b815260206004820152601960248201527f52657761726420706572696f64206e6f7420656c617073656400000000000000604482015260640161068b565b336000908152600260208190526040909120429181019190915560050154610fff90826129fb565b3360009081526002602052604090206005015560085461101f90826129fb565b60085560405163a9059cbb60e01b8152336004820152602481018290527f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b03169063a9059cbb906044016020604051808303816000875af115801561108f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b39190612e31565b6110f65760405162461bcd60e51b81526020600482015260146024820152731554d115081d1c985b9cd9995c8819985a5b195960621b604482015260640161068b565b6040805182815242602082015233917fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e3259101610e27565b61113561282d565b600b5460ff166111875760405162461bcd60e51b815260206004820152601b60248201527f4d6967726174696f6e20616c726561647920636f6d706c657465640000000000604482015260640161068b565b600b805460ff19169055600954600a546040517f52db71cf1e1db1c5c31bf1d59b27ac4eac1c7d596d5fee6aa8d822e59e0aaa6a926111ce92908252602082015260400190565b60405180910390a16040517f696f10054d6c1ede8f1a191c155c7e36b572da39bbd1faba110b029df808b1b790600090a1565b61120961282d565b6040516370a0823160e01b81523060048201527f000000000000000000000000b1205f513c0f157363f79ffb5455907685ab34ce6001600160a01b0316906370a0823190602401602060405180830381865afa15801561126d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112919190612e18565b8111156112e05760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e74205052495649582062616c616e63650000000000604482015260640161068b565b7f000000000000000000000000b1205f513c0f157363f79ffb5455907685ab34ce6001600160a01b031663a9059cbb6113216000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af115801561136e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113929190612e31565b6108905760405162461bcd60e51b815260040161068b90612e99565b6060600480548060200260200160405190810160405280929190818152602001828054801561140657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116113e8575b5050505050905090565b61141861282d565b610e396000612a07565b6001600160a01b03811660009081526002602052604081206004015460ff1661144d57506000919050565b6001600160a01b0382166000908152600260205260409020600101546114769062278d006129fb565b42101592915050565b600b5460ff166114cb5760405162461bcd60e51b8152602060048201526017602482015276135a59dc985d1a5bdb881b5bd91948191a5cd8589b1959604a1b604482015260640161068b565b600b5461010090046001600160a01b03163314806114f357506000546001600160a01b031633145b61153f5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420617574686f72697a656420666f72206d6967726174696f6e00000000604482015260640161068b565b600c5442111561158d5760405162461bcd60e51b8152602060048201526019602482015278135a59dc985d1a5bdb88191958591b1a5b99481c185cdcd959603a1b604482015260640161068b565b6001600160a01b03861660009081526002602052604090206004015460ff16156115f15760405162461bcd60e51b81526020600482015260156024820152745374616b657220616c72656164792061637469766560581b604482015260640161068b565b65048c27395000851461163d5760405162461bcd60e51b8152602060048201526014602482015273125b9d985b1a59081cdd185ad948185b5bdd5b9d60621b604482015260640161068b565b6101f5821015801561165157506103e88211155b6116985760405162461bcd60e51b8152602060048201526018602482015277125b9d985b1a5908191a585b5bdb99081d1bdad95b88125160421b604482015260640161068b565b856001600160a01b03167f000000000000000000000000e0d947b837b42ea1bcd7dec7640d5b3bb2455d4e6001600160a01b0316636352211e846040518263ffffffff1660e01b81526004016116f091815260200190565b602060405180830381865afa15801561170d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117319190612ec9565b6001600160a01b0316146117875760405162461bcd60e51b815260206004820152601960248201527f5374616b6572206e6f206c6f6e676572206f776e73204e465400000000000000604482015260640161068b565b604051632783162d60e11b8152600481018390526000907f000000000000000000000000e0d947b837b42ea1bcd7dec7640d5b3bb2455d4e6001600160a01b031690634f062c5a90602401600060405180830381865afa1580156117ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118179190810190612efc565b604080518082019091526007815266111a585b5bdb9960ca1b6020918201528151908201209091507faadb29765cb3e4f21bde5ecd65db8e565d901b6c9394dcec22aa81b8ff2d6e2f146118a75760405162461bcd60e51b815260206004820152601760248201527627232a1034b9903737ba102234b0b6b7b732103a34b2b960491b604482015260640161068b565b60008381526003602052604090205460ff16156119065760405162461bcd60e51b815260206004820152601c60248201527f4e465420616c7265616479207573656420666f72207374616b696e6700000000604482015260640161068b565b6040518061010001604052808781526020014281526020018581526020018481526020016001151581526020018381526020016001151581526020018681525060026000896001600160a01b03166001600160a01b031681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555060e0820151816007015590505060016003600085815260200190815260200160002060006101000a81548160ff021916908315150217905550611a1f87612a57565b600654611a2c90876129fb565b600655600754611a3d9060016129fb565b600755600954611a4e9060016129fb565b600955600a54611a5e90876129fb565b600a5560408051878152602081018590529081018690526001600160a01b038816907f578e36e2593159a433c62763b901e31f4530d19b7534fd31cab8e00c0b6137f29060600160405180910390a250505050505050565b611abe612887565b600b5460ff1615611b2b5760405162461bcd60e51b815260206004820152603160248201527f436f6e747261637420696e206d6967726174696f6e206d6f6465202d206e6577604482015270081cdd185ada5b99c8191a5cd8589b1959607a1b606482015260840161068b565b3360009081526002602052604090206004015460ff1615611b805760405162461bcd60e51b815260206004820152600f60248201526e416c7265616479207374616b696e6760881b604482015260640161068b565b6101f58110158015611b9457506103e88111155b611bdb5760405162461bcd60e51b8152602060048201526018602482015277125b9d985b1a5908191a585b5bdb99081d1bdad95b88125160421b604482015260640161068b565b6040516331a9108f60e11b81526004810182905233906001600160a01b037f000000000000000000000000e0d947b837b42ea1bcd7dec7640d5b3bb2455d4e1690636352211e90602401602060405180830381865afa158015611c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c669190612ec9565b6001600160a01b031614611cb45760405162461bcd60e51b8152602060048201526015602482015274139bdd081bdddb995c881bd9881d1a1a5cc8139195605a1b604482015260640161068b565b60008181526003602052604090205460ff1615611d135760405162461bcd60e51b815260206004820152601c60248201527f4e465420616c7265616479207573656420666f72207374616b696e6700000000604482015260640161068b565b604051632783162d60e11b8152600481018290526000907f000000000000000000000000e0d947b837b42ea1bcd7dec7640d5b3bb2455d4e6001600160a01b031690634f062c5a90602401600060405180830381865afa158015611d7b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611da39190810190612efc565b604080518082019091526007815266111a585b5bdb9960ca1b6020918201528151908201209091507faadb29765cb3e4f21bde5ecd65db8e565d901b6c9394dcec22aa81b8ff2d6e2f14611e335760405162461bcd60e51b815260206004820152601760248201527627232a1034b9903737ba102234b0b6b7b732103a34b2b960491b604482015260640161068b565b6040516323b872dd60e01b815233600482015230602482015265048c2739500060448201527f000000000000000000000000b1205f513c0f157363f79ffb5455907685ab34ce6001600160a01b0316906323b872dd906064016020604051808303816000875af1158015611eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecf9190612e31565b611eeb5760405162461bcd60e51b815260040161068b90612e99565b604080516101008101825265048c27395000815242602080830182815283850183815260608501888152600160808701818152600060a0890181815260c08a0182815260e08b01998a52338084526002808b528d85209c518d5598518c8701559651978b019790975593516003808b0191909155915160048a01805491151560ff19928316179055935160058a015594516006890180549115159185169190911790559551600790970196909655888352939092529390932080549091169091179055611fb790612a57565b600654611fca9065048c273950006129fb565b600655600754611fdb9060016129fb565b6007556040805165048c273950008152602081018490524281830152905133917fb4caaf29adda3eefee3ad552a8e85058589bf834c7466cae4ee58787f70589ed919081900360600190a25061089060018055565b60008060008060008060006006546007546008547f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161209f91906001600160a01b0391909116815260200190565b602060405180830381865afa1580156120bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e09190612e18565b6040516370a0823160e01b81523060048201527f000000000000000000000000b1205f513c0f157363f79ffb5455907685ab34ce6001600160a01b0316906370a0823190602401602060405180830381865afa158015612144573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121689190612e18565b600954600a54959d949c50929a50909850965094509092509050565b61218c61282d565b600b5460ff166121de5760405162461bcd60e51b815260206004820152601b60248201527f4d6967726174696f6e20616c726561647920636f6d706c657465640000000000604482015260640161068b565b600c54811161222f5760405162461bcd60e51b815260206004820152601860248201527f43616e206f6e6c7920657874656e6420646561646c696e650000000000000000604482015260640161068b565b600c55565b6004546060908190819081908190806001600160401b0381111561225a5761225a612ee6565b604051908082528060200260200182016040528015612283578160200160208202803683370190505b509550806001600160401b0381111561229e5761229e612ee6565b6040519080825280602002602001820160405280156122c7578160200160208202803683370190505b509450806001600160401b038111156122e2576122e2612ee6565b60405190808252806020026020018201604052801561230b578160200160208202803683370190505b509350806001600160401b0381111561232657612326612ee6565b60405190808252806020026020018201604052801561234f578160200160208202803683370190505b509250806001600160401b0381111561236a5761236a612ee6565b604051908082528060200260200182016040528015612393578160200160208202803683370190505b50915060005b81811015612514576000600482815481106123b6576123b6612e83565b60009182526020808320909101546001600160a01b0316808352600280835260409384902084516101008101865281548152600182015494810194909452908101549383019390935260038301546060830152600483015460ff90811615156080840152600584015460a0840152600684015416151560c083015260079092015460e082015289519192509082908a908590811061245657612456612e83565b60200260200101906001600160a01b031690816001600160a01b031681525050806000015188848151811061248d5761248d612e83565b6020026020010181815250508060e001518784815181106124b0576124b0612e83565b60200260200101818152505080606001518684815181106124d3576124d3612e83565b6020026020010181815250506124e882611422565b8584815181106124fa576124fa612e83565b911515602092830291909101909101525050600101612399565b50509091929394565b6001600160a01b03811660009081526002602081815260408084208151610100810183528154808252600183015494820185905294820154928101839052600382015460608201819052600483015460ff908116151560808401819052600585015460a08501526006850154909116151560c084015260079093015460e083015286958695869586958695869586959194919391926125bb8f611422565b8660c001518760e001519850985098509850985098509850985050919395975091939597565b6001600160a01b03811660009081526002602052604081206004015460ff1661260c57506000919050565b6001600160a01b03828116600090815260026020526040908190206003015490516331a9108f60e11b815260048101919091527f000000000000000000000000e0d947b837b42ea1bcd7dec7640d5b3bb2455d4e90911690636352211e90602401602060405180830381865afa9250505080156126a6575060408051601f3d908101601f191682019092526126a391810190612ec9565b60015b6126b257506000919050565b826001600160a01b0316816001600160a01b031614915050919050565b6126d761282d565b6001600160a01b03811661273c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068b565b61089081612a07565b6001600160a01b03811660009081526002602052604081206004015460ff1661277057506000919050565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b0316906370a0823190602401602060405180830381865afa1580156127d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fb9190612e18565b905080158061280a5750600754155b156128185750600092915050565b600754612826908290612acc565b9392505050565b6000546001600160a01b03163314610e395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161068b565b6002600154036128d95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161068b565b6002600155565b6001600160a01b03811660009081526005602052604081205460045490919061290b90600190612fdb565b90508082146129935760006004828154811061292957612929612e83565b600091825260209091200154600480546001600160a01b03909216925082918590811061295857612958612e83565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559290911681526005909152604090208290555b60048054806129a4576129a4612fee565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03949094168152600590935250506040812055565b60006129f28284612fdb565b90505b92915050565b60006129f28284613004565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600480546001808201835560008390527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b90910180546001600160a01b0319166001600160a01b0385161790559054612ab09190612fdb565b6001600160a01b03909116600090815260056020526040902055565b60006129f28284613017565b6001600160a01b038116811461089057600080fd5b600060208284031215612aff57600080fd5b813561282681612ad8565b600060208284031215612b1c57600080fd5b5035919050565b60008083601f840112612b3557600080fd5b5081356001600160401b03811115612b4c57600080fd5b6020830191508360208260051b8501011115612b6757600080fd5b9250929050565b60008060008060008060008060008060008060c08d8f031215612b9057600080fd5b6001600160401b038d351115612ba557600080fd5b612bb28e8e358f01612b23565b909c509a506001600160401b0360208e01351115612bcf57600080fd5b612bdf8e60208f01358f01612b23565b909a5098506001600160401b0360408e01351115612bfc57600080fd5b612c0c8e60408f01358f01612b23565b90985096506001600160401b0360608e01351115612c2957600080fd5b612c398e60608f01358f01612b23565b90965094506001600160401b0360808e01351115612c5657600080fd5b612c668e60808f01358f01612b23565b90945092506001600160401b0360a08e01351115612c8357600080fd5b612c938e60a08f01358f01612b23565b81935080925050509295989b509295989b509295989b565b60008151808452602080850194506020840160005b83811015612ce55781516001600160a01b031687529582019590820190600101612cc0565b509495945050505050565b6020815260006129f26020830184612cab565b60008060008060008060c08789031215612d1c57600080fd5b8635612d2781612ad8565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b60008151808452602080850194506020840160005b83811015612ce557815187529582019590820190600101612d64565b60a081526000612d9360a0830188612cab565b60208382036020850152612da78289612d4f565b91508382036040850152612dbb8288612d4f565b91508382036060850152612dcf8287612d4f565b84810360808601528551808252602080880194509091019060005b81811015612e08578451151583529383019391830191600101612dea565b50909a9950505050505050505050565b600060208284031215612e2a57600080fd5b5051919050565b600060208284031215612e4357600080fd5b8151801515811461282657600080fd5b602080825260169082015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260169082015275141492559256081d1c985b9cd9995c8819985a5b195960521b604082015260600190565b600060208284031215612edb57600080fd5b815161282681612ad8565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215612f0f57600080fd5b82516001600160401b0380821115612f2657600080fd5b818501915085601f830112612f3a57600080fd5b815181811115612f4c57612f4c612ee6565b604051601f8201601f19908116603f01168101908382118183101715612f7457612f74612ee6565b816040528281528886848701011115612f8c57600080fd5b600093505b82841015612fae5784840186015181850187015292850192612f91565b600086848301015280965050505050505092915050565b634e487b7160e01b600052601160045260246000fd5b818103818111156129f5576129f5612fc5565b634e487b7160e01b600052603160045260246000fd5b808201808211156129f5576129f5612fc5565b60008261303457634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220afcd9fec63e793b4db772bd970877a64de73ab49564f86ad4c19da1205d1476d64736f6c63430008170033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000b1205f513c0f157363f79ffb5455907685ab34ce000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000e0d947b837b42ea1bcd7dec7640d5b3bb2455d4e000000000000000000000000d6afecb82e5e23829085069dda33a8b73fa0465a

-----Decoded View---------------
Arg [0] : _privixToken (address): 0xb1205f513C0F157363F79fFb5455907685Ab34ce
Arg [1] : _usdtToken (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [2] : _nftContract (address): 0xE0d947B837b42ea1bcD7dec7640d5b3BB2455D4e
Arg [3] : _migrationOperator (address): 0xD6afecB82e5e23829085069DDa33A8b73fa0465A

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000b1205f513c0f157363f79ffb5455907685ab34ce
Arg [1] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [2] : 000000000000000000000000e0d947b837b42ea1bcd7dec7640d5b3bb2455d4e
Arg [3] : 000000000000000000000000d6afecb82e5e23829085069dda33a8b73fa0465a


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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