Help with vesting wallet

Hi, I am playing with the vestingWallet contract and am running into something that I don't understand. Any help is greatly appreciated.

So, I am trying to add a cliff to the vestingWallet:

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

import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/finance/VestingWalletUpgradeable.sol";

contract DualVestingWallet is Initializable, VestingWalletUpgradeable {
    uint64 private _cliff;

    /// @custom:oz-upgrades-unsafe-allow constructor
    constructor() initializer {}

    function initialize(
        address beneficiaryAddress,
        uint64 startTimestamp,
        uint64 durationSeconds,
        uint64 cliff
    ) public initializer {
        _cliff = cliff;
        __VestingWallet_init(
            beneficiaryAddress,
            startTimestamp,
            durationSeconds
        );
    }

    function _vestingSchedule(uint256 totalAllocation, uint64 timestamp)
        internal
        view
        virtual
        override
        returns (uint256)
    {
        if (timestamp < start() + _cliff) {
            return 0;
        } else if (timestamp > start() + duration()) {
            return totalAllocation;
        } else {
            return (totalAllocation * (timestamp - start())) / duration();
        }
    }
}

And I am in the process of writing a test to test the contract:

const { expect } = require('chai');
const { ethers, upgrades, artifacts } = require('hardhat');
const {
  BN,
  constants,
  expectEvent,
  expectRevert,
  time,
  balance,
} = require('@openzeppelin/test-helpers');
const { inTransaction } = require('@openzeppelin/test-helpers/src/expectEvent');

const { ZERO_ADDRESS } = constants;

before(async function () {
  // Advance to the next block to correctly read time in the solidity "now" function interpreted by ganache
  await time.advanceBlock();
});

beforeEach(async () => {
  [owner, user1, user2, ...users] = await ethers.getSigners();
  const Token = await ethers.getContractFactory('Token', owner);
  dual = await upgrades.deployProxy(Token, ['DualMint', 'DUAL']);
  const VestingWallet = await ethers.getContractFactory(
    'DualVestingWallet',
    owner
  );

  const startTimestamp = Math.floor(Date.now() / 1000);

  vestingWallet = await upgrades.deployProxy(VestingWallet, [
    owner.address,
    startTimestamp,
    7200,
    3600,
  ]);
});

describe('VestingWallet', async () => {
  it('release after cliff', async () => {
    await dual.mint(vestingWallet.address, 1000);
    await time.increase(time.duration.hours(5));
    await vestingWallet.release(dual.address);
  });
});

For some reason I am getting:

  1. VestingWallet
    release after cliff:
    TypeError: vestingWallet.release is not a function
    at Context. (test/DualVestingWallet-test.js:43:25)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)

This is really really strange. I am able to call some of the functions but not others. For example:

describe('VestingWallet', async () => {
  it('release after cliff', async () => {
    await dual.mint(vestingWallet.address, 1000);
    await time.increase(time.duration.hours(5));
    console.log('vestingWallet address: ', vestingWallet.address);
    console.log('beneficiary: ', await vestingWallet.beneficiary());
    console.log('duration: ', await vestingWallet.duration());
    console.log('start: ', await vestingWallet.start());
    console.log('vested amount: ', await vestingWallet.vestedAmount());
    console.log('released: ', await vestingWallet.released());
    await vestingWallet.release(dual.address);
  });
});

I get:

➜  token git:(main) ✗ npx hardhat --network ganache test ./test/DualVestingWallet-test.js


  VestingWallet
vestingWallet address:  0xf0A3282654c21D6b2d608Fcc13A0906c92EA6100
beneficiary:  0xfFbc5d3ba67B4391c701C92880cBD735c27769Cc
duration:  BigNumber { value: "7200" }
start:  BigNumber { value: "1647050900" }
    1) release after cliff


  0 passing (986ms)
  1 failing

  1) VestingWallet
       release after cliff:
     TypeError: vestingWallet.vestedAmount is not a function
      at Context.<anonymous> (test/DualVestingWallet-test.js:46:56)
      at processTicksAndRejections (internal/process/task_queues.js:93:5)

Can someone please help? I am pulling my hair out. Tried on hardhat node and ganache but getting the same thing. I was able to deploy the contract on remix and get it to work.

In case it helps anyone else -- I believe some methods are overloaded (ie. have multiple signatures which take different arguments). In which case I had to access those methods by specifying the function name and signature like: vestingWallet['vestedAmount(address,uint64)'](address)