@daostack/arc-experimental
Version:
A platform for building DAOs
318 lines (288 loc) • 14.6 kB
JavaScript
const helpers = require("./helpers");
var ExternalLocking4Reputation = artifacts.require("./ExternalLocking4Reputation.sol");
var ExternalTokenLockerMock = artifacts.require("./ExternalTokenLockerMock.sol");
class ExternalLocking4ReputationParams {
constructor() {
}
}
const setup = async function (accounts,
_repAllocation = 100,
_claimingStartTime = 0,
_claimingEndTime = 3000,
_redeemEnableTime = 3000,
_agreementHash = helpers.SOME_HASH,
_initialize = true) {
var testSetup = new helpers.TestSetup();
testSetup.proxyAdmin = accounts[5];
var registration = await helpers.registerImplementation();
var block = await web3.eth.getBlock("latest");
testSetup.lockingEndTime = block.timestamp + _claimingEndTime;
testSetup.lockingStartTime = block.timestamp + _claimingStartTime;
testSetup.redeemEnableTime = block.timestamp + _redeemEnableTime;
testSetup.extetnalTokenLockerMock = await ExternalTokenLockerMock.new();
await testSetup.extetnalTokenLockerMock.initialize(accounts[0]);
await testSetup.extetnalTokenLockerMock.lock(100,accounts[0]);
await testSetup.extetnalTokenLockerMock.lock(200,accounts[1]);
await testSetup.extetnalTokenLockerMock.lock(300,accounts[2]);
testSetup.agreementHash = _agreementHash;
testSetup.externalLocking4ReputationParams = new ExternalLocking4ReputationParams();
if (_initialize === true) {
testSetup.externalLocking4ReputationParams.initdata = await new web3.eth.Contract(registration.externalLocking4Reputation.abi)
.methods
.initialize(helpers.NULL_ADDRESS,
_repAllocation,
testSetup.lockingStartTime,
testSetup.lockingEndTime,
testSetup.redeemEnableTime,
testSetup.extetnalTokenLockerMock.address,
"lockedTokenBalances(address)",
testSetup.agreementHash)
.encodeABI();
} else {
testSetup.externalLocking4ReputationParams.initdata = Buffer.from('');
}
[] = await helpers.setupOrganizationWithArraysDAOFactory(
testSetup.proxyAdmin,
accounts,
registration,
[]],
[],
[],
0,
[],
testSetup.externalLocking4ReputationParams.initdata,
[],
["0x0000000"],
"metaData"
);
testSetup.externalLocking4Reputation = await ExternalLocking4Reputation.at(await helpers.getSchemeAddress(registration.daoFactory.address,tx));
return testSetup;
};
contract('ExternalLocking4Reputation', accounts => {
it("initialize", async () => {
let testSetup = await setup(accounts);
assert.equal(await testSetup.externalLocking4Reputation.reputationReward(),100);
assert.equal(await testSetup.externalLocking4Reputation.lockingEndTime(),testSetup.lockingEndTime);
assert.equal(await testSetup.externalLocking4Reputation.lockingStartTime(),testSetup.lockingStartTime);
assert.equal(await testSetup.externalLocking4Reputation.redeemEnableTime(),testSetup.redeemEnableTime);
assert.equal(await testSetup.externalLocking4Reputation.externalLockingContract(),testSetup.extetnalTokenLockerMock.address);
assert.equal(await testSetup.externalLocking4Reputation.getBalanceFuncSignature(),"lockedTokenBalances(address)");
assert.equal(await testSetup.externalLocking4Reputation.getAgreementHash(),testSetup.agreementHash);
});
it("externalLockingMock is onlyOwner", async () => {
let testSetup = await setup(accounts);
try {
await testSetup.extetnalTokenLockerMock.lock(1030,accounts[3],{from:accounts[1]});
assert(false, "externalLockingMock is onlyOwner");
} catch(error) {
helpers.assertVMException(error);
}
});
it("claim", async () => {
let testSetup = await setup(accounts);
var tx = await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,testSetup.agreementHash);
var lockingId = await helpers.getValueFromLogs(tx, '_lockingId',1);
assert.equal(tx.logs.length,1);
assert.equal(tx.logs[0].event,"Lock");
assert.equal(tx.logs[0].args._lockingId,lockingId);
assert.equal(tx.logs[0].args._amount,100);
assert.equal(tx.logs[0].args._period,1);
assert.equal(tx.logs[0].args._locker,accounts[0]);
});
it("claim on behalf of a beneficiary", async () => {
let testSetup = await setup(accounts);
var tx = await testSetup.externalLocking4Reputation.register(testSetup.agreementHash,{from:accounts[1]});
assert.equal(tx.logs.length,1);
assert.equal(tx.logs[0].event,"Register");
assert.equal(tx.logs[0].args._beneficiary,accounts[1]);
tx = await testSetup.externalLocking4Reputation.claim(accounts[1],testSetup.agreementHash);
var lockingId = await helpers.getValueFromLogs(tx, '_lockingId',1);
assert.equal(tx.logs.length,1);
assert.equal(tx.logs[0].event,"Lock");
assert.equal(tx.logs[0].args._lockingId,lockingId);
assert.equal(tx.logs[0].args._amount,200);
assert.equal(tx.logs[0].args._period,1);
assert.equal(tx.logs[0].args._locker,accounts[1]);
});
it("cannot claim on behalf of a beneficiary if not register", async () => {
let testSetup = await setup(accounts);
try {
await testSetup.externalLocking4Reputation.claim(accounts[1],testSetup.agreementHash);
assert(false, "cannot claim on behalf of a beneficiary if not register");
} catch(error) {
helpers.assertVMException(error);
}
});
it("cannot claim before set parameters", async () => {
let testSetup = await setup(accounts,100,0,3000,3000,helpers.SOME_HASH,false);
try {
await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,testSetup.agreementHash);
assert(false, "cannot lock before set parameters");
} catch(error) {
helpers.assertVMException(error);
}
});
it("cannot claim with wrong agreementHash", async () => {
let testSetup = await setup(accounts);
try {
await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,helpers.NULL_HASH);
assert(false, "cannot claim with wrong agreementHash");
} catch(error) {
helpers.assertVMException(error);
}
});
it("cannot register with wrong agreementHash", async () => {
let testSetup = await setup(accounts);
try {
await testSetup.externalLocking4Reputation.register(helpers.NULL_ADDRESS);
assert(false, "cannot register with wrong agreementHash");
} catch(error) {
helpers.assertVMException(error);
}
});
it("claim with value == 0 should revert", async () => {
let testSetup = await setup(accounts);
try {
await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,testSetup.agreementHash,{from:accounts[4]});
assert(false, "lock with value == 0 should revert");
} catch(error) {
helpers.assertVMException(error);
}
});
it("claim after _claimingEndTime should revert", async () => {
let testSetup = await setup(accounts);
await helpers.increaseTime(3001);
try {
await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,testSetup.agreementHash);
assert(false, "lock after _claimingEndTime should revert");
} catch(error) {
helpers.assertVMException(error);
}
});
it("claim before start should revert", async () => {
let testSetup = await setup(accounts,100,100);
try {
await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,testSetup.agreementHash);
assert(false, "lock before start should revert");
} catch(error) {
helpers.assertVMException(error);
}
});
it("cannot claim twice for the same user", async () => {
let testSetup = await setup(accounts);
await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,testSetup.agreementHash);
try {
await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,testSetup.agreementHash);
assert(false, "cannot lock twice for the same user");
} catch(error) {
helpers.assertVMException(error);
}
});
it("redeem", async () => {
let testSetup = await setup(accounts);
var tx = await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,testSetup.agreementHash);
await helpers.increaseTime(3001);
tx = await testSetup.externalLocking4Reputation.redeem(accounts[0]);
assert.equal(tx.logs.length,1);
assert.equal(tx.logs[0].event,"Redeem");
assert.equal(tx.logs[0].args._amount,100);
assert.equal(tx.logs[0].args._beneficiary,accounts[0]);
assert.equal(await testSetup.org.reputation.balanceOf(accounts[0]),1000+100);
});
it("redeem score ", async () => {
let testSetup = await setup(accounts);
await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,testSetup.agreementHash,{from:accounts[0]});
await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,testSetup.agreementHash,{from:accounts[2]});
await helpers.increaseTime(3001);
await testSetup.externalLocking4Reputation.redeem(accounts[0]);
await testSetup.externalLocking4Reputation.redeem(accounts[2]);
assert.equal(await testSetup.org.reputation.balanceOf(accounts[0]),1000+25);
assert.equal(await testSetup.org.reputation.balanceOf(accounts[2]),75);
});
it("redeem cannot redeem twice", async () => {
let testSetup = await setup(accounts);
await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,testSetup.agreementHash);
await helpers.increaseTime(3001);
await testSetup.externalLocking4Reputation.redeem(accounts[0]);
try {
await testSetup.externalLocking4Reputation.redeem(accounts[0]);
assert(false, "cannot redeem twice");
} catch(error) {
helpers.assertVMException(error);
}
});
it("redeem before lockingEndTime should revert", async () => {
let testSetup = await setup(accounts);
await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,testSetup.agreementHash);
await helpers.increaseTime(50);
try {
await testSetup.externalLocking4Reputation.redeem(accounts[0]);
assert(false, "redeem before lockingEndTime should revert");
} catch(error) {
helpers.assertVMException(error);
}
});
it("redeem before redeemEnableTime should revert", async () => {
let testSetup = await setup(accounts,100,0,3000,4000,helpers.SOME_HASH,true);
await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,testSetup.agreementHash);
await helpers.increaseTime(3500);
try {
await testSetup.externalLocking4Reputation.redeem(accounts[0]);
assert(false, "redeem before lockingEndTime should revert");
} catch(error) {
helpers.assertVMException(error);
}
await helpers.increaseTime(501);
await testSetup.externalLocking4Reputation.redeem(accounts[0]);
});
it("cannot initialize twice", async () => {
let testSetup = await setup(accounts);
try {
await testSetup.externalLocking4Reputation.initialize(testSetup.org.avatar.address,
100,
testSetup.lockingStartTime,
testSetup.lockingEndTime,
testSetup.redeemEnableTime,
testSetup.extetnalTokenLockerMock.address,
"lockedTokenBalances(address)",
helpers.SOME_HASH);
assert(false, "cannot initialize twice");
} catch(error) {
helpers.assertVMException(error);
}
});
it("redeemEnableTime >= lockingEndTime ", async () => {
var externalLocking4Reputation = await ExternalLocking4Reputation.new();
try {
await externalLocking4Reputation.initialize(accounts[0],
100,
0,
3000,
3000-1,
accounts[0],
"lockedTokenBalances(address)",
helpers.SOME_HASH,
{from:accounts[0]});
assert(false, "redeemEnableTime >= lockingEndTime");
} catch(error) {
helpers.assertVMException(error);
}
await externalLocking4Reputation.initialize(accounts[0],
100,
0,
3000,
3000,
accounts[0],
"lockedTokenBalances(address)",
helpers.SOME_HASH,
{from:accounts[0]});
});
it("get earned reputation", async () => {
let testSetup = await setup(accounts);
await testSetup.externalLocking4Reputation.claim(helpers.NULL_ADDRESS,testSetup.agreementHash);
await helpers.increaseTime(3001);
const reputation = await testSetup.externalLocking4Reputation.redeem.call(accounts[0]);
assert.equal(reputation,100);
assert.equal(await testSetup.org.reputation.balanceOf(accounts[0]),1000);
});
});