-1

I have this contract that lets a organisation register themselves and their erc20 token and lock some token to create a vesting schedule for different users, The Registering and whitelisting part it working perfectly but the locktokens function does not work . It works when i use it in local remix ide but when deployed on fuji-c it gives this error Returned error: {"jsonrpc":"2.0","error":"execution reverted","id":7771897207710637}

here is the smart contract

// SPDX-License-Identifier: MIT


pragma solidity ^0.8.19;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";


contract TokenVesting is Ownable , ReentrancyGuard{
   
struct Stakeholder{
    address stakeholderAddress;
    VestingSchedule vestingSchedule;
    bool isWhitelisted;
    bool isClaimed;

   }
    struct VestingSchedule {
        uint256 startTime;
        uint256 endTime;
        uint256 amount;
    }

    struct Organization {
        address orgAddress;
        IERC20 token;
        mapping(address => Stakeholder) stakeholder;
       
    }

    mapping(address => Organization) public organizations;

   function registerOrganization( IERC20 _token) external  {
    organizations[msg.sender].orgAddress = msg.sender;
    organizations[msg.sender].token = _token;

}
    function lockTokens(uint256 _amount) external {
    require(organizations[msg.sender].orgAddress != address(0), "Organization not registered");
    require(organizations[msg.sender].token.approve(address(this),_amount),"Amount not approved");
    organizations[msg.sender].token.transferFrom(msg.sender, address(this), _amount*10**18);
    
    }


    function whiteListStakeholders(
        address _Stakeholder,
        uint256 _amount,
        uint256 _startTime,
        uint256 _endTime
    ) external onlyRegisteredOrg {
    require(_startTime<_endTime,"End date cannot be before the start date");
    require(block.timestamp<_endTime,"End date cannot be before present");
    require(organizations[msg.sender].stakeholder[msg.sender].stakeholderAddress==address(0),"Already Whitlisted");
    require(_Stakeholder!=address(0),"Please enter correct address");
    organizations[msg.sender].stakeholder[_Stakeholder].stakeholderAddress= _Stakeholder;
    organizations[msg.sender].stakeholder[_Stakeholder].vestingSchedule=VestingSchedule(_startTime, _endTime, _amount*10**18);
    organizations[msg.sender].stakeholder[_Stakeholder].isWhitelisted= true;
    }


    function unwhiteListStakeholders(address _Stakeholder) external onlyRegisteredOrg {
    require(_Stakeholder!=address(0),"Please enter correct address");
    organizations[msg.sender].stakeholder[_Stakeholder].isWhitelisted= false;
    
    }
    function isWhiteListed(address _stakeholderAddress) external view onlyRegisteredOrg returns (bool){
          require(organizations[msg.sender].stakeholder[_stakeholderAddress].stakeholderAddress!=address(0),"Not a stakeholeder");
          return  organizations[msg.sender].stakeholder[_stakeholderAddress].isWhitelisted;
    }

    function claimTokens(address org) external  {
      require( organizations[org].orgAddress!=address(0),"Not a Registered Organisation");
      require(block.timestamp>=organizations[org].stakeholder[msg.sender].vestingSchedule.startTime,"The Vesting period is not over yet");
      require(block.timestamp<=organizations[org].stakeholder[msg.sender].vestingSchedule.endTime,"The claiming period is over");
      require(organizations[org].stakeholder[msg.sender].stakeholderAddress!=address(0),"You are not white Listed for the claim");
      require(organizations[org].stakeholder[msg.sender].isClaimed!=true,"You have already claimed the amount");
      require(organizations[org].stakeholder[msg.sender].isWhitelisted==true,"You are not white Listed for the claim");
      uint claimAmount = organizations[org].stakeholder[msg.sender].vestingSchedule.amount; 
      organizations[org].stakeholder[msg.sender].isClaimed=true; 
      organizations[org].token.transfer(msg.sender,claimAmount);
     
    }

    function getDate() external view  returns (uint256){
        return block.timestamp;
    }
    function getVestingSchedule (address _Stakeholder) external  view returns ( uint256 startTime, uint256 endTime,uint256 amount){
        endTime = organizations[msg.sender].stakeholder[_Stakeholder].vestingSchedule.endTime;
        startTime = organizations[msg.sender].stakeholder[_Stakeholder].vestingSchedule.startTime;
        amount = organizations[msg.sender].stakeholder[_Stakeholder].vestingSchedule.amount;

    }

   
     function isOrganization() external view returns(bool){
        return organizations[msg.sender].orgAddress != address(0);
    }
    function getToken() external  view onlyRegisteredOrg returns (uint256){
        return organizations[msg.sender].token.balanceOf(address(this));
    }
      function getTokenAddress() external view  onlyRegisteredOrg returns (IERC20){
        return organizations[msg.sender].token;
    }

    modifier onlyRegisteredOrg (){
     require(organizations[msg.sender].orgAddress != address(0), "Organization not registered");
      _;

    }
}

can anyone tell me what i am doing wrong?

when I try to run the locketokens function it does not works. niether does the getTokenAddress or the getToken.

0 Answers0