@daostack/arc-experimental
Version:
A platform for building DAOs
557 lines (509 loc) • 30.6 kB
JavaScript
const helpers = require('./helpers');
const constants = require('./constants');
const ERC20Mock = artifacts.require('./test/ERC20Mock.sol');
var ContinuousLocking4Reputation = artifacts.require("./ContinuousLocking4Reputation.sol");
class ContinuousLocking4ReputationParams {
constructor() {
}
}
const setup = async function (accounts,
_initialize = true,
_reputationReward = 850000,
_startTime = 0,
_periodsUnit = (30*60*60),
_redeemEnableTime = (30*60*60),
_maxLockingPeriod = 12,
_repRewardConstA = 85000,
_repRewardConstB = 900,
_periodsCap = 100,
_agreementHash = helpers.SOME_HASH
)
{
var testSetup = new helpers.TestSetup();
testSetup.proxyAdmin = accounts[5];
var registration = await helpers.registerImplementation();
testSetup.lockingToken = await ERC20Mock.new(accounts[0], web3.utils.toWei('100', "ether"));
testSetup.startTime = (await web3.eth.getBlock("latest")).timestamp + _startTime;
testSetup.redeemEnableTime = (await web3.eth.getBlock("latest")).timestamp + _redeemEnableTime;
testSetup.continuousLocking4Reputation = await ContinuousLocking4Reputation.new();
testSetup.periodsUnit = _periodsUnit;
testSetup.agreementHash = _agreementHash;
testSetup.maxLockingPeriod = _maxLockingPeriod;
testSetup.repRewardConstA = _repRewardConstA;
testSetup.repRewardConstB = _repRewardConstB;
testSetup.reputationReward = _reputationReward;
testSetup.periodsCap = _periodsCap;testSetup.continuousLocking4ReputationParams = new ContinuousLocking4ReputationParams();
if (_initialize === true) {
testSetup.continuousLocking4ReputationParams.initdata = await new web3.eth.Contract(registration.continuousLocking4Reputation.abi)
.methods
.initialize(helpers.NULL_ADDRESS,
testSetup.reputationReward,
testSetup.startTime,
testSetup.periodsUnit,
testSetup.redeemEnableTime,
testSetup.maxLockingPeriod,
testSetup.repRewardConstA,
testSetup.repRewardConstB,
testSetup.periodsCap,
testSetup.lockingToken.address,
testSetup.agreementHash)
.encodeABI();
} else {
testSetup.continuousLocking4ReputationParams.initdata = Buffer.from('');
}
var permissions = "0x00000000";
[testSetup.org,tx] = await helpers.setupOrganizationWithArraysDAOFactory(
testSetup.proxyAdmin,
accounts,
registration,
[accounts[0]],
[1000],
[1000],
0,
[web3.utils.fromAscii("ContinuousLocking4Reputation")],
testSetup.continuousLocking4ReputationParams.initdata,
[helpers.getBytesLength(testSetup.continuousLocking4ReputationParams.initdata)],
[permissions],
"metaData"
);
testSetup.continuousLocking4Reputation = await ContinuousLocking4Reputation.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx));
await testSetup.lockingToken.approve(testSetup.continuousLocking4Reputation.address,web3.utils.toWei('100', "ether"));
return testSetup;
};
contract('ContinuousLocking4Reputation', accounts => {
it("initialize", async () => {
let testSetup = await setup(accounts);
assert.equal(await testSetup.continuousLocking4Reputation.reputationRewardLeft(),testSetup.reputationReward);
assert.equal(await testSetup.continuousLocking4Reputation.startTime(),testSetup.startTime);
assert.equal(await testSetup.continuousLocking4Reputation.redeemEnableTime(),testSetup.redeemEnableTime);
assert.equal(await testSetup.continuousLocking4Reputation.token(),testSetup.lockingToken.address);
assert.equal(await testSetup.continuousLocking4Reputation.batchTime(),testSetup.periodsUnit);
assert.equal(await testSetup.continuousLocking4Reputation.getAgreementHash(),testSetup.agreementHash);
assert.equal(await testSetup.continuousLocking4Reputation.batchesIndexCap(),testSetup.periodsCap);
});
it("initialize periodsUnit <= 15 seconds is not allowed", async () => {
let testSetup = await setup(accounts,false);
try {
await testSetup.continuousLocking4Reputation.initialize(testSetup.org.avatar.address,
testSetup.reputationReward,
testSetup.startTime,
1,
testSetup.redeemEnableTime,
testSetup.maxLockingPeriod,
testSetup.repRewardConstA,
testSetup.repRewardConstB,
testSetup.periodsCap,
testSetup.lockingToken.address,
testSetup.agreementHash,
{gas : constants.ARC_GAS_LIMIT});
assert(false, "periodsUnit < 15 is not allowed");
} catch(error) {
helpers.assertVMException(error);
}
});
it("initialize _redeemEnableTime < _startTime+_periodsUnit is not allowed", async () => {
let testSetup = await setup(accounts,false);
try {
await testSetup.continuousLocking4Reputation.initialize(testSetup.org.avatar.address,
testSetup.reputationReward,
testSetup.startTime,
testSetup.periodsUnit,
testSetup.startTime + testSetup.periodsUnit -7,
testSetup.maxLockingPeriod,
testSetup.repRewardConstA,
testSetup.repRewardConstB,
testSetup.periodsCap,
testSetup.lockingToken.address,
testSetup.agreementHash,
{gas : constants.ARC_GAS_LIMIT});
assert(false, "_redeemEnableTime < _startTime+_periodsUnit is not allowed");
} catch(error) {
helpers.assertVMException(error);
}
});
it("period cap", async () => {
let testSetup = await setup(accounts,false);
try {
await testSetup.continuousLocking4Reputation.initialize(testSetup.org.avatar.address,
testSetup.reputationReward,
testSetup.startTime,
testSetup.periodsUnit,
testSetup.startTime,
testSetup.maxLockingPeriod,
testSetup.repRewardConstA,
testSetup.repRewardConstB,
testSetup.periodsCap +1,
testSetup.lockingToken.address,
testSetup.agreementHash,
{gas : constants.ARC_GAS_LIMIT});
assert(false, "period cap cannot be greater than 100");
} catch(error) {
helpers.assertVMException(error);
}
});
it("lock", async () => {
let testSetup = await setup(accounts);
var tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"), 12 , 0, testSetup.agreementHash);
var id = await helpers.getValueFromLogs(tx, '_lockingId',1);
assert.equal(tx.logs.length,1);
assert.equal(tx.logs[0].event,"LockToken");
assert.equal(tx.logs[0].args._lockingId,id);
assert.equal(tx.logs[0].args._amount,web3.utils.toWei('1', "ether"));
assert.equal(tx.logs[0].args._locker,accounts[0]);
//test the tokens moved to the wallet.
assert.equal(await testSetup.lockingToken.balanceOf(testSetup.continuousLocking4Reputation.address),web3.utils.toWei('1', "ether"));
});
it("lock twice does not overwrite score", async () => {
let testSetup = await setup(accounts);
var tx = await testSetup.continuousLocking4Reputation.lock(100, 12 , 0, testSetup.agreementHash);
var id1= await helpers.getValueFromLogs(tx, '_lockingId',0);
tx = await testSetup.continuousLocking4Reputation.lock(500, 12 , 0, testSetup.agreementHash);
var id2 = await helpers.getValueFromLogs(tx, '_lockingId',0);
assert.equal((await testSetup.continuousLocking4Reputation.getLockingIdScore(11,id1)).toNumber(),100);
assert.equal((await testSetup.continuousLocking4Reputation.getLockingIdScore(11,id2)).toNumber(),500);
});
it("lock without initialize should fail", async () => {
let testSetup = await setup(accounts,false);
try {
await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),1,0, testSetup.agreementHash);
assert(false, "lock without initialize should fail");
} catch(error) {
helpers.assertVMException(error);
}
});
it("lock with wrong agreementHash should fail", async () => {
let testSetup = await setup(accounts);
try {
await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),1,0, helpers.NULL_HASH);
assert(false, "lock with wrong agreementHash should fail");
} catch(error) {
helpers.assertVMException(error);
}
});
it("lock with value == 0 should revert", async () => {
let testSetup = await setup(accounts);
try {
await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('0', "ether"),1,0,testSetup.agreementHash);
assert(false, "lock with value == 0 should revert");
} catch(error) {
helpers.assertVMException(error);
}
});
it("lock with period over maxLockingPeriod should revert", async () => {
let testSetup = await setup(accounts);
try {
await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('0', "ether"),testSetup.maxLockingPeriod +1 ,0,testSetup.agreementHash);
assert(false, "lock with period over maxLockingPeriod should revert");
} catch(error) {
helpers.assertVMException(error);
}
});
it("redeem", async () => {
let testSetup = await setup(accounts);
var period = 12;
var tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),period,0,testSetup.agreementHash);
var id = await helpers.getValueFromLogs(tx, '_lockingId',1);
await helpers.increaseTime(testSetup.periodsUnit * period +1);
tx = await testSetup.continuousLocking4Reputation.redeem(accounts[0],id);
assert.equal(tx.logs.length,12);
var totalRedeemAmount = 0;
var redeemAmount = 0;
for (var lockingPeriodToRedeemFrom = 0; lockingPeriodToRedeemFrom < period; lockingPeriodToRedeemFrom++) {
redeemAmount = testSetup.repRewardConstA * (Math.pow((testSetup.repRewardConstB/1000),lockingPeriodToRedeemFrom));
totalRedeemAmount += redeemAmount;
assert.equal(tx.logs[lockingPeriodToRedeemFrom].event,"Redeem");
var rep = tx.logs[lockingPeriodToRedeemFrom].args._amount.toNumber();
//this is due to real math calculation
assert.equal(((rep === Math.floor(redeemAmount)) || (rep +1 === Math.floor(redeemAmount))),true);
assert.equal(tx.logs[lockingPeriodToRedeemFrom].args._beneficiary,accounts[0]);
assert.equal(tx.logs[lockingPeriodToRedeemFrom].args._batchIndex,lockingPeriodToRedeemFrom);
}
totalRedeemAmount = Math.floor(totalRedeemAmount);
assert.equal(await testSetup.org.reputation.balanceOf(accounts[0]),1000+totalRedeemAmount);
});
it("redeem part of the periods", async () => {
let testSetup = await setup(accounts);
var period = 12;
var tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),period,0,testSetup.agreementHash);
var id = await helpers.getValueFromLogs(tx, '_lockingId',1);
await helpers.increaseTime(testSetup.periodsUnit * 3 +1);
tx = await testSetup.continuousLocking4Reputation.redeem(accounts[0],id);
var totalRedeemAmount = 230349;
assert.equal(tx.logs.length,3);
assert.equal(await testSetup.org.reputation.balanceOf(accounts[0]),1000+totalRedeemAmount);
await helpers.increaseTime(testSetup.periodsUnit * 9 +1);
tx = await testSetup.continuousLocking4Reputation.redeem(accounts[0],id);
totalRedeemAmount = 0;
var redeemAmount = 0;
for (var lockingPeriodToRedeemFrom = 3; lockingPeriodToRedeemFrom < period; lockingPeriodToRedeemFrom++) {
redeemAmount = testSetup.repRewardConstA * (Math.pow((testSetup.repRewardConstB/1000),lockingPeriodToRedeemFrom));
totalRedeemAmount += redeemAmount;
assert.equal(tx.logs.length,9);
assert.equal(tx.logs[lockingPeriodToRedeemFrom-3].event,"Redeem");
var rep = tx.logs[lockingPeriodToRedeemFrom-3].args._amount.toNumber();
assert.equal(((rep === Math.floor(redeemAmount)) || (rep +1 === Math.floor(redeemAmount))),true);
assert.equal(tx.logs[lockingPeriodToRedeemFrom-3].args._beneficiary,accounts[0]);
assert.equal(tx.logs[lockingPeriodToRedeemFrom-3].args._batchIndex,lockingPeriodToRedeemFrom);
}
totalRedeemAmount = Math.round(totalRedeemAmount) - 1;
assert.equal(await testSetup.org.reputation.balanceOf(accounts[0]),1000+totalRedeemAmount + 230349);
});
it("redeem score ", async () => {
let testSetup = await setup(accounts);
var tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),1,0,testSetup.agreementHash,{from:accounts[0]});
var id1 = await helpers.getValueFromLogs(tx, '_lockingId',1);
await testSetup.lockingToken.transfer(accounts[1],web3.utils.toWei('3', "ether"));
await testSetup.lockingToken.approve(testSetup.continuousLocking4Reputation.address,web3.utils.toWei('100', "ether"),{from:accounts[1]});
tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('3', "ether"),1,0,testSetup.agreementHash,{from:accounts[1]});
var id2 = await helpers.getValueFromLogs(tx, '_lockingId',1);
await helpers.increaseTime(testSetup.periodsUnit +1);
await testSetup.continuousLocking4Reputation.redeem(accounts[0],id1);
await testSetup.continuousLocking4Reputation.redeem(accounts[1],id2);
assert.equal(await testSetup.org.reputation.balanceOf(accounts[0]),1000+85000/4);
assert.equal(await testSetup.org.reputation.balanceOf(accounts[1]),85000*3/4);
});
it("redeem cannot redeem twice", async () => {
let testSetup = await setup(accounts);
var tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),1,0,testSetup.agreementHash);
var id = await helpers.getValueFromLogs(tx, '_lockingId',1);
await helpers.increaseTime(testSetup.periodsUnit +1);
await testSetup.continuousLocking4Reputation.redeem(accounts[0],id);
try {
await testSetup.continuousLocking4Reputation.redeem(accounts[0],id);
assert(false, "cannot redeem twice");
} catch(error) {
helpers.assertVMException(error);
}
});
it("redeem before redeemEnableTime should revert", async () => {
let testSetup = await setup(accounts);
var tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),1,0,testSetup.agreementHash);
var id = await helpers.getValueFromLogs(tx, '_lockingId',1);
try {
await testSetup.continuousLocking4Reputation.redeem(accounts[0],id);
assert(false, "redeem before redeemEnableTime should revert");
} catch(error) {
helpers.assertVMException(error);
}
await helpers.increaseTime(testSetup.redeemEnableTime);
await testSetup.continuousLocking4Reputation.redeem(accounts[0],id);
});
it("lock and redeem from all lockings", async () => {
let testSetup = await setup(accounts);
var tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),1,0,testSetup.agreementHash);
var id1 = await helpers.getValueFromLogs(tx, '_lockingId',1);
await helpers.increaseTime(testSetup.periodsUnit+1);
tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),1,1,testSetup.agreementHash);
var id2 = await helpers.getValueFromLogs(tx, '_lockingId',1);
await helpers.increaseTime(testSetup.periodsUnit+1);
tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),1,2,testSetup.agreementHash);
var id3 = await helpers.getValueFromLogs(tx, '_lockingId',1);
await helpers.increaseTime((testSetup.periodsUnit+1)*3);
//todo oren-- fill this up :)
// var totalBid1 = await testSetup.continuousLocking4Reputation.auctions(id1);
// var totalBid2 = await testSetup.continuousLocking4Reputation.auctions(id2);
// var totalBid3 = await testSetup.continuousLocking4Reputation.auctions(id3);
// assert.equal(web3.utils.BN(totalBid1).eq(web3.utils.BN(totalBid2)),true);
// assert.equal(web3.utils.BN(totalBid1).eq(web3.utils.BN(totalBid3)),true);
// assert.equal(totalBid1,web3.utils.toWei('1', "ether"));
// assert.equal(id1,0);
// assert.equal(id2,1);
// assert.equal(id3,2);
await testSetup.continuousLocking4Reputation.redeem(accounts[0],id1);
await testSetup.continuousLocking4Reputation.redeem(accounts[0],id2);
await testSetup.continuousLocking4Reputation.redeem(accounts[0],id3);
// assert.equal(await testSetup.org.reputation.balanceOf(accounts[0]),1000+300);
});
it("cannot initialize twice", async () => {
let testSetup = await setup(accounts);
try {
await testSetup.continuousLocking4Reputation.initialize(testSetup.org.avatar.address,
testSetup.reputationReward,
testSetup.startTime,
testSetup.periodsUnit,
testSetup.redeemEnableTime,
testSetup.maxLockingPeriod,
testSetup.repRewardConstA,
testSetup.repRewardConstB,
testSetup.periodsCap,
testSetup.lockingToken.address,
testSetup.agreementHash,
{gas : constants.ARC_GAS_LIMIT});
assert(false, "cannot initialize twice");
} catch(error) {
helpers.assertVMException(error);
}
});
it("cannot lock with wrong _lockingPeriodToLockIn", async () => {
var lockingPeriodToLockIn = 2;
let testSetup = await setup(accounts);
try {
await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),1,lockingPeriodToLockIn,testSetup.agreementHash);
assert(false, "cannot lock with wrong _lockingPeriodToLockIn");
} catch(error) {
helpers.assertVMException(error);
}
});
it("release", async () => {
let testSetup = await setup(accounts);
var tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),1,0,testSetup.agreementHash);
var lockingId = await helpers.getValueFromLogs(tx, '_lockingId',1);
await helpers.increaseTime(testSetup.periodsUnit+1);
tx = await testSetup.continuousLocking4Reputation.release(accounts[0],lockingId);
assert.equal(tx.logs.length,1);
assert.equal(tx.logs[0].event,"Release");
assert.equal(tx.logs[0].args._lockingId.toNumber(),lockingId.toNumber());
assert.equal(tx.logs[0].args._amount,web3.utils.toWei('1', "ether"));
assert.equal(tx.logs[0].args._beneficiary,accounts[0]);
});
it("release before locking period should revert", async () => {
let testSetup = await setup(accounts);
var tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),1,0,testSetup.agreementHash);
var lockingId = await helpers.getValueFromLogs(tx, '_lockingId',1);
try {
await testSetup.continuousLocking4Reputation.release(accounts[0],lockingId);
assert(false, "release before locking period should revert");
} catch(error) {
helpers.assertVMException(error);
}
});
it("release cannot release twice", async () => {
let testSetup = await setup(accounts);
var tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),1,0,testSetup.agreementHash);
var lockingId = await helpers.getValueFromLogs(tx, '_lockingId',1);
await helpers.increaseTime(testSetup.periodsUnit+1);
await testSetup.continuousLocking4Reputation.release(accounts[0],lockingId);
try {
await testSetup.continuousLocking4Reputation.release(accounts[0],lockingId);
assert(false, "release cannot release twice");
} catch(error) {
helpers.assertVMException(error);
}
});
it("redeem reward limits 100 periods", async () => {
let testSetup = await setup(accounts);
var repForPeriod = await testSetup.continuousLocking4Reputation.getRepRewardPerBatch(100);
var REAL_FBITS = 40;
var res = (repForPeriod.shrn(REAL_FBITS).toNumber() + (repForPeriod.maskn(REAL_FBITS)/Math.pow(2,REAL_FBITS))).toFixed(2);
assert.equal(Math.floor(res),Math.floor(testSetup.repRewardConstA* Math.pow(testSetup.repRewardConstB/1000,100)));
assert.equal(await testSetup.continuousLocking4Reputation.getRepRewardPerBatch(101),0);
});
it("redeem limits 100 periods", async () => {
let testSetup = await setup(accounts,false);
var period = 24;
await helpers.increaseTime(testSetup.periodsUnit*90+1);
await testSetup.continuousLocking4Reputation.initialize(testSetup.org.avatar.address,
testSetup.reputationReward,
testSetup.startTime,
testSetup.periodsUnit,
testSetup.redeemEnableTime,
period,
testSetup.repRewardConstA,
testSetup.repRewardConstB,
testSetup.periodsCap,
testSetup.lockingToken.address,
testSetup.agreementHash,
{gas : constants.ARC_GAS_LIMIT});
await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),1,90,testSetup.agreementHash);
try {
await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),period,90,testSetup.agreementHash);
assert(false, "exceed max allowe periods");
} catch(error) {
helpers.assertVMException(error);
}
});
it("extend locking withouth lock should fail", async () => {
let testSetup = await setup(accounts);
try {
await testSetup.continuousLocking4Reputation.extendLocking(1,0,helpers.SOME_HASH,testSetup.agreementHash);
assert(false, "extend locking withouth lock should fail");
} catch(error) {
helpers.assertVMException(error);
}
});
it("extend locking ", async () => {
let testSetup = await setup(accounts);
var period = 12;
var tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),period,0,testSetup.agreementHash);
var id = await helpers.getValueFromLogs(tx, '_lockingId',1);
//increase time with one period
await helpers.increaseTime(testSetup.periodsUnit*1+1);
tx = await testSetup.continuousLocking4Reputation.extendLocking(1,1,id,testSetup.agreementHash);
assert.equal(tx.logs.length,1);
assert.equal(tx.logs[0].event,"ExtendLocking");
assert.equal(tx.logs[0].args._lockingId.toNumber(),id.toNumber());
assert.equal(tx.logs[0].args._extendPeriod,1);
await helpers.increaseTime(testSetup.periodsUnit*11+1);
try {
await testSetup.continuousLocking4Reputation.release(accounts[0],id);
assert(false, "release cannot release before time");
} catch(error) {
helpers.assertVMException(error);
}
await helpers.increaseTime(testSetup.periodsUnit*1+1);
await testSetup.continuousLocking4Reputation.release(accounts[0],id);
tx = await testSetup.continuousLocking4Reputation.redeem(accounts[0],id);
var totalRedeemAmount = 0;
var redeemAmount = 0;
for (var lockingPeriodToRedeemFrom = 0; lockingPeriodToRedeemFrom < period+1; lockingPeriodToRedeemFrom++) {
redeemAmount = testSetup.repRewardConstA * (Math.pow((testSetup.repRewardConstB/1000),lockingPeriodToRedeemFrom));
totalRedeemAmount += redeemAmount;
assert.equal(tx.logs.length,period+1);
assert.equal(tx.logs[lockingPeriodToRedeemFrom].event,"Redeem");
var rep = tx.logs[lockingPeriodToRedeemFrom].args._amount.toNumber();
assert.equal(((rep === Math.floor(redeemAmount)) || (rep +1 === Math.floor(redeemAmount))),true);
assert.equal(tx.logs[lockingPeriodToRedeemFrom].args._beneficiary,accounts[0]);
assert.equal(tx.logs[lockingPeriodToRedeemFrom].args._batchIndex,lockingPeriodToRedeemFrom);
}
totalRedeemAmount = Math.floor(totalRedeemAmount);
assert.equal(await testSetup.org.reputation.balanceOf(accounts[0]),1000+totalRedeemAmount);
});
it("extend locking should not exceed the max period allowed", async () => {
let testSetup = await setup(accounts);
var period = 12;
var tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),period,0,testSetup.agreementHash);
var id = await helpers.getValueFromLogs(tx, '_lockingId',1);
try {
await testSetup.continuousLocking4Reputation.extendLocking(1,0,id,testSetup.agreementHash);
assert(false, "extend locking should not exceed the max period allowed");
} catch(error) {
helpers.assertVMException(error);
}
});
it("extend locking limits", async () => {
let testSetup = await setup(accounts);
var period = 12;
var tx = await testSetup.continuousLocking4Reputation.lock(web3.utils.toWei('1', "ether"),period,0,testSetup.agreementHash);
var id = await helpers.getValueFromLogs(tx, '_lockingId',1);
for (var i = 12;i< 96 ;i +=12 ) {
await helpers.increaseTime(testSetup.periodsUnit*12+1);
await testSetup.continuousLocking4Reputation.extendLocking(period,i,id,testSetup.agreementHash);
}
await helpers.increaseTime(testSetup.periodsUnit*12+1);
await testSetup.continuousLocking4Reputation.extendLocking(4,96,id,testSetup.agreementHash);
await helpers.increaseTime(testSetup.periodsUnit*3+1);
try {
await testSetup.continuousLocking4Reputation.release(accounts[0],id);
assert(false, "release cannot release before time");
} catch(error) {
helpers.assertVMException(error);
}
await helpers.increaseTime(testSetup.periodsUnit*1+1);
await testSetup.continuousLocking4Reputation.release(accounts[0],id);
tx = await testSetup.continuousLocking4Reputation.redeem(accounts[0],id);
assert.equal(tx.logs.length,100);
var totalRedeemAmount = 0;
var redeemAmount = 0;
for (var lockingPeriodToRedeemFrom = 0; lockingPeriodToRedeemFrom < 100; lockingPeriodToRedeemFrom++) {
redeemAmount = testSetup.repRewardConstA * (Math.pow((testSetup.repRewardConstB/1000),lockingPeriodToRedeemFrom));
totalRedeemAmount += redeemAmount;
assert.equal(tx.logs[lockingPeriodToRedeemFrom].event,"Redeem");
var rep = tx.logs[lockingPeriodToRedeemFrom].args._amount.toNumber();
assert.equal(((rep === Math.floor(redeemAmount)) || (rep +1 === Math.floor(redeemAmount))),true);
assert.equal(tx.logs[lockingPeriodToRedeemFrom].args._beneficiary,accounts[0]);
assert.equal(tx.logs[lockingPeriodToRedeemFrom].args._batchIndex,lockingPeriodToRedeemFrom);
}
totalRedeemAmount = Math.floor(totalRedeemAmount);
assert.equal(await testSetup.org.reputation.balanceOf(accounts[0]),1000+totalRedeemAmount);
});
});