Skip to content

Commit

Permalink
Collateral pool tests passing
Browse files Browse the repository at this point in the history
  • Loading branch information
Phil Elsasser committed Sep 26, 2018
1 parent d8268c4 commit 8c7ed0e
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 52 deletions.
100 changes: 49 additions & 51 deletions test/MarketCollateralPool.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ contract('MarketCollateralPool', function(accounts) {

let error = null;
try {
await collateralPool.depositTokensForTrading(500, { from: accounts[5] });
await collateralPool.depositTokensForTrading(collateralToken.address, 500, { from: accounts[5] });
} catch (err) {
error = err;
}
Expand Down Expand Up @@ -100,32 +100,36 @@ contract('MarketCollateralPool', function(accounts) {
await collateralToken.approve(collateralPool.address, fourBalance, { from: accounts[3] });

// move tokens to the collateralPool
await collateralPool.depositTokensForTrading(amountToDeposit, { from: accounts[0] });
await collateralPool.depositTokensForTrading(amountToDeposit, { from: accounts[1] });
await collateralPool.depositTokensForTrading(fourBalance, { from: accounts[3] });
await collateralPool.depositTokensForTrading(collateralToken.address, amountToDeposit, { from: accounts[0] });
await collateralPool.depositTokensForTrading(collateralToken.address, amountToDeposit, { from: accounts[1] });
await collateralPool.depositTokensForTrading(collateralToken.address, fourBalance, { from: accounts[3] });

// trigger requires
error = null;
try {
await collateralPool.depositTokensForTrading(amountToDeposit, { from: accounts[2] });
await collateralPool.depositTokensForTrading(collateralToken.address, amountToDeposit, { from: accounts[2] });
} catch (err) {
error = err;
}
assert.ok(error instanceof Error, 'should not be able to deposit tokens');

error = null;
try {
await collateralPool.settleAndClose({ from: accounts[2] });
await collateralPool.settleAndClose(marketContract.address, { from: accounts[2] });
} catch (err) {
error = err;
}
assert.ok(error instanceof Error, 'should not be able call settleAndClose until settled');
// end trigger requires

// ensure balances are now inside the contract.
const tradingBalanceAcctOne = await collateralPool.getUserUnallocatedBalance.call(accounts[0]);
const tradingBalanceAcctTwo = await collateralPool.getUserUnallocatedBalance.call(accounts[1]);
const tradingBalanceAcctFour = await collateralPool.getUserUnallocatedBalance.call(accounts[3]);
const tradingBalanceAcctOne =
await collateralPool.getUserUnallocatedBalance.call(collateralToken.address, accounts[0]);
const tradingBalanceAcctTwo =
await collateralPool.getUserUnallocatedBalance.call(collateralToken.address, accounts[1]);
const tradingBalanceAcctFour =
await collateralPool.getUserUnallocatedBalance.call(collateralToken.address, accounts[3]);

assert.equal(tradingBalanceAcctOne, amountToDeposit, "Balance doesn't equal tokens deposited");
assert.equal(tradingBalanceAcctTwo, amountToDeposit, "Balance doesn't equal tokens deposited");
assert.equal(tradingBalanceAcctFour, fourBalance, "4 Balance doesn't equal tokens deposited");
Expand All @@ -134,11 +138,13 @@ contract('MarketCollateralPool', function(accounts) {
it('Both accounts should be able to withdraw from collateral pool contract', async function() {
const amountToWithdraw = 2500000;
// move tokens to the MarketContract
await collateralPool.withdrawTokens(amountToWithdraw, { from: accounts[0] });
await collateralPool.withdrawTokens(amountToWithdraw, { from: accounts[1] });
await collateralPool.withdrawTokens(collateralToken.address, amountToWithdraw, { from: accounts[0] });
await collateralPool.withdrawTokens(collateralToken.address, amountToWithdraw, { from: accounts[1] });
// ensure balances are now correct inside the contract.
let tradingBalanceAcctOne = await collateralPool.getUserUnallocatedBalance.call(accounts[0]);
let tradingBalanceAcctTwo = await collateralPool.getUserUnallocatedBalance.call(accounts[1]);
let tradingBalanceAcctOne =
await collateralPool.getUserUnallocatedBalance.call(collateralToken.address, accounts[0]);
let tradingBalanceAcctTwo =
await collateralPool.getUserUnallocatedBalance.call(collateralToken.address, accounts[1]);

assert.equal(
tradingBalanceAcctOne,
Expand Down Expand Up @@ -204,7 +210,7 @@ contract('MarketCollateralPool', function(accounts) {
// try to withdraw collateral without adequate locked tokens
//
try {
await collateralPool.withdrawTokens(1, { from: accounts[1] });
await collateralPool.withdrawTokens(collateralToken.address, 1, { from: accounts[1] });
} catch (err) {
error = err;
}
Expand All @@ -216,7 +222,7 @@ contract('MarketCollateralPool', function(accounts) {
// try to deposit tokens without adequate locked tokens
//
try {
await collateralPool.depositTokensForTrading(amountToDeposit, { from: accounts[0] });
await collateralPool.depositTokensForTrading(collateralToken.address, amountToDeposit, { from: accounts[0] });
} catch (err) {
error = err;
}
Expand Down Expand Up @@ -256,13 +262,15 @@ contract('MarketCollateralPool', function(accounts) {
await collateralToken.approve(collateralPool.address, amountToDeposit, { from: accounts[1] });

// move tokens to the collateralPool
await collateralPool.depositTokensForTrading(amountToDeposit, { from: accounts[0] });
await collateralPool.depositTokensForTrading(amountToDeposit, { from: accounts[1] });
await collateralPool.depositTokensForTrading(collateralToken.address, amountToDeposit, { from: accounts[0] });
await collateralPool.depositTokensForTrading(collateralToken.address, amountToDeposit, { from: accounts[1] });

makerAccountBalanceBeforeTrade = await collateralPool.getUserUnallocatedBalance.call(
collateralToken.address,
accounts[0]
);
takerAccountBalanceBeforeTrade = await collateralPool.getUserUnallocatedBalance.call(
collateralToken.address,
accounts[1]
);

Expand Down Expand Up @@ -298,18 +306,18 @@ contract('MarketCollateralPool', function(accounts) {
}
assert.ok(error instanceof Error, "didn't fail a trade order");

var makerNetPos = await collateralPool.getUserNetPosition.call(accountMaker);
var takerNetPos = await collateralPool.getUserNetPosition.call(accountTaker);
var makerNetPos = await collateralPool.getUserNetPosition.call(marketContract.address, accountMaker);
var takerNetPos = await collateralPool.getUserNetPosition.call(marketContract.address, accountTaker);
assert.equal(makerNetPos.toNumber(), 1, 'Maker should be long 1');
assert.equal(takerNetPos.toNumber(), -1, 'Taker should be short 1');

var makerPosCount = await collateralPool.getUserPositionCount.call(accountMaker);
var takerPosCount = await collateralPool.getUserPositionCount.call(accountTaker);
var makerPosCount = await collateralPool.getUserPositionCount.call(marketContract.address, accountMaker);
var takerPosCount = await collateralPool.getUserPositionCount.call(marketContract.address, accountTaker);
assert.equal(makerPosCount.toNumber(), 1, 'Maker should have one position struct');
assert.equal(takerPosCount.toNumber(), 1, 'Taker should have one position struct');

var makerPos = await collateralPool.getUserPosition.call(accountMaker, 0);
var takerPos = await collateralPool.getUserPosition.call(accountTaker, 0);
var makerPos = await collateralPool.getUserPosition.call(marketContract.address, accountMaker, 0);
var takerPos = await collateralPool.getUserPosition.call(marketContract.address, accountTaker, 0);

assert.equal(
makerPos[0].toNumber(),
Expand Down Expand Up @@ -340,8 +348,8 @@ contract('MarketCollateralPool', function(accounts) {
{ from: accountTaker }
);

makerNetPos = await collateralPool.getUserNetPosition.call(accountMaker);
takerNetPos = await collateralPool.getUserNetPosition.call(accountTaker);
makerNetPos = await collateralPool.getUserNetPosition.call(marketContract.address, accountMaker);
takerNetPos = await collateralPool.getUserNetPosition.call(marketContract.address, accountTaker);
assert.equal(makerNetPos.toNumber(), 3, 'Maker should be long 3');
assert.equal(takerNetPos.toNumber(), -3, 'Taker should be short 3');

Expand All @@ -363,7 +371,7 @@ contract('MarketCollateralPool', function(accounts) {
const priceFloor = await marketContract.PRICE_FLOOR.call();
const priceCap = await marketContract.PRICE_CAP.call();
const qtyMultiplier = await marketContract.QTY_MULTIPLIER.call();
const actualCollateralPoolBalance = await collateralPool.collateralPoolBalance.call();
const actualCollateralPoolBalance = await collateralPool.getCollateralPoolBalance.call(marketContract.address);

const longCollateral = (entryOrderPrice - priceFloor) * qtyMultiplier * qtyFilled;
const shortCollateral = (priceCap - entryOrderPrice) * qtyMultiplier * qtyFilled;
Expand All @@ -376,9 +384,11 @@ contract('MarketCollateralPool', function(accounts) {
);

const makerAccountBalanceAfterTrade = await collateralPool.getUserUnallocatedBalance.call(
collateralToken.address,
accounts[0]
);
const takerAccountBalanceAfterTrade = await collateralPool.getUserUnallocatedBalance.call(
collateralToken.address,
accounts[1]
);

Expand Down Expand Up @@ -415,8 +425,8 @@ contract('MarketCollateralPool', function(accounts) {
orderSignature[2], // s
{ from: accountTaker }
);
makerNetPos = await collateralPool.getUserNetPosition.call(accountMaker);
takerNetPos = await collateralPool.getUserNetPosition.call(accountTaker);
makerNetPos = await collateralPool.getUserNetPosition.call(marketContract.address, accountMaker);
takerNetPos = await collateralPool.getUserNetPosition.call(marketContract.address, accountTaker);
assert.equal(makerNetPos.toNumber(), 2, 'Maker should be long 2');
assert.equal(takerNetPos.toNumber(), -2, 'Taker should be short 2');

Expand All @@ -426,9 +436,11 @@ contract('MarketCollateralPool', function(accounts) {
const eshortCollateral = (priceCap - entryOrderPrice) * qtyMultiplier * qtyFilled;

const emakerAccountBalanceAfterTrade = await collateralPool.getUserUnallocatedBalance.call(
collateralToken.address,
accounts[0]
);
const etakerAccountBalanceAfterTrade = await collateralPool.getUserUnallocatedBalance.call(
collateralToken.address,
accounts[1]
);

Expand Down Expand Up @@ -460,7 +472,7 @@ contract('MarketCollateralPool', function(accounts) {
await marketToken.setLockQtyToAllowTrading(10);
var error = null;
try {
await collateralPool.depositTokensForTrading(1, { from: accounts[2] });
await collateralPool.depositTokensForTrading(collateralToken.address, 1, { from: accounts[2] });
} catch (err) {
error = err;
}
Expand All @@ -480,6 +492,8 @@ contract('MarketCollateralPool', function(accounts) {
);
await tradeHelper.attemptToSettleContract(settlementPrice); // this should push our contract into settlement.

assert.isTrue(await marketContract.isSettled(), "Contract not settled properly!");

const expectedMakersTokenBalanceAfterSettlement = await tradeHelper.calculateSettlementToken(
accounts[0],
priceFloor,
Expand All @@ -498,30 +512,18 @@ contract('MarketCollateralPool', function(accounts) {
settlementPrice
);

// test for inadequate locked tokens
await marketToken.setLockQtyToAllowTrading(10);
try {
await collateralPool.settleAndClose({ from: accounts[0] });
} catch (err) {
error = err;
}
assert.ok(
error instanceof Error,
"didn't fail settleAndClose for inadequate locked market tokens for Taker"
);
await marketToken.setLockQtyToAllowTrading(0);
// end test for inadequate locked tokens

// each account now calls settle and close, returning to them all collateral.
await collateralPool.settleAndClose({ from: accounts[0] });
await collateralPool.settleAndClose({ from: accounts[1] });
await collateralPool.settleAndClose({ from: accounts[3] });
await collateralPool.settleAndClose(marketContract.address, { from: accounts[0] });
await collateralPool.settleAndClose(marketContract.address, { from: accounts[1] });
await collateralPool.settleAndClose(marketContract.address, { from: accounts[3] });

// makers and takers collateral pool balance is cleared
const makersCollateralBalanceAfterSettlement = await collateralPool.getUserUnallocatedBalance.call(
collateralToken.address,
accounts[0]
);
const takersCollateralBalanceAfterSettlement = await collateralPool.getUserUnallocatedBalance.call(
collateralToken.address,
accounts[1]
);

Expand Down Expand Up @@ -553,14 +555,10 @@ contract('MarketCollateralPool', function(accounts) {
});

it('should fail if settleAndClose() is called before settlement', async () => {
// const entryOrderPrice = 3000;
// const orderQty = 2;
// const orderToFill = 1;
// await tradeHelper.tradeOrder([accounts[0], accounts[1], accounts[2]], [entryOrderPrice, orderQty, orderToFill]);

let error = null;
try {
await collateralPool.settleAndClose.call({ from: accounts[0] });
await collateralPool.settleAndClose.call(marketContract.address, { from: accounts[0] });
} catch (err) {
error = err;
}
Expand Down
2 changes: 1 addition & 1 deletion test/helpers/TraderHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ module.exports = async function(marketContract, orderLib, collateralToken, colla
settlementPrice
) {
const tokenBalanceOfUser = await collateralToken.balanceOf.call(address);
const userAccountBalance = await collateralPool.getUserUnallocatedBalance.call(address);
const userAccountBalance = await collateralPool.getUserUnallocatedBalance.call(collateralToken.address, address);
const collateralLeft = utility.calculateNeededCollateral(
priceFloor,
priceCap,
Expand Down

0 comments on commit 8c7ed0e

Please sign in to comment.