Overview
ETH Balance
ETH Value
$0.00Latest 25 from a total of 950 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Retrieve Excess ... | 14540949 | 363 days ago | IN | 0 ETH | 0.00000005 | ||||
| Claim With CHRNF... | 14528687 | 363 days ago | IN | 0 ETH | 0.00000066 | ||||
| Claim With VECHR | 14528682 | 363 days ago | IN | 0 ETH | 0.00000066 | ||||
| Claim With CHR | 14528677 | 363 days ago | IN | 0 ETH | 0.00000066 | ||||
| Claim With CHRNF... | 14498098 | 364 days ago | IN | 0 ETH | 0.0000007 | ||||
| Claim With CHRNF... | 14498066 | 364 days ago | IN | 0 ETH | 0.00000074 | ||||
| Claim With CHRNF... | 14498059 | 364 days ago | IN | 0 ETH | 0.00000074 | ||||
| Claim With VECHR | 14498057 | 364 days ago | IN | 0 ETH | 0.00000067 | ||||
| Claim With VECHR | 14485647 | 364 days ago | IN | 0 ETH | 0.00000443 | ||||
| Claim With VECHR | 14411957 | 366 days ago | IN | 0 ETH | 0.00000038 | ||||
| Claim With CHRNF... | 14374613 | 366 days ago | IN | 0 ETH | 0.00000007 | ||||
| Claim With VECHR | 14374602 | 366 days ago | IN | 0 ETH | 0.00000007 | ||||
| Claim With CHR | 14374594 | 366 days ago | IN | 0 ETH | 0.00000007 | ||||
| Claim With CHRNF... | 14368699 | 367 days ago | IN | 0 ETH | 0.00000149 | ||||
| Set User Claim A... | 14325764 | 368 days ago | IN | 0 ETH | 0.00000007 | ||||
| Set User Claim A... | 14325496 | 368 days ago | IN | 0 ETH | 0.00000004 | ||||
| Set User Claim A... | 14325457 | 368 days ago | IN | 0 ETH | 0.00000004 | ||||
| Claim With VECHR | 14128161 | 372 days ago | IN | 0 ETH | 0.00000055 | ||||
| Claim With CHRNF... | 14128152 | 372 days ago | IN | 0 ETH | 0.00000059 | ||||
| Claim With VECHR | 14078138 | 373 days ago | IN | 0 ETH | 0.00000111 | ||||
| Claim With CHRNF... | 14077898 | 373 days ago | IN | 0 ETH | 0.00000666 | ||||
| Claim With VECHR | 14077892 | 373 days ago | IN | 0 ETH | 0.00000683 | ||||
| Claim With CHR | 14072570 | 373 days ago | IN | 0 ETH | 0.00001383 | ||||
| Claim With CHRNF... | 14072549 | 373 days ago | IN | 0 ETH | 0.00001095 | ||||
| Claim With CHRNF... | 14072092 | 373 days ago | IN | 0 ETH | 0.00001889 |
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Contract Source Code (Solidity Standard Json-Input format)
// 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;
}{
"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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Net Worth in USD
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.