ETH Price: $2,958.23 (+1.05%)

Contract

0x3191EF613f297b53f593fEa5044ce7A6B19985A5
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Retrieve Excess ...145409492025-01-26 11:41:53363 days ago1737891713IN
0x3191EF61...6B19985A5
0 ETH0.000000050.00119829
Claim With CHRNF...145286872025-01-26 4:53:09363 days ago1737867189IN
0x3191EF61...6B19985A5
0 ETH0.000000660.00014037
Claim With VECHR145286822025-01-26 4:52:59363 days ago1737867179IN
0x3191EF61...6B19985A5
0 ETH0.000000660.00014031
Claim With CHR145286772025-01-26 4:52:49363 days ago1737867169IN
0x3191EF61...6B19985A5
0 ETH0.000000660.00014032
Claim With CHRNF...144980982025-01-25 11:53:31364 days ago1737806011IN
0x3191EF61...6B19985A5
0 ETH0.00000070.00015575
Claim With CHRNF...144980662025-01-25 11:52:27364 days ago1737805947IN
0x3191EF61...6B19985A5
0 ETH0.000000740.00015148
Claim With CHRNF...144980592025-01-25 11:52:13364 days ago1737805933IN
0x3191EF61...6B19985A5
0 ETH0.000000740.00015134
Claim With VECHR144980572025-01-25 11:52:09364 days ago1737805929IN
0x3191EF61...6B19985A5
0 ETH0.000000670.00015036
Claim With VECHR144856472025-01-25 4:58:29364 days ago1737781109IN
0x3191EF61...6B19985A5
0 ETH0.000004430.00100257
Claim With VECHR144119572025-01-23 12:02:09366 days ago1737633729IN
0x3191EF61...6B19985A5
0 ETH0.000000380.00008284
Claim With CHRNF...143746132025-01-22 15:17:21366 days ago1737559041IN
0x3191EF61...6B19985A5
0 ETH0.000000070.00001918
Claim With VECHR143746022025-01-22 15:16:59366 days ago1737559019IN
0x3191EF61...6B19985A5
0 ETH0.000000070.00001943
Claim With CHR143745942025-01-22 15:16:43366 days ago1737559003IN
0x3191EF61...6B19985A5
0 ETH0.000000070.00001962
Claim With CHRNF...143686992025-01-22 12:00:13367 days ago1737547213IN
0x3191EF61...6B19985A5
0 ETH0.000001490.00110082
Set User Claim A...143257642025-01-21 12:09:03368 days ago1737461343IN
0x3191EF61...6B19985A5
0 ETH0.000000070.00000033
Set User Claim A...143254962025-01-21 12:00:07368 days ago1737460807IN
0x3191EF61...6B19985A5
0 ETH0.000000040.00000034
Set User Claim A...143254572025-01-21 11:58:49368 days ago1737460729IN
0x3191EF61...6B19985A5
0 ETH0.000000040.00000035
Claim With VECHR141281612025-01-16 22:22:17372 days ago1737066137IN
0x3191EF61...6B19985A5
0 ETH0.000000550.00011633
Claim With CHRNF...141281522025-01-16 22:21:59372 days ago1737066119IN
0x3191EF61...6B19985A5
0 ETH0.000000590.00011366
Claim With VECHR140781382025-01-15 18:34:51373 days ago1736966091IN
0x3191EF61...6B19985A5
0 ETH0.000001110.000002
Claim With CHRNF...140778982025-01-15 18:26:51373 days ago1736965611IN
0x3191EF61...6B19985A5
0 ETH0.000006660.00110157
Claim With VECHR140778922025-01-15 18:26:39373 days ago1736965599IN
0x3191EF61...6B19985A5
0 ETH0.000006830.00110155
Claim With CHR140725702025-01-15 15:29:15373 days ago1736954955IN
0x3191EF61...6B19985A5
0 ETH0.000013830.00001348
Claim With CHRNF...140725492025-01-15 15:28:33373 days ago1736954913IN
0x3191EF61...6B19985A5
0 ETH0.000010950.00001351
Claim With CHRNF...140720922025-01-15 15:13:19373 days ago1736953999IN
0x3191EF61...6B19985A5
0 ETH0.000018890.00112651
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
veFNXClaimer

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 2000 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity =0.8.19;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeMath} from "@openzeppelin/contracts/utils/math/SafeMath.sol";

import {IVotingEscrow} from "../core/interfaces/IVotingEscrow.sol";

contract veFNXClaimer is Ownable, ReentrancyGuard {
    IERC20 public fnxToken;
    IVotingEscrow public lockingContract;

    uint256 public constant LOCK_DURATION = 182 * 24 * 60 * 60; // 182 days in seconds
    uint256 public chrRatio;
    uint256 public spchrRatio;
    uint256 public elchrRatio;
    uint256 public vechrRatio;
    uint256 public chrnftRatio;

    mapping(address => uint256) public chrClaimAmount;
    mapping(address => uint256) public spchrClaimAmount;
    mapping(address => uint256) public elchrClaimAmount;
    mapping(address => uint256) public vechrClaimAmount;
    mapping(address => uint256) public chrnftClaimAmount;

    mapping(address => uint256) public chrClaimedAmount;
    mapping(address => uint256) public spchrClaimedAmount;
    mapping(address => uint256) public elchrClaimedAmount;
    mapping(address => uint256) public vechrClaimedAmount;
    mapping(address => uint256) public chrnftClaimedAmount;

    mapping(address => uint256) public chrMigratedAmount;
    mapping(address => uint256) public spchrMigratedAmount;
    mapping(address => uint256) public elchrMigratedAmount;
    mapping(address => uint256) public vechrMigratedAmount;
    mapping(address => uint256) public chrnftMigratedAmount;

    event Claimed(address indexed user, uint256 amount, string tokenType);
    event ClaimAmountSet(address indexed user, uint256 amount, string tokenType);
    event MigratedAmountSet(address indexed user, uint256 amount, string tokenType);
    event RatiosSet(uint256 chrRatio, uint256 spchrRatio, uint256 elchrRatio, uint256 vechrRatio, uint256 chrnftRatio);

    using SafeMath for uint256;

    constructor(address _fnxToken, address _lockingContract) Ownable() {
        fnxToken = IERC20(_fnxToken);
        lockingContract = IVotingEscrow(_lockingContract);
        chrRatio = 15500;
        spchrRatio = 15500;
        elchrRatio = 15500;
        vechrRatio = 9700;
        chrnftRatio = 1094000;
    }

    function setRatios(
        uint256 _chrRatio,
        uint256 _spchrRatio,
        uint256 _elchrRatio,
        uint256 _vechrRatio,
        uint256 _chrnftRatio
    ) external onlyOwner {
        chrRatio = _chrRatio;
        spchrRatio = _spchrRatio;
        elchrRatio = _elchrRatio;
        vechrRatio = _vechrRatio;
        chrnftRatio = _chrnftRatio;

        emit RatiosSet(chrRatio, spchrRatio, elchrRatio, vechrRatio, chrnftRatio);
    }

    function claimWithCHR(bool withPermanentLock_, uint256 managedTokenIdForAttach_) external nonReentrant {
        uint256 claimAmount = chrClaimAmount[msg.sender];
        chrClaimedAmount[msg.sender] += claimAmount;
        _updateClaimAmount(msg.sender, "CHR");

        _createLock(msg.sender, claimAmount, withPermanentLock_, managedTokenIdForAttach_);
    }

    function claimWithSPCHR(bool withPermanentLock_, uint256 managedTokenIdForAttach_) external nonReentrant {
        uint256 claimAmount = spchrClaimAmount[msg.sender];
        spchrClaimedAmount[msg.sender] += claimAmount;
        _updateClaimAmount(msg.sender, "SPCHR");

        _createLock(msg.sender, claimAmount, withPermanentLock_, managedTokenIdForAttach_);
    }

    function claimWithELCHR(bool withPermanentLock_, uint256 managedTokenIdForAttach_) external nonReentrant {
        uint256 claimAmount = elchrClaimAmount[msg.sender];
        elchrClaimedAmount[msg.sender] += claimAmount;
        _updateClaimAmount(msg.sender, "ELCHR");

        _createLock(msg.sender, claimAmount, withPermanentLock_, managedTokenIdForAttach_);
    }

    function claimWithVECHR(bool withPermanentLock_, uint256 managedTokenIdForAttach_) external nonReentrant {
        uint256 claimAmount = vechrClaimAmount[msg.sender];
        vechrClaimedAmount[msg.sender] += claimAmount;
        _updateClaimAmount(msg.sender, "VECHR");

        _createLock(msg.sender, claimAmount, withPermanentLock_, managedTokenIdForAttach_);
    }

    function claimWithCHRNFT(bool withPermanentLock_, uint256 managedTokenIdForAttach_) external nonReentrant {
        uint256 claimAmount = chrnftClaimAmount[msg.sender];
        chrnftClaimedAmount[msg.sender] += claimAmount;
        _updateClaimAmount(msg.sender, "CHRNFT");

        _createLock(msg.sender, claimAmount, withPermanentLock_, managedTokenIdForAttach_);
    }

    function setUserClaimAmounts(address[] memory users, uint256[] memory migratedAmounts, string memory tokenType) external onlyOwner {
        require(users.length == migratedAmounts.length, "Users and migrated amounts arrays must be the same length");

        bytes32 tokenTypeHash = keccak256(abi.encodePacked(tokenType));

        require(
            tokenTypeHash == keccak256("CHR") ||
                tokenTypeHash == keccak256("SPCHR") ||
                tokenTypeHash == keccak256("ELCHR") ||
                tokenTypeHash == keccak256("VECHR") ||
                tokenTypeHash == keccak256("CHRNFT"),
            "Invalid token type"
        );

        uint256 ratio;
        if (tokenTypeHash == keccak256("CHRNFT")) {
            ratio = chrnftRatio;
        } else if (tokenTypeHash == keccak256("CHR")) {
            ratio = chrRatio;
        } else if (tokenTypeHash == keccak256("SPCHR")) {
            ratio = spchrRatio;
        } else if (tokenTypeHash == keccak256("ELCHR")) {
            ratio = elchrRatio;
        } else if (tokenTypeHash == keccak256("VECHR")) {
            ratio = vechrRatio;
        }

        for (uint256 i = 0; i < users.length; i++) {
            address user = users[i];
            uint256 migratedAmount = migratedAmounts[i];
            uint256 amount;
            if (
                tokenTypeHash == keccak256("CHR") ||
                tokenTypeHash == keccak256("SPCHR") ||
                tokenTypeHash == keccak256("ELCHR") ||
                tokenTypeHash == keccak256("VECHR")
            ) {
                amount = migratedAmount.mul(1000).div(ratio);
            } else {
                amount = migratedAmount.mul(ratio).mul(1e18).div(1000);
            }

            if (tokenTypeHash == keccak256("CHR")) {
                chrClaimAmount[user] = amount;
                chrMigratedAmount[user] = migratedAmount;
            } else if (tokenTypeHash == keccak256("SPCHR")) {
                spchrClaimAmount[user] = amount;
                spchrMigratedAmount[user] = migratedAmount;
            } else if (tokenTypeHash == keccak256("ELCHR")) {
                elchrClaimAmount[user] = amount;
                elchrMigratedAmount[user] = migratedAmount;
            } else if (tokenTypeHash == keccak256("VECHR")) {
                vechrClaimAmount[user] = amount;
                vechrMigratedAmount[user] = migratedAmount;
            } else if (tokenTypeHash == keccak256("CHRNFT")) {
                chrnftClaimAmount[user] = amount;
                chrnftMigratedAmount[user] = migratedAmount;
            }

            emit ClaimAmountSet(user, amount, tokenType);
            emit MigratedAmountSet(user, migratedAmount, tokenType);
        }
    }

    function retrieveExcessFNX(uint256 amount) external onlyOwner {
        uint256 balance = fnxToken.balanceOf(address(this));
        require(amount <= balance, "Amount exceeds balance");
        fnxToken.transfer(msg.sender, amount);
    }

    function _createLock(address target_, uint256 claimAmount_, bool withPermanentLock_, uint256 managedTokenIdForAttach_) internal {
        require(claimAmount_ > 0, "No claimable amount");
        fnxToken.approve(address(lockingContract), claimAmount_);
        lockingContract.createLockFor(claimAmount_, LOCK_DURATION, target_, false, withPermanentLock_, managedTokenIdForAttach_);
    }

    function _updateClaimAmount(address user, string memory tokenType) internal {
        if (keccak256(abi.encodePacked(tokenType)) == keccak256("CHR")) {
            emit Claimed(user, chrClaimAmount[user], "CHR");
            chrClaimAmount[user] = 0;
        } else if (keccak256(abi.encodePacked(tokenType)) == keccak256("SPCHR")) {
            emit Claimed(user, spchrClaimAmount[user], "SPCHR");
            spchrClaimAmount[user] = 0;
        } else if (keccak256(abi.encodePacked(tokenType)) == keccak256("ELCHR")) {
            emit Claimed(user, elchrClaimAmount[user], "ELCHR");
            elchrClaimAmount[user] = 0;
        } else if (keccak256(abi.encodePacked(tokenType)) == keccak256("VECHR")) {
            emit Claimed(user, vechrClaimAmount[user], "VECHR");
            vechrClaimAmount[user] = 0;
        } else if (keccak256(abi.encodePacked(tokenType)) == keccak256("CHRNFT")) {
            emit Claimed(user, chrnftClaimAmount[user], "CHRNFT");
            chrnftClaimAmount[user] = 0;
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721Upgradeable is IERC165Upgradeable {
    /**
     * @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/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 IERC165Upgradeable {
    /**
     * @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) (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.4) (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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

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

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol";

/**
 * @title IVotingEscrow
 * @notice Interface for Voting Escrow, allowing users to lock tokens in exchange for veNFTs that are used in governance and other systems.
 */
interface IVotingEscrow is IERC721Upgradeable {
    /**
     * @notice Enum representing the types of deposits that can be made.
     * @dev Defines the context in which a deposit is made:
     * - `DEPOSIT_FOR_TYPE`: Regular deposit for an existing lock.
     * - `CREATE_LOCK_TYPE`: Creating a new lock.
     * - `INCREASE_UNLOCK_TIME`: Increasing the unlock time for an existing lock.
     * - `MERGE_TYPE`: Merging two locks together.
     */
    enum DepositType {
        DEPOSIT_FOR_TYPE,
        CREATE_LOCK_TYPE,
        INCREASE_UNLOCK_TIME,
        MERGE_TYPE
    }

    /**
     * @notice Structure representing the state of a token.
     * @dev This includes information about the lock, voting status, attachment status, last transfer block, and point epoch.
     * @param locked The locked balance associated with the token.
     * @param isVoted Whether the token has been used to vote.
     * @param isAttached Whether the token is attached to a managed NFT.
     * @param lastTranferBlock The block number of the last transfer.
     * @param pointEpoch The epoch of the last point associated with the token.
     */
    struct TokenState {
        LockedBalance locked;
        bool isVoted;
        bool isAttached;
        uint256 lastTranferBlock;
        uint256 pointEpoch;
    }

    /**
     * @notice Structure representing a locked balance.
     * @dev Contains the amount locked, the end time of the lock, and whether the lock is permanent.
     * @param amount The amount of tokens locked.
     * @param end The timestamp when the lock ends.
     * @param isPermanentLocked Whether the lock is permanent.
     */
    struct LockedBalance {
        int128 amount;
        uint256 end;
        bool isPermanentLocked;
    }

    /**
     * @notice Structure representing a point in time for calculating voting power.
     * @dev Used for calculating the slope and bias for lock balances over time.
     * @param bias The bias of the lock, representing the remaining voting power.
     * @param slope The rate at which the voting power decreases.
     * @param ts The timestamp of the point.
     * @param blk The block number of the point.
     * @param permanent The permanent amount associated with the lock.
     */
    struct Point {
        int128 bias;
        int128 slope; // -dweight / dt
        uint256 ts;
        uint256 blk; // block
        int128 permanent;
    }

    /**
     * @notice Emitted when a boost is applied to a token's lock.
     * @param tokenId The ID of the token that received the boost.
     * @param value The value of the boost applied.
     */
    event Boost(uint256 indexed tokenId, uint256 value);

    /**
     * @notice Emitted when a deposit is made into a lock.
     * @param provider The address of the entity making the deposit.
     * @param tokenId The ID of the token associated with the deposit.
     * @param value The value of the deposit made.
     * @param locktime The time until which the lock is extended.
     * @param deposit_type The type of deposit being made.
     * @param ts The timestamp when the deposit was made.
     */
    event Deposit(address indexed provider, uint256 tokenId, uint256 value, uint256 indexed locktime, DepositType deposit_type, uint256 ts);

    /**
     * @notice Emitted when a withdrawal is made from a lock.
     * @param provider The address of the entity making the withdrawal.
     * @param tokenId The ID of the token associated with the withdrawal.
     * @param value The value of the withdrawal made.
     * @param ts The timestamp when the withdrawal was made.
     */
    event Withdraw(address indexed provider, uint256 tokenId, uint256 value, uint256 ts);

    /**
     * @notice Emitted when the total supply of voting power changes.
     * @param prevSupply The previous total supply of voting power.
     * @param supply The new total supply of voting power.
     */
    event Supply(uint256 prevSupply, uint256 supply);

    /**
     * @notice Emitted when an address associated with the contract is updated.
     * @param key The key representing the contract being updated.
     * @param value The new address of the contract.
     */
    event UpdateAddress(string key, address indexed value);

    /**
     * @notice Emitted when a token is permanently locked by a user.
     * @param sender The address of the user who initiated the lock.
     * @param tokenId The ID of the token that has been permanently locked.
     */
    event LockPermanent(address indexed sender, uint256 indexed tokenId);

    /**
     * @notice Emitted when a token is unlocked from a permanent lock state by a user.
     * @param sender The address of the user who initiated the unlock.
     * @param tokenId The ID of the token that has been unlocked from its permanent state.
     */
    event UnlockPermanent(address indexed sender, uint256 indexed tokenId);

    /**
     * @notice Returns the address of the token used in voting escrow.
     * @return The address of the token.
     */
    function token() external view returns (address);

    /**
     * @notice Returns the address of the voter.
     * @return The address of the voter.
     */
    function voter() external view returns (address);

    /**
     * @notice Checks if the specified address is approved or the owner of the given token.
     * @param sender The address to check.
     * @param tokenId The ID of the token to check against.
     * @return True if the sender is approved or the owner of the token, false otherwise.
     */
    function isApprovedOrOwner(address sender, uint256 tokenId) external view returns (bool);

    /**
     * @notice Retrieves the state of a specific NFT.
     * @param tokenId_ The ID of the NFT to query.
     * @return The current state of the specified NFT.
     */
    function getNftState(uint256 tokenId_) external view returns (TokenState memory);

    /**
     * @notice Returns the total supply of voting power at the current block timestamp.
     * @return The total supply of voting power.
     */
    function votingPowerTotalSupply() external view returns (uint256);

    /**
     * @notice Returns the balance of an NFT at the current block timestamp.
     * @param tokenId_ The ID of the NFT to query.
     * @return The balance of the NFT.
     */
    function balanceOfNFT(uint256 tokenId_) external view returns (uint256);

    /**
     * @notice Returns the balance of an NFT at the current block timestamp, ignoring ownership changes.
     * @param tokenId_ The ID of the NFT to query.
     * @return The balance of the NFT.
     */
    function balanceOfNftIgnoreOwnershipChange(uint256 tokenId_) external view returns (uint256);

    /**
     * @notice Updates the address of a specified contract.
     * @param key_ The key representing the contract.
     * @param value_ The new address of the contract.
     * @dev Reverts with `InvalidAddressKey` if the key does not match any known contracts.
     * Emits an {UpdateAddress} event on successful address update.
     */
    function updateAddress(string memory key_, address value_) external;

    /**
     * @notice Hooks the voting state for a specified NFT.
     * @param tokenId_ The ID of the NFT.
     * @param state_ The voting state to set.
     * @dev Reverts with `AccessDenied` if the caller is not the voter.
     */
    function votingHook(uint256 tokenId_, bool state_) external;

    /**
     * @notice Creates a new lock for a specified recipient.
     * @param amount_ The amount of tokens to lock.
     * @param lockDuration_ The duration for which the tokens will be locked.
     * @param to_ The address of the recipient who will receive the veNFT.
     * @param shouldBoosted_ Whether the deposit should be boosted.
     * @param withPermanentLock_ Whether the lock should be permanent.
     * @param managedTokenIdForAttach_ The ID of the managed NFT to attach, if any. 0 for ignore
     * @return The ID of the newly created veNFT.
     * @dev Reverts with `InvalidLockDuration` if the lock duration is invalid.
     * Emits a {Deposit} event on successful lock creation.
     */
    function createLockFor(
        uint256 amount_,
        uint256 lockDuration_,
        address to_,
        bool shouldBoosted_,
        bool withPermanentLock_,
        uint256 managedTokenIdForAttach_
    ) external returns (uint256);

    /**
     * @notice Deposits tokens for a specific NFT, increasing its locked balance.
     * @param tokenId_ The ID of the NFT.
     * @param amount_ The amount of tokens to deposit.
     * @param shouldBoosted_ Whether the deposit should be boosted.
     * @param withPermanentLock_ Whether to apply a permanent lock.
     * @dev Reverts with `InvalidAmount` if the amount is zero.
     * Emits a {Deposit} event on successful deposit.
     */
    function depositFor(uint256 tokenId_, uint256 amount_, bool shouldBoosted_, bool withPermanentLock_) external;

    /**
     * @notice Increases the unlock time for a specified NFT.
     * @param tokenId_ The ID of the NFT to increase unlock time for.
     * @param lockDuration_ The additional duration to add to the unlock time.
     * @dev Reverts with `InvalidLockDuration` if the new unlock time is invalid.
     * Reverts with `AccessDenied` if the caller is not approved or the owner of the NFT.
     * Emits a {Deposit} event on successful unlock time increase.
     */
    function increase_unlock_time(uint256 tokenId_, uint256 lockDuration_) external;

    /**
     * @notice Deposits tokens to increase the balance and extend the lock duration for a given token ID.
     * @dev The lock duration is increased and the deposit is processed for the given token.
     *
     * !!! Important: The veBoost incentive is applied whenever possible
     *
     * @param tokenId_ The ID of the token to increase the balance and extend the lock duration.
     * @param amount_ The amount of tokens to be deposited.
     * @param lockDuration_ The duration (in seconds) - how long the new lock should be.
     * Emits a {Deposit} event on successful deposit.
     * Emits second a {Deposit} event on successful unlock time increase.
     */
    function depositWithIncreaseUnlockTime(uint256 tokenId_, uint256 amount_, uint256 lockDuration_) external;

    /**
     * @notice Withdraws tokens from a specified NFT lock.
     * @param tokenId_ The ID of the NFT to withdraw tokens from.
     * @dev Reverts with `AccessDenied` if the caller is not approved or the owner of the NFT.
     * Emits a {Supply} event reflecting the change in total supply.
     */
    function withdraw(uint256 tokenId_) external;

    /**
     * @notice Merges two NFTs into one.
     * @param tokenFromId_ The ID of the NFT to merge from.
     * @param tokenToId_ The ID of the NFT to merge into.
     * @dev Reverts with `MergeTokenIdsTheSame` if the token IDs are the same.
     * Reverts with `AccessDenied` if the caller is not approved or the owner of both NFTs.
     * Emits a {Deposit} event reflecting the merge.
     */
    function merge(uint256 tokenFromId_, uint256 tokenToId_) external;

    /**
     * @notice Permanently locks a specified NFT.
     * @param tokenId_ The ID of the NFT to lock permanently.
     * @dev Reverts with `AccessDenied` if the caller is not approved or the owner of the NFT.
     * Emits a {LockPermanent} event on successful permanent lock.
     */
    function lockPermanent(uint256 tokenId_) external;

    /**
     * @notice Unlocks a permanently locked NFT.
     * @param tokenId_ The ID of the NFT to unlock.
     * @dev Reverts with `AccessDenied` if the caller is not approved or the owner of the NFT.
     * Emits an {UnlockPermanent} event on successful unlock.
     */
    function unlockPermanent(uint256 tokenId_) external;

    /**
     * @notice Creates a new managed NFT for a given recipient.
     * @param recipient_ The address of the recipient to receive the newly created managed NFT.
     * @return The ID of the newly created managed NFT.
     * @dev Reverts with `AccessDenied` if the caller is not the managed NFT manager.
     */
    function createManagedNFT(address recipient_) external returns (uint256);

    /**
     * @notice Attaches a token to a managed NFT.
     * @param tokenId_ The ID of the user's token being attached.
     * @param managedTokenId_ The ID of the managed token to which the user's token is being attached.
     * @return The amount of tokens locked during the attach operation.
     * @dev Reverts with `AccessDenied` if the caller is not the managed NFT manager.
     * Reverts with `ZeroVotingPower` if the NFT has no voting power.
     * Reverts with `NotManagedNft` if the target is not a managed NFT.
     */
    function onAttachToManagedNFT(uint256 tokenId_, uint256 managedTokenId_) external returns (uint256);

    /**
     * @notice Detaches a token from a managed NFT.
     * @param tokenId_ The ID of the user's token being detached.
     * @param managedTokenId_ The ID of the managed token from which the user's token is being detached.
     * @param newBalance_ The new balance to set for the user's token post detachment.
     * @dev Reverts with `AccessDenied` if the caller is not the managed NFT manager.
     * Reverts with `NotManagedNft` if the target is not a managed NFT.
     */
    function onDettachFromManagedNFT(uint256 tokenId_, uint256 managedTokenId_, uint256 newBalance_) external;
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_fnxToken","type":"address"},{"internalType":"address","name":"_lockingContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenType","type":"string"}],"name":"ClaimAmountSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenType","type":"string"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenType","type":"string"}],"name":"MigratedAmountSet","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":false,"internalType":"uint256","name":"chrRatio","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"spchrRatio","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"elchrRatio","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vechrRatio","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"chrnftRatio","type":"uint256"}],"name":"RatiosSet","type":"event"},{"inputs":[],"name":"LOCK_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"chrClaimAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"chrClaimedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"chrMigratedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chrRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"chrnftClaimAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"chrnftClaimedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"chrnftMigratedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chrnftRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"withPermanentLock_","type":"bool"},{"internalType":"uint256","name":"managedTokenIdForAttach_","type":"uint256"}],"name":"claimWithCHR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"withPermanentLock_","type":"bool"},{"internalType":"uint256","name":"managedTokenIdForAttach_","type":"uint256"}],"name":"claimWithCHRNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"withPermanentLock_","type":"bool"},{"internalType":"uint256","name":"managedTokenIdForAttach_","type":"uint256"}],"name":"claimWithELCHR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"withPermanentLock_","type":"bool"},{"internalType":"uint256","name":"managedTokenIdForAttach_","type":"uint256"}],"name":"claimWithSPCHR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"withPermanentLock_","type":"bool"},{"internalType":"uint256","name":"managedTokenIdForAttach_","type":"uint256"}],"name":"claimWithVECHR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"elchrClaimAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"elchrClaimedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"elchrMigratedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"elchrRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fnxToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockingContract","outputs":[{"internalType":"contract IVotingEscrow","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"retrieveExcessFNX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_chrRatio","type":"uint256"},{"internalType":"uint256","name":"_spchrRatio","type":"uint256"},{"internalType":"uint256","name":"_elchrRatio","type":"uint256"},{"internalType":"uint256","name":"_vechrRatio","type":"uint256"},{"internalType":"uint256","name":"_chrnftRatio","type":"uint256"}],"name":"setRatios","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"migratedAmounts","type":"uint256[]"},{"internalType":"string","name":"tokenType","type":"string"}],"name":"setUserClaimAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"spchrClaimAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"spchrClaimedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"spchrMigratedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"spchrRatio","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":[{"internalType":"address","name":"","type":"address"}],"name":"vechrClaimAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vechrClaimedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vechrMigratedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vechrRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080346100e457601f62001bf238819003918201601f19168301916001600160401b038311848410176100e95780849260409485528339810103126100e457610053602061004c836100ff565b92016100ff565b60008054336001600160a01b0319808316821784556040519590946001600160a01b03949093859391908416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3600180551683600254161760025516906003541617600355613c8c80600455806005556006556125e46007556210b170600855611ade9081620001148239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100e45756fe6080604052600436101561001257600080fd5b60003560e01c806306f45f8614610bf25780630d2cf27414610a8a578063148a1e6114610a505780631effc02d146109d1578063236c6d731461095257806325b161551461091857806336480580146108de5780633d9c86b9146108a45780633f582b2a1461086a578063485d38341461084c5780634871d226146108125780634b256137146107eb5780635122c0f91461076c57806357ad88291461074e5780635f8914d71461071457806368144d69146106955780636a0c007d14610677578063715018a614610606578063721ada30146105cc57806377048937146105ae5780637a34c562146105905780637d020009146105565780638062bf5c1461052f5780638da5cb5b14610508578063999255ec146104ce578063b3b727da14610494578063bb8d3e501461045a578063ca6e58b414610420578063cc5171d514610402578063d72537a1146103c8578063e078e9f71461034c578063e9c8eacf146102c1578063f2fde38b146101d15763ffe993df1461019257600080fd5b346101cc5760206003193601126101cc576001600160a01b036101b36113e5565b1660005260126020526020604060002054604051908152f35b600080fd5b346101cc5760206003193601126101cc576101ea6113e5565b6101f261141a565b6001600160a01b0380911690811561025757600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b346101cc576103466102d2366113fb565b906102db611495565b33600052600b602052604060002054601060205260406000206102ff828254611472565b905561034060405161031081611378565b600581527f454c434852000000000000000000000000000000000000000000000000000000602082015233611705565b33611582565b60018055005b346101cc5760a06003193601126101cc577f5c8db23671d5b4f722b46d07d7cd2b5a1afd67ee0073e14bfe830e5d00a068d860a060043560843560643560443560243561039761141a565b84600455806005558160065582600755836008556040519485526020850152604084015260608301526080820152a1005b346101cc5760206003193601126101cc576001600160a01b036103e96113e5565b1660005260156020526020604060002054604051908152f35b346101cc5760006003193601126101cc576020600454604051908152f35b346101cc5760206003193601126101cc576001600160a01b036104416113e5565b1660005260146020526020604060002054604051908152f35b346101cc5760206003193601126101cc576001600160a01b0361047b6113e5565b16600052600e6020526020604060002054604051908152f35b346101cc5760206003193601126101cc576001600160a01b036104b56113e5565b1660005260106020526020604060002054604051908152f35b346101cc5760206003193601126101cc576001600160a01b036104ef6113e5565b1660005260116020526020604060002054604051908152f35b346101cc5760006003193601126101cc5760206001600160a01b0360005416604051908152f35b346101cc5760006003193601126101cc5760206001600160a01b0360025416604051908152f35b346101cc5760206003193601126101cc576001600160a01b036105776113e5565b1660005260136020526020604060002054604051908152f35b346101cc5760006003193601126101cc576020600554604051908152f35b346101cc5760006003193601126101cc576020600754604051908152f35b346101cc5760206003193601126101cc576001600160a01b036105ed6113e5565b16600052600d6020526020604060002054604051908152f35b346101cc5760006003193601126101cc5761061f61141a565b60006001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101cc5760006003193601126101cc576020600854604051908152f35b346101cc576103466106a6366113fb565b906106af611495565b33600052600c602052604060002054601160205260406000206106d3828254611472565b90556103406040516106e481611378565b600581527f5645434852000000000000000000000000000000000000000000000000000000602082015233611705565b346101cc5760206003193601126101cc576001600160a01b036107356113e5565b1660005260166020526020604060002054604051908152f35b346101cc5760006003193601126101cc576020600654604051908152f35b346101cc5761034661077d366113fb565b90610786611495565b33600052600d602052604060002054601260205260406000206107aa828254611472565b90556103406040516107bb81611378565b600681527f4348524e46540000000000000000000000000000000000000000000000000000602082015233611705565b346101cc5760006003193601126101cc5760206001600160a01b0360035416604051908152f35b346101cc5760206003193601126101cc576001600160a01b036108336113e5565b16600052600f6020526020604060002054604051908152f35b346101cc5760006003193601126101cc57602060405162eff1008152f35b346101cc5760206003193601126101cc576001600160a01b0361088b6113e5565b1660005260176020526020604060002054604051908152f35b346101cc5760206003193601126101cc576001600160a01b036108c56113e5565b16600052600b6020526020604060002054604051908152f35b346101cc5760206003193601126101cc576001600160a01b036108ff6113e5565b16600052600a6020526020604060002054604051908152f35b346101cc5760206003193601126101cc576001600160a01b036109396113e5565b1660005260096020526020604060002054604051908152f35b346101cc57610346610963366113fb565b9061096c611495565b336000526009602052604060002054600e6020526040600020610990828254611472565b90556103406040516109a181611378565b600381527f4348520000000000000000000000000000000000000000000000000000000000602082015233611705565b346101cc576103466109e2366113fb565b906109eb611495565b33600052600a602052604060002054600f6020526040600020610a0f828254611472565b9055610340604051610a2081611378565b600581527f5350434852000000000000000000000000000000000000000000000000000000602082015233611705565b346101cc5760206003193601126101cc576001600160a01b03610a716113e5565b16600052600c6020526020604060002054604051908152f35b346101cc576020806003193601126101cc57600435610aa761141a565b6001600160a01b0360025416906040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201528381602481865afa908115610b7557600091610bc5575b508111610b81576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810191909152908290829060449082906000905af18015610b7557610b4d57005b81610b6c92903d10610b6e575b610b6481836113aa565b81019061156a565b005b503d610b5a565b6040513d6000823e3d90fd5b6064836040519062461bcd60e51b82526004820152601660248201527f416d6f756e7420657863656564732062616c616e6365000000000000000000006044820152fd5b90508381813d8311610beb575b610bdc81836113aa565b810103126101cc575184610af7565b503d610bd2565b346101cc5760606003193601126101cc5767ffffffffffffffff6004358181116101cc57366023820112156101cc57806004013591610c30836113cd565b91610c3e60405193846113aa565b83835260208301906024809560051b820101903682116101cc578501915b818310611358575050508235908082116101cc57366023830112156101cc57816004013591610c8a836113cd565b92610c9860405194856113aa565b80845285602085019160051b830101913683116101cc578601905b828210611348575050506044358181116101cc57366023820112156101cc5780600401359182116113335760405191610cf66020601f19601f84011601846113aa565b8083526020830191368783830101116101cc57816000928860209301853784010152610d2061141a565b83518351036112c957610d4790610d546020604051809382820195869188519283916114ea565b81010380845201826113aa565b519020907f7de62342a32975aa47805e60a10a2271e2a718c6ebf4158a0ad7369d0e74cd0382148092811591826112a0575b8015611277575b801561124e575b8015611225575b156111e15760007f1a2825c73c305750cce9f81d6488d2e01f88caebb2ad355ab305efd9e9b25f59820361114157506008545b60005b8751811015610b6c576001600160a01b03610dec828a61150d565b5116610df8828961150d565b518786611118575b80156110ef575b80156110c6575b1561104c576103e8808202908282041482151715611037578415611022577f6b19042f1da1f9ce33a54a3dd482f02180c29df7cba143d074da677142e4802991837f430471d2e5d7154f375a29ec5c3266e86a81fddc58ef0ca377eac3144b737e108a888195045b8d15610f0157836000526009602052806040600020556013602052846040600020555b610ea860405192839283611537565b0390a2610eba60405192839283611537565b0390a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610eec57600101610dd1565b88634e487b7160e01b60005260116004526000fd5b7f4b0a5fd1a5bc8d16d6124c329875beeeb515a3fb23e817c363d4ac5af8ce64898b03610f4a5783600052600a602052806040600020556014602052846040600020555b610e99565b7fd907cde5797a6cad48a6d049faf854a3db6c14fbf5642cd35edfcc23309a27768b03610f925783600052600b60205280604060002055601560205284604060002055610e99565b7fa440bd38e98e3d04ef6bce1bf53b289f9cc1f710ace26e49300656881efd614f8b03610fda5783600052600c60205280604060002055601660205284604060002055610e99565b7f1a2825c73c305750cce9f81d6488d2e01f88caebb2ad355ab305efd9e9b25f598b03610f455783600052600d60205280604060002055601760205284604060002055610e99565b8b634e487b7160e01b60005260126004526000fd5b8b634e487b7160e01b60005260116004526000fd5b83810281810485148215171561103757670de0b6b3a764000090818102918183041490151715611037577f6b19042f1da1f9ce33a54a3dd482f02180c29df7cba143d074da677142e4802991837f430471d2e5d7154f375a29ec5c3266e86a81fddc58ef0ca377eac3144b737e108a6103e8819504610e76565b507fa440bd38e98e3d04ef6bce1bf53b289f9cc1f710ace26e49300656881efd614f8514610e0e565b507fd907cde5797a6cad48a6d049faf854a3db6c14fbf5642cd35edfcc23309a27768514610e07565b507f4b0a5fd1a5bc8d16d6124c329875beeeb515a3fb23e817c363d4ac5af8ce64898514610e00565b841561115157506004545b610dce565b7f4b0a5fd1a5bc8d16d6124c329875beeeb515a3fb23e817c363d4ac5af8ce648982036111815750600554610dce565b7fd907cde5797a6cad48a6d049faf854a3db6c14fbf5642cd35edfcc23309a277682036111b15750600654610dce565b7fa440bd38e98e3d04ef6bce1bf53b289f9cc1f710ace26e49300656881efd614f820361114c5750600754610dce565b60648760126040519162461bcd60e51b8352602060048401528201527f496e76616c696420746f6b656e207479706500000000000000000000000000006044820152fd5b507f1a2825c73c305750cce9f81d6488d2e01f88caebb2ad355ab305efd9e9b25f598114610d9b565b507fa440bd38e98e3d04ef6bce1bf53b289f9cc1f710ace26e49300656881efd614f8114610d94565b507fd907cde5797a6cad48a6d049faf854a3db6c14fbf5642cd35edfcc23309a27768114610d8d565b507f4b0a5fd1a5bc8d16d6124c329875beeeb515a3fb23e817c363d4ac5af8ce64898114610d86565b60848560396040519162461bcd60e51b8352602060048401528201527f557365727320616e64206d6967726174656420616d6f756e747320617272617960448201527f73206d757374206265207468652073616d65206c656e677468000000000000006064820152fd5b84634e487b7160e01b60005260416004526000fd5b8135815260209182019101610cb3565b82356001600160a01b03811681036101cc57815260209283019201610c5c565b6040810190811067ffffffffffffffff82111761139457604052565b634e487b7160e01b600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff82111761139457604052565b67ffffffffffffffff81116113945760051b60200190565b600435906001600160a01b03821682036101cc57565b60031960409101126101cc5760043580151581036101cc579060243590565b6001600160a01b0360005416330361142e57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b9190820180921161147f57565b634e487b7160e01b600052601160045260246000fd5b6002600154146114a6576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b60005b8381106114fd5750506000910152565b81810151838201526020016114ed565b80518210156115215760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b90601f606093601f199284526040602085015261156381518092816040880152602088880191016114ea565b0116010190565b908160209103126101cc575180151581036101cc5790565b91909182156116c1576002546003546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810186905291811695602095919491928681806044810103816000809c5af180156116b6579287959492899260c495611699575b5087600354169160405198899788967f42c15c87000000000000000000000000000000000000000000000000000000008852600488015262eff10060248801521660448601528360648601521515608485015260a48401525af1801561168e5761166657505050565b813d8311611687575b61167981836113aa565b810103126116845750565b80fd5b503d61166f565b6040513d85823e3d90fd5b6116af90883d8a11610b6e57610b6481836113aa565b50386115fd565b6040513d8a823e3d90fd5b606460405162461bcd60e51b815260206004820152601360248201527f4e6f20636c61696d61626c6520616d6f756e74000000000000000000000000006044820152fd5b60409081516020937f7de62342a32975aa47805e60a10a2271e2a718c6ebf4158a0ad7369d0e74cd03858301825193611748888281870197610d4781878b6114ea565b519020036117ce5750506000926001600160a01b0360099216808552828252807faaf4f52f2d9453d1bd23cd1b1cd2388a7dd01f328cfe74ef0ad765fffd89d3f8608086882054875190815287868201526003888201527f43485200000000000000000000000000000000000000000000000000000000006060820152a2845252812055565b7f4b0a5fd1a5bc8d16d6124c329875beeeb515a3fb23e817c363d4ac5af8ce648984518681019061180788828651610d4781878b6114ea565b5190200361188d5750506000926001600160a01b03600a9216808552828252807faaf4f52f2d9453d1bd23cd1b1cd2388a7dd01f328cfe74ef0ad765fffd89d3f8608086882054875190815287868201526005888201527f53504348520000000000000000000000000000000000000000000000000000006060820152a2845252812055565b7fd907cde5797a6cad48a6d049faf854a3db6c14fbf5642cd35edfcc23309a27768451868101906118c688828651610d4781878b6114ea565b5190200361194c5750506000926001600160a01b03600b9216808552828252807faaf4f52f2d9453d1bd23cd1b1cd2388a7dd01f328cfe74ef0ad765fffd89d3f8608086882054875190815287868201526005888201527f454c4348520000000000000000000000000000000000000000000000000000006060820152a2845252812055565b7fa440bd38e98e3d04ef6bce1bf53b289f9cc1f710ace26e49300656881efd614f84518681019061198588828651610d4781878b6114ea565b51902003611a0b5750506000926001600160a01b03600c9216808552828252807faaf4f52f2d9453d1bd23cd1b1cd2388a7dd01f328cfe74ef0ad765fffd89d3f8608086882054875190815287868201526005888201527f56454348520000000000000000000000000000000000000000000000000000006060820152a2845252812055565b907f1a2825c73c305750cce9f81d6488d2e01f88caebb2ad355ab305efd9e9b25f5991611a488686518093610d47838301968792519283916114ea565b51902014611a5557505050565b6000926001600160a01b03600d9216808552828252807faaf4f52f2d9453d1bd23cd1b1cd2388a7dd01f328cfe74ef0ad765fffd89d3f8608086882054875190815287868201526006888201527f4348524e465400000000000000000000000000000000000000000000000000006060820152a284525281205556fea164736f6c6343000813000a00000000000000000000000052f847356b38720b55ee18cb3e094ca11c85a192000000000000000000000000c900c984a3581efa4fb56caf6ef19721aafbb4f9

Deployed Bytecode

0x6080604052600436101561001257600080fd5b60003560e01c806306f45f8614610bf25780630d2cf27414610a8a578063148a1e6114610a505780631effc02d146109d1578063236c6d731461095257806325b161551461091857806336480580146108de5780633d9c86b9146108a45780633f582b2a1461086a578063485d38341461084c5780634871d226146108125780634b256137146107eb5780635122c0f91461076c57806357ad88291461074e5780635f8914d71461071457806368144d69146106955780636a0c007d14610677578063715018a614610606578063721ada30146105cc57806377048937146105ae5780637a34c562146105905780637d020009146105565780638062bf5c1461052f5780638da5cb5b14610508578063999255ec146104ce578063b3b727da14610494578063bb8d3e501461045a578063ca6e58b414610420578063cc5171d514610402578063d72537a1146103c8578063e078e9f71461034c578063e9c8eacf146102c1578063f2fde38b146101d15763ffe993df1461019257600080fd5b346101cc5760206003193601126101cc576001600160a01b036101b36113e5565b1660005260126020526020604060002054604051908152f35b600080fd5b346101cc5760206003193601126101cc576101ea6113e5565b6101f261141a565b6001600160a01b0380911690811561025757600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b346101cc576103466102d2366113fb565b906102db611495565b33600052600b602052604060002054601060205260406000206102ff828254611472565b905561034060405161031081611378565b600581527f454c434852000000000000000000000000000000000000000000000000000000602082015233611705565b33611582565b60018055005b346101cc5760a06003193601126101cc577f5c8db23671d5b4f722b46d07d7cd2b5a1afd67ee0073e14bfe830e5d00a068d860a060043560843560643560443560243561039761141a565b84600455806005558160065582600755836008556040519485526020850152604084015260608301526080820152a1005b346101cc5760206003193601126101cc576001600160a01b036103e96113e5565b1660005260156020526020604060002054604051908152f35b346101cc5760006003193601126101cc576020600454604051908152f35b346101cc5760206003193601126101cc576001600160a01b036104416113e5565b1660005260146020526020604060002054604051908152f35b346101cc5760206003193601126101cc576001600160a01b0361047b6113e5565b16600052600e6020526020604060002054604051908152f35b346101cc5760206003193601126101cc576001600160a01b036104b56113e5565b1660005260106020526020604060002054604051908152f35b346101cc5760206003193601126101cc576001600160a01b036104ef6113e5565b1660005260116020526020604060002054604051908152f35b346101cc5760006003193601126101cc5760206001600160a01b0360005416604051908152f35b346101cc5760006003193601126101cc5760206001600160a01b0360025416604051908152f35b346101cc5760206003193601126101cc576001600160a01b036105776113e5565b1660005260136020526020604060002054604051908152f35b346101cc5760006003193601126101cc576020600554604051908152f35b346101cc5760006003193601126101cc576020600754604051908152f35b346101cc5760206003193601126101cc576001600160a01b036105ed6113e5565b16600052600d6020526020604060002054604051908152f35b346101cc5760006003193601126101cc5761061f61141a565b60006001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101cc5760006003193601126101cc576020600854604051908152f35b346101cc576103466106a6366113fb565b906106af611495565b33600052600c602052604060002054601160205260406000206106d3828254611472565b90556103406040516106e481611378565b600581527f5645434852000000000000000000000000000000000000000000000000000000602082015233611705565b346101cc5760206003193601126101cc576001600160a01b036107356113e5565b1660005260166020526020604060002054604051908152f35b346101cc5760006003193601126101cc576020600654604051908152f35b346101cc5761034661077d366113fb565b90610786611495565b33600052600d602052604060002054601260205260406000206107aa828254611472565b90556103406040516107bb81611378565b600681527f4348524e46540000000000000000000000000000000000000000000000000000602082015233611705565b346101cc5760006003193601126101cc5760206001600160a01b0360035416604051908152f35b346101cc5760206003193601126101cc576001600160a01b036108336113e5565b16600052600f6020526020604060002054604051908152f35b346101cc5760006003193601126101cc57602060405162eff1008152f35b346101cc5760206003193601126101cc576001600160a01b0361088b6113e5565b1660005260176020526020604060002054604051908152f35b346101cc5760206003193601126101cc576001600160a01b036108c56113e5565b16600052600b6020526020604060002054604051908152f35b346101cc5760206003193601126101cc576001600160a01b036108ff6113e5565b16600052600a6020526020604060002054604051908152f35b346101cc5760206003193601126101cc576001600160a01b036109396113e5565b1660005260096020526020604060002054604051908152f35b346101cc57610346610963366113fb565b9061096c611495565b336000526009602052604060002054600e6020526040600020610990828254611472565b90556103406040516109a181611378565b600381527f4348520000000000000000000000000000000000000000000000000000000000602082015233611705565b346101cc576103466109e2366113fb565b906109eb611495565b33600052600a602052604060002054600f6020526040600020610a0f828254611472565b9055610340604051610a2081611378565b600581527f5350434852000000000000000000000000000000000000000000000000000000602082015233611705565b346101cc5760206003193601126101cc576001600160a01b03610a716113e5565b16600052600c6020526020604060002054604051908152f35b346101cc576020806003193601126101cc57600435610aa761141a565b6001600160a01b0360025416906040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201528381602481865afa908115610b7557600091610bc5575b508111610b81576040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810191909152908290829060449082906000905af18015610b7557610b4d57005b81610b6c92903d10610b6e575b610b6481836113aa565b81019061156a565b005b503d610b5a565b6040513d6000823e3d90fd5b6064836040519062461bcd60e51b82526004820152601660248201527f416d6f756e7420657863656564732062616c616e6365000000000000000000006044820152fd5b90508381813d8311610beb575b610bdc81836113aa565b810103126101cc575184610af7565b503d610bd2565b346101cc5760606003193601126101cc5767ffffffffffffffff6004358181116101cc57366023820112156101cc57806004013591610c30836113cd565b91610c3e60405193846113aa565b83835260208301906024809560051b820101903682116101cc578501915b818310611358575050508235908082116101cc57366023830112156101cc57816004013591610c8a836113cd565b92610c9860405194856113aa565b80845285602085019160051b830101913683116101cc578601905b828210611348575050506044358181116101cc57366023820112156101cc5780600401359182116113335760405191610cf66020601f19601f84011601846113aa565b8083526020830191368783830101116101cc57816000928860209301853784010152610d2061141a565b83518351036112c957610d4790610d546020604051809382820195869188519283916114ea565b81010380845201826113aa565b519020907f7de62342a32975aa47805e60a10a2271e2a718c6ebf4158a0ad7369d0e74cd0382148092811591826112a0575b8015611277575b801561124e575b8015611225575b156111e15760007f1a2825c73c305750cce9f81d6488d2e01f88caebb2ad355ab305efd9e9b25f59820361114157506008545b60005b8751811015610b6c576001600160a01b03610dec828a61150d565b5116610df8828961150d565b518786611118575b80156110ef575b80156110c6575b1561104c576103e8808202908282041482151715611037578415611022577f6b19042f1da1f9ce33a54a3dd482f02180c29df7cba143d074da677142e4802991837f430471d2e5d7154f375a29ec5c3266e86a81fddc58ef0ca377eac3144b737e108a888195045b8d15610f0157836000526009602052806040600020556013602052846040600020555b610ea860405192839283611537565b0390a2610eba60405192839283611537565b0390a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610eec57600101610dd1565b88634e487b7160e01b60005260116004526000fd5b7f4b0a5fd1a5bc8d16d6124c329875beeeb515a3fb23e817c363d4ac5af8ce64898b03610f4a5783600052600a602052806040600020556014602052846040600020555b610e99565b7fd907cde5797a6cad48a6d049faf854a3db6c14fbf5642cd35edfcc23309a27768b03610f925783600052600b60205280604060002055601560205284604060002055610e99565b7fa440bd38e98e3d04ef6bce1bf53b289f9cc1f710ace26e49300656881efd614f8b03610fda5783600052600c60205280604060002055601660205284604060002055610e99565b7f1a2825c73c305750cce9f81d6488d2e01f88caebb2ad355ab305efd9e9b25f598b03610f455783600052600d60205280604060002055601760205284604060002055610e99565b8b634e487b7160e01b60005260126004526000fd5b8b634e487b7160e01b60005260116004526000fd5b83810281810485148215171561103757670de0b6b3a764000090818102918183041490151715611037577f6b19042f1da1f9ce33a54a3dd482f02180c29df7cba143d074da677142e4802991837f430471d2e5d7154f375a29ec5c3266e86a81fddc58ef0ca377eac3144b737e108a6103e8819504610e76565b507fa440bd38e98e3d04ef6bce1bf53b289f9cc1f710ace26e49300656881efd614f8514610e0e565b507fd907cde5797a6cad48a6d049faf854a3db6c14fbf5642cd35edfcc23309a27768514610e07565b507f4b0a5fd1a5bc8d16d6124c329875beeeb515a3fb23e817c363d4ac5af8ce64898514610e00565b841561115157506004545b610dce565b7f4b0a5fd1a5bc8d16d6124c329875beeeb515a3fb23e817c363d4ac5af8ce648982036111815750600554610dce565b7fd907cde5797a6cad48a6d049faf854a3db6c14fbf5642cd35edfcc23309a277682036111b15750600654610dce565b7fa440bd38e98e3d04ef6bce1bf53b289f9cc1f710ace26e49300656881efd614f820361114c5750600754610dce565b60648760126040519162461bcd60e51b8352602060048401528201527f496e76616c696420746f6b656e207479706500000000000000000000000000006044820152fd5b507f1a2825c73c305750cce9f81d6488d2e01f88caebb2ad355ab305efd9e9b25f598114610d9b565b507fa440bd38e98e3d04ef6bce1bf53b289f9cc1f710ace26e49300656881efd614f8114610d94565b507fd907cde5797a6cad48a6d049faf854a3db6c14fbf5642cd35edfcc23309a27768114610d8d565b507f4b0a5fd1a5bc8d16d6124c329875beeeb515a3fb23e817c363d4ac5af8ce64898114610d86565b60848560396040519162461bcd60e51b8352602060048401528201527f557365727320616e64206d6967726174656420616d6f756e747320617272617960448201527f73206d757374206265207468652073616d65206c656e677468000000000000006064820152fd5b84634e487b7160e01b60005260416004526000fd5b8135815260209182019101610cb3565b82356001600160a01b03811681036101cc57815260209283019201610c5c565b6040810190811067ffffffffffffffff82111761139457604052565b634e487b7160e01b600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff82111761139457604052565b67ffffffffffffffff81116113945760051b60200190565b600435906001600160a01b03821682036101cc57565b60031960409101126101cc5760043580151581036101cc579060243590565b6001600160a01b0360005416330361142e57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b9190820180921161147f57565b634e487b7160e01b600052601160045260246000fd5b6002600154146114a6576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b60005b8381106114fd5750506000910152565b81810151838201526020016114ed565b80518210156115215760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b90601f606093601f199284526040602085015261156381518092816040880152602088880191016114ea565b0116010190565b908160209103126101cc575180151581036101cc5790565b91909182156116c1576002546003546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810186905291811695602095919491928681806044810103816000809c5af180156116b6579287959492899260c495611699575b5087600354169160405198899788967f42c15c87000000000000000000000000000000000000000000000000000000008852600488015262eff10060248801521660448601528360648601521515608485015260a48401525af1801561168e5761166657505050565b813d8311611687575b61167981836113aa565b810103126116845750565b80fd5b503d61166f565b6040513d85823e3d90fd5b6116af90883d8a11610b6e57610b6481836113aa565b50386115fd565b6040513d8a823e3d90fd5b606460405162461bcd60e51b815260206004820152601360248201527f4e6f20636c61696d61626c6520616d6f756e74000000000000000000000000006044820152fd5b60409081516020937f7de62342a32975aa47805e60a10a2271e2a718c6ebf4158a0ad7369d0e74cd03858301825193611748888281870197610d4781878b6114ea565b519020036117ce5750506000926001600160a01b0360099216808552828252807faaf4f52f2d9453d1bd23cd1b1cd2388a7dd01f328cfe74ef0ad765fffd89d3f8608086882054875190815287868201526003888201527f43485200000000000000000000000000000000000000000000000000000000006060820152a2845252812055565b7f4b0a5fd1a5bc8d16d6124c329875beeeb515a3fb23e817c363d4ac5af8ce648984518681019061180788828651610d4781878b6114ea565b5190200361188d5750506000926001600160a01b03600a9216808552828252807faaf4f52f2d9453d1bd23cd1b1cd2388a7dd01f328cfe74ef0ad765fffd89d3f8608086882054875190815287868201526005888201527f53504348520000000000000000000000000000000000000000000000000000006060820152a2845252812055565b7fd907cde5797a6cad48a6d049faf854a3db6c14fbf5642cd35edfcc23309a27768451868101906118c688828651610d4781878b6114ea565b5190200361194c5750506000926001600160a01b03600b9216808552828252807faaf4f52f2d9453d1bd23cd1b1cd2388a7dd01f328cfe74ef0ad765fffd89d3f8608086882054875190815287868201526005888201527f454c4348520000000000000000000000000000000000000000000000000000006060820152a2845252812055565b7fa440bd38e98e3d04ef6bce1bf53b289f9cc1f710ace26e49300656881efd614f84518681019061198588828651610d4781878b6114ea565b51902003611a0b5750506000926001600160a01b03600c9216808552828252807faaf4f52f2d9453d1bd23cd1b1cd2388a7dd01f328cfe74ef0ad765fffd89d3f8608086882054875190815287868201526005888201527f56454348520000000000000000000000000000000000000000000000000000006060820152a2845252812055565b907f1a2825c73c305750cce9f81d6488d2e01f88caebb2ad355ab305efd9e9b25f5991611a488686518093610d47838301968792519283916114ea565b51902014611a5557505050565b6000926001600160a01b03600d9216808552828252807faaf4f52f2d9453d1bd23cd1b1cd2388a7dd01f328cfe74ef0ad765fffd89d3f8608086882054875190815287868201526006888201527f4348524e465400000000000000000000000000000000000000000000000000006060820152a284525281205556fea164736f6c6343000813000a

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

00000000000000000000000052f847356b38720b55ee18cb3e094ca11c85a192000000000000000000000000c900c984a3581efa4fb56caf6ef19721aafbb4f9

-----Decoded View---------------
Arg [0] : _fnxToken (address): 0x52f847356b38720B55ee18Cb3e094ca11C85A192
Arg [1] : _lockingContract (address): 0xC900C984a3581EfA4Fb56cAF6eF19721aAFbB4f9

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000052f847356b38720b55ee18cb3e094ca11c85a192
Arg [1] : 000000000000000000000000c900c984a3581efa4fb56caf6ef19721aafbb4f9


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.