DCIPs/assets/eip-5725/test/LinearVestingNFT.test.ts

124 lines
3.4 KiB
TypeScript

import { ethers } from 'hardhat'
import { Signer } from 'ethers'
import { expect } from 'chai'
import { increaseTime } from './helpers/time'
// typechain
import {
ERC20Mock__factory,
ERC20Mock,
LinearVestingNFT__factory,
LinearVestingNFT,
} from '../typechain-types'
const testValues = {
payout: '1000000000',
lockTime: 60,
buffer: 10,
totalLock: 70,
}
describe('LinearVestingNFT', function () {
let accounts: Signer[]
let linearVestingNFT: LinearVestingNFT
let mockToken: ERC20Mock
let receiverAccount: string
let unlockTime: number
beforeEach(async function () {
const LinearVestingNFT = (await ethers.getContractFactory(
'LinearVestingNFT'
)) as LinearVestingNFT__factory
linearVestingNFT = await LinearVestingNFT.deploy('LinearVestingNFT', 'TLV')
await linearVestingNFT.deployed()
const ERC20Mock = (await ethers.getContractFactory(
'ERC20Mock'
)) as ERC20Mock__factory
mockToken = await ERC20Mock.deploy(
'1000000000000000000000',
18,
'LockedToken',
'LOCK'
)
await mockToken.deployed()
await mockToken.approve(linearVestingNFT.address, '1000000000000000000000')
accounts = await ethers.getSigners()
receiverAccount = await accounts[1].getAddress()
unlockTime = await createVestingNft(
linearVestingNFT,
receiverAccount,
mockToken
)
})
it('Returns a valid vested payout', async function () {
// TODO: More extensive testing of linear vesting functionality
const totalPayout = await linearVestingNFT.vestedPayoutAtTime(0, unlockTime)
expect(await linearVestingNFT.vestedPayout(0)).to.equal(0)
await increaseTime(testValues.totalLock)
expect(await linearVestingNFT.vestedPayout(0)).to.equal(totalPayout)
})
it('Reverts when creating to account 0', async function () {
const latestBlock = await ethers.provider.getBlock('latest')
await expect(
linearVestingNFT.create(
'0x0000000000000000000000000000000000000000',
testValues.payout,
latestBlock.timestamp + testValues.buffer,
testValues.lockTime,
0,
mockToken.address
)
).to.revertedWith('to cannot be address 0')
})
it('Reverts when creating to past start date 0', async function () {
await expect(
linearVestingNFT.create(
receiverAccount,
testValues.payout,
0,
testValues.lockTime,
0,
mockToken.address
)
).to.revertedWith('startTime cannot be on the past')
})
it('Reverts when duration is less than cliff', async function () {
const latestBlock = await ethers.provider.getBlock('latest')
await expect(
linearVestingNFT.create(
receiverAccount,
testValues.payout,
latestBlock.timestamp + testValues.buffer,
testValues.lockTime,
100,
mockToken.address
)
).to.revertedWith('duration needs to be more than cliff')
})
})
async function createVestingNft(
linearVestingNFT: LinearVestingNFT,
receiverAccount: string,
mockToken: ERC20Mock
) {
const latestBlock = await ethers.provider.getBlock('latest')
const unlockTime =
latestBlock.timestamp + testValues.lockTime + testValues.buffer
const txReceipt = await linearVestingNFT.create(
receiverAccount,
testValues.payout,
latestBlock.timestamp + testValues.buffer,
testValues.lockTime,
0,
mockToken.address
)
await txReceipt.wait()
return unlockTime
}