Skip to content

Orderbook checksum is incorrect with prices smaller than 0.000001 #70

@ighunter

Description

@ighunter

Issue type

  • bug
  • missing functionality
  • performance
  • feature request

Brief description

When an orderbook containing prices smaller than 0.000001, i.e. those which are stringified in e-notation, is passed to Orderbook.checksumArr(), it takes pains to ensure that those are stringified without e-notation. The resulting checksum value doesn't match the checksum from the Bitfinex websocket 'book' stream. In my own rather naive implementation I just let Node.js stringify those numbers in e-notation and the checksum does match.

I only tested Orderbook.checksumArr(), not Orderbook.checksum(), but the latter looks it probably behaves in the same way.

Steps to reproduce

const rawArr = [
    [5.6e-7, 1, 60712.4250231],
    [5.5e-7, 8, 1047414.30449527],
    [5.4e-7, 3, 26992.30308495],
    [5.3e-7, 1, 1597.7],
    [5.1e-7, 1, 300],
    [5e-7, 1, 4000],
    [4.9e-7, 1, 1000],
    [4.3e-7, 1, 2000],
    [4.2e-7, 1, 2000],
    [4.1e-7, 1, 2000],
    [4e-7, 3, 4452.125],
    [3.9e-7, 1, 2000],
    [3.8e-7, 1, 2000],
    [3.4e-7, 32, 10290.67],
    [3.3e-7, 2, 734.82],
    [3e-7, 1, 800],
    [2.9e-7, 1, 867],
    [2.8e-7, 1, 300],
    [2.7e-7, 1, 400.6],
    [2.6e-7, 1, 257],
    [2.5e-7, 2, 3600],
    [2.4e-7, 1, 108.5],
    [2.3e-7, 1, 8050],
    [2.1e-7, 1, 308],
    [2e-7, 1, 100],
    [5.7e-7, 6, -1106130.75562937],
    [5.8e-7, 1, -383.98454496],
    [5.9e-7, 1, -2501.6405316],
    [6.1e-7, 2, -416.6],
    [8.2e-7, 1, -2000],
    [8.9e-7, 1, -100],
    [9.2e-7, 1, -22222],
    [9.3e-7, 1, -500],
    [9.9e-7, 1, -500],
    [0.000001, 1, -250.37],
    [0.00000108, 1, -500],
    [0.0000011, 1, -129.576636],
    [0.00000111, 1, -29412.414691],
    [0.00000118, 1, -500],
    [0.00000119, 1, -100],
    [0.0000012, 1, -4000],
    [0.00000141, 1, -332.93],
    [0.00000165, 1, -152.76229702],
    [0.00000171, 1, -265.88],
    [0.00000175, 1, -653],
    [0.00000176, 1, -2.19],
    [0.0000018, 1, -4000],
    [0.000002, 1, -2722.65],
    [0.0000022, 1, -500],
    [0.0000024, 1, -4000]
];

console.log(bfx.OrderBook.checksumArr(rawArr));

Expected: -776929505
Result: 758960098

Subscribing to a market such as tVSYBTC where the prices are very small should give you your own real-world examples if you doubt.

Additional Notes:
  • Node v14.16.0
  • wss://api-pub.bitfinex.com/ws/2
  • Checksums enabled with ws.send(JSON.stringify({event: 'conf', flags: 131072}));

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions