Skip to content
This repository was archived by the owner on Jan 18, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions test/contracts/core/extensions/coreIssuanceOrder.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -530,7 +530,7 @@ contract('CoreIssuanceOrder', accounts => {
});
});

describe("when rounding error is too large", async () => {
describe('when rounding error is too large', async () => {
before(async () => {
orderQuantity = ether(6);
makerTokenAmount = new BigNumber(10);
Expand All @@ -545,7 +545,7 @@ contract('CoreIssuanceOrder', accounts => {
makerTokenAmount = undefined;
});

it("should revert", async () => {
it('should revert', async () => {
await expectRevertError(subject());
});
});
Expand Down
148 changes: 77 additions & 71 deletions test/contracts/core/extensions/coreIssuanceOrderScenarios.spec.ts
Original file line number Diff line number Diff line change
@@ -1,83 +1,70 @@
import * as chai from "chai";
import * as _ from "lodash";
import * as chai from 'chai';
import * as _ from 'lodash';

import * as ABIDecoder from "abi-decoder";
import { BigNumber } from "bignumber.js";
import { ether } from "../../../../utils/units";
import * as ABIDecoder from 'abi-decoder';
import { BigNumber } from 'bignumber.js';
import { ether } from '../../../../utils/units';

// Types
import { Address, Bytes32, IssuanceOrder } from "../../../../types/common.js";
import { Address, Bytes32 } from '../../../../types/common.js';

// Contract types
import { CoreContract } from "../../../../types/generated/core";
import { SetTokenContract } from "../../../../types/generated/set_token";
import { SetTokenFactoryContract } from "../../../../types/generated/set_token_factory";
import { StandardTokenMockContract } from "../../../../types/generated/standard_token_mock";
import { TakerWalletWrapperContract } from "../../../../types/generated/taker_wallet_wrapper";
import { TransferProxyContract } from "../../../../types/generated/transfer_proxy";
import { VaultContract } from "../../../../types/generated/vault";
import { CoreContract } from '../../../../types/generated/core';
import { SetTokenContract } from '../../../../types/generated/set_token';
import { SetTokenFactoryContract } from '../../../../types/generated/set_token_factory';
import { StandardTokenMockContract } from '../../../../types/generated/standard_token_mock';
import { TakerWalletWrapperContract } from '../../../../types/generated/taker_wallet_wrapper';
import { TransferProxyContract } from '../../../../types/generated/transfer_proxy';
import { VaultContract } from '../../../../types/generated/vault';

// Artifacts
const Core = artifacts.require("Core");
const Core = artifacts.require('Core');

// Core wrapper
import { CoreWrapper } from "../../../../utils/coreWrapper";
import { ERC20Wrapper } from "../../../../utils/erc20Wrapper";
import { ExchangeWrapper } from "../../../../utils/exchangeWrapper";
import { CoreWrapper } from '../../../../utils/coreWrapper';
import { ERC20Wrapper } from '../../../../utils/erc20Wrapper';
import { ExchangeWrapper } from '../../../../utils/exchangeWrapper';
import {
generateFillOrderParameters,
generateOrdersDataForOrderCount,
generateOrdersDataWithIncorrectExchange,
generateOrdersDataWithTakerOrders,
} from "../../../../utils/orderWrapper";
} from '../../../../utils/orderWrapper';

// Log Testing Tools
import {
assertLogEquivalence,
getFormattedLogsFromTxHash
} from "../../../../utils/logs";
} from '../../../../utils/logs';

import {
getExpectedFillLog,
getExpectedCancelLog,
} from "../../../../utils/contract_logs/coreIssuanceOrder";
} from '../../../../utils/contract_logs/coreIssuanceOrder';

// Testing Set up
import { BigNumberSetup } from "../../../../utils/bigNumberSetup";
import ChaiSetup from "../../../../utils/chaiSetup";
import { BigNumberSetup } from '../../../../utils/bigNumberSetup';
import ChaiSetup from '../../../../utils/chaiSetup';
BigNumberSetup.configure();
ChaiSetup.configure();
const { expect, assert } = chai;
const { expect } = chai;

import {
IssuanceComponentDeposited,
} from "../../../../utils/contract_logs/core";

import {
assertTokenBalance,
expectRevertError,
} from "../../../../utils/tokenAssertions";
} from '../../../../utils/tokenAssertions';

import {
DEPLOYED_TOKEN_QUANTITY,
ZERO,
NULL_ADDRESS,
DEFAULT_GAS,
EXCHANGES,
} from "../../../../utils/constants";
} from '../../../../utils/constants';

import { SCENARIOS } from "./coreIssuanceOrderScenarios";
import { SCENARIOS } from './coreIssuanceOrderScenarios';


contract("CoreIssuanceOrder::Scenarios", (accounts) => {
contract('CoreIssuanceOrder::Scenarios', accounts => {
const [
ownerAccount,
takerAccount,
makerAccount,
signerAccount,
relayerAccount,
mockSetTokenAccount,
mockTokenAccount
] = accounts;

let core: CoreContract;
Expand Down Expand Up @@ -112,29 +99,32 @@ contract("CoreIssuanceOrder::Scenarios", (accounts) => {
await coreWrapper.setDefaultStateAndAuthorizationsAsync(core, vault, transferProxy, setTokenFactory);
});

describe("#fillOrder", async () => {
SCENARIOS.forEach(async (scenario) => {
describe('#fillOrder', async () => {
SCENARIOS.forEach(async scenario => {
describe(scenario.title, async () => {
let subjectCaller: Address = takerAccount;
let subjectQuantityToIssue: BigNumber = scenario.exchangeOrders.subjectQuantityToIssue;
const subjectCaller: Address = takerAccount;
const subjectQuantityToIssue: BigNumber = scenario.exchangeOrders.subjectQuantityToIssue;
let subjectExchangeOrdersData: Bytes32;

let makerAddress: Address = signerAccount;
let relayerAddress: Address = relayerAccount;
const makerAddress: Address = signerAccount;
const relayerAddress: Address = relayerAccount;

let setToken: SetTokenContract;
let makerToken: StandardTokenMockContract;
let relayerToken: StandardTokenMockContract;

let makerTokenAmount: BigNumber = scenario.issuanceOrderParams.makerTokenAmount;
let relayerTokenAmount: BigNumber = ether(1);
let orderQuantity: BigNumber = scenario.issuanceOrderParams.orderQuantity;
let fillPercentage: BigNumber = subjectQuantityToIssue.div(orderQuantity);
const makerTokenAmount: BigNumber = scenario.issuanceOrderParams.makerTokenAmount;
const relayerTokenAmount: BigNumber = ether(1);
const orderQuantity: BigNumber = scenario.issuanceOrderParams.orderQuantity;
const fillPercentage: BigNumber = subjectQuantityToIssue.div(orderQuantity);

let issuanceOrderParams: any;

beforeEach(async () => {
const deployedTokens = await erc20Wrapper.deployTokensAsync(scenario.tokenState.numberOfComponents + 2, ownerAccount);
const deployedTokens = await erc20Wrapper.deployTokensAsync(
scenario.tokenState.numberOfComponents + 2,
ownerAccount
);
await erc20Wrapper.approveTransfersAsync(deployedTokens, transferProxy.address, ownerAccount);
await erc20Wrapper.approveTransfersAsync(deployedTokens, transferProxy.address, signerAccount);
await erc20Wrapper.approveTransfersAsync(deployedTokens, transferProxy.address, takerAccount);
Expand All @@ -157,16 +147,26 @@ contract("CoreIssuanceOrder::Scenarios", (accounts) => {
amount,
{ from: signerAccount },
);
};
}
});

// Give maker and taker their maker and relayer tokens
await erc20Wrapper.transferTokensAsync(deployedTokens.slice(-2), signerAccount, DEPLOYED_TOKEN_QUANTITY.div(2), ownerAccount);
await erc20Wrapper.transferTokensAsync(deployedTokens.slice(-2), takerAccount, DEPLOYED_TOKEN_QUANTITY.div(2), ownerAccount);
await erc20Wrapper.transferTokensAsync(
deployedTokens.slice(-2),
signerAccount,
DEPLOYED_TOKEN_QUANTITY.div(2),
ownerAccount
);
await erc20Wrapper.transferTokensAsync(
deployedTokens.slice(-2),
takerAccount,
DEPLOYED_TOKEN_QUANTITY.div(2),
ownerAccount
);

// Set up and create SetToken
const componentTokens = deployedTokens.slice(0, scenario.tokenState.numberOfComponents);
const componentAddresses = _.map(componentTokens, (token) => token.address);
const componentAddresses = _.map(componentTokens, token => token.address);
const componentUnits = _.map(componentTokens, () => scenario.componentUnit); // Multiple of naturalUnit
setToken = await coreWrapper.createSetTokenAsync(
core,
Expand All @@ -181,8 +181,8 @@ contract("CoreIssuanceOrder::Scenarios", (accounts) => {
relayerToken = deployedTokens.slice(-1)[0];

// Define rest of params for issuanceOrder and create issuanceOrder object
let requiredComponentAmounts: BigNumber[] = [];
let requiredComponents: Address[] = [];
const requiredComponentAmounts: BigNumber[] = [];
const requiredComponents: Address[] = [];
scenario.issuanceOrderParams.requiredComponentWeighting.forEach((weight, idx) => {
if (weight != 0) {
requiredComponents.push(componentAddresses[idx]);
Expand Down Expand Up @@ -210,8 +210,8 @@ contract("CoreIssuanceOrder::Scenarios", (accounts) => {
await coreWrapper.registerExchange(core, EXCHANGES.TAKER_WALLET, takerWalletWrapper.address);

// Create parameters for exchange orders and generate exchange order data
let takerAmountsToTransfer: BigNumber[] = [];
let takerComponents: Address[] = [];
const takerAmountsToTransfer: BigNumber[] = [];
const takerComponents: Address[] = [];
scenario.exchangeOrders.takerWeightsToTransfer.forEach((weight, idx) => {
if (weight != 0) {
takerComponents.push(componentAddresses[idx]);
Expand Down Expand Up @@ -241,7 +241,7 @@ contract("CoreIssuanceOrder::Scenarios", (accounts) => {
);
}

it("transfers the full maker token amount from the maker", async () => {
it('transfers the full maker token amount from the maker', async () => {
console.log(scenario.description);
// Get pre-run balances
const makerMakerTokenPreBalance = await makerToken.balanceOf.callAsync(signerAccount);
Expand All @@ -253,28 +253,34 @@ contract("CoreIssuanceOrder::Scenarios", (accounts) => {
await subject();

// Expected token balances
const makerMakerTokenExpectedBalance = makerMakerTokenPreBalance.sub((makerTokenAmount.mul(fillPercentage)).round(0,3));
const takerMakerTokenExpectedBalance = takerMakerTokenPreBalance.add((makerTokenAmount.mul(fillPercentage)).round(0,3));
const relayerRelayerTokenExpectedBalance = relayerRelayerTokenPreBalance.add((relayerTokenAmount.mul(fillPercentage)).round(0,3).mul(2));
const makerMakerTokenExpectedBalance = makerMakerTokenPreBalance.sub(
(makerTokenAmount.mul(fillPercentage)).round(0, 3)
);
const takerMakerTokenExpectedBalance = takerMakerTokenPreBalance.add(
(makerTokenAmount.mul(fillPercentage)).round(0, 3)
);
const relayerRelayerTokenExpectedBalance = relayerRelayerTokenPreBalance.add(
(relayerTokenAmount.mul(fillPercentage)).round(0, 3).mul(2)
);
const makerSetTokenExpectedBalance = makerSetTokenPreBalance.add(subjectQuantityToIssue);
const expectedFillOrderBalance = preFillOrderBalance.add(subjectQuantityToIssue);

// Assert token balance equal what we expect
console.log("Expected maker token amount taken from maker.");
console.log('Expected maker token amount taken from maker.');
await assertTokenBalance(makerToken, makerMakerTokenExpectedBalance, signerAccount);
console.log("Expected maker token amount given to taker.");
console.log('Expected maker token amount given to taker.');
await assertTokenBalance(makerToken, takerMakerTokenExpectedBalance, subjectCaller);
console.log("Expected relayer token amount given to relayer.");
console.log('Expected relayer token amount given to relayer.');
await assertTokenBalance(relayerToken, relayerRelayerTokenExpectedBalance, relayerAddress);
console.log("Expected set token amount minted for maker.");
console.log('Expected set token amount minted for maker.');
await assertTokenBalance(setToken, makerSetTokenExpectedBalance, signerAccount);

const postFillOrderBalance = await core.orderFills.callAsync(issuanceOrderParams.orderHash);
console.log("Expected fill amount marked in mapping.")
console.log('Expected fill amount marked in mapping.');
expect(expectedFillOrderBalance).to.be.bignumber.equal(postFillOrderBalance);
});

it("emits correct LogFill event", async () => {
it('emits correct LogFill event', async () => {
const txHash = await subject();

const formattedLogs = await getFormattedLogsFromTxHash(txHash);
Expand All @@ -286,8 +292,8 @@ contract("CoreIssuanceOrder::Scenarios", (accounts) => {
relayerAddress,
relayerToken.address,
subjectQuantityToIssue,
(makerTokenAmount.mul(fillPercentage)).round(0,3),
(relayerTokenAmount.mul(fillPercentage)).round(0,3).mul(2),
(makerTokenAmount.mul(fillPercentage)).round(0, 3),
(relayerTokenAmount.mul(fillPercentage)).round(0, 3).mul(2),
issuanceOrderParams.orderHash,
core.address
);
Expand Down
Loading