diff --git a/migrations/10_deploy_Locker.js b/migrations/10_deploy_Locker.js index 587d6e0b..2c8f6bf5 100644 --- a/migrations/10_deploy_Locker.js +++ b/migrations/10_deploy_Locker.js @@ -8,8 +8,12 @@ module.exports = function(deployer) { deployer.deploy(Locker, TokenAEur.address, MonetarySupervisor.address); deployer.then(async () => { const tokenAEur = TokenAEur.at(TokenAEur.address); - await tokenAEur.grantMultiplePermissions(Locker.address, ["NoFeeTransferContracts"]); - const monetarySupervisor = await MonetarySupervisor.at(MonetarySupervisor.address); - await monetarySupervisor.grantMultiplePermissions(Locker.address, ["LockerContracts"]); + const monetarySupervisor = MonetarySupervisor.at(MonetarySupervisor.address); + const locker = Locker.at(Locker.address); + await Promise.all([ + tokenAEur.grantPermission(Locker.address, "NoFeeTransferContracts"), + monetarySupervisor.grantPermission(Locker.address, "LockerContracts"), + locker.addLockProduct(50000, 60, 100, true) // to be used in tests to make unit test independent + ]); }); }; diff --git a/migrations/11_deploy_Exchange.js b/migrations/11_deploy_Exchange.js index ec5bde0c..5bb6a8c8 100644 --- a/migrations/11_deploy_Exchange.js +++ b/migrations/11_deploy_Exchange.js @@ -2,13 +2,11 @@ const TokenAEur = artifacts.require("./TokenAEur.sol"); const SafeMath = artifacts.require("./SafeMath.sol"); const Exchange = artifacts.require("./Exchange.sol"); -module.exports = function(deployer, network, accounts) { +module.exports = function(deployer) { deployer.link(SafeMath, Exchange); deployer.deploy(Exchange, TokenAEur.address); deployer.then(async () => { - const exchange = Exchange.at(Exchange.address); - const tokenAEur = TokenAEur.at(TokenAEur.address); - await tokenAEur.grantMultiplePermissions(Exchange.address, ["NoFeeTransferContracts"]); + await tokenAEur.grantPermission(Exchange.address, "NoFeeTransferContracts"); }); }; diff --git a/migrations/6_deploy_TokenAEur.js b/migrations/6_deploy_TokenAEur.js index bf334b51..a80b78c9 100644 --- a/migrations/6_deploy_TokenAEur.js +++ b/migrations/6_deploy_TokenAEur.js @@ -14,7 +14,9 @@ module.exports = async function(deployer, network, accounts) { ); const tokenAEur = TokenAEur.at(TokenAEur.address); - await tokenAEur.grantMultiplePermissions(accounts[0], ["MonetaryBoard"]); - await tokenAEur.grantMultiplePermissions(FeeAccount.address, ["NoFeeTransferContracts"]); - await tokenAEur.grantMultiplePermissions(AugmintReserves.address, ["NoFeeTransferContracts"]); + await Promise.all([ + tokenAEur.grantPermission(accounts[0], "MonetaryBoard"), + tokenAEur.grantPermission(FeeAccount.address, "NoFeeTransferContracts"), + tokenAEur.grantPermission(AugmintReserves.address, "NoFeeTransferContracts") + ]); }; diff --git a/migrations/8_deploy_MonetarySupervisor.js b/migrations/8_deploy_MonetarySupervisor.js index eb2c6ae8..16e288b9 100644 --- a/migrations/8_deploy_MonetarySupervisor.js +++ b/migrations/8_deploy_MonetarySupervisor.js @@ -20,10 +20,14 @@ module.exports = async function(deployer) { 50000000 /* allowedLtdDifferenceAmount =5,000 A-EUR - if totalLoan and totalLock difference is less than that then allow loan or lock even if ltdDifference limit would go off with it */ ); - const interestEarnedAccount = InterestEarnedAccount.at(InterestEarnedAccount.address); - await interestEarnedAccount.grantMultiplePermissions(MonetarySupervisor.address, ["MonetarySupervisorContract"]); + const interestEarnedAccount = InterestEarnedAccount.at(InterestEarnedAccount.address); const tokenAEur = TokenAEur.at(TokenAEur.address); - await tokenAEur.grantMultiplePermissions(MonetarySupervisor.address, ["MonetarySupervisorContract"]); - await tokenAEur.grantMultiplePermissions(MonetarySupervisor.address, ["NoFeeTransferContracts"]); + const augmintReserves = AugmintReserves.at(AugmintReserves.address); + await Promise.all([ + interestEarnedAccount.grantPermission(MonetarySupervisor.address, "MonetarySupervisorContract"), + tokenAEur.grantPermission(MonetarySupervisor.address, "MonetarySupervisorContract"), + tokenAEur.grantPermission(MonetarySupervisor.address, "NoFeeTransferContracts"), + augmintReserves.grantPermission(MonetarySupervisor.address, "MonetarySupervisorContract") + ]); }; diff --git a/migrations/9_deploy_LoanManager.js b/migrations/9_deploy_LoanManager.js index 67dbd52e..22fa839d 100644 --- a/migrations/9_deploy_LoanManager.js +++ b/migrations/9_deploy_LoanManager.js @@ -16,12 +16,14 @@ module.exports = function(deployer, network, accounts) { ); deployer.then(async () => { const lm = LoanManager.at(LoanManager.address); - await lm.grantMultiplePermissions(accounts[0], ["MonetaryBoard"]); const tokenAEur = TokenAEur.at(TokenAEur.address); - await tokenAEur.grantMultiplePermissions(LoanManager.address, ["NoFeeTransferContracts"]); - const monetarySupervisor = MonetarySupervisor.at(MonetarySupervisor.address); - await monetarySupervisor.grantMultiplePermissions(LoanManager.address, ["LoanManagerContracts"]); + + await Promise.all([ + lm.grantPermission(accounts[0], "MonetaryBoard"), + tokenAEur.grantPermission(LoanManager.address, "NoFeeTransferContracts"), + monetarySupervisor.grantPermission(LoanManager.address, "LoanManagerContracts") + ]); const onTest = web3.version.network == 999 || diff --git a/package.json b/package.json index 31b0f018..68a1ad6c 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "bignumber.js": "5.0.0", "stringifier": "1.3.0", "babel-register": "6.26.0", - "ganache-cli": "6.0.3", + "ganache-cli": "6.1.0-beta.0", "random-seed": "0.3.0", "truffle": "4.0.6" } diff --git a/test/ExchangeMatching.test.js b/test/exchangeMatching.js similarity index 82% rename from test/ExchangeMatching.test.js rename to test/exchangeMatching.js index 04a769bc..43ed6aec 100644 --- a/test/ExchangeMatching.test.js +++ b/test/exchangeMatching.js @@ -1,34 +1,33 @@ -const testHelper = new require("./helpers/testHelper.js"); -const monetarySupervisorTestHelpers = require("./helpers/monetarySupervisorTestHelpers.js"); -const tokenAceTestHelper = require("./helpers/tokenAceTestHelper.js"); -const exchangeTestHelper = require("./helpers/exchangeTestHelper.js"); +const testHelpers = new require("./helpers/testHelpers.js"); +const tokenTestHelpers = require("./helpers/tokenTestHelpers.js"); +const exchangeTestHelper = require("./helpers/exchangeTestHelpers.js"); const TOKEN_BUY = 0; const TOKEN_SELL = 1; let snapshotId; -let monetarySupervisor, tokenAce, exchange; +let augmintToken = null; +let exchange = null; const maker = web3.eth.accounts[1]; const taker = web3.eth.accounts[2]; contract("Exchange matching tests", accounts => { before(async function() { - tokenAce = await tokenAceTestHelper.newTokenAceMock(); - monetarySupervisor = await monetarySupervisorTestHelpers.newMonetarySupervisorMock(tokenAce); + augmintToken = await tokenTestHelpers.initAugmintToken(); - await monetarySupervisor.issueToReserve(1000000000); - await monetarySupervisorTestHelpers.withdrawFromReserve(maker, 100000000); - await monetarySupervisorTestHelpers.withdrawFromReserve(taker, 100000000); + await tokenTestHelpers.issueToReserve(1000000000); + await tokenTestHelpers.withdrawFromReserve(maker, 100000000); + await tokenTestHelpers.withdrawFromReserve(taker, 100000000); - exchange = await exchangeTestHelper.newExchangeMock(tokenAce); + exchange = await exchangeTestHelper.getExchange(); }); beforeEach(async function() { - snapshotId = await testHelper.takeSnapshot(); + snapshotId = await testHelpers.takeSnapshot(); }); afterEach(async function() { - await testHelper.revertSnapshot(snapshotId); + await testHelpers.revertSnapshot(snapshotId); }); it("should match two matching orders (buy token fully filled)", async function() { @@ -94,7 +93,7 @@ contract("Exchange matching tests", accounts => { await exchangeTestHelper.newOrder(this, buyOrder); await exchangeTestHelper.newOrder(this, sellOrder); - await testHelper.expectThrow(exchange.matchOrders(buyOrder.id, sellOrder.id)); + await testHelpers.expectThrow(exchange.matchOrders(buyOrder.id, sellOrder.id)); }); it("should match multiple orders"); // ensure edge cases of passing the same order twice diff --git a/test/ExchangeOrders.test.js b/test/exchangeOrders.js similarity index 74% rename from test/ExchangeOrders.test.js rename to test/exchangeOrders.js index 92ebba4d..b0879647 100644 --- a/test/ExchangeOrders.test.js +++ b/test/exchangeOrders.js @@ -1,33 +1,32 @@ -const testHelper = new require("./helpers/testHelper.js"); -const tokenAceTestHelper = require("./helpers/tokenAceTestHelper.js"); -const monetarySupervisorTestHelpers = require("./helpers/monetarySupervisorTestHelpers.js"); -const exchangeTestHelper = require("./helpers/exchangeTestHelper.js"); +const testHelpers = new require("./helpers/testHelpers.js"); +const tokenTestHelpers = require("./helpers/tokenTestHelpers.js"); +const exchangeTestHelper = require("./helpers/exchangeTestHelpers.js"); const TOKEN_BUY = 0; const TOKEN_SELL = 1; +const makers = [web3.eth.accounts[1], web3.eth.accounts[2]]; let snapshotId; -let tokenAce, exchange, monetarySupervisor; -const makers = [web3.eth.accounts[1], web3.eth.accounts[2]]; +let augmintToken = null; +let exchange = null; contract("Exchange orders tests", accounts => { before(async function() { - tokenAce = await tokenAceTestHelper.newTokenAceMock(); - monetarySupervisor = await monetarySupervisorTestHelpers.newMonetarySupervisorMock(tokenAce); + augmintToken = await tokenTestHelpers.initAugmintToken(); - await monetarySupervisor.issueToReserve(1000000000); + await tokenTestHelpers.issueToReserve(1000000000); - await Promise.all(makers.map(maker => monetarySupervisorTestHelpers.withdrawFromReserve(maker, 100000000))); + await Promise.all(makers.map(maker => tokenTestHelpers.withdrawFromReserve(maker, 100000000))); - exchange = await exchangeTestHelper.newExchangeMock(tokenAce); + exchange = await exchangeTestHelper.getExchange(); }); beforeEach(async function() { - snapshotId = await testHelper.takeSnapshot(); + snapshotId = await testHelpers.takeSnapshot(); }); afterEach(async function() { - await testHelper.revertSnapshot(snapshotId); + await testHelpers.revertSnapshot(snapshotId); }); it("place buy token orders", async function() { @@ -47,8 +46,8 @@ contract("Exchange orders tests", accounts => { viaAugmintToken: false }; - const tx = await tokenAce.approve(exchange.address, order.amount * 2, { from: order.maker }); - testHelper.logGasUse(this, tx, "approve"); + const tx = await augmintToken.approve(exchange.address, order.amount * 2, { from: order.maker }); + testHelpers.logGasUse(this, tx, "approve"); await exchangeTestHelper.newOrder(this, order); await exchangeTestHelper.newOrder(this, order); @@ -63,10 +62,10 @@ contract("Exchange orders tests", accounts => { viaAugmintToken: false }; - const tx = await tokenAce.approve(exchange.address, order.amount - 1, { from: order.maker }); - testHelper.logGasUse(this, tx, "approve"); + const tx = await augmintToken.approve(exchange.address, order.amount - 1, { from: order.maker }); + testHelpers.logGasUse(this, tx, "approve"); - await testHelper.expectThrow(exchange.placeSellTokenOrder(order.price, order.amount, { from: order.maker })); + await testHelpers.expectThrow(exchange.placeSellTokenOrder(order.price, order.amount, { from: order.maker })); }); it("place a sell token order via AugmintToken", async function() { @@ -84,19 +83,19 @@ contract("Exchange orders tests", accounts => { it("shouldn't place a SELL token order with 0 price", async function() { const price = 11000; - await testHelper.expectThrow(tokenAce.transferAndNotify(exchange.address, 0, price, { from: makers[0] })); + await testHelpers.expectThrow(augmintToken.transferAndNotify(exchange.address, 0, price, { from: makers[0] })); }); it("shouldn't place a BUY token order with 0 price", async function() { const price = 11000; - await testHelper.expectThrow(exchange.placeBuyTokenOrder(price, { value: 0 })); + await testHelpers.expectThrow(exchange.placeBuyTokenOrder(price, { value: 0 })); }); it("no SELL token order when user doesn't have enough ACE", async function() { const price = 11000; - const userBal = await tokenAce.balanceOf(makers[0]); - await testHelper.expectThrow( - tokenAce.transferAndNotify(exchange.address, userBal + 1, price, { from: makers[0] }) + const userBal = await augmintToken.balanceOf(makers[0]); + await testHelpers.expectThrow( + augmintToken.transferAndNotify(exchange.address, userBal + 1, price, { from: makers[0] }) ); }); @@ -120,8 +119,8 @@ contract("Exchange orders tests", accounts => { await exchangeTestHelper.newOrder(this, buyOrder); await exchangeTestHelper.newOrder(this, sellOrder); - await testHelper.expectThrow(exchange.cancelBuyTokenOrder(buyOrder.id, { from: accounts[0] })); - await testHelper.expectThrow(exchange.cancelSellTokenOrder(sellOrder.id, { from: accounts[0] })); + await testHelpers.expectThrow(exchange.cancelBuyTokenOrder(buyOrder.id, { from: accounts[0] })); + await testHelpers.expectThrow(exchange.cancelSellTokenOrder(sellOrder.id, { from: accounts[0] })); }); it("should return x buy orders from offset", async function() { @@ -158,7 +157,7 @@ contract("Exchange orders tests", accounts => { const orders = []; for (let i = 0; i < orderCount; i++) { orders.push( - tokenAce.transferAndNotify(exchange.address, i + 1, 10000 + i, { + augmintToken.transferAndNotify(exchange.address, i + 1, 10000 + i, { from: makers[0] }) ); @@ -185,6 +184,6 @@ contract("Exchange orders tests", accounts => { }); it("should only allow the token contract call transferNotification", async function() { - await testHelper.expectThrow(exchange.transferNotification(accounts[0], 1000, 0, { from: accounts[0] })); + await testHelpers.expectThrow(exchange.transferNotification(accounts[0], 1000, 0, { from: accounts[0] })); }); }); diff --git a/test/ExchangeRandom.test.js b/test/exchangeRandom.js similarity index 83% rename from test/ExchangeRandom.test.js rename to test/exchangeRandom.js index 34057e4c..5885891a 100644 --- a/test/ExchangeRandom.test.js +++ b/test/exchangeRandom.js @@ -1,8 +1,8 @@ const RandomSeed = require("random-seed"); -const testHelper = new require("./helpers/testHelper.js"); -const tokenAceTestHelper = require("./helpers/tokenAceTestHelper.js"); -const monetarySupervisorTestHelpers = require("./helpers/monetarySupervisorTestHelpers.js"); -const exchangeTestHelper = require("./helpers/exchangeTestHelper.js"); + +const testHelpers = new require("./helpers/testHelpers.js"); +const tokenTestHelpers = require("./helpers/tokenTestHelpers.js"); +const exchangeTestHelper = require("./helpers/exchangeTestHelpers.js"); const ONEWEI = 1000000000000000000; const ETH_ROUND = 1000000000000; // 6 decimals places max in ETH @@ -19,9 +19,10 @@ const MAX_TOKEN = 10000000; // 1,000 ACE const TEST_ACCS_CT = web3.eth.accounts.length; const ACC_INIT_ACE = 100000000; const CHUNK_SIZE = 100; - -let tokenAce, monetarySupervisor, exchange; const random = new RandomSeed("Have the same test data"); + +let augmintToken = null; +let exchange = null; let buyTokenOrders = null; let sellTokenOrders = null; let matches = []; @@ -66,18 +67,15 @@ const getOrderToFill = async () => { */ contract("Exchange random tests", accounts => { before(async function() { - tokenAce = await tokenAceTestHelper.newTokenAceMock(); - monetarySupervisor = await monetarySupervisorTestHelpers.newMonetarySupervisorMock(tokenAce); - await monetarySupervisor.issueToReserve(TEST_ACCS_CT * ACC_INIT_ACE); + augmintToken = await tokenTestHelpers.initAugmintToken(); + await tokenTestHelpers.issueToReserve(TEST_ACCS_CT * ACC_INIT_ACE); console.log(`\x1b[2m\t*** Topping up ${TEST_ACCS_CT} accounts each with ${ACC_INIT_ACE / 10000} A-EURO\x1b[0m`); await Promise.all( - accounts - .slice(0, TEST_ACCS_CT) - .map(acc => monetarySupervisorTestHelpers.withdrawFromReserve(acc, ACC_INIT_ACE)) + accounts.slice(0, TEST_ACCS_CT).map(acc => tokenTestHelpers.withdrawFromReserve(acc, ACC_INIT_ACE)) ); - exchange = await exchangeTestHelper.newExchangeMock(tokenAce); + exchange = await exchangeTestHelper.getExchange(); }); it("place x buy / sell orders", async function() { @@ -104,7 +102,7 @@ contract("Exchange random tests", accounts => { if (order.orderType === TOKEN_BUY) { tx = exchange.placeBuyTokenOrder(order.price, { value: order.amount, from: order.maker }); } else { - tx = tokenAce.transferAndNotify(exchange.address, order.amount, order.price, { + tx = augmintToken.transferAndNotify(exchange.address, order.amount, order.price, { from: order.maker }); } @@ -112,7 +110,7 @@ contract("Exchange random tests", accounts => { }) ); txs.map(tx => - testHelper.logGasUse( + testHelpers.logGasUse( this, tx, typeof tx.logs[0].args.weiAmount === "undefined" @@ -125,7 +123,7 @@ contract("Exchange random tests", accounts => { }); it("should fill x matching orders", async function() { - const snapshotId = await testHelper.takeSnapshot(); + const snapshotId = await testHelpers.takeSnapshot(); //await exchangeTestHelper.printOrderBook(10); let match = await getOrderToFill(); @@ -148,11 +146,11 @@ contract("Exchange random tests", accounts => { //await exchangeTestHelper.printOrderBook(10); - await testHelper.revertSnapshot(snapshotId); + await testHelpers.revertSnapshot(snapshotId); }); it("should match x orders at once (matchMultipleOrders)", async function() { - const snapshotId = await testHelper.takeSnapshot(); + const snapshotId = await testHelpers.takeSnapshot(); //await exchangeTestHelper.printOrderBook(10); // convert & transpose matches to the format required by matchMultipleOrders @@ -167,7 +165,7 @@ contract("Exchange random tests", accounts => { ); const tx = await exchange.matchMultipleOrders(matchArgs.buyTokenIds, matchArgs.sellTokenIds); - testHelper.logGasUse(this, tx, "matchMultipleOrders"); + testHelpers.logGasUse(this, tx, "matchMultipleOrders"); //await exchangeTestHelper.printOrderBook(10); @@ -175,11 +173,11 @@ contract("Exchange random tests", accounts => { assert.equal(stateAfter.sellCount, stateAfterAllMatch.sellCount, "sellCount should == after 1by1 matching all"); assert.equal(stateAfter.buyCount, stateAfterAllMatch.buyCount, "buyCount should == after 1by1 matching all"); - await testHelper.revertSnapshot(snapshotId); + await testHelpers.revertSnapshot(snapshotId); }); it("should cancel all orders", async function() { - const snapshotId = await testHelper.takeSnapshot(); + const snapshotId = await testHelpers.takeSnapshot(); //await exchangeTestHelper.printOrderBook(10); //const stateBefore = await exchangeTestHelper.getState(); @@ -199,6 +197,6 @@ contract("Exchange random tests", accounts => { assert.equal(stateAfter.sellCount, 0); assert.equal(stateAfter.buyCount, 0); - await testHelper.revertSnapshot(snapshotId); + await testHelpers.revertSnapshot(snapshotId); }); }); diff --git a/test/feeAccount.test.js b/test/feeAccount.js similarity index 100% rename from test/feeAccount.test.js rename to test/feeAccount.js diff --git a/test/helpers/exchangeTestHelper.js b/test/helpers/exchangeTestHelpers.js similarity index 84% rename from test/helpers/exchangeTestHelper.js rename to test/helpers/exchangeTestHelpers.js index c29d4167..ae65f405 100644 --- a/test/helpers/exchangeTestHelper.js +++ b/test/helpers/exchangeTestHelpers.js @@ -1,8 +1,9 @@ const BigNumber = require("bignumber.js"); const moment = require("moment"); -const testHelper = new require("./testHelper.js"); -const tokenAceTestHelper = require("./tokenAceTestHelper.js"); + const Exchange = artifacts.require("./Exchange.sol"); +const testHelpers = new require("./testHelpers.js"); +const tokenTestHelpers = require("./tokenTestHelpers.js"); const ONEWEI = 1000000000000000000; const PLACE_ORDER_MAXFEE = web3.toWei(0.03); @@ -12,7 +13,7 @@ const TOKEN_BUY = 0; const TOKEN_SELL = 1; module.exports = { - newExchangeMock, + getExchange, newOrder, cancelOrder, matchOrders, @@ -24,18 +25,18 @@ module.exports = { printOrderBook }; -let exchange, tokenAce; +let exchange = null; +let augmintToken = null; -async function newExchangeMock(_tokenAce) { - tokenAce = _tokenAce; - exchange = await Exchange.new(tokenAce.address); - await tokenAce.grantMultiplePermissions(exchange.address, ["NoFeeTransferContracts"]); +async function getExchange() { + augmintToken = await tokenTestHelpers.initAugmintToken(); + exchange = Exchange.at(Exchange.address); return exchange; } async function newOrder(testInstance, order) { const stateBefore = await getState(); - const balBefore = await tokenAceTestHelper.getAllBalances({ exchange: exchange.address, maker: order.maker }); + const balBefore = await tokenTestHelpers.getAllBalances({ exchange: exchange.address, maker: order.maker }); order.amount = new BigNumber(order.amount); // to handle numbers, strings and BigNumbers passed order.viaAugmintToken = typeof order.viaAugmintToken === "undefined" && order.orderType === TOKEN_SELL ? true : order.viaAugmintToken; @@ -45,22 +46,22 @@ async function newOrder(testInstance, order) { value: order.amount, from: order.maker }); - testHelper.logGasUse(testInstance, tx, "placeBuyTokenOrder"); + testHelpers.logGasUse(testInstance, tx, "placeBuyTokenOrder"); order.tokenAmount = 0; order.weiAmount = order.amount; } else { if (order.viaAugmintToken) { - tx = await tokenAce.transferAndNotify(exchange.address, order.amount, order.price, { + tx = await augmintToken.transferAndNotify(exchange.address, order.amount, order.price, { from: order.maker }); - testHelper.logGasUse(testInstance, tx, "transferAndNotify - token sell"); + testHelpers.logGasUse(testInstance, tx, "transferAndNotify - token sell"); } else { - const approvedBefore = await tokenAce.allowed(order.maker, exchange.address); + const approvedBefore = await augmintToken.allowed(order.maker, exchange.address); tx = await exchange.placeSellTokenOrder(order.price, order.amount, { from: order.maker }); - testHelper.logGasUse(testInstance, tx, "placeSellTokenOrder"); - const approvedAfter = await tokenAce.allowed(order.maker, exchange.address); + testHelpers.logGasUse(testInstance, tx, "placeSellTokenOrder"); + const approvedAfter = await augmintToken.allowed(order.maker, exchange.address); assert.equal( approvedAfter.toString(), approvedBefore.sub(order.amount).toString(), @@ -100,7 +101,7 @@ async function newOrder(testInstance, order) { "amount should be set in contract's order array" ); - await tokenAceTestHelper.assertBalances(balBefore, { + await tokenTestHelpers.assertBalances(balBefore, { exchange: { eth: balBefore.exchange.eth.add(order.weiAmount), ace: balBefore.exchange.ace.add(order.tokenAmount) @@ -114,7 +115,7 @@ async function newOrder(testInstance, order) { } async function newOrderEventAsserts(order) { - const res = await testHelper.assertEvent(exchange, "NewOrder", { + const res = await testHelpers.assertEvent(exchange, "NewOrder", { orderId: x => x, maker: order.maker, price: order.price, @@ -123,12 +124,12 @@ async function newOrderEventAsserts(order) { }); if (order.orderType === TOKEN_SELL) { - await testHelper.assertEvent(tokenAce, "Transfer", { + await testHelpers.assertEvent(augmintToken, "Transfer", { from: order.maker, to: exchange.address, amount: order.tokenAmount.toString() }); - await testHelper.assertEvent(tokenAce, "AugmintTransfer", { + await testHelpers.assertEvent(augmintToken, "AugmintTransfer", { from: order.maker, to: exchange.address, amount: order.tokenAmount.toString(), @@ -142,15 +143,15 @@ async function newOrderEventAsserts(order) { async function cancelOrder(testInstance, order) { const stateBefore = await getState(); - const balBefore = await tokenAceTestHelper.getAllBalances({ exchange: exchange.address, maker: order.maker }); + const balBefore = await tokenTestHelpers.getAllBalances({ exchange: exchange.address, maker: order.maker }); const sell = order.orderType === TOKEN_SELL; if (sell) { const tx = await exchange.cancelSellTokenOrder(order.id, { from: order.maker }); - testHelper.logGasUse(testInstance, tx, "cancelSellTokenOrder"); + testHelpers.logGasUse(testInstance, tx, "cancelSellTokenOrder"); } else { const tx = await exchange.cancelBuyTokenOrder(order.id, { from: order.maker }); - testHelper.logGasUse(testInstance, tx, "cancelBuyTokenOrder"); + testHelpers.logGasUse(testInstance, tx, "cancelBuyTokenOrder"); } if (sell) { @@ -161,7 +162,7 @@ async function cancelOrder(testInstance, order) { order.weiAmount = order.amount; } - await testHelper.assertEvent(exchange, "CancelledOrder", { + await testHelpers.assertEvent(exchange, "CancelledOrder", { orderId: order.id, maker: order.maker, tokenAmount: order.tokenAmount.toString(), @@ -170,7 +171,7 @@ async function cancelOrder(testInstance, order) { let expSellCount, expBuyCount; if (order.orderType === TOKEN_SELL) { - await testHelper.assertEvent(tokenAce, "AugmintTransfer", { + await testHelpers.assertEvent(augmintToken, "AugmintTransfer", { amount: order.amount.toString(), from: exchange.address, to: order.maker, @@ -187,7 +188,7 @@ async function cancelOrder(testInstance, order) { const stateAfter = await getState(); assert.equal(stateAfter.sellCount, expSellCount, "sell order count should be set"); assert.equal(stateAfter.buyCount, expBuyCount, "buy order count should be set"); - await tokenAceTestHelper.assertBalances(balBefore, { + await tokenTestHelpers.assertBalances(balBefore, { exchange: { eth: balBefore.exchange.eth.sub(order.weiAmount), ace: balBefore.exchange.ace.sub(order.tokenAmount) @@ -204,7 +205,7 @@ async function cancelOrder(testInstance, order) { async function matchOrders(testInstance, buyTokenOrder, sellTokenOrder) { const stateBefore = await getState(); - const balancesBefore = await tokenAceTestHelper.getAllBalances({ + const balancesBefore = await tokenTestHelpers.getAllBalances({ exchange: exchange.address, seller: sellTokenOrder.maker, buyer: buyTokenOrder.maker @@ -235,9 +236,9 @@ async function matchOrders(testInstance, buyTokenOrder, sellTokenOrder) { }; const tx = await exchange.matchOrders(buyTokenOrder.id, sellTokenOrder.id); - testHelper.logGasUse(testInstance, tx, "matchOrders"); + testHelpers.logGasUse(testInstance, tx, "matchOrders"); - await testHelper.assertEvent(exchange, "OrderFill", { + await testHelpers.assertEvent(exchange, "OrderFill", { sellTokenOrderId: expMatch.sellTokenOrderId, buyTokenOrderId: expMatch.buyTokenOrderId, tokenSeller: expMatch.tokenSeller, @@ -247,12 +248,12 @@ async function matchOrders(testInstance, buyTokenOrder, sellTokenOrder) { tokenAmount: expMatch.tokenAmount.toString() }); - await testHelper.assertEvent(tokenAce, "Transfer", { + await testHelpers.assertEvent(augmintToken, "Transfer", { from: exchange.address, to: expMatch.tokenBuyer, amount: expMatch.tokenAmount.toString() }); - await testHelper.assertEvent(tokenAce, "AugmintTransfer", { + await testHelpers.assertEvent(augmintToken, "AugmintTransfer", { from: exchange.address, to: expMatch.tokenBuyer, amount: expMatch.tokenAmount.toString(), @@ -264,14 +265,14 @@ async function matchOrders(testInstance, buyTokenOrder, sellTokenOrder) { assert.equal(stateAfter.sellCount, expMatch.sellCount, "sell order count should be as expected"); assert.equal(stateAfter.buyCount, expMatch.buyCount, "buy order count should be as expected"); - await tokenAceTestHelper.assertBalances(balancesBefore, { + await tokenTestHelpers.assertBalances(balancesBefore, { exchange: { eth: balancesBefore.exchange.eth.sub(expMatch.weiAmount), ace: balancesBefore.exchange.ace.sub(expMatch.tokenAmount) } }); if (balancesBefore.seller.address === balancesBefore.buyer.address) { - await tokenAceTestHelper.assertBalances(balancesBefore, { + await tokenTestHelpers.assertBalances(balancesBefore, { seller: { eth: balancesBefore.seller.eth.add(expMatch.weiAmount), ace: balancesBefore.seller.ace.add(expMatch.tokenAmount), @@ -279,7 +280,7 @@ async function matchOrders(testInstance, buyTokenOrder, sellTokenOrder) { } }); } else { - await tokenAceTestHelper.assertBalances(balancesBefore, { + await tokenTestHelpers.assertBalances(balancesBefore, { seller: { eth: balancesBefore.seller.eth.add(expMatch.weiAmount), ace: balancesBefore.seller.ace, diff --git a/test/helpers/loanTestHelper.js b/test/helpers/loanTestHelpers.js similarity index 79% rename from test/helpers/loanTestHelper.js rename to test/helpers/loanTestHelpers.js index b3d22fe2..5a89f058 100644 --- a/test/helpers/loanTestHelper.js +++ b/test/helpers/loanTestHelpers.js @@ -6,17 +6,24 @@ const NULL_ACC = "0x0000000000000000000000000000000000000000"; const BigNumber = require("bignumber.js"); const moment = require("moment"); -const tokenAceTestHelper = require("./tokenAceTestHelper.js"); -const testHelper = require("./testHelper.js"); +const MonetarySupervisor = artifacts.require("./MonetarySupervisor.sol"); const LoanManager = artifacts.require("./LoanManager.sol"); +const Rates = artifacts.require("./Rates.sol"); -let tokenAce, monetarySupervisor, loanManager, rates, peggedSymbol; +const tokenTestHelpers = require("./tokenTestHelpers.js"); +const testHelpers = require("./testHelpers.js"); + +let augmintToken = null; +let monetarySupervisor = null; +let loanManager = null; +let rates = null; +let peggedSymbol = null; let reserveAcc = null; let interestEarnedAcc = null; module.exports = { - newLoanManagerMock, + initLoanManager, createLoan, repayLoan, collectLoan, @@ -25,40 +32,19 @@ module.exports = { loanAsserts }; -async function newLoanManagerMock(_tokenAce, _monetarySupervisor, _rates) { - tokenAce = _tokenAce; - monetarySupervisor = _monetarySupervisor; - rates = _rates; - [reserveAcc, interestEarnedAcc] = await Promise.all([ +async function initLoanManager() { + loanManager = LoanManager.at(LoanManager.address); + monetarySupervisor = MonetarySupervisor.at(MonetarySupervisor.address); + augmintToken = await tokenTestHelpers.initAugmintToken(); + rates = Rates.at(Rates.address); + + [peggedSymbol, reserveAcc, interestEarnedAcc] = await Promise.all([ + augmintToken.peggedSymbol(), monetarySupervisor.augmintReserves(), monetarySupervisor.interestEarnedAccount() ]); - loanManager = await LoanManager.new(tokenAce.address, monetarySupervisor.address, rates.address, interestEarnedAcc); - - [peggedSymbol, , ,] = await Promise.all([ - tokenAce.peggedSymbol(), - - tokenAce.grantMultiplePermissions(loanManager.address, ["NoFeeTransferContracts"]), - - monetarySupervisor.grantMultiplePermissions(loanManager.address, ["LoanManagerContracts"]), - - loanManager.grantMultiplePermissions(web3.eth.accounts[0], ["MonetaryBoard"]) - ]); peggedSymbol = web3.toAscii(peggedSymbol); - // These neeed to be sequantial b/c ids hardcoded in tests. - // term (in sec), discountRate, loanCoverageRatio, minDisbursedAmount (w/ 4 decimals), defaultingFeePt, isActive - // notDue: (due in 1 day) - await loanManager.addLoanProduct(86400, 970000, 850000, 300000, 50000, true); - // repaying: due in 60 sec for testing repayment - await loanManager.addLoanProduct(60, 985000, 900000, 200000, 50000, true); - // defaulting: due in 1 sec, repay in 1sec for testing defaults - await loanManager.addLoanProduct(1, 990000, 600000, 100000, 50000, true); - // defaulting no left over collateral: due in 1 sec, repay in 1sec for testing defaults without leftover - await loanManager.addLoanProduct(1, 900000, 900000, 100000, 100000, true); - // disabled product - await loanManager.addLoanProduct(1, 990000, 990000, 100000, 50000, false); - return loanManager; } @@ -67,10 +53,10 @@ async function createLoan(testInstance, product, borrower, collateralWei) { loan.state = 0; loan.borrower = borrower; const [totalSupplyBefore, totalLoanAmountBefore, balBefore] = await Promise.all([ - tokenAce.totalSupply(), + augmintToken.totalSupply(), monetarySupervisor.totalLoanAmount(), - tokenAceTestHelper.getAllBalances({ + tokenTestHelpers.getAllBalances({ reserve: reserveAcc, borrower: loan.borrower, loanManager: loanManager.address, @@ -82,10 +68,10 @@ async function createLoan(testInstance, product, borrower, collateralWei) { from: loan.borrower, value: loan.collateral }); - testHelper.logGasUse(testInstance, tx, "newEthBackedLoan"); + testHelpers.logGasUse(testInstance, tx, "newEthBackedLoan"); const [newLoanEvenResult, ,] = await Promise.all([ - testHelper.assertEvent(loanManager, "NewLoan", { + testHelpers.assertEvent(loanManager, "NewLoan", { loanId: x => x, productId: loan.product.id, borrower: loan.borrower, @@ -94,7 +80,7 @@ async function createLoan(testInstance, product, borrower, collateralWei) { repaymentAmount: loan.repaymentAmount.toString() }), - testHelper.assertEvent(tokenAce, "AugmintTransfer", { + testHelpers.assertEvent(augmintToken, "AugmintTransfer", { from: NULL_ACC, to: loan.borrower, amount: loan.loanAmount.toString(), @@ -103,8 +89,8 @@ async function createLoan(testInstance, product, borrower, collateralWei) { }) // TODO: it's emmited but why not picked up by assertEvent? - // testHelper.assertEvent(tokenAce, "Transfer", { - // from: tokenAce.address, + // testHelpers.assertEvent(augmintToken, "Transfer", { + // from: augmintToken.address, // to: expLoan.borrower, // amount: expLoan.loanAmount.toString() // }) @@ -113,12 +99,12 @@ async function createLoan(testInstance, product, borrower, collateralWei) { loan.id = newLoanEvenResult.loanId.toNumber(); const [totalSupplyAfter, totalLoanAmountAfter, ,] = await Promise.all([ - tokenAce.totalSupply(), + augmintToken.totalSupply(), monetarySupervisor.totalLoanAmount(), loanAsserts(loan), - tokenAceTestHelper.assertBalances(balBefore, { + tokenTestHelpers.assertBalances(balBefore, { reserve: {}, borrower: { ace: balBefore.borrower.ace.add(loan.loanAmount), @@ -147,9 +133,9 @@ async function createLoan(testInstance, product, borrower, collateralWei) { async function repayLoan(testInstance, loan) { const [totalSupplyBefore, totalLoanAmountBefore, balBefore] = await Promise.all([ - tokenAce.totalSupply(), + augmintToken.totalSupply(), monetarySupervisor.totalLoanAmount(), - tokenAceTestHelper.getAllBalances({ + tokenTestHelpers.getAllBalances({ reserve: reserveAcc, borrower: loan.borrower, loanManager: loanManager.address, @@ -158,29 +144,29 @@ async function repayLoan(testInstance, loan) { ]); loan.state = 1; // repaid - const tx = await tokenAce.transferAndNotify(loanManager.address, loan.repaymentAmount, loan.id, { + const tx = await augmintToken.transferAndNotify(loanManager.address, loan.repaymentAmount, loan.id, { from: loan.borrower }); - testHelper.logGasUse(testInstance, tx, "transferAndNotify - repayLoan"); + testHelpers.logGasUse(testInstance, tx, "transferAndNotify - repayLoan"); const [totalSupplyAfter, totalLoanAmountAfter, , , ,] = await Promise.all([ - tokenAce.totalSupply(), + augmintToken.totalSupply(), monetarySupervisor.totalLoanAmount(), - testHelper.assertEvent(loanManager, "LoanRepayed", { + testHelpers.assertEvent(loanManager, "LoanRepayed", { loanId: loan.id, borrower: loan.borrower }), /* TODO: these are emmited but why not picked up by assertEvent? */ - // testHelper.assertEvent(tokenAce, "AugmintTransfer", { + // testHelpers.assertEvent(augmintToken, "AugmintTransfer", { // from: loan.borrower, // to: loanManager.address, // amount: loan.repaymentAmount.toString(), // fee: 0, // narrative: "" // }), - // testHelper.assertEvent(tokenAce, "Transfer", { + // testHelpers.assertEvent(augmintToken, "Transfer", { // from: loan.borrower, // to: loanManager.address, // amount: loan.repaymentAmount.toString() @@ -188,7 +174,7 @@ async function repayLoan(testInstance, loan) { loanAsserts(loan), - tokenAceTestHelper.assertBalances(balBefore, { + tokenTestHelpers.assertBalances(balBefore, { reserve: {}, borrower: { ace: balBefore.borrower.ace.sub(loan.repaymentAmount), @@ -233,10 +219,10 @@ async function collectLoan(testInstance, loan, collector) { targetCollectionInWei, targetFeeInWei ] = await Promise.all([ - tokenAce.totalSupply(), + augmintToken.totalSupply(), monetarySupervisor.totalLoanAmount(), - tokenAceTestHelper.getAllBalances({ + tokenTestHelpers.getAllBalances({ reserve: reserveAcc, collector: loan.collector, borrower: loan.borrower, @@ -271,13 +257,13 @@ async function collectLoan(testInstance, loan, collector) { // ); const tx = await loanManager.collect([loan.id], { from: loan.collector }); - testHelper.logGasUse(testInstance, tx, "collect 1"); + testHelpers.logGasUse(testInstance, tx, "collect 1"); const [totalSupplyAfter, totalLoanAmountAfter, , ,] = await Promise.all([ - tokenAce.totalSupply(), + augmintToken.totalSupply(), monetarySupervisor.totalLoanAmount(), - testHelper.assertEvent(loanManager, "LoanCollected", { + testHelpers.assertEvent(loanManager, "LoanCollected", { loanId: loan.id, borrower: loan.borrower, collectedCollateral: collectedCollateral.toString(), @@ -287,7 +273,7 @@ async function collectLoan(testInstance, loan, collector) { loanAsserts(loan), - tokenAceTestHelper.assertBalances(balBefore, { + tokenTestHelpers.assertBalances(balBefore, { reserve: { eth: balBefore.reserve.eth.add(collectedCollateral) }, diff --git a/test/helpers/monetarySupervisorTestHelpers.js b/test/helpers/monetarySupervisorTestHelpers.js deleted file mode 100644 index 44a933bc..00000000 --- a/test/helpers/monetarySupervisorTestHelpers.js +++ /dev/null @@ -1,40 +0,0 @@ -const AugmintReserves = artifacts.require("./AugmintReserves.sol"); - -module.exports = { - newMonetarySupervisorMock, - withdrawFromReserve -}; - -const InterestEarnedAccount = artifacts.require("./InterestEarnedAccount.sol"); -const MonetarySupervisor = artifacts.require("./MonetarySupervisor.sol"); -let tokenAEur, monetarySupervisor, augmintReserves, interestEarnedAccount; - -async function newMonetarySupervisorMock(augmintToken, tokenOwner = web3.eth.accounts[0]) { - tokenAEur = augmintToken; - augmintReserves = await AugmintReserves.new(); - monetarySupervisor = await MonetarySupervisor.new( - tokenAEur.address, - augmintReserves.address, - InterestEarnedAccount.address, - - /* Parameters Used to ensure totalLoanAmount or totalLockedAmount difference is withing limit and system also works - when any of those 0 or low. */ - 200000 /* ltdDifferenceLimit = 20% allow lock or loan if Loan To Deposut ratio stay within 1 +- this param - stored as parts per million */, - 50000000 /* allowedLtdDifferenceAmount =5,000 A-EUR - if totalLoan and totalLock difference is less than that - then allow loan or lock even if ltdDifference limit would go off with it */, - { from: tokenOwner } - ); - - interestEarnedAccount = InterestEarnedAccount.at(InterestEarnedAccount.address); - await interestEarnedAccount.grantMultiplePermissions(monetarySupervisor.address, ["MonetarySupervisorContract"]); - await tokenAEur.grantMultiplePermissions(monetarySupervisor.address, ["MonetarySupervisorContract"]); - await augmintReserves.grantMultiplePermissions(monetarySupervisor.address, ["MonetarySupervisorContract"]); - await tokenAEur.grantMultiplePermissions(monetarySupervisor.address, ["NoFeeTransferContracts"]); - await tokenAEur.grantMultiplePermissions(augmintReserves.address, ["NoFeeTransferContracts"]); - return monetarySupervisor; -} - -async function withdrawFromReserve(to, amount) { - await augmintReserves.withdrawTokens(tokenAEur.address, to, amount, "withdrawal for tests"); -} diff --git a/test/helpers/ratesTestHelper.js b/test/helpers/ratesTestHelpers.js similarity index 85% rename from test/helpers/ratesTestHelper.js rename to test/helpers/ratesTestHelpers.js index 9b7e7482..629aeff6 100644 --- a/test/helpers/ratesTestHelper.js +++ b/test/helpers/ratesTestHelpers.js @@ -2,18 +2,14 @@ const Rates = artifacts.require("./Rates.sol"); const moment = require("moment"); module.exports = { - newRatesMock, + getRates, newRatesAsserts }; -let rates; +let rates = null; -async function newRatesMock(symbol, rate) { - rates = await Rates.new(); - await rates.grantPermission(web3.eth.accounts[0], "setRate"); - if (symbol) { - await rates.setRate(symbol, rate); - } +async function getRates() { + rates = Rates.at(Rates.address); return rates; } diff --git a/test/helpers/testHelper.js b/test/helpers/testHelpers.js similarity index 100% rename from test/helpers/testHelper.js rename to test/helpers/testHelpers.js diff --git a/test/helpers/tokenAceTestHelper.js b/test/helpers/tokenTestHelpers.js similarity index 76% rename from test/helpers/tokenAceTestHelper.js rename to test/helpers/tokenTestHelpers.js index 5a3a3982..ad997a49 100644 --- a/test/helpers/tokenAceTestHelper.js +++ b/test/helpers/tokenTestHelpers.js @@ -1,10 +1,16 @@ const BigNumber = require("bignumber.js"); -const testHelper = new require("./testHelper.js"); -const TokenAEur = artifacts.require("./mocks/TokenAEur.sol"); +const testHelper = new require("./testHelpers.js"); + +const AugmintToken = artifacts.require("./mocks/TokenAEur.sol"); +const AugmintReserves = artifacts.require("./AugmintReserves.sol"); +const MonetarySupervisor = artifacts.require("./MonetarySupervisor.sol"); + const TRANSFER_MAXFEE = web3.toWei(0.01); // TODO: set this to expected value (+set gasPrice) module.exports = { - newTokenAceMock, + initAugmintToken, + issueToReserve, + withdrawFromReserve, transferTest, getTransferFee, getAllBalances, @@ -16,24 +22,24 @@ module.exports = { }; const FeeAccount = artifacts.require("./FeeAccount.sol"); -const InterestEarnedAccount = artifacts.require("./InterestEarnedAccount.sol"); -let tokenAce; -async function newTokenAceMock(tokenOwner = web3.eth.accounts[0]) { - tokenAce = await TokenAEur.new( - FeeAccount.address, - 2000, // transferFeePt in parts per million = 0.2% - 200, // min: 0.02 A-EUR - 50000, // max fee: 5 A-EUR - { from: tokenOwner } - ); +let augmintToken = null; +let augmintReserves = null; +let monetarySupervisor = null; - await tokenAce.grantMultiplePermissions(FeeAccount.address, ["NoFeeTransferContracts"]); - await tokenAce.grantMultiplePermissions(tokenOwner, ["MonetaryBoard", "NoFeeTransferContracts"]); +async function initAugmintToken() { + augmintToken = AugmintToken.at(AugmintToken.address); + augmintReserves = AugmintReserves.at(AugmintReserves.address); + monetarySupervisor = MonetarySupervisor.at(MonetarySupervisor.address); + return augmintToken; +} - await tokenAce.grantMultiplePermissions(InterestEarnedAccount.address, ["NoFeeTransferContracts"]); +async function issueToReserve(amount) { + await monetarySupervisor.issueToReserve(amount); +} - return tokenAce; +async function withdrawFromReserve(to, amount) { + await augmintReserves.withdrawTokens(augmintToken.address, to, amount, "withdrawal for tests"); } async function transferTest(testInstance, expTransfer) { @@ -50,12 +56,12 @@ async function transferTest(testInstance, expTransfer) { let tx, txName; if (expTransfer.narrative === "") { txName = "transfer"; - tx = await tokenAce.transfer(expTransfer.to, expTransfer.amount, { + tx = await augmintToken.transfer(expTransfer.to, expTransfer.amount, { from: expTransfer.from }); } else { txName = "transferWithNarrative"; - tx = await tokenAce.transferWithNarrative(expTransfer.to, expTransfer.amount, expTransfer.narrative, { + tx = await augmintToken.transferWithNarrative(expTransfer.to, expTransfer.amount, expTransfer.narrative, { from: expTransfer.from }); } @@ -80,12 +86,12 @@ async function transferTest(testInstance, expTransfer) { } async function approveTest(testInstance, expApprove) { - const tx = await tokenAce.approve(expApprove.spender, expApprove.value, { + const tx = await augmintToken.approve(expApprove.spender, expApprove.value, { from: expApprove.owner }); await approveEventAsserts(expApprove); testHelper.logGasUse(testInstance, tx, "approve"); - const newAllowance = await tokenAce.allowance(expApprove.owner, expApprove.spender); + const newAllowance = await augmintToken.allowance(expApprove.owner, expApprove.spender); assert.equal(newAllowance.toString(), expApprove.value.toString(), "allowance value should be set"); } @@ -97,7 +103,7 @@ async function transferFromTest(testInstance, expTransfer) { if (typeof expTransfer.narrative === "undefined") expTransfer.narrative = ""; expTransfer.fee = typeof expTransfer.fee === "undefined" ? await getTransferFee(expTransfer) : expTransfer.fee; - const allowanceBefore = await tokenAce.allowance(expTransfer.from, expTransfer.spender); + const allowanceBefore = await augmintToken.allowance(expTransfer.from, expTransfer.spender); const balBefore = await getAllBalances({ from: expTransfer.from, to: expTransfer.to, @@ -108,12 +114,12 @@ async function transferFromTest(testInstance, expTransfer) { let tx, txName; if (expTransfer.narrative === "") { txName = "transferFrom"; - tx = await tokenAce.transferFrom(expTransfer.from, expTransfer.to, expTransfer.amount, { + tx = await augmintToken.transferFrom(expTransfer.from, expTransfer.to, expTransfer.amount, { from: expTransfer.spender }); } else { txName = "transferFromWithNarrative"; - tx = await tokenAce.transferFromWithNarrative( + tx = await augmintToken.transferFromWithNarrative( expTransfer.from, expTransfer.to, expTransfer.amount, @@ -127,7 +133,7 @@ async function transferFromTest(testInstance, expTransfer) { await transferEventAsserts(expTransfer); - const allowanceAfter = await tokenAce.allowance(expTransfer.from, expTransfer.spender); + const allowanceAfter = await augmintToken.allowance(expTransfer.from, expTransfer.spender); assert.equal( allowanceBefore.sub(expTransfer.amount).toString(), allowanceAfter.toString(), @@ -158,14 +164,14 @@ async function transferFromTest(testInstance, expTransfer) { async function getTransferFee(transfer) { const [fromAllowed, toAllowed] = await Promise.all([ - tokenAce.permissions(transfer.from, "NoFeeTransferContracts"), - tokenAce.permissions(transfer.from, "NoFeeTransferContracts") + augmintToken.permissions(transfer.from, "NoFeeTransferContracts"), + augmintToken.permissions(transfer.from, "NoFeeTransferContracts") ]); if (fromAllowed || toAllowed) { return 0; } - const [feePt, feeMin, feeMax] = await tokenAce.getParams(); + const [feePt, feeMin, feeMax] = await augmintToken.getParams(); const amount = new BigNumber(transfer.amount); let fee = @@ -191,7 +197,7 @@ async function getAllBalances(accs) { ret[ac] = {}; ret[ac].address = address; ret[ac].eth = await web3.eth.getBalance(address); - ret[ac].ace = await tokenAce.balanceOf(address); + ret[ac].ace = await augmintToken.balanceOf(address); } return ret; @@ -235,7 +241,7 @@ async function assertBalances(before, exp) { } async function transferEventAsserts(expTransfer) { - await testHelper.assertEvent(tokenAce, "AugmintTransfer", { + await testHelper.assertEvent(augmintToken, "AugmintTransfer", { from: expTransfer.from, to: expTransfer.to, amount: expTransfer.amount.toString(), @@ -243,7 +249,7 @@ async function transferEventAsserts(expTransfer) { narrative: expTransfer.narrative }); - await testHelper.assertEvent(tokenAce, "Transfer", { + await testHelper.assertEvent(augmintToken, "Transfer", { from: expTransfer.from, to: expTransfer.to, amount: expTransfer.amount.toString() @@ -251,7 +257,7 @@ async function transferEventAsserts(expTransfer) { } async function approveEventAsserts(expApprove) { - await testHelper.assertEvent(tokenAce, "Approval", { + await testHelper.assertEvent(augmintToken, "Approval", { _owner: expApprove.owner, _spender: expApprove.spender, _value: expApprove.value.toString() diff --git a/test/interestEarnedAccount.test.js b/test/interestEarnedAccount.js similarity index 82% rename from test/interestEarnedAccount.test.js rename to test/interestEarnedAccount.js index fb50df2d..ae101dd3 100644 --- a/test/interestEarnedAccount.test.js +++ b/test/interestEarnedAccount.js @@ -1,5 +1,5 @@ const InterestEarnedAccount = artifacts.require("./InterestEarnedAccount.sol"); -const testHelper = require("./helpers/testHelper.js"); +const testHelpers = require("./helpers/testHelpers.js"); contract("InterestEarnedAccount", accounts => { it("should allow permitted contracts to transfer interest"); diff --git a/test/loanManager.test.js b/test/loanManager.js similarity index 63% rename from test/loanManager.test.js rename to test/loanManager.js index 9a70ed6a..b81094a0 100644 --- a/test/loanManager.test.js +++ b/test/loanManager.js @@ -1,17 +1,11 @@ -const testHelper = new require("./helpers/testHelper.js"); -const tokenAceTestHelper = new require("./helpers/tokenAceTestHelper.js"); -const monetarySupervisorTestHelpers = require("./helpers/monetarySupervisorTestHelpers.js"); -const ratesTestHelper = new require("./helpers/ratesTestHelper.js"); -const loanTestHelper = new require("./helpers/loanTestHelper.js"); +const testHelpers = require("./helpers/testHelpers.js"); +const loanTestHelpers = require("./helpers/loanTestHelpers.js"); -let loanManager, tokenAce, monetarySupervisor, rates; +let loanManager = null; contract("loanManager tests", accounts => { before(async function() { - rates = await ratesTestHelper.newRatesMock(); - tokenAce = await tokenAceTestHelper.newTokenAceMock(); - monetarySupervisor = await monetarySupervisorTestHelpers.newMonetarySupervisorMock(tokenAce); - loanManager = await loanTestHelper.newLoanManagerMock(tokenAce, monetarySupervisor, rates); + loanManager = await loanTestHelpers.initLoanManager(); }); it("Should add new product", async function() { @@ -32,10 +26,10 @@ contract("loanManager tests", accounts => { prod.isActive, { from: accounts[0] } ); - const res = await testHelper.assertEvent(loanManager, "LoanProductAdded", { + const res = await testHelpers.assertEvent(loanManager, "LoanProductAdded", { productId: x => x }); - const prodActual = await loanTestHelper.getProductInfo(res.productId); + const prodActual = await loanTestHelpers.getProductInfo(res.productId); Object.keys(prod).forEach(argName => assert.equal( prodActual[argName].toString(), @@ -46,14 +40,14 @@ contract("loanManager tests", accounts => { }); it("Only allowed should add new product", async function() { - await testHelper.expectThrow( + await testHelpers.expectThrow( loanManager.addLoanProduct(86400, 970000, 850000, 300000, 50000, true, { from: accounts[1] }) ); }); it("Should disable loan product", async function() { const tx = await loanManager.setLoanProductActiveState(0, false); - testHelper.logGasUse(this, tx, "setLoanProductActiveState"); + testHelpers.logGasUse(this, tx, "setLoanProductActiveState"); assert.equal( tx.logs[0].event, "LoanProductActiveStateChanged", @@ -64,7 +58,7 @@ contract("loanManager tests", accounts => { it("Should enable loan product", async function() { const tx = await loanManager.setLoanProductActiveState(4, true); - testHelper.logGasUse(this, tx, "setLoanProductActiveState"); + testHelpers.logGasUse(this, tx, "setLoanProductActiveState"); assert.equal( tx.logs[0].event, "LoanProductActiveStateChanged", @@ -74,6 +68,6 @@ contract("loanManager tests", accounts => { }); it("Only allowed should set loan product state", async function() { - await testHelper.expectThrow(loanManager.setLoanProductActiveState(0, true, { from: accounts[1] })); + await testHelpers.expectThrow(loanManager.setLoanProductActiveState(0, true, { from: accounts[1] })); }); }); diff --git a/test/loans.js b/test/loans.js new file mode 100644 index 00000000..2d063dec --- /dev/null +++ b/test/loans.js @@ -0,0 +1,199 @@ +const LoanManager = artifacts.require("./LoanManager.sol"); +const MonetarySupervisor = artifacts.require("./MonetarySupervisor.sol"); +const Rates = artifacts.require("./Rates.sol"); + +const testHelpers = require("./helpers/testHelpers.js"); +const augmintTokenTestHelper = require("./helpers/tokenTestHelpers.js"); +const loanTestHelpers = require("./helpers/loanTestHelpers.js"); + +let augmintToken = null; +let loanManager = null; +let monetarySupervisor = null; +let rates = null; +let products = {}; + +contract("Augmint Loans tests", accounts => { + before(async function() { + rates = Rates.at(Rates.address); + monetarySupervisor = MonetarySupervisor.at(MonetarySupervisor.address); + augmintToken = await augmintTokenTestHelper.initAugmintToken(); + + [loanManager] = await Promise.all([ + loanTestHelpers.initLoanManager(), + augmintTokenTestHelper.issueToReserve(1000000000) + ]); + + // These neeed to be sequantial b/c ids hardcoded in tests. + // term (in sec), discountRate, loanCoverageRatio, minDisbursedAmount (w/ 4 decimals), defaultingFeePt, isActive + // notDue: (due in 1 day) + const prodCount = (await loanManager.getProductCount()).toNumber(); + + await loanManager.addLoanProduct(86400, 970000, 850000, 300000, 50000, true); + // repaying: due in 60 sec for testing repayment + await loanManager.addLoanProduct(60, 985000, 900000, 200000, 50000, true); + // defaulting: due in 1 sec, repay in 1sec for testing defaults + await loanManager.addLoanProduct(1, 990000, 600000, 100000, 50000, true); + // defaulting no left over collateral: due in 1 sec, repay in 1sec for testing defaults without leftover + await loanManager.addLoanProduct(1, 900000, 900000, 100000, 100000, true); + // disabled product + await loanManager.addLoanProduct(1, 990000, 990000, 100000, 50000, false); + + [ + products.disabledProduct, + products.defaultingNoLeftOver, + products.defaulting, + products.repaying, + products.notDue, + , + ] = await Promise.all([ + loanTestHelpers.getProductInfo(prodCount + 4), + loanTestHelpers.getProductInfo(prodCount + 3), + loanTestHelpers.getProductInfo(prodCount + 2), + loanTestHelpers.getProductInfo(prodCount + 1), + loanTestHelpers.getProductInfo(prodCount), + augmintTokenTestHelper.withdrawFromReserve(accounts[0], 1000000000) + ]); + }); + + it("Should get an ACE loan", async function() { + await loanTestHelpers.createLoan(this, products.repaying, accounts[0], web3.toWei(0.5)); + }); + + it("Should NOT get a loan less than minLoanAmount"); + + it("Shouldn't get a loan for a disabled product", async function() { + await testHelpers.expectThrow( + loanManager.newEthBackedLoan(products.disabledProduct.id, { from: accounts[0], value: web3.toWei(0.5) }) + ); + }); + + it("Should NOT collect a loan before it's due"); + it("Should NOT repay an ACE loan on maturity if ACE balance is insufficient"); + it("should not repay a loan with smaller amount than repaymentAmount"); + it("Non owner should be able to repay a loan too"); + it("Should not repay with invalid loanId"); + + it("Should repay an ACE loan before maturity", async function() { + const loan = await loanTestHelpers.createLoan(this, products.notDue, accounts[1], web3.toWei(0.5)); + // send interest to borrower to have enough ACE to repay in test + await augmintToken.transfer(loan.borrower, loan.interestAmount, { + from: accounts[0] + }); + await loanTestHelpers.repayLoan(this, loan, true); // repaymant via AugmintToken.repayLoan convenience func + }); + + it("Should collect a defaulted ACE loan and send back leftover collateral ", async function() { + const loan = await loanTestHelpers.createLoan(this, products.defaulting, accounts[1], web3.toWei(0.5)); + + await testHelpers.waitForTimeStamp((await loanManager.loans(loan.id))[8].toNumber()); + + await loanTestHelpers.collectLoan(this, loan, accounts[2]); + }); + + it("Should collect a defaulted ACE loan when no leftover collateral (collection exactly covered)", async function() { + await rates.setRate("EUR", 10000000); + const loan = await loanTestHelpers.createLoan(this, products.defaultingNoLeftOver, accounts[1], web3.toWei(1)); + + await Promise.all([ + rates.setRate("EUR", 9900000), + testHelpers.waitForTimeStamp((await loanManager.loans(loan.id))[8].toNumber()) + ]); + + await loanTestHelpers.collectLoan(this, loan, accounts[2]); + }); + + it("Should collect a defaulted ACE loan when no leftover collateral (collection partially covered)", async function() { + await rates.setRate("EUR", 10000000); + const loan = await loanTestHelpers.createLoan(this, products.defaultingNoLeftOver, accounts[1], web3.toWei(1)); + + await Promise.all([ + rates.setRate("EUR", 9890000), + testHelpers.waitForTimeStamp((await loanManager.loans(loan.id))[8].toNumber()) + ]); + + await loanTestHelpers.collectLoan(this, loan, accounts[2]); + }); + + it("Should collect a defaulted ACE loan when no leftover collateral (only fee covered)", async function() { + await rates.setRate("EUR", 9980000); + const loan = await loanTestHelpers.createLoan(this, products.defaultingNoLeftOver, accounts[1], web3.toWei(2)); + await Promise.all([ + rates.setRate("EUR", 1), + testHelpers.waitForTimeStamp((await loanManager.loans(loan.id))[8].toNumber()) + ]); + + await loanTestHelpers.collectLoan(this, loan, accounts[2]); + }); + + it("Should not collect when rate = 0", async function() { + await rates.setRate("EUR", 9980000); + const loan = await loanTestHelpers.createLoan(this, products.defaultingNoLeftOver, accounts[1], web3.toWei(2)); + await Promise.all([ + rates.setRate("EUR", 0), + testHelpers.waitForTimeStamp((await loanManager.loans(loan.id))[8].toNumber()) + ]); + + testHelpers.expectThrow(loanTestHelpers.collectLoan(this, loan, accounts[2])); + }); + + it("Should get loans from offset"); // contract func to be implemented + it("Should get loans for one account from offset"); // contract func to be implemented + + it("Should NOT repay a loan after paymentperiod is over"); + + it("Should NOT collect an already collected ACE loan"); + + it("Should collect multiple defaulted ACE loans "); + + it("Should get and repay a loan with colletaralRatio = 1"); + it("Should get and repay a loan with colletaralRatio > 1"); + it("Should get and collect a loan with colletaralRatio = 1"); + it("Should get and collect a loan with colletaralRatio > 1"); + it("Should not get a loan when rates = 0"); + + it("Should get a loan if interest rate is negative "); // to be implemented + + it("should only allow whitelisted loan contract to be used", async function() { + const interestEarnedAcc = await monetarySupervisor.interestEarnedAccount(); + const craftedLender = await LoanManager.new( + augmintToken.address, + monetarySupervisor.address, + rates.address, + interestEarnedAcc + ); + await rates.setRate("EUR", 9980000); + await craftedLender.grantPermission(accounts[0], "MonetaryBoard"); + await craftedLender.addLoanProduct(100000, 1000000, 1000000, 100000, 50000, true); + + // testing Lender not having "LoanManagerContracts" permission on monetarySupervisor: + await testHelpers.expectThrow(craftedLender.newEthBackedLoan(0, { value: web3.toWei(1) })); + + // grant permission to create new loan + await monetarySupervisor.grantPermission(craftedLender.address, "LoanManagerContracts"); + await craftedLender.newEthBackedLoan(0, { value: web3.toWei(1) }); + + // revoke permission and try to repay + await monetarySupervisor.revokePermission(craftedLender.address, "LoanManagerContracts"), + await testHelpers.expectThrow( + augmintToken.transferAndNotify(craftedLender.address, 9980000, 0, { + from: accounts[0] + }) + ); + }); + + it("should only allow the token contract to call transferNotification", async function() { + await testHelpers.expectThrow(loanManager.transferNotification(accounts[0], 1000, 0, { from: accounts[0] })); + }); + + it("only allowed contract should call MonetarySupervisor.issueLoan", async function() { + await testHelpers.expectThrow(monetarySupervisor.issueLoan(accounts[0], 0, { from: accounts[0] })); + }); + + it("only allowed contract should call MonetarySupervisor.loanRepaymentNotification", async function() { + await testHelpers.expectThrow(monetarySupervisor.loanRepaymentNotification(0, { from: accounts[0] })); + }); + + it("only allowed contract should call MonetarySupervisor.loanCollectionNotification", async function() { + await testHelpers.expectThrow(monetarySupervisor.loanCollectionNotification(0, { from: accounts[0] })); + }); +}); diff --git a/test/loans.test.js b/test/loans.test.js deleted file mode 100644 index ead7c9b9..00000000 --- a/test/loans.test.js +++ /dev/null @@ -1,192 +0,0 @@ -const loanTestHelper = require("./helpers/loanTestHelper.js"); -const LoanManager = artifacts.require("./LoanManager.sol"); -const tokenAceTestHelper = require("./helpers/tokenAceTestHelper.js"); -const monetarySupervisorTestHelpers = require("./helpers/monetarySupervisorTestHelpers.js"); -const ratesTestHelper = require("./helpers/ratesTestHelper.js"); -const testHelper = require("./helpers/testHelper.js"); - -let tokenAce, loanManager, monetarySupervisor, rates; -let products = {}; - -contract("ACE Loans tests", accounts => { - before(async function() { - [tokenAce, rates] = await Promise.all([ - tokenAceTestHelper.newTokenAceMock(), - ratesTestHelper.newRatesMock("EUR", 9980000) - ]); - monetarySupervisor = await monetarySupervisorTestHelpers.newMonetarySupervisorMock(tokenAce); - - [loanManager] = await Promise.all([ - loanTestHelper.newLoanManagerMock(tokenAce, monetarySupervisor, rates), - monetarySupervisor.issueToReserve(1000000000) - ]); - - [ - products.disabledProduct, - products.defaultingNoLeftOver, - products.defaulting, - products.repaying, - products.notDue, - , - ] = await Promise.all([ - loanTestHelper.getProductInfo(4), - loanTestHelper.getProductInfo(3), - loanTestHelper.getProductInfo(2), - loanTestHelper.getProductInfo(1), - loanTestHelper.getProductInfo(0), - monetarySupervisorTestHelpers.withdrawFromReserve(accounts[0], 1000000000) - ]); - - // For test debug: - // for (const key of Object.keys(products)) { - // console.log({ - // product: key, - // id: products[key].id, - // term: products[key].term.toString(), - // repayPeriod: products[key].repayPeriod.toString() - // }); - // } - }); - - it("Should get an ACE loan", async function() { - await loanTestHelper.createLoan(this, products.repaying, accounts[0], web3.toWei(0.5)); - }); - - it("Should NOT get a loan less than minLoanAmount"); - - it("Shouldn't get a loan for a disabled product", async function() { - await testHelper.expectThrow( - loanManager.newEthBackedLoan(products.disabledProduct.id, { from: accounts[0], value: web3.toWei(0.5) }) - ); - }); - - it("Should NOT collect a loan before it's due"); - it("Should NOT repay an ACE loan on maturity if ACE balance is insufficient"); - it("should not repay a loan with smaller amount than repaymentAmount"); - it("Non owner should be able to repay a loan too"); - it("Should not repay with invalid loanId"); - - it("Should repay an ACE loan before maturity", async function() { - const loan = await loanTestHelper.createLoan(this, products.notDue, accounts[1], web3.toWei(0.5)); - // send interest to borrower to have enough ACE to repay in test - await tokenAce.transfer(loan.borrower, loan.interestAmount, { - from: accounts[0] - }); - await loanTestHelper.repayLoan(this, loan, true); // repaymant via AugmintToken.repayLoan convenience func - }); - - it("Should collect a defaulted ACE loan and send back leftover collateral ", async function() { - const loan = await loanTestHelper.createLoan(this, products.defaulting, accounts[1], web3.toWei(0.5)); - - await testHelper.waitForTimeStamp((await loanManager.loans(loan.id))[8].toNumber()); - - await loanTestHelper.collectLoan(this, loan, accounts[2]); - }); - - it("Should collect a defaulted ACE loan when no leftover collateral (collection exactly covered)", async function() { - await rates.setRate("EUR", 10000000); - const loan = await loanTestHelper.createLoan(this, products.defaultingNoLeftOver, accounts[1], web3.toWei(1)); - - await Promise.all([ - rates.setRate("EUR", 9900000), - testHelper.waitForTimeStamp((await loanManager.loans(loan.id))[8].toNumber()) - ]); - - await loanTestHelper.collectLoan(this, loan, accounts[2]); - }); - - it("Should collect a defaulted ACE loan when no leftover collateral (collection partially covered)", async function() { - await rates.setRate("EUR", 10000000); - const loan = await loanTestHelper.createLoan(this, products.defaultingNoLeftOver, accounts[1], web3.toWei(1)); - - await Promise.all([ - rates.setRate("EUR", 9890000), - testHelper.waitForTimeStamp((await loanManager.loans(loan.id))[8].toNumber()) - ]); - - await loanTestHelper.collectLoan(this, loan, accounts[2]); - }); - - it("Should collect a defaulted ACE loan when no leftover collateral (only fee covered)", async function() { - await rates.setRate("EUR", 9980000); - const loan = await loanTestHelper.createLoan(this, products.defaultingNoLeftOver, accounts[1], web3.toWei(2)); - await Promise.all([ - rates.setRate("EUR", 1), - testHelper.waitForTimeStamp((await loanManager.loans(loan.id))[8].toNumber()) - ]); - - await loanTestHelper.collectLoan(this, loan, accounts[2]); - }); - - it("Should not collect when rate = 0", async function() { - await rates.setRate("EUR", 9980000); - const loan = await loanTestHelper.createLoan(this, products.defaultingNoLeftOver, accounts[1], web3.toWei(2)); - await Promise.all([ - rates.setRate("EUR", 0), - testHelper.waitForTimeStamp((await loanManager.loans(loan.id))[8].toNumber()) - ]); - - testHelper.expectThrow(loanTestHelper.collectLoan(this, loan, accounts[2])); - }); - - it("Should get loans from offset"); // contract func to be implemented - it("Should get loans for one account from offset"); // contract func to be implemented - - it("Should NOT repay a loan after paymentperiod is over"); - - it("Should NOT collect an already collected ACE loan"); - - it("Should collect multiple defaulted ACE loans "); - - it("Should get and repay a loan with colletaralRatio = 1"); - it("Should get and repay a loan with colletaralRatio > 1"); - it("Should get and collect a loan with colletaralRatio = 1"); - it("Should get and collect a loan with colletaralRatio > 1"); - it("Should not get a loan when rates = 0"); - - it("Should get a loan if interest rate is negative "); // to be implemented - - it("should only allow whitelisted loan contract to be used", async function() { - const interestEarnedAcc = await monetarySupervisor.interestEarnedAccount(); - const craftedLender = await LoanManager.new( - tokenAce.address, - monetarySupervisor.address, - rates.address, - interestEarnedAcc - ); - await rates.setRate("EUR", 9980000); - await craftedLender.grantPermission(accounts[0], "MonetaryBoard"); - await craftedLender.addLoanProduct(100000, 1000000, 1000000, 100000, 50000, true); - - // testing Lender not having "LoanManagerContracts" permission on monetarySupervisor: - await testHelper.expectThrow(craftedLender.newEthBackedLoan(0, { value: web3.toWei(1) })); - - // grant permission to create new loan - await monetarySupervisor.grantPermission(craftedLender.address, "LoanManagerContracts"); - await craftedLender.newEthBackedLoan(0, { value: web3.toWei(1) }); - - // revoke permission and try to repay - await monetarySupervisor.revokePermission(craftedLender.address, "LoanManagerContracts"), - await testHelper.expectThrow( - tokenAce.transferAndNotify(craftedLender.address, 9980000, 0, { - from: accounts[0] - }) - ); - }); - - it("should only allow the token contract to call transferNotification", async function() { - await testHelper.expectThrow(loanManager.transferNotification(accounts[0], 1000, 0, { from: accounts[0] })); - }); - - it("only allowed contract should call MonetarySupervisor.issueLoan", async function() { - await testHelper.expectThrow(monetarySupervisor.issueLoan(accounts[0], 0, { from: accounts[0] })); - }); - - it("only allowed contract should call MonetarySupervisor.loanRepaymentNotification", async function() { - await testHelper.expectThrow(monetarySupervisor.loanRepaymentNotification(0, { from: accounts[0] })); - }); - - it("only allowed contract should call MonetarySupervisor.loanCollectionNotification", async function() { - await testHelper.expectThrow(monetarySupervisor.loanCollectionNotification(0, { from: accounts[0] })); - }); -}); diff --git a/test/locker.js b/test/locker.js index 852bb5a6..1cd00554 100644 --- a/test/locker.js +++ b/test/locker.js @@ -1,9 +1,9 @@ /* TODO: create lockHelpers to make this test more readable and manegable */ const Locker = artifacts.require("Locker"); +const MonetarySupervisor = artifacts.require("./MonetarySupervisor.sol"); +const tokenTestHelpers = require("./helpers/tokenTestHelpers.js"); -const tokenAceTestHelper = require("./helpers/tokenAceTestHelper.js"); -const monetarySupervisorTestHelpers = require("./helpers/monetarySupervisorTestHelpers.js"); -const testHelpers = require("./helpers/testHelper.js"); +const testHelpers = require("./helpers/testHelpers.js"); const MAX_LOCK_GAS = web3.toWei(0.028); // TODO: use gas cost and calculate wei fee const MAX_RELEASE_GAS = web3.toWei(0.001); @@ -11,33 +11,28 @@ const MAX_RELEASE_GAS = web3.toWei(0.001); let tokenHolder = ""; let interestEarnedAddress = ""; let lockerInstance = null; -let tokenAceInstance = null; +let augmintToken = null; let monetarySupervisor = null; contract("Lock", accounts => { before(async function() { - const superUserAddress = accounts[0]; tokenHolder = accounts[1]; - tokenAceInstance = await tokenAceTestHelper.newTokenAceMock(superUserAddress); + augmintToken = await tokenTestHelpers.initAugmintToken(); - monetarySupervisor = await monetarySupervisorTestHelpers.newMonetarySupervisorMock(tokenAceInstance); + monetarySupervisor = MonetarySupervisor.at(MonetarySupervisor.address); - lockerInstance = await Locker.new(tokenAceInstance.address, monetarySupervisor.address); + lockerInstance = Locker.at(Locker.address); [interestEarnedAddress, , , ,] = await Promise.all([ monetarySupervisor.interestEarnedAccount(), - tokenAceInstance.grantMultiplePermissions(lockerInstance.address, ["NoFeeTransferContracts"]), - monetarySupervisor.grantMultiplePermissions(lockerInstance.address, ["LockerContracts"]), - - monetarySupervisor.issueToReserve(50000), - lockerInstance.addLockProduct(50000, 60, 100, true) // to be used in tests to make unit test independent + monetarySupervisor.issueToReserve(50000) ]); await Promise.all([ - monetarySupervisorTestHelpers.withdrawFromReserve(tokenHolder, 40000), - monetarySupervisorTestHelpers.withdrawFromReserve(interestEarnedAddress, 10000) + tokenTestHelpers.withdrawFromReserve(tokenHolder, 40000), + tokenTestHelpers.withdrawFromReserve(interestEarnedAddress, 10000) ]); }); @@ -179,7 +174,7 @@ contract("Lock", accounts => { it("should allow tokens to be locked", async function() { const [startingBalances, totalLockAmountBefore] = await Promise.all([ - tokenAceTestHelper.getAllBalances({ + tokenTestHelpers.getAllBalances({ tokenHolder: tokenHolder, lockerInstance: lockerInstance.address, interestEarned: interestEarnedAddress @@ -191,7 +186,7 @@ contract("Lock", accounts => { // lock funds, and get the product that was used: const [product, lockingTransaction] = await Promise.all([ lockerInstance.lockProducts(0), - tokenAceInstance.transferAndNotify(lockerInstance.address, amountToLock, 0, { + augmintToken.transferAndNotify(lockerInstance.address, amountToLock, 0, { from: tokenHolder }) ]); @@ -222,13 +217,13 @@ contract("Lock", accounts => { }), // TODO: events are emitted but can't retrieve them - // testHelpers.assertEvent(tokenAceInstance, "Transfer", { + // testHelpers.assertEvent(augmintToken, "Transfer", { // from: tokenHolder, // to: lockerInstance.address, // amount: amountToLock // }), // - // testHelpers.assertEvent(tokenAceInstance, "AugmintTransfer", { + // testHelpers.assertEvent(augmintToken, "AugmintTransfer", { // from: tokenHolder, // to: lockerInstance.address, // amount: amountToLock, @@ -236,7 +231,7 @@ contract("Lock", accounts => { // narrative: "Funds locked" // }) - tokenAceTestHelper.assertBalances(startingBalances, { + tokenTestHelpers.assertBalances(startingBalances, { tokenHolder: { ace: startingBalances.tokenHolder.ace.sub(amountToLock), gasFee: MAX_LOCK_GAS }, lockerInstance: { ace: startingBalances.lockerInstance.ace.add(amountToLock + interestEarned) }, interestEarned: { ace: startingBalances.interestEarned.ace.sub(interestEarned) } @@ -254,7 +249,7 @@ contract("Lock", accounts => { const startingNumLocks = (await lockerInstance.getLockCountForAddress(tokenHolder)).toNumber(); const amountToLock = 1000; - await tokenAceInstance.transferAndNotify(lockerInstance.address, amountToLock, 0, { + await augmintToken.transferAndNotify(lockerInstance.address, amountToLock, 0, { from: tokenHolder }); @@ -265,7 +260,7 @@ contract("Lock", accounts => { it("should allow tokens to be unlocked", async function() { const [startingBalances, addProdTx] = await Promise.all([ - tokenAceTestHelper.getAllBalances({ + tokenTestHelpers.getAllBalances({ tokenHolder: tokenHolder, lockerInstance: lockerInstance.address, interestEarned: interestEarnedAddress @@ -279,14 +274,9 @@ contract("Lock", accounts => { const interestEarned = Math.floor(amountToLock / 10); // 10% const newLockProductId = (await lockerInstance.getLockProductCount()).toNumber() - 1; - const lockTx = await tokenAceInstance.transferAndNotify( - lockerInstance.address, - amountToLock, - newLockProductId, - { - from: tokenHolder - } - ); + const lockTx = await augmintToken.transferAndNotify(lockerInstance.address, amountToLock, newLockProductId, { + from: tokenHolder + }); testHelpers.logGasUse(this, lockTx, "transferAndNotify - lockFunds"); await testHelpers.waitFor(2500); @@ -304,7 +294,7 @@ contract("Lock", accounts => { const [totalLockAmountAfter, , , ,] = await Promise.all([ monetarySupervisor.totalLockedAmount(), - tokenAceTestHelper.assertBalances(startingBalances, { + tokenTestHelpers.assertBalances(startingBalances, { tokenHolder: { ace: startingBalances.tokenHolder.ace.add(interestEarned), gasFee: MAX_LOCK_GAS + MAX_RELEASE_GAS @@ -318,7 +308,7 @@ contract("Lock", accounts => { lockIndex: newestLockIndex }), - testHelpers.assertEvent(tokenAceInstance, "AugmintTransfer", { + testHelpers.assertEvent(augmintToken, "AugmintTransfer", { from: lockerInstance.address, to: tokenHolder, amount: amountToLock + interestEarned, @@ -326,7 +316,7 @@ contract("Lock", accounts => { narrative: "Funds released from lock" }), - testHelpers.assertEvent(tokenAceInstance, "Transfer", { + testHelpers.assertEvent(augmintToken, "Transfer", { from: lockerInstance.address, to: tokenHolder, amount: amountToLock + interestEarned @@ -346,7 +336,7 @@ contract("Lock", accounts => { // lock funds, and get the product that was used: const [product, lockingTransaction] = await Promise.all([ lockerInstance.lockProducts(0), - tokenAceInstance.transferAndNotify(lockerInstance.address, amountToLock, 0, { from: tokenHolder }) + augmintToken.transferAndNotify(lockerInstance.address, amountToLock, 0, { from: tokenHolder }) ]); const expectedPerTermInterest = product[0].toNumber(); @@ -385,7 +375,7 @@ contract("Lock", accounts => { // lock funds, and get the product that was used: const [product, lockingTransaction] = await Promise.all([ lockerInstance.lockProducts(0), - tokenAceInstance.transferAndNotify(lockerInstance.address, amountToLock, 0, { from: tokenHolder }) + augmintToken.transferAndNotify(lockerInstance.address, amountToLock, 0, { from: tokenHolder }) ]); const expectedPerTermInterest = product[0].toNumber(); @@ -462,7 +452,7 @@ contract("Lock", accounts => { it("should prevent someone from locking more tokens than they have", async function() { const [startingBalances, totalLockAmountBefore, startingNumLocks] = await Promise.all([ - tokenAceTestHelper.getAllBalances({ + tokenTestHelpers.getAllBalances({ tokenHolder: tokenHolder, lockerInstance: lockerInstance.address, interestEarned: interestEarnedAddress @@ -474,14 +464,14 @@ contract("Lock", accounts => { const amountToLock = startingBalances.tokenHolder.ace + 1000; await testHelpers.expectThrow( - tokenAceInstance.transferAndNotify(lockerInstance.address, amountToLock, 0, { from: tokenHolder }) + augmintToken.transferAndNotify(lockerInstance.address, amountToLock, 0, { from: tokenHolder }) ); await testHelpers.assertNoEvents(lockerInstance, "NewLock"); const [totalLockAmountAfter, finishingNumLocks] = await Promise.all([ monetarySupervisor.totalLockedAmount(), lockerInstance.getLockCountForAddress(tokenHolder), - tokenAceTestHelper.assertBalances(startingBalances, { + tokenTestHelpers.assertBalances(startingBalances, { tokenHolder: { ace: startingBalances.tokenHolder.ace, gasFee: MAX_LOCK_GAS }, lockerInstance: { ace: startingBalances.lockerInstance.ace }, interestEarned: { ace: startingBalances.interestEarned.ace } @@ -503,7 +493,7 @@ contract("Lock", accounts => { const newLockProductId = (await lockerInstance.getLockProductCount()).toNumber() - 1; const [startingBalances, totalLockAmountBefore, startingNumLocks] = await Promise.all([ - tokenAceTestHelper.getAllBalances({ + tokenTestHelpers.getAllBalances({ tokenHolder: tokenHolder, lockerInstance: lockerInstance.address, interestEarned: interestEarnedAddress @@ -520,7 +510,7 @@ contract("Lock", accounts => { assert(startingBalances.tokenHolder.ace.gte(amountToLock)); await testHelpers.expectThrow( - tokenAceInstance.transferAndNotify(lockerInstance.address, amountToLock, newLockProductId, { + augmintToken.transferAndNotify(lockerInstance.address, amountToLock, newLockProductId, { from: tokenHolder }) ); @@ -529,7 +519,7 @@ contract("Lock", accounts => { const [totalLockAmountAfter, finishingNumLocks] = await Promise.all([ monetarySupervisor.totalLockedAmount(), lockerInstance.getLockCountForAddress(tokenHolder), - tokenAceTestHelper.assertBalances(startingBalances, { + tokenTestHelpers.assertBalances(startingBalances, { tokenHolder: { ace: startingBalances.tokenHolder.ace, gasFee: MAX_LOCK_GAS }, lockerInstance: { ace: startingBalances.lockerInstance.ace }, interestEarned: { ace: startingBalances.interestEarned.ace } @@ -555,7 +545,7 @@ contract("Lock", accounts => { // can't lock less than the minimumLockAmount: await testHelpers.expectThrow( - tokenAceInstance.transferAndNotify(lockerInstance.address, minimumLockAmount - 1, newLockProductId, { + augmintToken.transferAndNotify(lockerInstance.address, minimumLockAmount - 1, newLockProductId, { from: tokenHolder }) ); @@ -563,7 +553,7 @@ contract("Lock", accounts => { it("should allow someone to lock exactly the minimum", async function() { const [startingBalances, totalLockAmountBefore, startingNumLocks] = await Promise.all([ - tokenAceTestHelper.getAllBalances({ + tokenTestHelpers.getAllBalances({ tokenHolder: tokenHolder, lockerInstance: lockerInstance.address, interestEarned: interestEarnedAddress @@ -578,14 +568,9 @@ contract("Lock", accounts => { const newLockProductId = (await lockerInstance.getLockProductCount()).toNumber() - 1; - const tx = await tokenAceInstance.transferAndNotify( - lockerInstance.address, - minimumLockAmount, - newLockProductId, - { - from: tokenHolder - } - ); + const tx = await augmintToken.transferAndNotify(lockerInstance.address, minimumLockAmount, newLockProductId, { + from: tokenHolder + }); testHelpers.logGasUse(this, tx, "transferAndNotify - lockFunds"); const eventResults = await testHelpers.assertEvent(lockerInstance, "NewLock", { @@ -604,7 +589,7 @@ contract("Lock", accounts => { lockerInstance.getLockCountForAddress(tokenHolder), - tokenAceTestHelper.assertBalances(startingBalances, { + tokenTestHelpers.assertBalances(startingBalances, { tokenHolder: { ace: startingBalances.tokenHolder.ace.sub(minimumLockAmount), gasFee: MAX_LOCK_GAS }, lockerInstance: { ace: startingBalances.lockerInstance.ace.add(minimumLockAmount).add(eventResults.interestEarned) @@ -625,7 +610,7 @@ contract("Lock", accounts => { it("should prevent someone from releasing a lock early", async function() { const amountToLock = 1000; const [startingBalances, totalLockAmountBefore] = await Promise.all([ - tokenAceTestHelper.getAllBalances({ + tokenTestHelpers.getAllBalances({ tokenHolder: tokenHolder, lockerInstance: lockerInstance.address, interestEarned: interestEarnedAddress @@ -637,7 +622,7 @@ contract("Lock", accounts => { const [product] = await Promise.all([ lockerInstance.lockProducts(0), - tokenAceInstance.transferAndNotify(lockerInstance.address, amountToLock, 0, { + augmintToken.transferAndNotify(lockerInstance.address, amountToLock, 0, { from: tokenHolder }) ]); @@ -654,7 +639,7 @@ contract("Lock", accounts => { testHelpers.assertNoEvents(lockerInstance, "NewLock"), - tokenAceTestHelper.assertBalances(startingBalances, { + tokenTestHelpers.assertBalances(startingBalances, { tokenHolder: { ace: startingBalances.tokenHolder.ace.sub(amountToLock), gasFee: MAX_LOCK_GAS }, lockerInstance: { ace: startingBalances.lockerInstance.ace.add(amountToLock + interestEarned) }, interestEarned: { ace: startingBalances.interestEarned.ace.sub(interestEarned) } @@ -670,7 +655,7 @@ contract("Lock", accounts => { it("should prevent someone from unlocking an unlocked lock", async function() { const [startingBalances, totalLockAmountBefore, startingNumLocks] = await Promise.all([ - tokenAceTestHelper.getAllBalances({ + tokenTestHelpers.getAllBalances({ tokenHolder: tokenHolder, lockerInstance: lockerInstance.address, interestEarned: interestEarnedAddress @@ -686,7 +671,7 @@ contract("Lock", accounts => { const newLockProductId = (await lockerInstance.getLockProductCount()).toNumber() - 1; - await tokenAceInstance.transferAndNotify(lockerInstance.address, amountToLock, newLockProductId, { + await augmintToken.transferAndNotify(lockerInstance.address, amountToLock, newLockProductId, { from: tokenHolder }); @@ -703,7 +688,7 @@ contract("Lock", accounts => { lockerInstance.getLockCountForAddress(tokenHolder), - tokenAceTestHelper.assertBalances(startingBalances, { + tokenTestHelpers.assertBalances(startingBalances, { tokenHolder: { ace: startingBalances.tokenHolder.ace.add(interestEarned), gasFee: MAX_LOCK_GAS + MAX_RELEASE_GAS @@ -729,11 +714,11 @@ contract("Lock", accounts => { }); it("should only allow whitelisted lock contract to be used", async function() { - const craftedLocker = await Locker.new(tokenAceInstance.address, monetarySupervisor.address); + const craftedLocker = await Locker.new(augmintToken.address, monetarySupervisor.address); await craftedLocker.addLockProduct(1000000, 120, 0, true); const newLockProductId = (await craftedLocker.getLockProductCount()).toNumber() - 1; await testHelpers.expectThrow( - tokenAceInstance.transferAndNotify(craftedLocker.address, 10000, newLockProductId, { + augmintToken.transferAndNotify(craftedLocker.address, 10000, newLockProductId, { from: tokenHolder }) ); @@ -746,13 +731,13 @@ contract("Lock", accounts => { it("only allowed contract should call requestInterest ", async function() { const interestAmount = 100; // make sure it's not reverting b/c not enough interest - assert((await tokenAceInstance.balanceOf(interestEarnedAddress)).gte(interestAmount)); + assert((await augmintToken.balanceOf(interestEarnedAddress)).gte(interestAmount)); await testHelpers.expectThrow(monetarySupervisor.requestInterest(1000, interestAmount, { from: accounts[0] })); }); it("only allowed contract should call releaseFundsNotification ", async function() { const amountToLock = 10000; - await tokenAceInstance.transferAndNotify(lockerInstance.address, amountToLock, 0, { + await augmintToken.transferAndNotify(lockerInstance.address, amountToLock, 0, { from: tokenHolder }); await testHelpers.expectThrow(monetarySupervisor.releaseFundsNotification(amountToLock, { from: accounts[0] })); diff --git a/test/monetarySupervisor.test.js b/test/monetarySupervisor.js similarity index 70% rename from test/monetarySupervisor.test.js rename to test/monetarySupervisor.js index 0b50829a..ba06edc2 100644 --- a/test/monetarySupervisor.test.js +++ b/test/monetarySupervisor.js @@ -1,37 +1,38 @@ -const tokenAceTestHelper = require("./helpers/tokenAceTestHelper.js"); -const monetarySupervisorTestHelpers = require("./helpers/monetarySupervisorTestHelpers.js"); -const testHelper = require("./helpers/testHelper.js"); +const MonetarySupervisor = artifacts.require("./MonetarySupervisor.sol"); +const AugmintReserves = artifacts.require("./AugmintReserves.sol"); +const tokenTestHelpers = require("./helpers/tokenTestHelpers.js"); +const testHelpers = require("./helpers/testHelpers.js"); const NULL_ACC = "0x0000000000000000000000000000000000000000"; -let tokenAce, monetarySupervisor, augmintReserves; +let augmintToken = null; +let monetarySupervisor = null; contract("MonetarySupervisor tests", accounts => { before(async () => { - tokenAce = await tokenAceTestHelper.newTokenAceMock(); - monetarySupervisor = await monetarySupervisorTestHelpers.newMonetarySupervisorMock(tokenAce); - augmintReserves = await monetarySupervisor.augmintReserves(); + augmintToken = await tokenTestHelpers.initAugmintToken(); + monetarySupervisor = MonetarySupervisor.at(MonetarySupervisor.address); }); it("should be possible to issue new tokens to reserve", async function() { const amount = 100000; const [totalSupplyBefore, reserveBalBefore, issuedByMonetaryBoardBefore] = await Promise.all([ - tokenAce.totalSupply(), - tokenAce.balanceOf(augmintReserves), + augmintToken.totalSupply(), + augmintToken.balanceOf(AugmintReserves.address), monetarySupervisor.issuedByMonetaryBoard() ]); const tx = await monetarySupervisor.issueToReserve(amount); - testHelper.logGasUse(this, tx, "issue"); + testHelpers.logGasUse(this, tx, "issue"); - await testHelper.assertEvent(tokenAce, "Transfer", { + await testHelpers.assertEvent(augmintToken, "Transfer", { from: NULL_ACC, - to: augmintReserves, + to: AugmintReserves.address, amount: amount }); const [totalSupply, issuedByMonetaryBoard, reserveBal] = await Promise.all([ - tokenAce.totalSupply(), - tokenAce.balanceOf(augmintReserves), + augmintToken.totalSupply(), + augmintToken.balanceOf(AugmintReserves.address), monetarySupervisor.issuedByMonetaryBoard() ]); @@ -53,30 +54,30 @@ contract("MonetarySupervisor tests", accounts => { }); it("only allowed should issue tokens", async function() { - await testHelper.expectThrow(monetarySupervisor.issueToReserve(1000, { from: accounts[1] })); + await testHelpers.expectThrow(monetarySupervisor.issueToReserve(1000, { from: accounts[1] })); }); it("should be possible to burn tokens from reserve", async function() { - const amount = 900; + const amount = 9000000; await monetarySupervisor.issueToReserve(amount); const [totalSupplyBefore, reserveBalBefore, issuedByMonetaryBoardBefore] = await Promise.all([ - tokenAce.totalSupply(), - tokenAce.balanceOf(augmintReserves), + augmintToken.totalSupply(), + augmintToken.balanceOf(AugmintReserves.address), monetarySupervisor.issuedByMonetaryBoard() ]); - const tx = await monetarySupervisor.burnFromReserve(amount); - testHelper.logGasUse(this, tx, "burn"); + const tx = await monetarySupervisor.burnFromReserve(amount, { from: accounts[0] }); + testHelpers.logGasUse(this, tx, "burnFromReserve"); - await testHelper.assertEvent(tokenAce, "Transfer", { - from: augmintReserves, + await testHelpers.assertEvent(augmintToken, "Transfer", { + from: AugmintReserves.address, to: NULL_ACC, amount: amount }); const [totalSupply, issuedByMonetaryBoard, reserveBal] = await Promise.all([ - tokenAce.totalSupply(), - tokenAce.balanceOf(augmintReserves), + augmintToken.totalSupply(), + augmintToken.balanceOf(AugmintReserves.address), monetarySupervisor.issuedByMonetaryBoard() ]); assert.equal( @@ -98,7 +99,7 @@ contract("MonetarySupervisor tests", accounts => { it("only allowed should burn tokens", async function() { await monetarySupervisor.issueToReserve(2000); - await testHelper.expectThrow(monetarySupervisor.burnFromReserve(1000, { from: accounts[1] })); + await testHelpers.expectThrow(monetarySupervisor.burnFromReserve(1000, { from: accounts[1] })); }); it("should be possible to set parameters", async function() { @@ -106,9 +107,9 @@ contract("MonetarySupervisor tests", accounts => { const tx = await monetarySupervisor.setParams(params.ltdDifferenceLimit, params.allowedLtdDifferenceAmount, { from: accounts[0] }); - testHelper.logGasUse(this, tx, "setParams"); + testHelpers.logGasUse(this, tx, "setParams"); - await testHelper.assertEvent(monetarySupervisor, "ParamsChanged", { + await testHelpers.assertEvent(monetarySupervisor, "ParamsChanged", { ltdDifferenceLimit: params.ltdDifferenceLimit, allowedLtdDifferenceAmount: params.allowedLtdDifferenceAmount }); @@ -123,7 +124,7 @@ contract("MonetarySupervisor tests", accounts => { }); it("only allowed should set params ", async function() { - await testHelper.expectThrow(monetarySupervisor.setParams(10000, 10000, { from: accounts[1] })); + await testHelpers.expectThrow(monetarySupervisor.setParams(10000, 10000, { from: accounts[1] })); }); it("all params should be accessible via getParams", async function() { diff --git a/test/Rates.test.js b/test/rates.js similarity index 54% rename from test/Rates.test.js rename to test/rates.js index 03bd1799..98004bfd 100644 --- a/test/Rates.test.js +++ b/test/rates.js @@ -1,11 +1,11 @@ -const ratesTestHelper = require("./helpers/ratesTestHelper"); -const testHelper = require("./helpers/testHelper.js"); +const ratesTestHelpers = require("./helpers/ratesTestHelpers"); +const testHelpers = require("./helpers/testHelpers.js"); -let rates; +let rates = null; contract("Rates tests", accounts => { before(async function() { - rates = await ratesTestHelper.newRatesMock(); + rates = await ratesTestHelpers.getRates(); }); it("should be possible to set 1 rate", async function() { @@ -13,13 +13,13 @@ contract("Rates tests", accounts => { // change the symbol 1st time let tx = await rates.setRate(symbol, 12340000); - testHelper.logGasUse(this, tx, "setRate 1st"); - await ratesTestHelper.newRatesAsserts(tx, [symbol], [12340000]); + testHelpers.logGasUse(this, tx, "setRate 1st"); + await ratesTestHelpers.newRatesAsserts(tx, [symbol], [12340000]); // change the same symbol again tx = await rates.setRate(symbol, 12350000); - testHelper.logGasUse(this, tx, "setRate"); - await ratesTestHelper.newRatesAsserts(tx, [symbol], [12350000]); + testHelpers.logGasUse(this, tx, "setRate"); + await ratesTestHelpers.newRatesAsserts(tx, [symbol], [12350000]); }); it("should be possible to set multiple rates", async function() { @@ -28,14 +28,14 @@ contract("Rates tests", accounts => { // change the symbols 1st time let tx = await rates.setMultipleRates(symbols, newRates); - testHelper.logGasUse(this, tx, "setMultipleRates 2 1st"); - await ratesTestHelper.newRatesAsserts(tx, symbols, newRates); + testHelpers.logGasUse(this, tx, "setMultipleRates 2 1st"); + await ratesTestHelpers.newRatesAsserts(tx, symbols, newRates); // change the symbols 2nd time newRates = [123460000, 11120000]; tx = await rates.setMultipleRates(symbols, newRates); - testHelper.logGasUse(this, tx, "setMultipleRates 2"); - await ratesTestHelper.newRatesAsserts(tx, symbols, newRates); + testHelpers.logGasUse(this, tx, "setMultipleRates 2"); + await ratesTestHelpers.newRatesAsserts(tx, symbols, newRates); }); it("should be possible to convert WEI to/from EUR", async function() { @@ -52,29 +52,29 @@ contract("Rates tests", accounts => { it("setRate should allow to set 0 rate", async function() { let tx = await rates.setRate("XXX", 0); - testHelper.logGasUse(this, tx, "setRate to 0 1st"); - await ratesTestHelper.newRatesAsserts(tx, ["XXX"], [0]); + testHelpers.logGasUse(this, tx, "setRate to 0 1st"); + await ratesTestHelpers.newRatesAsserts(tx, ["XXX"], [0]); tx = await rates.setRate("XXX", 0); - testHelper.logGasUse(this, tx, "setRate to 0"); - await ratesTestHelper.newRatesAsserts(tx, ["XXX"], [0]); + testHelpers.logGasUse(this, tx, "setRate to 0"); + await ratesTestHelpers.newRatesAsserts(tx, ["XXX"], [0]); }); it("setMultipleRates should allow 0 rate set", async function() { let tx = await rates.setMultipleRates(["AAA", "BBB"], [0, 0]); - testHelper.logGasUse(this, tx, "setMultipleRates 2 to 0 1st"); - await ratesTestHelper.newRatesAsserts(tx, ["AAA", "BBB"], [0, 0]); + testHelpers.logGasUse(this, tx, "setMultipleRates 2 to 0 1st"); + await ratesTestHelpers.newRatesAsserts(tx, ["AAA", "BBB"], [0, 0]); tx = await rates.setMultipleRates(["AAA", "BBB"], [0, 0]); - testHelper.logGasUse(this, tx, "setMultipleRates 2 to 0"); - await ratesTestHelper.newRatesAsserts(tx, ["AAA", "BBB"], [0, 0]); + testHelpers.logGasUse(this, tx, "setMultipleRates 2 to 0"); + await ratesTestHelpers.newRatesAsserts(tx, ["AAA", "BBB"], [0, 0]); }); it("convert should throw when 0 rate set", async function() { - await testHelper.expectThrow(rates.convertToWei("NOTSETYET", 1230000)); - await testHelper.expectThrow(rates.convertFromWei("NOTSETYET", 1230000)); + await testHelpers.expectThrow(rates.convertToWei("NOTSETYET", 1230000)); + await testHelpers.expectThrow(rates.convertFromWei("NOTSETYET", 1230000)); await rates.setRate("SETTOZERO", 0); - await testHelper.expectThrow(rates.convertToWei("SETTOZERO", 1230000)); - await testHelper.expectThrow(rates.convertFromWei("SETTOZERO", 1230000)); + await testHelpers.expectThrow(rates.convertToWei("SETTOZERO", 1230000)); + await testHelpers.expectThrow(rates.convertFromWei("SETTOZERO", 1230000)); }); }); diff --git a/test/token.js b/test/token.js new file mode 100644 index 00000000..f6a2e5a5 --- /dev/null +++ b/test/token.js @@ -0,0 +1,44 @@ +const tokenTestHelpers = require("./helpers/tokenTestHelpers.js"); +const testHelpers = require("./helpers/testHelpers.js"); + +let augmintToken; + +contract("AugmintToken tests", accounts => { + before(async () => { + augmintToken = await tokenTestHelpers.initAugmintToken(); + }); + + it("should be possible to set transfer fees ", async function() { + const fee = { pt: 100000, max: 80, min: 90 }; + const tx = await augmintToken.setTransferFees(fee.pt, fee.min, fee.max, { from: accounts[0] }); + testHelpers.logGasUse(this, tx, "setTransferFees"); + + const [feePt, feeMin, feeMax] = await augmintToken.getParams(); + + await testHelpers.assertEvent(augmintToken, "TransferFeesChanged", { + transferFeePt: fee.pt, + transferFeeMin: fee.min, + transferFeeMax: fee.max + }); + + assert.equal(feePt, fee.pt); + assert.equal(feeMin, fee.min); + assert.equal(feeMax, fee.max); + }); + + it("only allowed should set transfer fees ", async function() { + await testHelpers.expectThrow(augmintToken.setTransferFees(10000, 10000, 10000, { from: accounts[1] })); + }); + + it("all params should be accesible via getParams", async function() { + const paramsOneByOne = await Promise.all([ + augmintToken.transferFeePt(), + augmintToken.transferFeeMin(), + augmintToken.transferFeeMax() + ]); + + const paramsViaHelper = await augmintToken.getParams(); + + assert.deepEqual(paramsOneByOne, paramsViaHelper); + }); +}); diff --git a/test/tokenAce.test.js b/test/tokenAce.test.js deleted file mode 100644 index ce511a6b..00000000 --- a/test/tokenAce.test.js +++ /dev/null @@ -1,44 +0,0 @@ -const tokenAceTestHelper = require("./helpers/tokenAceTestHelper.js"); -const testHelper = require("./helpers/testHelper.js"); - -let tokenAce; - -contract("TokenAce tests", accounts => { - before(async () => { - tokenAce = await tokenAceTestHelper.newTokenAceMock(); - }); - - it("should be possible to set transfer fees ", async function() { - const fee = { pt: 100000, max: 80, min: 90 }; - const tx = await tokenAce.setTransferFees(fee.pt, fee.min, fee.max, { from: accounts[0] }); - testHelper.logGasUse(this, tx, "setTransferFees"); - - const [feePt, feeMin, feeMax] = await tokenAce.getParams(); - - await testHelper.assertEvent(tokenAce, "TransferFeesChanged", { - transferFeePt: fee.pt, - transferFeeMin: fee.min, - transferFeeMax: fee.max - }); - - assert.equal(feePt, fee.pt); - assert.equal(feeMin, fee.min); - assert.equal(feeMax, fee.max); - }); - - it("only allowed should set transfer fees ", async function() { - await testHelper.expectThrow(tokenAce.setTransferFees(10000, 10000, 10000, { from: accounts[1] })); - }); - - it("all params should be accesible via getParams", async function() { - const paramsOneByOne = await Promise.all([ - tokenAce.transferFeePt(), - tokenAce.transferFeeMin(), - tokenAce.transferFeeMax() - ]); - - const paramsViaHelper = await tokenAce.getParams(); - - assert.deepEqual(paramsOneByOne, paramsViaHelper); - }); -}); diff --git a/test/transferAce.test.js b/test/tokenTransfer.js similarity index 54% rename from test/transferAce.test.js rename to test/tokenTransfer.js index bb36ba42..9155fee5 100644 --- a/test/transferAce.test.js +++ b/test/tokenTransfer.js @@ -1,25 +1,24 @@ -const tokenAceTestHelper = new require("./helpers/tokenAceTestHelper.js"); -const monetarySupervisorTestHelpers = require("./helpers/monetarySupervisorTestHelpers.js"); -const testHelper = new require("./helpers/testHelper.js"); +const testHelpers = new require("./helpers/testHelpers.js"); +const tokenTestHelpers = new require("./helpers/tokenTestHelpers.js"); -let tokenAce, monetarySupervisor, minFee, maxFee, feePt, minFeeAmount, maxFeeAmount; +let augmintToken = null; +let minFee, maxFee, feePt, minFeeAmount, maxFeeAmount; -contract("Transfer ACE tests", accounts => { +contract("Transfer Augmint tokens tests", accounts => { before(async function() { - tokenAce = await tokenAceTestHelper.newTokenAceMock(); - monetarySupervisor = await monetarySupervisorTestHelpers.newMonetarySupervisorMock(tokenAce); - await monetarySupervisor.issueToReserve(1000000000); + augmintToken = await tokenTestHelpers.initAugmintToken(); + await tokenTestHelpers.issueToReserve(1000000000); await Promise.all([ - monetarySupervisorTestHelpers.withdrawFromReserve(accounts[0], 500000000), - monetarySupervisorTestHelpers.withdrawFromReserve(accounts[1], 500000000) + tokenTestHelpers.withdrawFromReserve(accounts[0], 500000000), + tokenTestHelpers.withdrawFromReserve(accounts[1], 500000000) ]); - [feePt, minFee, maxFee] = await tokenAce.getParams(); + [feePt, minFee, maxFee] = await augmintToken.getParams(); minFeeAmount = minFee.div(feePt).mul(1000000); maxFeeAmount = maxFee.div(feePt).mul(1000000); }); it("Should be able to transfer ACE between accounts (without narrative, min fee)", async function() { - await tokenAceTestHelper.transferTest(this, { + await tokenTestHelpers.transferTest(this, { from: accounts[1], to: accounts[2], amount: minFeeAmount.sub(10), @@ -28,7 +27,7 @@ contract("Transfer ACE tests", accounts => { }); it("Should be able to transfer ACE between accounts (with narrative, max fee)", async function() { - await tokenAceTestHelper.transferTest(this, { + await tokenTestHelpers.transferTest(this, { from: accounts[1], to: accounts[2], amount: maxFeeAmount.add(10), @@ -37,7 +36,7 @@ contract("Transfer ACE tests", accounts => { }); it("transfer fee % should deducted when fee % is between min and max fee", async function() { - await tokenAceTestHelper.transferTest(this, { + await tokenTestHelpers.transferTest(this, { from: accounts[1], to: accounts[2], amount: maxFeeAmount.sub(10), @@ -46,7 +45,7 @@ contract("Transfer ACE tests", accounts => { }); it("Should be able to transfer 0 amount without narrative", async function() { - await tokenAceTestHelper.transferTest(this, { + await tokenTestHelpers.transferTest(this, { from: accounts[1], to: accounts[2], amount: 0, @@ -55,7 +54,7 @@ contract("Transfer ACE tests", accounts => { }); it("Should be able to transfer 0 with narrative", async function() { - await tokenAceTestHelper.transferTest(this, { + await tokenTestHelpers.transferTest(this, { from: accounts[1], to: accounts[2], amount: 0, @@ -64,43 +63,42 @@ contract("Transfer ACE tests", accounts => { }); it("Shouldn't be able to transfer ACE when ACE balance is insufficient", async function() { - await testHelper.expectThrow( - tokenAce.transfer(accounts[2], (await tokenAce.balanceOf(accounts[1])).plus(1), { + await testHelpers.expectThrow( + augmintToken.transfer(accounts[2], (await augmintToken.balanceOf(accounts[1])).plus(1), { from: accounts[1] }) ); }); it("Shouldn't be able to transfer ACE between the same accounts", async function() { - await testHelper.expectThrow( - tokenAce.transfer(accounts[1], 20000, { + await testHelpers.expectThrow( + augmintToken.transfer(accounts[1], 20000, { from: accounts[1] }) ); }); it("Shouldn't be able to transfer to 0x0", async function() { - await testHelper.expectThrow( - tokenAce.transfer("0x0", 20000, { + await testHelpers.expectThrow( + augmintToken.transfer("0x0", 20000, { from: accounts[1] }) ); }); - it("should have zero fee if 'to' is NoFeeTransferContracts", async function() { - await tokenAceTestHelper.transferTest(this, { + it("should have zero fee if 'to' or from is NoFeeTransferContracts", async function() { + await augmintToken.grantPermission(accounts[0], "NoFeeTransferContracts"); + await tokenTestHelpers.transferTest(this, { from: accounts[0], to: accounts[1], amount: 10000, narrative: "", fee: 0 }); - }); - it("should have zero fee if 'from' is NoFeeTransferContracts", async function() { - await tokenAceTestHelper.transferTest(this, { - from: accounts[0], - to: accounts[1], + await tokenTestHelpers.transferTest(this, { + from: accounts[1], + to: accounts[0], amount: 10000, narrative: "transfer 0 test", fee: 0 diff --git a/test/transferFromAce.test.js b/test/tokenTransferFrom.js similarity index 51% rename from test/transferFromAce.test.js rename to test/tokenTransferFrom.js index 0b31a472..5b52bc91 100644 --- a/test/transferFromAce.test.js +++ b/test/tokenTransferFrom.js @@ -1,16 +1,18 @@ -const tokenAceTestHelper = new require("./helpers/tokenAceTestHelper.js"); -const monetarySupervisorTestHelpers = require("./helpers/monetarySupervisorTestHelpers.js"); -const testHelper = new require("./helpers/testHelper.js"); -let tokenAce, monetarySupervisor, maxFee; +const tokenTestHelpers = new require("./helpers/tokenTestHelpers.js"); +const testHelpers = new require("./helpers/testHelpers.js"); -contract("TransferFrom ACE tests", accounts => { +let augmintToken = null; +let maxFee = null; + +contract("TransferFrom AugmintToken tests", accounts => { before(async function() { - tokenAce = await tokenAceTestHelper.newTokenAceMock(); - monetarySupervisor = await monetarySupervisorTestHelpers.newMonetarySupervisorMock(tokenAce); - await monetarySupervisor.issueToReserve(1000000000); - await monetarySupervisorTestHelpers.withdrawFromReserve(accounts[0], 500000000); - await monetarySupervisorTestHelpers.withdrawFromReserve(accounts[1], 500000000); - maxFee = await tokenAce.transferFeeMax(); + augmintToken = await tokenTestHelpers.initAugmintToken(); + await tokenTestHelpers.issueToReserve(1000000000); + [maxFee, ,] = await Promise.all([ + augmintToken.transferFeeMax(), + tokenTestHelpers.withdrawFromReserve(accounts[0], 500000000), + tokenTestHelpers.withdrawFromReserve(accounts[1], 500000000) + ]); }); it("transferFrom", async function() { @@ -20,15 +22,15 @@ contract("TransferFrom ACE tests", accounts => { value: 100000 }; - await tokenAceTestHelper.approveTest(this, expApprove); + await tokenTestHelpers.approveTest(this, expApprove); - await tokenAceTestHelper.transferFromTest(this, { + await tokenTestHelpers.transferFromTest(this, { from: expApprove.owner, spender: expApprove.spender, amount: Math.round(expApprove.value / 2) }); - await tokenAceTestHelper.transferFromTest(this, { + await tokenTestHelpers.transferFromTest(this, { from: expApprove.owner, spender: expApprove.spender, amount: Math.round(expApprove.value / 2), @@ -43,9 +45,9 @@ contract("TransferFrom ACE tests", accounts => { value: 200000 }; - await tokenAceTestHelper.approveTest(this, expApprove); + await tokenTestHelpers.approveTest(this, expApprove); - await tokenAceTestHelper.transferFromTest(this, { + await tokenTestHelpers.transferFromTest(this, { from: expApprove.owner, spender: expApprove.spender, to: accounts[2], @@ -55,16 +57,16 @@ contract("TransferFrom ACE tests", accounts => { }); it("Shouldn't approve 0x0 spender", async function() { - await testHelper.expectThrow( - tokenAce.approve("0x0", 100, { + await testHelpers.expectThrow( + augmintToken.approve("0x0", 100, { from: accounts[2] }) ); }); it("transferFrom only if approved", async function() { - await testHelper.expectThrow( - tokenAce.transferFrom(accounts[0], accounts[2], 100, { + await testHelpers.expectThrow( + augmintToken.transferFrom(accounts[0], accounts[2], 100, { from: accounts[2] }) ); @@ -77,8 +79,8 @@ contract("TransferFrom ACE tests", accounts => { value: 100000 }; - await tokenAceTestHelper.approveTest(this, expApprove); - await tokenAceTestHelper.transferFromTest(this, { + await tokenTestHelpers.approveTest(this, expApprove); + await tokenTestHelpers.transferFromTest(this, { from: expApprove.owner, spender: expApprove.spender, amount: 0, @@ -93,9 +95,9 @@ contract("TransferFrom ACE tests", accounts => { value: 0 }; - await tokenAceTestHelper.approveTest(this, expApprove); - await testHelper.expectThrow( - tokenAce.transferFrom(expApprove.owner, expApprove.spender, 0, { + await tokenTestHelpers.approveTest(this, expApprove); + await testHelpers.expectThrow( + augmintToken.transferFrom(expApprove.owner, expApprove.spender, 0, { from: expApprove.spender }) ); @@ -108,9 +110,9 @@ contract("TransferFrom ACE tests", accounts => { value: 10000 }; - await tokenAceTestHelper.approveTest(this, expApprove); - await testHelper.expectThrow( - tokenAce.transferFrom(expApprove.owner, "0x0", 0, { + await tokenTestHelpers.approveTest(this, expApprove); + await testHelpers.expectThrow( + augmintToken.transferFrom(expApprove.owner, "0x0", 0, { from: expApprove.spender }) ); @@ -123,63 +125,65 @@ contract("TransferFrom ACE tests", accounts => { value: 200000 }; - await tokenAceTestHelper.approveTest(this, expApprove); - await testHelper.expectThrow( - tokenAce.transferFrom(expApprove.owner, expApprove.spender, expApprove.value + 1, { + await tokenTestHelpers.approveTest(this, expApprove); + await testHelpers.expectThrow( + augmintToken.transferFrom(expApprove.owner, expApprove.spender, expApprove.value + 1, { from: expApprove.spender }) ); }); it("transferFrom only if balance is enough", async function() { - await tokenAce.transfer(accounts[1], maxFee, { from: accounts[0] }); // to cover the transfer fee - const amount = await tokenAce.balanceOf(accounts[0]); + await augmintToken.transfer(accounts[1], maxFee, { from: accounts[0] }); // to cover the transfer fee + const amount = await augmintToken.balanceOf(accounts[0]); const expApprove = { owner: accounts[1], spender: accounts[2], value: amount }; - await tokenAceTestHelper.approveTest(this, expApprove); + await tokenTestHelpers.approveTest(this, expApprove); - await testHelper.expectThrow( - tokenAce.transferFrom(expApprove.owner, expApprove.spender, expApprove.value + 1, { + await testHelpers.expectThrow( + augmintToken.transferFrom(expApprove.owner, expApprove.spender, expApprove.value + 1, { from: expApprove.spender }) ); }); - it("should have zero fee for transferFrom if 'to' is NoFeeTransferContracts", async function() { - const expApprove = { - owner: accounts[1], - spender: accounts[0], - to: accounts[0], + it("should have zero fee for transferFrom if 'to' is NoFeeTransferContracts", async function() {}); + + it("should have zero fee for transferFrom if 'from' or 'to' is NoFeeTransferContracts ", async function() { + await augmintToken.grantPermission(accounts[0], "NoFeeTransferContracts"); + + const expApprove1 = { + owner: accounts[0], + spender: accounts[1], + to: accounts[2], value: 100000 }; - await tokenAceTestHelper.approveTest(this, expApprove); + await tokenTestHelpers.approveTest(this, expApprove1); - await tokenAceTestHelper.transferFromTest(this, { - from: expApprove.owner, - spender: expApprove.spender, - to: expApprove.to, - amount: expApprove.value, + await tokenTestHelpers.transferFromTest(this, { + from: expApprove1.owner, + spender: expApprove1.spender, + to: expApprove1.to, + amount: expApprove1.value, fee: 0 }); - }); - it("should have zero fee for transferFrom if 'from' is NoFeeTransferContracts ", async function() { - const expApprove = { - owner: accounts[0], - spender: accounts[1], - to: accounts[2], + const expApprove2 = { + owner: accounts[1], + spender: accounts[0], + to: accounts[0], value: 100000 }; - await tokenAceTestHelper.approveTest(this, expApprove); + await tokenTestHelpers.approveTest(this, expApprove2); - await tokenAceTestHelper.transferFromTest(this, { - from: expApprove.owner, - spender: expApprove.spender, - to: expApprove.to, - amount: expApprove.value, + await tokenTestHelpers.transferFromTest(this, { + from: expApprove2.owner, + spender: expApprove2.spender, + to: expApprove2.to, + amount: expApprove2.value, fee: 0 }); });