Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0x5ED64bF0764202bE868b5DF2DeDA467Ae12c925F
Balance 0 ETH
Nonce 1
Code Size 4330 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

4330 bytes
0x608060405234801561001057600080fd5b50600436106100df5760003560e01c80636346a8c51161008c578063779552451161006657806377955245146101b25780639a91722f146101dd578063a495372a146101e5578063e58b4fc5146101ee57600080fd5b80636346a8c514610177578063704b6c021461017f57806371417b321461019257600080fd5b8063255bd3ac116100bd578063255bd3ac1461013f57806357c9ca14146101475780635dd67c6d1461016457600080fd5b80630f75327f146100e45780630f8fac0314610117578063215975f61461012c575b600080fd5b6101046100f2366004610f2a565b60046020526000908152604090205481565b6040519081526020015b60405180910390f35b61012a610125366004610f2a565b610201565b005b61012a61013a366004610f74565b610312565b61012a6105a4565b6003546101549060ff1681565b604051901515815260200161010e565b61012a610172366004610f4b565b6107ec565b6101046108ee565b61012a61018d366004610f2a565b610b57565b6101046101a0366004610f2a565b60056020526000908152604090205481565b6001546101c5906001600160a01b031681565b6040516001600160a01b03909116815260200161010e565b61012a610c5c565b61010460025481565b6000546101c5906001600160a01b031681565b6001546001600160a01b0316331461025a5760405162461bcd60e51b815260206004820152601760248201527621b0b63632b91034b9903737ba103a34329030b236b4b760491b60448201526064015b60405180910390fd5b6001600160a01b0381166102b05760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420594d5420746f6b656e2061646472657373000000000000006044820152606401610251565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f0eaa5644bd7f7c5189a1a9190b4765531731e5d24681305759e38593671b8cc6906020015b60405180910390a150565b6001546001600160a01b031633146103665760405162461bcd60e51b815260206004820152601760248201527621b0b63632b91034b9903737ba103a34329030b236b4b760491b6044820152606401610251565b8281146103db5760405162461bcd60e51b815260206004820152602160248201527f557365727320616e6420616d6f756e7473206c656e677468206d69736d61746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610251565b60005b8381101561059d57600085858381811061040857634e487b7160e01b600052603260045260246000fd5b905060200201602081019061041d9190610f2a565b6001600160a01b031614156104745760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964207573657220616464726573730000000000000000000000006044820152606401610251565b82828281811061049457634e487b7160e01b600052603260045260246000fd5b90506020020135600460008787858181106104bf57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906104d49190610f2a565b6001600160a01b031681526020810191909152604001600020557f2ced60d22c7400b92fad779842ba16b670a05f0c11db1d3c5548102b01e3ded785858381811061052f57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906105449190610f2a565b84848481811061056457634e487b7160e01b600052603260045260246000fd5b604080516001600160a01b0390951685526020918202939093013590840152500160405180910390a161059681611083565b90506103de565b5050505050565b6001546001600160a01b031633146105f85760405162461bcd60e51b815260206004820152601760248201527621b0b63632b91034b9903737ba103a34329030b236b4b760491b6044820152606401610251565b60008060009054906101000a90046001600160a01b03166001600160a01b03166378e979256040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190610ffd565b9050426106916301e13380600261104d565b61069b9083611015565b106106e85760405162461bcd60e51b815260206004820152601d60248201527f446973747269627574696f6e20706572696f642068617320656e6465640000006044820152606401610251565b60035460ff16156107475760405162461bcd60e51b8152602060048201526024808201527f416c6c20746f6b656e73206861766520616c7265616479206265656e20636c616044820152631a5b595960e21b6064820152608401610251565b6003805460ff19166001908117909155600054905460405163a9059cbb60e01b81526001600160a01b0391821660048201526a52b7d2dcc80cd2e4000000602482015291169063a9059cbb90604401602060405180830381600087803b1580156107b057600080fd5b505af11580156107c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e89190610fdd565b5050565b6001546001600160a01b031633146108405760405162461bcd60e51b815260206004820152601760248201527621b0b63632b91034b9903737ba103a34329030b236b4b760491b6044820152606401610251565b6001600160a01b0382166108965760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964207573657220616464726573730000000000000000000000006044820152606401610251565b6001600160a01b038216600081815260046020908152604091829020849055815192835282018390527f2ced60d22c7400b92fad779842ba16b670a05f0c11db1d3c5548102b01e3ded7910160405180910390a15050565b3360009081526004602052604081205461094a5760405162461bcd60e51b815260206004820152601260248201527f4e6f20746f6b656e7320746f20636c61696d00000000000000000000000000006044820152606401610251565b60008060009054906101000a90046001600160a01b03166001600160a01b03166378e979256040518163ffffffff1660e01b815260040160206040518083038186803b15801561099957600080fd5b505afa1580156109ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d19190610ffd565b905060006109df824261106c565b905060006109f16301e1338084611015565b4210610a0d575033600090815260046020526040902054610a3a565b336000908152600460205260409020546301e1338090610a2d908461104d565b610a37919061102d565b90505b33600090815260056020526040812054610a54908361106c565b905060008111610aa65760405162461bcd60e51b815260206004820152601c60248201527f4e6f20746f6b656e7320617661696c61626c6520746f20636c61696d000000006044820152606401610251565b3360009081526005602052604081208054839290610ac5908490611015565b909155505060005460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b158015610b1657600080fd5b505af1158015610b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4e9190610fdd565b50949350505050565b6001546001600160a01b03163314610bab5760405162461bcd60e51b815260206004820152601760248201527621b0b63632b91034b9903737ba103a34329030b236b4b760491b6044820152606401610251565b6001600160a01b038116610c015760405162461bcd60e51b815260206004820152601560248201527f496e76616c69642061646d696e206164647265737300000000000000000000006044820152606401610251565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fa54e30973125ab6651706f5e9b1b43cf9bdba85ff8204cba762dfe45c0b4b9d090602001610307565b6001546001600160a01b03163314610cb05760405162461bcd60e51b815260206004820152601760248201527621b0b63632b91034b9903737ba103a34329030b236b4b760491b6044820152606401610251565b6a52b7d2dcc80cd2e400000060025410610d185760405162461bcd60e51b8152602060048201526024808201527f416c6c20746f6b656e73206861766520616c7265616479206265656e20636c616044820152631a5b595960e21b6064820152608401610251565b60008060009054906101000a90046001600160a01b03166001600160a01b03166378e979256040518163ffffffff1660e01b815260040160206040518083038186803b158015610d6757600080fd5b505afa158015610d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9f9190610ffd565b90506000610dad824261106c565b90506000610dc06301e13380600561104d565b610dca9084611015565b4210610de257506a52b7d2dcc80cd2e4000000610e13565b610df16301e13380600561104d565b610e06906a52b7d2dcc80cd2e400000061102d565b610e10908361104d565b90505b600060025482610e23919061106c565b90508060026000828254610e379190611015565b909155505060005460015460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb90604401602060405180830381600087803b158015610e8c57600080fd5b505af1158015610ea0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059d9190610fdd565b80356001600160a01b0381168114610edb57600080fd5b919050565b60008083601f840112610ef1578182fd5b50813567ffffffffffffffff811115610f08578182fd5b6020830191508360208260051b8501011115610f2357600080fd5b9250929050565b600060208284031215610f3b578081fd5b610f4482610ec4565b9392505050565b60008060408385031215610f5d578081fd5b610f6683610ec4565b946020939093013593505050565b60008060008060408587031215610f89578182fd5b843567ffffffffffffffff80821115610fa0578384fd5b610fac88838901610ee0565b90965094506020870135915080821115610fc4578384fd5b50610fd187828801610ee0565b95989497509550505050565b600060208284031215610fee578081fd5b81518015158114610f44578182fd5b60006020828403121561100e578081fd5b5051919050565b600082198211156110285761102861109e565b500190565b60008261104857634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156110675761106761109e565b500290565b60008282101561107e5761107e61109e565b500390565b60006000198214156110975761109761109e565b5060010190565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220f618984a2b646d1b21648df97bd6e6ae9d1c94541a9f86588437824b103418b564736f6c63430008040033

Verified Source Code Full Match

Compiler: v0.8.4+commit.c7e474f2 EVM: istanbul Optimization: Yes (1000 runs)
YmtVesting.sol 161 lines
pragma solidity 0.8.4;

/*
 * SPDX-License-Identifier: GPL-3.0-or-later
 * Copyright (C) 2024 Yamato Protocol (DeFiGeek Community Japan)
 */

import "./Interfaces/IYMT.sol";

/**
 * @title YMT Vesting
 * @dev This contract manages the vesting of YMT tokens.
 */
contract YmtVesting {
    // Events
    event YmtAddressSet(address ymt);
    event AdminAddressSet(address admin);
    event ClaimAmountSet(address user, uint256 amount);

    // Constants
    uint256 private constant YEAR = 365 days;
    uint256 private constant VESTING_AMOUNT = 100_000_000 * 10 ** 18; // 100,000,000 YMT
    uint256 private constant LINEAR_DISTRIBUTION_DURATION = 5 * YEAR;
    uint256 private constant LINEAR_DISTRIBUTION_RATE =
        VESTING_AMOUNT / LINEAR_DISTRIBUTION_DURATION;

    // State variables
    address public ymtTokenAddress;
    address public contractAdmin;
    uint256 public totalLinearDistributionClaimed;
    bool public isClaimed;

    // Vesting mapping
    mapping(address => uint256) public vestingAmounts;
    mapping(address => uint256) public claimedAmounts;

    // Constructor
    constructor() {
        contractAdmin = msg.sender;
    }

    /**
     * @notice Sets a new admin for the contract.
     * @param newAdmin The address of the new admin.
     */
    function setAdmin(address newAdmin) external onlyAdmin {
        require(newAdmin != address(0), "Invalid admin address");
        contractAdmin = newAdmin;
        emit AdminAddressSet(newAdmin);
    }

    /**
     * @notice Sets the YMT token address.
     * @param ymtToken The address of the YMT token.
     */
    function setYmtToken(address ymtToken) external onlyAdmin {
        require(ymtToken != address(0), "Invalid YMT token address");
        ymtTokenAddress = ymtToken;
        emit YmtAddressSet(ymtToken);
    }

    /**
     * @notice Sets the claim amount for a user.
     * @param user The address of the user.
     * @param amount The amount of tokens to be claimed.
     */
    function setClaimAmount(address user, uint256 amount) external onlyAdmin {
        require(user != address(0), "Invalid user address");
        vestingAmounts[user] = amount;
        emit ClaimAmountSet(user, amount);
    }

    /**
     * @notice Sets claim amounts for multiple users.
     * @param users Array of user addresses.
     * @param amounts Array of claim amounts for each user.
     */
    function setMultipleClaimAmounts(
        address[] calldata users,
        uint256[] calldata amounts
    ) external onlyAdmin {
        require(
            users.length == amounts.length,
            "Users and amounts length mismatch"
        );

        for (uint256 i = 0; i < users.length; ++i) {
            require(users[i] != address(0), "Invalid user address");
            vestingAmounts[users[i]] = amounts[i];
            emit ClaimAmountSet(users[i], amounts[i]);
        }
    }

    /**
     * @notice Allows users to claim their V1 Retroactive Rewards based on a one-year linear vesting schedule.
     * @dev Calculates the claimable amount based on the time elapsed since the distribution start, then transfers the tokens to the user's address. Any unclaimed amount from the previous claims is considered.
     */
    function claimV1RetroactiveRewards() external returns (uint256) {
        require(vestingAmounts[msg.sender] > 0, "No tokens to claim");
        uint256 distributionStart = IYMT(ymtTokenAddress).startTime();
        uint256 timeElapsed = block.timestamp - distributionStart;
        uint256 claimableAmount;
        if (block.timestamp >= distributionStart + YEAR) {
            claimableAmount = vestingAmounts[msg.sender];
        } else {
            claimableAmount = (timeElapsed * vestingAmounts[msg.sender]) / YEAR;
        }
        uint256 availableToClaim = claimableAmount - claimedAmounts[msg.sender];
        require(availableToClaim > 0, "No tokens available to claim");
        claimedAmounts[msg.sender] += availableToClaim;
        IYMT(ymtTokenAddress).transfer(msg.sender, availableToClaim);
        return availableToClaim;
    }

    /**
     * @notice Allows the admin to claim tokens from five-year linear distribution.
     * @dev Transfers claimable tokens to the admin address.
     */
    function claimFiveYearVestingTokens() external onlyAdmin {
        require(
            totalLinearDistributionClaimed < VESTING_AMOUNT,
            "All tokens have already been claimed"
        );

        uint256 distributionStart = IYMT(ymtTokenAddress).startTime();
        uint256 timeElapsed = block.timestamp - distributionStart;
        uint256 claimableAmount;
        if (
            block.timestamp >= distributionStart + LINEAR_DISTRIBUTION_DURATION
        ) {
            claimableAmount = VESTING_AMOUNT;
        } else {
            claimableAmount = timeElapsed * LINEAR_DISTRIBUTION_RATE;
        }
        uint256 availableToClaim = claimableAmount -
            totalLinearDistributionClaimed;
        totalLinearDistributionClaimed += availableToClaim;
        IYMT(ymtTokenAddress).transfer(contractAdmin, availableToClaim);
    }

    /**
     * @notice Allows the admin to claim tokens from two-year vesting period.
     * @dev Transfers claimable tokens to the admin address.
     */
    function claimTwoYearVestingTokens() external onlyAdmin {
        uint256 distributionStart = IYMT(ymtTokenAddress).startTime();
        require(
            distributionStart + 2 * YEAR < block.timestamp,
            "Distribution period has ended"
        );
        require(!isClaimed, "All tokens have already been claimed");
        isClaimed = true;
        IYMT(ymtTokenAddress).transfer(contractAdmin, VESTING_AMOUNT);
    }

    // Modifier
    modifier onlyAdmin() {
        require(msg.sender == contractAdmin, "Caller is not the admin");
        _;
    }
}
IYMT.sol 40 lines
pragma solidity 0.8.4;

/*
 * SPDX-License-Identifier: GPL-3.0-or-later
 * Copyright (C) 2024 Yamato Protocol (DeFiGeek Community Japan)
 */

//solhint-disable max-line-length
//solhint-disable no-inline-assembly

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IYMT {
    /**
     * @dev mint token for recipient. Assuming onlyGovernance
     */
    function mint(address to_, uint256 value_) external returns (bool);

    function decimals() external view returns (uint8);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);

    function approve(address spender_, uint256 value_) external;

    function rate() external view returns (uint256);

    function futureEpochTimeWrite() external returns (uint256);

    function startTime() external view returns (uint256);
}

Read Contract

claimedAmounts 0x71417b32 → uint256
contractAdmin 0x77955245 → address
isClaimed 0x57c9ca14 → bool
totalLinearDistributionClaimed 0xa495372a → uint256
vestingAmounts 0x0f75327f → uint256
ymtTokenAddress 0xe58b4fc5 → address

Write Contract 7 functions

These functions modify contract state and require a wallet transaction to execute.

claimFiveYearVestingTokens 0x9a91722f
No parameters
claimTwoYearVestingTokens 0x255bd3ac
No parameters
claimV1RetroactiveRewards 0x6346a8c5
No parameters
returns: uint256
setAdmin 0x704b6c02
address newAdmin
setClaimAmount 0x5dd67c6d
address user
uint256 amount
setMultipleClaimAmounts 0x215975f6
address[] users
uint256[] amounts
setYmtToken 0x0f8fac03
address ymtToken

Recent Transactions

No transactions found for this address