124 lines
3.4 KiB
TypeScript
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
|
||
|
}
|