0

I am rewriting some code in order to be able to set 4 timelocks from a fixed date to team members. I always get the error

~/code/ANCToken$ truffle  compile

Compiling your contracts...
===========================
> Compiling ./contracts/ANCToken.sol

TypeError: Type contract TokenTimelock is not implicitly convertible to expected type address.
   --> project:/contracts/ANCToken.sol:123:31:
    |
123 |             team[i].fstLock = new TokenTimelock(_IERC20Token, team[i].teamMember, block.timestamp + fifteenDaysInSeconds);
    |                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

,TypeError: Member "release" not found or not visible after argument-dependent lookup in address.
   --> project:/contracts/ANCToken.sol:130:13:
    |
130 |             team[i].fstLock.release();
    |             ^^^^^^^^^^^^^^^^^^^^^^^

Compilation failed. See above.
Truffle v5.4.26 (core: 5.4.26)
Node v12.22.8

And I can't understand the reason... Could you please help me?

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/utils/TokenTimelock.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";


contract Ancestry is ERC20, ERC20Burnable, Pausable, Ownable {

    using SafeMath for *;

    // Wallets
    address payable deployerWallet = payable(0xE76dfad0a129CD7B72E3E6aD172F98865998c1aB);// Deployer/Owner wallet
    
    address payable rewardsWallet = payable(0x9f5094675526898e4260a411241d374232021183); // Wallet to collect 5% of each transaction
    address payable preSaleTokens = payable(0xE76dfad0a129CD7B72E3E6aD172F98865998c1aB); // Wallet where Presale Tokens reserve are minted to

    // for excluding addresses from 5% fee
    mapping(address => uint256) private _excludedFromFee;

    // for mapping team wallets to 4 team timelocks each
    struct TeamTimelocks{
        address teamMember;
        address fstLock;
        address sndLock;
        address thrLock;
        address frtLock;
    }

    TeamTimelocks[] team;



    // fechas en unixtimestamp GMT
    
    /*
    17/01/2022 00:00:00 1642377600
    24/01/2022 00:00:00 1642978800
    */

    /*
       p1Date         - Epoch del 17/01/22
       p2Date         - Epoch del 24/01/22
       PublicSaleDate - Epoch del 31/01/22
    */

    /* real times for deploying timestamps
   
    uint256 public constant PublicSaleDate = 1643587200;
    uint256 public constant fifteenDaysInSeconds = 1296000;
    uint256 public constant oneMonthInSeconds = 2592000;
    uint256 public constant oneMonthAndAHalfInSeconds = 3888000;
    uint256 public constant twoMonthsInSeconds = 5184000;
*/
    
    uint256 public  PublicSaleDate = block.timestamp + 120;
    uint256 public  fifteenDaysInSeconds = 140;
    uint256 public  oneMonthInSeconds = 160;
    uint256 public  oneMonthAndAHalfInSeconds = 180;
    uint256 public  twoMonthsInSeconds = 200;

    constructor() ERC20("Ancestry", "ANC") {

        distributeAndLock();
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
        internal
        whenNotPaused
        override
    {
        super._beforeTokenTransfer(from, to, amount);
    }

    // token distribution and timelocks for Team

    function distributeAndLock() internal {

        IERC20 _IERC20Token = IERC20(this);

        // Mint presale available tokens without lock for DXSale
        _mint(preSaleTokens, 2600000 * 10 ** decimals());

        // Mint for rewards Wallet without lock
        _mint(rewardsWallet, 13000000 * 10 ** decimals());

        // Mint Reserve+Airdrop+Marketing tokens without lock
        _mint(rewardsWallet, 3900000 * 10 ** decimals());

        // Team distribution
        // calculates release of tokens by quarters
        uint256 teamTokensTotal        = 3900000 * 10 ** decimals();
        uint256 tokensPerMember        = teamTokensTotal.div(8);
        uint256 quarterTokensPerMember = tokensPerMember.div(4);

        // 1 Add member's wallets to array
        team[0].teamMember = 0xE76dfad0a129CD7B72E3E6aD172F98865998c1aB;
        team[1].teamMember = 0x58d299cf28e508704646A95d78AEA4EFddd6B7c8;
        team[2].teamMember = 0xFe76F9F0aF1F8250CB30767461921e81871d9037;
        team[3].teamMember = 0xEaEEB732b67169F3Bc24DAA6271e95fc104e0FC0;
        team[4].teamMember = 0x631bB0244071aC67663241657c8312eCDb23A665;
        team[5].teamMember = 0xE8DD32180803095A57b4Ff1B475753ea5D1c3b8d;
        team[6].teamMember = 0x3C9E6083E2Db441843c9d6678f1E54cC9bb5B719;
        team[7].teamMember = 0xdDfACfD8B9dA4c15f61beB43B41Db12c33c6898F;

        for(uint i=0; i < team.length; i++) {
            team[i].fstLock = new TokenTimelock(_IERC20Token, team[i].teamMember, block.timestamp + fifteenDaysInSeconds);
            this.mint(team[i].fstLock, quarterTokensPerMember);
        }
    }

    function releaseFirstTL() public {
        for(uint i=0; i < team.length; i++)
            team[i].fstLock.release();
    }

    function releaseSecondTL() public {
        for(uint i=0; i < team.length; i++)
            team[i].sndLock.release();
    }

    function releaseThirdTL() public {
        for(uint i=0; i < team.length; i++)
            team[i].thrLock.release();
    }

    function releaseFourthTL() public {
        for(uint i=0; i < team.length; i++)
            team[i].frtLock.release();
    }
    
}

1 Answer 1

0

It's because your fstLock field is of type address but you're using it as if it were a TokenTimelock contract.

TypeError: Type contract TokenTimelock is not implicitly convertible to expected type address.
   --> project:/contracts/ANCToken.sol:123:31:
    |
123 |             team[i].fstLock = new TokenTimelock(_IERC20Token, team[i].teamMember, block.timestamp + fifteenDaysInSeconds);
    |                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

new returns a contract type and contracts are not implicitly convertible to addresses. You cannot assign one to another without an explicit conversion.

TypeError: Member "release" not found or not visible after argument-dependent lookup in address.
   --> project:/contracts/ANCToken.sol:130:13:
    |
130 |             team[i].fstLock.release();
    |             ^^^^^^^^^^^^^^^^^^^^^^^

The release() function is available only on the TokenTimelock contract, not on arbitrary address variables.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.