diff options
author | Leonid <logvinov.leon@gmail.com> | 2017-05-25 19:44:19 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-25 19:44:19 +0800 |
commit | b43cc8f52cd726cd919d2db6c9e63b4b7af5dcea (patch) | |
tree | 2336c98e0c7d321c44a074d48d66e4c5edf03449 | |
parent | eee06e0cc97333891a84aff22196849105846eb4 (diff) | |
parent | dfb7b039f15d572ddf2e417f71ecb069114100a8 (diff) | |
download | dexon-0x-contracts-b43cc8f52cd726cd919d2db6c9e63b4b7af5dcea.tar.gz dexon-0x-contracts-b43cc8f52cd726cd919d2db6c9e63b4b7af5dcea.tar.zst dexon-0x-contracts-b43cc8f52cd726cd919d2db6c9e63b4b7af5dcea.zip |
Merge branch 'master' into isValidOrderHash
-rw-r--r-- | package.json | 1 | ||||
-rw-r--r-- | src/ts/0x.js.ts | 25 | ||||
-rw-r--r-- | src/ts/globals.d.ts | 15 | ||||
-rw-r--r-- | test/0x.js.ts | 23 |
4 files changed, 61 insertions, 3 deletions
diff --git a/package.json b/package.json index a46ffcaf1..557d6eeff 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "awesome-typescript-loader": "^3.1.3", "bignumber.js": "^4.0.2", "chai": "^3.5.0", + "chai-bignumber": "^2.0.0", "mocha": "^3.4.1", "npm-run-all": "^4.0.2", "nyc": "^10.3.2", diff --git a/src/ts/0x.js.ts b/src/ts/0x.js.ts index bd0ce80e2..cc2adca33 100644 --- a/src/ts/0x.js.ts +++ b/src/ts/0x.js.ts @@ -56,5 +56,30 @@ export class ZeroEx { assert.isString('orderHash', orderHash); const isValid = /^0x[0-9A-F]{66}$/i.test(orderHash); return isValid; + /* + * A unit amount is defined as the amount of a token above the specified decimal places (integer part). + * E.g: If a currency has 18 decimal places, 1e18 or one quintillion of the currency is equivalent + * to 1 unit. + */ + public static toUnitAmount(amount: BigNumber.BigNumber, decimals: number): BigNumber.BigNumber { + assert.isBigNumber('amount', amount); + assert.isNumber('decimals', decimals); + + const aUnit = new BigNumber(10).pow(decimals); + const unit = amount.div(aUnit); + return unit; + } + /* + * A baseUnit is defined as the smallest denomination of a token. An amount expressed in baseUnits + * is the amount expressed in the smallest denomination. + * E.g: 1 unit of a token with 18 decimal places is expressed in baseUnits as 1000000000000000000 + */ + public static toBaseUnitAmount(amount: BigNumber.BigNumber, decimals: number): BigNumber.BigNumber { + assert.isBigNumber('amount', amount); + assert.isNumber('decimals', decimals); + + const unit = new BigNumber(10).pow(decimals); + const baseUnitAmount = amount.times(unit); + return baseUnitAmount; } } diff --git a/src/ts/globals.d.ts b/src/ts/globals.d.ts index 1e502b061..796812c87 100644 --- a/src/ts/globals.d.ts +++ b/src/ts/globals.d.ts @@ -1,14 +1,25 @@ -declare type ETHAddressBuff = Buffer; +declare module 'chai-bignumber'; declare interface Schema { id: string; } +// HACK: In order to merge the bignumber declaration added by chai-bignumber to the chai Assertion +// interface we must use `namespace` as the Chai definitelyTyped definition does. Since we otherwise +// disallow `namespace`, we disable tslint for the following. +/* tslint:disable */ +declare namespace Chai { + interface Assertion { + bignumber: Assertion; + } +} +/* tslint:enable */ + declare module 'ethereumjs-util' { const toBuffer: (dataHex: string) => Buffer; const hashPersonalMessage: (msg: Buffer) => Buffer; const bufferToHex: (buff: Buffer) => string; const ecrecover: (msgHashBuff: Buffer, v: number, r: Buffer, s: Buffer) => string; - const pubToAddress: (pubKey: string) => ETHAddressBuff; + const pubToAddress: (pubKey: string) => Buffer; const isValidAddress: (address: string) => boolean; } diff --git a/test/0x.js.ts b/test/0x.js.ts index 38c36d248..01a5554ff 100644 --- a/test/0x.js.ts +++ b/test/0x.js.ts @@ -1,7 +1,12 @@ import {ZeroEx} from '../src/ts/0x.js'; -import {expect} from 'chai'; +import * as chai from 'chai'; import 'mocha'; import * as BigNumber from 'bignumber.js'; +import ChaiBigNumber = require('chai-bignumber'); + +// Use BigNumber chai add-on +chai.use(ChaiBigNumber()); +const expect = chai.expect; describe('ZeroEx library', () => { describe('#isValidSignature', () => { @@ -94,6 +99,22 @@ describe('ZeroEx library', () => { it('returns true if order hash is correct', () => { const isValid = ZeroEx.isValidOrderHash('0x' + Array(65).join('0')); expect(isValid).to.be.true; + describe('#toUnitAmount', () => { + it('Should return the expected unit amount for the decimals passed in', () => { + const baseUnitAmount = new BigNumber(1000000000); + const decimals = 6; + const unitAmount = ZeroEx.toUnitAmount(baseUnitAmount, decimals); + const expectedUnitAmount = new BigNumber(1000); + expect(unitAmount).to.be.bignumber.equal(expectedUnitAmount); + }); + }); + describe('#toBaseUnitAmount', () => { + it('Should return the expected base unit amount for the decimals passed in', () => { + const unitAmount = new BigNumber(1000); + const decimals = 6; + const baseUnitAmount = ZeroEx.toBaseUnitAmount(unitAmount, decimals); + const expectedUnitAmount = new BigNumber(1000000000); + expect(baseUnitAmount).to.be.bignumber.equal(expectedUnitAmount); }); }); }); |