import * as mocha from 'mocha'; import * as chai from 'chai'; import {RelayUtil} from '../src/index'; import {RelaySignedOrder, IndexedRelayTokens, RelayToken} from '0x-relay-types'; import {factories} from './lib/factories'; import BigNumber from 'bignumber.js'; /* tslint:disable:no-unused-expression */ const expect = chai.expect; let util: RelayUtil; let indexedRelayTokens: IndexedRelayTokens; const tokenAddresses: string[] = []; let tokenKeys: string[]; let tokenA: RelayToken; let tokenB: RelayToken; let tokenAAddress: string; let tokenBAddress: string; describe('convertUnits', () => { beforeEach(() => { indexedRelayTokens = factories.indexedRelayTokensFactory(10, tokenAddresses); // setup ZRX token tokenKeys = Object.keys(indexedRelayTokens); indexedRelayTokens[tokenKeys[0]].symbol = 'ZRX'; util = new RelayUtil(indexedRelayTokens); // setup 2 relay tokens tokenA = indexedRelayTokens[tokenKeys[0]]; tokenB = indexedRelayTokens[tokenKeys[1]]; tokenAAddress = tokenA.address; tokenBAddress = tokenB.address; }); // TODO these will break if we test // baseUnits other than 18 Decimals it('converts a SignedOrder from unit to BaseUnit', async () => { const order = factories.relaySignedOrderFactory(); // setup signed order order.signedOrder.makerTokenAddress = tokenAAddress; order.signedOrder.takerTokenAddress = tokenBAddress; order.signedOrder.makerTokenAmount = new BigNumber('1.5'); order.signedOrder.takerTokenAmount = new BigNumber('2'); // convert const convertedOrder = util.orderToBaseUnitAmount(order); const makerAmt = convertedOrder.signedOrder.makerTokenAmount.toString(); const takerAmt = convertedOrder.signedOrder.takerTokenAmount.toString(); expect(makerAmt).to.equal('1500000000000000000'); expect(takerAmt).to.equal('2000000000000000000'); }); it('converts a SignedOrder from unit to BaseUnit without affecting precision', async () => { const order = factories.relaySignedOrderFactory(); // setup signed order order.signedOrder.makerTokenAddress = tokenAAddress; order.signedOrder.takerTokenAddress = tokenBAddress; order.signedOrder.makerTokenAmount = new BigNumber('1.51242425125151'); order.signedOrder.takerTokenAmount = new BigNumber('2.22235523555557'); // convert const convertedOrder = util.orderToBaseUnitAmount(order); const makerAmt = convertedOrder.signedOrder.makerTokenAmount.toString(); const takerAmt = convertedOrder.signedOrder.takerTokenAmount.toString(); // should take number toPrecision of 9 // then convert to a baseUnit BigNumber object expect(makerAmt).to.equal('1512424251251510000'); // should round the 9th decimal expect(takerAmt).to.equal('2222355235555570000'); }); it('converts a RelayFill from baseUnit to unit amount', async () => { const relayFill = factories.relayFillFactory(); relayFill.makerTokenAddress = tokenAAddress; relayFill.takerTokenAddress = tokenBAddress; relayFill.filledTakerTokenAmount = new BigNumber('1500000000000000000'); const convertedFill = util.relayFillToUnitAmount(relayFill); const newFiledTakerAmt = convertedFill.filledTakerTokenAmount.toNumber(); expect(newFiledTakerAmt).to.equal(1.5); }); it('converts a RelayCandle from baseUnit to unit amount', () => { const relayCandle = factories.relayCandleFactory(); relayCandle.makerTokenAddress = tokenAAddress; relayCandle.takerTokenAddress = tokenBAddress; relayCandle.makerTokenVolume = new BigNumber('150000000000000000000'); relayCandle.takerTokenVolume = new BigNumber('250000000000000000000'); const convertedCandle = util.relayCandleToUnitAmount(relayCandle); const makerVolume = convertedCandle.makerTokenVolume.toNumber(); expect(makerVolume).to.equal(150); const takerVolume = convertedCandle.takerTokenVolume.toNumber(); expect(takerVolume).to.equal(250); }); });