Skip to content

fix(price): Fix decimals conversion and offer list ratio to price con…

Sign in for the full log view
This check has been archived and is scheduled for deletion. Learn more about checks retention
GitHub Actions / Test Report succeeded Nov 9, 2023 in 0s

Test Report ✅

Tests passed successfully

✅ coverage-tests-report.json

364 tests were completed in 136s with 364 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
test/integration/cleaner.integration.test.ts 4✅ 2s
test/integration/mangrove.integration.test.ts 4✅ 8s
test/integration/mangroveToyENS.integration.test.ts 2✅ 42s
test/integration/market.integration.test.ts 48✅ 8s
test/integration/mgvtoken.integration.test.ts 12✅ 418ms
test/integration/offermaker.integration.test.ts 16✅ 2s
test/integration/restingOrder.integration.test.ts 8✅ 2s
test/integration/semibook.integration.test.ts 44✅ 9s
test/unit/configuration.unit.test.ts 4✅ 2ms
test/unit/densityLib.unit.test.ts 5✅ 176ms
test/unit/liquidityProvider.unit.test.ts 23✅ 110ms
test/unit/market.unit.test.ts 21✅ 36ms
test/unit/prettyPrint.unit.test.ts 3✅ 38ms
test/unit/semibook.unit.test.ts 27✅ 4ms
test/unit/tickLib.unit.test.ts 43✅ 74ms
test/unit/tickPriceHelper.unit.test.ts 66✅ 356ms
test/unit/trade.unit.test.ts 24✅ 86ms
test/unit/tradeEventManagement.unit.test.ts 6✅ 9ms
test/unit/unitCalculations.unit.test.ts 4✅ 1ms

✅ test/integration/cleaner.integration.test.ts

Cleaner integration tests suite
  ✅ clean asks book, offer is successfully taken, therefore cannot clean it
  ✅ clean failing offers collects bounty
  ✅ clean using different takers funds
  ✅ clean via callStatic for failing offers returns bounty

✅ test/integration/mangrove.integration.test.ts

Mangrove integration tests suite getMarkets
  ✅ gets correct market info and updates with cashness
  ✅ has reverse lookup of address
  ✅ updates with mgvReader
Mangrove integration tests suite node utils
  ✅ can deal a test token

✅ test/integration/mangroveToyENS.integration.test.ts

Mangrove functionality watch local addresses
  ✅ can start watching after ToyENS has been created
  ✅ can start watching before ToyENS has been created

✅ test/integration/market.integration.test.ts

Market integration tests suite
  ✅ buying uses best price, with forceRoutingToMangroveOrder:false
  ✅ buying uses best price, with no forceRoutingToMangroveOrder
  ✅ crudely simulates market buy
  ✅ get minimum volume
  ✅ getOfferProvision agrees with calculateOfferProvision for asks with gasprice=100 
  ✅ getOfferProvision agrees with calculateOfferProvision for asks with gasprice=undefined 
  ✅ getOfferProvision agrees with calculateOfferProvision for bids with gasprice=100 
  ✅ getOfferProvision agrees with calculateOfferProvision for bids with gasprice=undefined 
  ✅ gets config
  ✅ gets OB
  ✅ max gasreq is added to gas estimates
  ✅ max gasreq returns a BigNumber, even if the book is empty
  ✅ mgvIntegrationTestUtils can post offers for asks
  ✅ mgvIntegrationTestUtils can post offers for bids
  ✅ returns correct data when taking offers
  ✅ selling uses best price
  ✅ subscribes
  ✅ updates OB
  ✅ uses expected gasLimit and forceRoutingToMangroveOrder=false with gasLowerBound=42 and gasLimit=6500000
  ✅ uses expected gasLimit and forceRoutingToMangroveOrder=false with gasLowerBound=42 and gasLimit=undefined
  ✅ uses expected gasLimit and forceRoutingToMangroveOrder=false with gasLowerBound=7000000 and gasLimit=6500000
  ✅ uses expected gasLimit and forceRoutingToMangroveOrder=false with gasLowerBound=7000000 and gasLimit=undefined
  ✅ uses expected gasLimit and forceRoutingToMangroveOrder=false with gasLowerBound=undefined and gasLimit=6500000
  ✅ uses expected gasLimit and forceRoutingToMangroveOrder=false with gasLowerBound=undefined and gasLimit=undefined
  ✅ uses expected gasLimit and forceRoutingToMangroveOrder=true with gasLowerBound=42 and gasLimit=6500000
  ✅ uses expected gasLimit and forceRoutingToMangroveOrder=true with gasLowerBound=42 and gasLimit=undefined
  ✅ uses expected gasLimit and forceRoutingToMangroveOrder=true with gasLowerBound=7000000 and gasLimit=6500000
  ✅ uses expected gasLimit and forceRoutingToMangroveOrder=true with gasLowerBound=7000000 and gasLimit=undefined
  ✅ uses expected gasLimit and forceRoutingToMangroveOrder=true with gasLowerBound=undefined and gasLimit=6500000
  ✅ uses expected gasLimit and forceRoutingToMangroveOrder=true with gasLowerBound=undefined and gasLimit=undefined
Market integration tests suite estimateVolumeTest
  ✅ return estimate value for buy
  ✅ return estimate value for sell
  ✅ return estimate value for sell
Market integration tests suite getMissingProvision
  ✅ can miss some provision
Market integration tests suite getOutboundInbound
  ✅ returns base as inbound and quote as outbound, when bids
  ✅ returns base as outbound and quote as inbound, when asks
  ✅ returns this.base as inbound and this.quote as outbound, when bids
  ✅ returns this.base as outbound and this.quote as inbound, when asks
Market integration tests suite isActive
  ✅ returns false, when asks and bids both not active
  ✅ returns false, when asks is active and bids is not active
  ✅ returns false, when asks is not active and bids is active
  ✅ returns true, when asks and bids are active
Market integration tests suite isLive
  ✅ returns false, when gives is negative
  ✅ returns true, when gives is positive
Market integration tests suite offerInfo
  ✅ return offer from ba semi book
  ✅ returns asks offer info
  ✅ returns bids offer info
Market integration tests suite Readonly mode
  ✅ can read book updates in readonly mode

✅ test/integration/mgvtoken.integration.test.ts

MGV Token integration tests suite
  ✅ allowanceInfinite is false if allowance is 2^200 
  ✅ allowanceInfinite is true if allowance is 2^200 + 1 
  ✅ allowanceInfinite is true if infinite allowance 
  ✅ approve can be set to 0
  ✅ approve sets approved amount
  ✅ approveIfHigher sets when higher but not when lower
  ✅ approveIfNotInfinite creates approval TX only if finite
  ✅ converts
  ✅ get token from address
  ✅ has checksum addresses
  ✅ increaseApproval increases except when at max
  ✅ reads allowance and sets

✅ test/integration/offermaker.integration.test.ts

OfferMaker integration test suite
  ✅ checks allowance for EOA provider
  ✅ checks allowance for onchain logic
  ✅ checks provision for EOA provider
  ✅ checks provision for onchain logic
  ✅ checks provision for onchain logic by calling provisionOf
  ✅ gets missing provision for eoa logic
  ✅ gets missing provision for onchain logic
OfferMaker integration test suite After setup
  ✅ approves signer for base transfer
  ✅ cancels offer
  ✅ fails, when trying to cancel a non-existing offer
  ✅ fails, when trying to create an offer on a closed market
  ✅ fails, when trying to push new offer without sufficient provision
  ✅ fails, when trying to update on a closed market
  ✅ OfferMaker updates offer
  ✅ pushes a new offer
  ✅ withdraws

✅ test/integration/restingOrder.integration.test.ts

RestingOrder Resting order integration tests suite
  ✅ no resting order params, with forceRoutingToMangroveOrder:true
  ✅ no resting order params, with forceRoutingToMangroveOrder:true
  ✅ resting order with deadline and custom gasreq
  ✅ resting order, using existing offer
  ✅ simple resting order, with forceRoutingToMangroveOrder:false
  ✅ simple resting order, with forceRoutingToMangroveOrder:true
  ✅ simple resting order, with no forceRoutingToMangroveOrder
RestingOrder RestingOrder connectivity
  ✅ deploys and connects

✅ test/integration/semibook.integration.test.ts

Semibook integration tests suite estimateVolume estimateVolume({to: buy}) - cache tests
  ✅ returns all given as residue when cache and offer list is empty
  ✅ returns correct estimate and residue when cache is empty and offer list is not
  ✅ returns correct estimate and residue when cache is partial and insufficient while offer list is sufficient
  ✅ returns correct estimate and residue when cache is partial and offer list is insufficient
Semibook integration tests suite estimateVolume estimateVolume({to: buy}) - calculation tests
  ✅ estimates all available volume when offer list has 1 offer with insufficient volume
  ✅ estimates all available volume when offer list has multiple offers with insufficient volume
  ✅ estimates volume and no residue when offer list has 1 offer with sufficient volume
  ✅ estimates volume and no residue when offer list has multiple offers which together have sufficient volume
  ✅ returns zero when given is zero
Semibook integration tests suite estimateVolume estimateVolume({to: sell}) - cache tests
  ✅ returns all given as residue when cache and offer list is empty
  ✅ returns correct estimate and residue when cache is empty and offer list is not
  ✅ returns correct estimate and residue when cache is partial and insufficient while offer list is sufficient
  ✅ returns correct estimate and residue when cache is partial and offer list is insufficient
Semibook integration tests suite estimateVolume estimateVolume({to: sell}) - calculation tests
  ✅ estimates all available volume when offer list has 1 offer with insufficient volume
  ✅ estimates all available volume when offer list has multiple offers with insufficient volume
  ✅ estimates volume and no residue when offer list has 1 offer with sufficient volume
  ✅ estimates volume and no residue when offer list has multiple offers which together have sufficient volume
  ✅ returns zero when given is zero
Semibook integration tests suite getBestInCache
  ✅ returns offer id 1, because cache gets synced even though market is created before offer
  ✅ returns offer id 1, because market made after offer
Semibook integration tests suite getConfig
  ✅ returns the config of a block as Mangrove.LocalConfig, when given blocknumber
  ✅ returns the config of a block, when given blocknumber
  ✅ returns the config of the latest block as Mangrove.LocalConfig, when given no blocknumber
  ✅ returns the config of the latest block as Mangrove.RawConfig, when given no blocknumber
Semibook integration tests suite getMaxGasReq
  ✅ finds max gasreq on both asks and bids side of market
  ✅ returns `undefined` when the semibook is empty
Semibook integration tests suite getMinimumVolume
  ✅ gets 1 unit if density is 0
  ✅ gets minimum volume
Semibook integration tests suite initialization options Option.desiredPrice
  ✅ does not fail if offer list is empty
  ✅ fetches all offers if all have a better price
  ✅ fetches only one chunk if no offers have a better price
  ✅ stops fetching when a chunk with a worse price has been fetched
Semibook integration tests suite initialization options Option.desiredVolume {to: buy}
  ✅ does not fail if offer list is empty
  ✅ fetches all offers if offer list has insufficient volume
  ✅ fetches only one chunk if it has sufficient volume
  ✅ stops fetching when sufficient volume has been fetched
Semibook integration tests suite initialization options Option.desiredVolume {to: sell}
  ✅ does not fail if offer list is empty
  ✅ fetches all offers if offer list has insufficient volume
  ✅ fetches only one chunk if it has sufficient volume
  ✅ stops fetching when sufficient volume has been fetched
Semibook integration tests suite offerInfo
  ✅ returns offer from cache, when offer is in cache
  ✅ returns offer from cache, when offer is in cache
  ✅ returns offer from contract, when offer is not in cache
  ✅ returns offer from contract, when offer is not in cache

✅ test/unit/configuration.unit.test.ts

Configuration unit tests suite
  ✅ Adding token config does not affect existing config
  ✅ Can add token config of unknown token
  ✅ can read mangroveOrder config
  ✅ Reset of configuration reverts additions and changes

✅ test/unit/densityLib.unit.test.ts

Density unit test suite
  ✅ test_density_convert_auto
  ✅ test_density_manual
  ✅ test_density_multiply_auto
  ✅ test_multiply_manual
  ✅ test_paramsTo96X32

✅ test/unit/liquidityProvider.unit.test.ts

Liquidity provider unit tests suite
  ✅ normalizeOfferParams, ask tick = 0 price = 10 different decimals
  ✅ normalizeOfferParams, ask tick = 0 price = 10 different decimals
  ✅ normalizeOfferParams, ask tick = 0 same decimals
  ✅ normalizeOfferParams, ask with tick = -1 different decimals
  ✅ normalizeOfferParams, ask with tick = -1 different decimals
  ✅ normalizeOfferParams, ask with tick = -1 same decimals
  ✅ normalizeOfferParams, ask with tick = -1 same decimals
  ✅ normalizeOfferParams, ask with tick = 1 different decimals
  ✅ normalizeOfferParams, ask with tick = 1 different decimals
  ✅ normalizeOfferParams, ask with tick = 1 same decimals
  ✅ normalizeOfferParams, ask with tick = 1 same decimals
  ✅ normalizeOfferParams, bid tick = 0 different decimals
  ✅ normalizeOfferParams, bid tick = 0 same decimals
  ✅ normalizeOfferParams, with big gives and wants, as asks
  ✅ normalizeOfferParams, with gives and wants, as asks
  ✅ normalizeOfferParams, with gives and wants, as bids
  ✅ normalizeOfferParams, with gives, tick, asks and funding
  ✅ normalizeOfferParams, with gives, tick, bids and no funding
  ✅ normalizeOfferParams, with non-equal decimals gives, tick, bids and no funding
  ✅ normalizeOfferParams, with volume and price 1, as asks
  ✅ normalizeOfferParams, with volume and price 1, as bids
  ✅ normalizeOfferParams, with volume and price 2, as asks
  ✅ normalizeOfferParams, with volume and price 2, as bids

✅ test/unit/market.unit.test.ts

Market unit tests suite getBaseQuoteVolumes
  ✅ returns gives as baseVolume and wants as quoteVolume
  ✅ returns gives as quoteVolume and wants as baseVolume
Market unit tests suite getDisplayDecimalsForPriceDifferences
  ✅ returns 7 decimals when difference is 1e-7
  ✅ returns 7 decimals when difference is 9e-7
  ✅ returns 7 decimals when difference is 9e-7
  ✅ returns no decimals for empty list
  ✅ returns no decimals for list with offers with same price
  ✅ returns no decimals for list with one offer
  ✅ returns no decimals when price differences are integers
  ✅ returns one decimal when difference is -0.1
  ✅ returns one decimal when difference is -0.9999999
  ✅ returns one decimal when difference is 0.1
  ✅ returns one decimal when difference is 0.9999999
  ✅ returns the decimals for the first difference when that is smallest
  ✅ returns the decimals for the last difference when that is smallest
Market unit tests suite getGivesForPrice
  ✅ returns wants divided by price
  ✅ returns wants multiplied by price
Market unit tests suite getGivesWantsForVolumeAtPrice
  ✅ return gives = volume && wants = volume*price for undefined type
  ✅ return gives = volume*price && wants = volume for undefined type
Market unit tests suite getWantsForPrice
  ✅ returns gives multiplied by price
  ✅ returns wants divided by price

✅ test/unit/prettyPrint.unit.test.ts

PrettyPrint Unit test suite consoleOffers
  ✅ should use default filter
  ✅ should use given filter
PrettyPrint Unit test suite prettyPrint
  ✅ prints the offers using the given filter

✅ test/unit/semibook.unit.test.ts

Semibook unit test suite getIsVolumeDesiredForAsks
  ✅ returns false, when desiredVolume is undefined
  ✅ returns false, when what is base and to is sell
  ✅ returns false, when what is quote and to is buy
  ✅ returns true, when what is base and to is buy
  ✅ returns true, when what is quote and to is sell
Semibook unit test suite getIsVolumeDesiredForBids
  ✅ returns false, when desiredVolume is undefined
  ✅ returns false, when what is base and to is buy 
  ✅ returns false, when what is quote and to is sell 
  ✅ returns true, when what is base and to is sell 
  ✅ returns true, when what is quote and to is buy 
Semibook unit test suite getOfferFromCacheOrFail
  ✅ returns offer when offer is in cache
  ✅ throws error when offer is not in cache
Semibook unit test suite insertOffer
  ✅ inserting offer exceeds maxOffer size, offer is not worst offer
  ✅ inserting offer exceeds maxOffer size, offer is worst offer
  ✅ inserts offer in empty book
  ✅ inserts offer in non empty book, offer is at a better tick, tick already exist
  ✅ inserts offer in non empty book, offer is at worse tick, tick already exist
  ✅ inserts offer in non empty book, offer is better
  ✅ inserts offer in non empty book, offer is in the middle
  ✅ inserts offer in non empty book, offer is in the middle at an already existing tick
  ✅ inserts offer in non empty book, offer is worse
Semibook unit test suite removeOffer
  ✅ removes last offer in book
  ✅ removes offer from empty book
  ✅ removes offer from non empty book, offer is best offer, does not have others at same tick
  ✅ removes offer from non empty book, offer is best offer, has others at same tick
  ✅ removes offer from non empty book, offer is worst offer, has others at same tick
  ✅ removes offer from non empty book, offer is worst offer, has others at same tick

✅ test/unit/tickLib.unit.test.ts

TickLib unit test suite divExpUp
  ✅ a==0 then rem == 0, should return  (a >> e) + rem
  ✅ e<256 and a > 0 
  ✅ e>255 then rem == 1, should return  (a >> e) + rem
TickLib unit test suite floatLt
  ✅ returns false when exp_a < exp_b
  ✅ returns false when exp_a == exp_b and mantissa_a >= mantissa_b
  ✅ returns true when exp_a == exp_b and mantissa_a < mantissa_b
  ✅ returns true when exp_a > exp_b and mantissa_a < mantissa_b
TickLib unit test suite getTickFromPrice
  ✅ should return the correct tick for price, MAX_TICK
TickLib unit test suite inboundFromOutbound
  ✅ should return the correct value of inbound from outbound based on tick
TickLib unit test suite inboundFromOutboundUp
  ✅ should return the correct rounded up value of inbound from outbound based on tick
TickLib unit test suite inRange
  ✅ should return false if tick is outside the range
  ✅ should return true if tick is within the range
TickLib unit test suite nonNormalizedPriceFromTick
  ✅ Test with maximum tick
  ✅ Test with minimum tick
  ✅ Test with negative tick
  ✅ Test with positive tick
  ✅ Test with tick exceeding MAX_TICK
TickLib unit test suite normalizePrice
  ✅ should handle negative shift correctly
  ✅ should handle positive shift correctly
  ✅ should throw an error if exp is less than 0 after normalization
  ✅ should throw an error if mantissa is zero
TickLib unit test suite outboundFromInbound
  ✅ should return the correct value of outbound from inbound based on tick
TickLib unit test suite outboundFromInboundUp
  ✅ should return the correct rounded up value of outbound from inbound based on tick
TickLib unit test suite priceFromTick
  ✅ should return the correct price for tick, 0
  ✅ should return the correct price for tick, 1 
  ✅ should return the correct price for tick, MAX_TICK
  ✅ should return the correct price for tick, MIN_TICK
TickLib unit test suite priceFromVolumes
  ✅ should return the correct mantissa and exp for non-zero inboundAmt and outboundAmt
  ✅ should return the correct mantissa and exp when inboundAmt is 0
  ✅ should return the correct mantissa and exp when outboundAmt is 0
TickLib unit test suite priceToMantissaAndExponent
  ✅ should return the correct mantissa and exponent for price, MAX_TICK
  ✅ should return the correct mantissa and exponent for price, MIN_TICK
  ✅ should return the correct mantissa and exponent for price, tick = -1
  ✅ should return the correct mantissa and exponent for price, tick = -1000
  ✅ should return the correct mantissa and exponent for price, tick = 0
  ✅ should return the correct mantissa and exponent for price, tick = 1
  ✅ should return the correct mantissa and exponent for price, tick = 1000
TickLib unit test suite ratioFromTick
  ✅ test_ratioFromTick
TickLib unit test suite tickFromNormalizedPrice
  ✅ should return the correct tick for normalizedPrice
  ✅ should revert with mgv/tickFromRatio/tooHigh
  ✅ should revert with mgv/tickFromRatio/tooLow
TickLib unit test suite tickFromRatio
  ✅ should return the correct tick for price
TickLib unit test suite tickFromVolumes
  ✅ should return tick 

✅ test/unit/tickPriceHelper.unit.test.ts

TickPriceHelper unit tests suite
  ✅ manual calculation
  ✅ manual calculation inverse decimals
TickPriceHelper unit tests suite inboundFromOutbound
  ✅ inboundFromOutbound ba=asks base=1 quote=2 price=2
  ✅ inboundFromOutbound ba=asks base=1 quote=2 price=2
  ✅ inboundFromOutbound ba=asks base=2 quote=1 price=0.5
  ✅ inboundFromOutbound ba=asks base=2 quote=1 price=0.5
  ✅ inboundFromOutbound ba=asks base=6 quote=3 price=0.5
  ✅ inboundFromOutbound ba=asks base=6 quote=3 price=0.5
  ✅ inboundFromOutbound ba=bids base=1 quote=2 price=2
  ✅ inboundFromOutbound ba=bids base=1 quote=2 price=2
  ✅ inboundFromOutbound ba=bids base=2 quote=1 price=0.5
  ✅ inboundFromOutbound ba=bids base=2 quote=1 price=0.5
  ✅ inboundFromOutbound ba=bids base=6 quote=3 price=0.5
  ✅ inboundFromOutbound ba=bids base=6 quote=3 price=0.5
  ✅ outboundFromInbound ba=asks base=1 quote=2 price=2
  ✅ outboundFromInbound ba=asks base=1 quote=2 price=2
  ✅ outboundFromInbound ba=asks base=2 quote=1 price=0.5
  ✅ outboundFromInbound ba=asks base=2 quote=1 price=0.5
  ✅ outboundFromInbound ba=asks base=6 quote=3 price=0.5
  ✅ outboundFromInbound ba=asks base=6 quote=3 price=0.5
  ✅ outboundFromInbound ba=bids base=1 quote=2 price=2
  ✅ outboundFromInbound ba=bids base=1 quote=2 price=2
  ✅ outboundFromInbound ba=bids base=2 quote=1 price=0.5
  ✅ outboundFromInbound ba=bids base=2 quote=1 price=0.5
  ✅ outboundFromInbound ba=bids base=6 quote=3 price=0.5
  ✅ outboundFromInbound ba=bids base=6 quote=3 price=0.5
TickPriceHelper unit tests suite priceFromTick
  ✅ returns price=1 for tick 0 with base decimals: 6, quote decimals: 6 (asks semibook)
  ✅ returns price=1 for tick 0 with base decimals: 6, quote decimals: 6 (bids semibook)
  ✅ returns price=1.00000396574 for tick 414486 with base decimals: 18, quote decimals: 0 (bids semibook)
  ✅ returns price=1.000096 for tick -414487 with base decimals: 0, quote decimals: 18 (bids semibook)
  ✅ returns price=100 for tick 0 with base decimals: 2, quote decimals: 0 (asks semibook)
  ✅ returns price=100 for tick 0 with base decimals: 2, quote decimals: 0 (bids semibook)
  ✅ returns price=1838.53469156 for tick -75171 with base decimals: 18, quote decimals: 18 (bids semibook)
  ✅ returns price=1838.534691561 for tick 75171 with base decimals: 18, quote decimals: 18 (asks semibook)
  ✅ returns price=1e-12 for tick 0 with base decimals: 6, quote decimals: 18 (asks semibook)
  ✅ returns price=1e-12 for tick 0 with base decimals: 6, quote decimals: 18 (bids semibook)
TickPriceHelper unit tests suite priceFromTick is inverse of tickFromPrice (up to tick-step)
  ✅ returns price=1 for tickFromPrice(..., tickFromPrice(..., 1))) with base decimals: 6, quote decimals: 6 for asks semibook
  ✅ returns price=1 for tickFromPrice(..., tickFromPrice(..., 1))) with base decimals: 6, quote decimals: 6 for bids semibook
  ✅ returns price=1.00000396574 for tickFromPrice(..., tickFromPrice(..., 1.00000396574))) with base decimals: 18, quote decimals: 0 for bids semibook
  ✅ returns price=1.000096 for tickFromPrice(..., tickFromPrice(..., 1.000096))) with base decimals: 0, quote decimals: 18 for bids semibook
  ✅ returns price=100 for tickFromPrice(..., tickFromPrice(..., 100))) with base decimals: 2, quote decimals: 0 for asks semibook
  ✅ returns price=100 for tickFromPrice(..., tickFromPrice(..., 100))) with base decimals: 2, quote decimals: 0 for bids semibook
  ✅ returns price=1838.53469156 for tickFromPrice(..., tickFromPrice(..., 1838.53469156))) with base decimals: 18, quote decimals: 18 for bids semibook
  ✅ returns price=1838.534691561 for tickFromPrice(..., tickFromPrice(..., 1838.534691561))) with base decimals: 18, quote decimals: 18 for asks semibook
  ✅ returns price=1e-12 for tickFromPrice(..., tickFromPrice(..., 1e-12))) with base decimals: 6, quote decimals: 18 for asks semibook
  ✅ returns price=1e-12 for tickFromPrice(..., tickFromPrice(..., 1e-12))) with base decimals: 6, quote decimals: 18 for bids semibook
TickPriceHelper unit tests suite tickFromPrice
  ✅ returns tick=-414487 for price 1.000096 with base decimals: 0, quote decimals: 18 (bids semibook)) 
  ✅ returns tick=-75171 for price 1838.53469156 with base decimals: 18, quote decimals: 18 (bids semibook)) 
  ✅ returns tick=0 for price 1 with base decimals: 6, quote decimals: 6 (asks semibook)) 
  ✅ returns tick=0 for price 1 with base decimals: 6, quote decimals: 6 (bids semibook)) 
  ✅ returns tick=0 for price 100 with base decimals: 2, quote decimals: 0 (asks semibook)) 
  ✅ returns tick=0 for price 100 with base decimals: 2, quote decimals: 0 (bids semibook)) 
  ✅ returns tick=0 for price 1e-12 with base decimals: 6, quote decimals: 18 (asks semibook)) 
  ✅ returns tick=0 for price 1e-12 with base decimals: 6, quote decimals: 18 (bids semibook)) 
  ✅ returns tick=414486 for price 1.00000396574 with base decimals: 18, quote decimals: 0 (bids semibook)) 
  ✅ returns tick=75171 for price 1838.534691561 with base decimals: 18, quote decimals: 18 (asks semibook)) 
TickPriceHelper unit tests suite tickFromPrice is inverse of priceFromTick (up to tick-step)
  ✅ returns tick=-414487 for priceFromTick(..., priceFromTick(..., -414487))) with base decimals: 0, quote decimals: 18 for bids semibook
  ✅ returns tick=-75171 for priceFromTick(..., priceFromTick(..., -75171))) with base decimals: 18, quote decimals: 18 for bids semibook
  ✅ returns tick=0 for priceFromTick(..., priceFromTick(..., 0))) with base decimals: 2, quote decimals: 0 for asks semibook
  ✅ returns tick=0 for priceFromTick(..., priceFromTick(..., 0))) with base decimals: 2, quote decimals: 0 for bids semibook
  ✅ returns tick=0 for priceFromTick(..., priceFromTick(..., 0))) with base decimals: 6, quote decimals: 18 for asks semibook
  ✅ returns tick=0 for priceFromTick(..., priceFromTick(..., 0))) with base decimals: 6, quote decimals: 18 for bids semibook
  ✅ returns tick=0 for priceFromTick(..., priceFromTick(..., 0))) with base decimals: 6, quote decimals: 6 for asks semibook
  ✅ returns tick=0 for priceFromTick(..., priceFromTick(..., 0))) with base decimals: 6, quote decimals: 6 for bids semibook
  ✅ returns tick=414486 for priceFromTick(..., priceFromTick(..., 414486))) with base decimals: 18, quote decimals: 0 for bids semibook
  ✅ returns tick=75171 for priceFromTick(..., priceFromTick(..., 75171))) with base decimals: 18, quote decimals: 18 for asks semibook

✅ test/unit/trade.unit.test.ts

Trade unit tests suite comparePrices
  ✅ returns false, when price = referencePrice and compare is “gt“
  ✅ returns false, when price = referencePrice and compare is “lt“
  ✅ returns false, when price > referencePrice and compare is “gt“
  ✅ returns false, when price > referencePrice and compare is “lt“
  ✅ returns true, when price < referencePrice and compare is “gt“
  ✅ returns true, when price < referencePrice and compare is “lt“
Trade unit tests suite getParamsForBuy
  ✅ returns fillVolume as fillVolume, tick as tick and fillWants as fillWants, when params has tick, fillVolume and fillWants 
  ✅ returns fillVolume as fillVolume, tick as tick and fillWants as true, when params has fillVolume and tick, but no fillWants 
  ✅ returns fillVolume as gives, tick as TickLib.fromVolume(gives,wants) and fillWants as fillWants, when params has gives, wants and fillWants 
  ✅ returns fillVolume as total, tick as tick(price) and fillWants false, when params has price!=null and total
  ✅ returns fillVolume as volume, tick as -1*tick(price) and fillWants true, when params has price!=null and volume
Trade unit tests suite getParamsForSell
  ✅ returns fillVolume as fillVolume, tick as tick and fillWants false, when params has wants and gives, but no fillWants
  ✅ returns fillVolume as gives, tick as TickLib.fromVolume(gives,wants) and fillWants as fillWants, when params has gives, wants and fillWants 
  ✅ returns fillVolume as total, tick as tick(price) and fillWants true, when params has price!=null and total
  ✅ returns fillVolume as volume, tick as tick(price) and fillWants false, when params has price!=null and volume
  ✅ returns wants as wants, gives as gives and fillWants as fillWants, when params has wants, gives and fillWants
Trade unit tests suite isPriceBetter
  ✅ Uses “gt“ when ba = bids
  ✅ Uses “lt“ when ba = asks
Trade unit tests suite isPriceWorse
  ✅ Uses “gt“ when ba = bids
  ✅ Uses “lt“ when ba = asks
Trade unit tests suite validateSlippage
  ✅ return given slippage, when it is valid
  ✅ returns 0, when slippage is undefined
  ✅ throw error, when slippage is above 100
  ✅ throw error, when slippage is lower than 0

✅ test/unit/tradeEventManagement.unit.test.ts

TradeEventManagement unit tests suite createPosthookFailure
  ✅ returns posthookFailure object, always
TradeEventManagement unit tests suite createSuccess
  ✅ returns Success object, always
TradeEventManagement unit tests suite createSummary
  ✅ return summary with partialFill as true, when partialFill func returns true
TradeEventManagement unit tests suite createSummaryForOrderComplete
  ✅ returns createSummary, always
TradeEventManagement unit tests suite createSummaryForOrderSummary
  ✅ returns createSummary with offerId, always
TradeEventManagement unit tests suite createTradeFailure
  ✅ returns TradeFailure object, always

✅ test/unit/unitCalculations.unit.test.ts

UnitCalculations unit tests suite fromUnits
  ✅ returns Big number, amount is BigNumber and nameOrDecimal is number
  ✅ returns Big number, amount is number and nameOrDecimal is number
  ✅ returns Big number, amount is number and nameOrDecimal is string
  ✅ returns Big number, amount is string and nameOrDecimal is number