Current Folder

This commit is contained in:
Luis Fernando Molina committed 2020-11-20 14:05:59 +01:00
1 parent 8b3382289b
commit cfcada880d
4379 files changed

No files matched your search

-118
View File
@@ -1,118 +0,0 @@
const { hash, ecdsa, jwt } = require ('../../../base/functions/crypto')
const { encode } = require ('../../../base/functions/encode')
const Exchange = require ('../../../base/Exchange');
const assert = require ('assert')
function equals (a, b) {
// does not check if b has more properties than a
for (const prop of Object.keys (a)) {
if (a[prop] !== b[prop]) {
return false
}
}
return true
}
const exchange = new Exchange ();
// ---------------------------------------------------------------------------------------------------------------------
assert (hash (encode (''), 'sha256', 'hex') === 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
assert (hash (encode ('cheese'), 'sha256', 'hex') === '873ac9ffea4dd04fa719e8920cd6938f0c23cd678af330939cff53c3d2855f34');
assert (hash (encode (''), 'md5', 'hex') === 'd41d8cd98f00b204e9800998ecf8427e');
assert (hash (encode ('sexyfish'), 'md5', 'hex') === 'c8a35464aa9d5683585786f44d5889f8');
assert (hash (encode (''), 'sha1', 'hex') === 'da39a3ee5e6b4b0d3255bfef95601890afd80709');
assert (hash (encode ('nutella'), 'sha1', 'hex') === 'b3d60a34b744159793c483b067c56d8affc5111a');
// ---------------------------------------------------------------------------------------------------------------------
const privateKey = '1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a';
assert (equals (ecdsa ('1a', privateKey, 'p256', 'sha256'), {
'r': '3f4537ef9e72240cdefaea19d68fd483b5e10227e89747c58a3b543bfaf9cc46',
's': '278d65adebd8d52dac34820c02cee0a0e3348f9aee91a21b8e9bfa0a23b40001',
'v': 1
}));
assert (equals (ecdsa (privateKey, privateKey, 'p256', undefined), {
'r': '9aadbfe7feca28a8b665731abd8fdd19f8b1be5fcdd1264d111b291a01c8dea2',
's': '5084765e08e169fbba470ed1f573c9fed8d68a9d883049054b601f66a6648912',
'v': 0,
}));
assert (equals (ecdsa ('1a', privateKey, 'secp256k1', 'sha256'), {
'r': '23dcb2a2a3728a35eb1a35cc01743c4609550d9cceaf2083550f13a9eb135f9f',
's': '317963fcac18e4ec9f7921b97d7ea0c82a873dd6299cbfb6af016e08ef5ed667',
'v': 0,
}));
assert (equals (ecdsa (privateKey, privateKey, 'secp256k1', undefined), {
'r': 'b84a36a6fbabd5277ede578448b93d48e70b38efb5b15b1d4e2a298accf938b1',
's': '66ebfb8221cda925526e699a59cd221bb4cc84bdc563024b1802c4d9e1d8bbe9',
'v': 1,
}));
// ---------------------------------------------------------------------------------------------------------------------
assert (exchange.hashMessage (privateKey) === '0x59ea5d98c3500c3729f95cf98aa91663f498518cc401360df2912742c232207f');
assert (equals (exchange.signHash ('0x59ea5d98c3500c3729f95cf98aa91663f498518cc401360df2912742c232207f', privateKey), {
'r': '0x6f684aa41c02da83dac3039d8805ddbe79a03b1297e247c7742cab8dfc19d341',
's': '0x62473881674550563cb028ff40a7846fd53620ddf40a20cc1003b8484a109a4a',
'v': 27
}));
assert (equals (exchange.signMessage (privateKey, privateKey), {
'r': '0x6f684aa41c02da83dac3039d8805ddbe79a03b1297e247c7742cab8dfc19d341',
's': '0x62473881674550563cb028ff40a7846fd53620ddf40a20cc1003b8484a109a4a',
'v': 27
}));
// ---------------------------------------------------------------------------------------------------------------------
const pemKeyArray = [
'-----BEGIN RSA PRIVATE KEY-----',
'MIIEpAIBAAKCAQEAqUtXQXv2uSm9zPvdJTRpu5/65rBjAoHmIiowAs+u7fY0QP9O',
'+T8CZRQjvZrfPomBiccjCxDo8mm7GkmL67rs9s7VOMQFvpTTtMBeglNSEbXJ3wTt',
'7WM5gD3ZAbhfGtwWdGpcOMX0hV5/d/fiw1zQk0+AooayTryZ7HV+DQcD1sGTYYir',
'LePUGkKV2NCvKtGOQfRAtuo0ccigMxMvEhWuExCc9Fhd077OpXMc0n7OiFqA2JWN',
'jlocM9S71Srvw/lDos8a7lGaFUV8gP1CsQY/4qTju6hhsRd4lFujVr5J9FqmDbnv',
'wQ79SSu6+lT0+ToFdDHiYOorBK2ESFR7EzlyLwIDAQABAoIBAEobQMbZjNbg/sSM',
'O/HdT6tiDGKPM8gVNLgf34RbhSeFbrpFCDzy6Al3F24YLUEi0CGPmjdt34q93blU',
'GHvIB5LCV3PR2vHiFAo7ayOBdZtrCEMn1T7lAHaynBu0qW0IiovLQzNW9AKtqv7I',
'8+qw5lyVoKmEbOkqhfaMN/Fb8MJAo3yEVyhyp4EjtFhqDQ9DuHEjp1jGthnMgm+4',
'qFyELf0DXZSAN+R9IGDqWPyo78lOcPW4pgeLuoLQ6Nn/2JAEGHFt1a7zMEw5yYbR',
'XB89Bh0dheSmopBN6Heay4YuhnNKua37OlL1/nhKpLGUNE3z/UOXeiUiMeE1C2i+',
'GjK+xgECgYEA4XH63rJ3VYDHHWUGlWffFWkEpgR4BDEkZ8MyVYQoUjQA2TpCvQ2+',
'bR7aAIGXhBnRTrIBNu9m4+am0aUfi1hVmVHqt1b2vFgEb9uKuO4U62tCFpeji+Rz',
'8C8QJyu5v5OUWdQZ4EA0d7ljeoTl50g8tpcGsDhnImLt+/jvJuFt8dECgYEAwD0n',
'rhlkEjKVHxu1xwKeczxYCqqcUV9Quq8HnPh4VJQ77ljfZ57V7sAKrFDi5XfVD9jS',
'oJPwxjw6za134VobhdvCM6WNs6AJmbR8E/b5kDMbGaZn27vt+/8JfnGaWBqpDi6W',
'a5xoJOqmcMBQBK1YleZDoY4PLbk+onVKLMfGI/8CgYEAkyUIv8euGdGWpHnm5SdJ',
'tLi5vv4Vs267uzntJWG/y3+DukTLgIdy7dgAI+pxkVgkg/+syUVSW5eU9CqZPyLl',
'o8+Sqh2Jp36vTq71iSRj5RA5r3ND3K+8eFzPZzGj6AWUA1lrljFxzV7kLfiF8gH1',
'FpvWUrhNoGT/vcFJno/uabECgYAecRC5hxfLserfVDoC261PvjyK492BHUDhbxob',
'h1U2v4qGAdjOxd5Gwm5uPxjPEZzRt5oTB5pXKe5953xWWTiGh/hGyW6ZBTy/9E65',
'sqBub0lZVHqZ1zamcwqD1WWFkiM3NbVoMQpk3iuhKzMAqpqekiofiSlqKi16+GvY',
'j4IW7QKBgQCrIUckPZ6IY3ERIN1IL4TIcK2gOJcznp7fLWpC+sv35ya3OhtDXKFt',
'GjIHmwLuiUNc0iPzA9Rw89W0zIkKWmWcxM88/ithdxh3MEeNDUGSnd4hQ9SECwxB',
'Wem3eBT7I4VtFYoaTE3/bX1SKfgBdTzIRqWKSDpgBNZg/P2Tc+s11g==',
'-----END RSA PRIVATE KEY-----',
];
const pemKey = pemKeyArray.join ("\n");
assert (jwt ({'chicken': 'salad'}, encode (pemKey), 'RS256') === 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJjaGlja2VuIjoic2FsYWQifQ.FSKD5Y6RNzkHTuHdvG3753U7QNZ-u-GUSPfP1FMjEaK0Rr_iyQTSSmHhkdYSFFnmBvrrN_l-UwKwir52WlsgmQm9HYm0kidxbj7fWwrK2E1oe0P7OjupFjv1BZxc5W69WeaHtOPWe28tiHiON1LCnax6HgfI5lcIBsESGIIBZMVeaioQn9gDVwea7JxJvAlrhDIWZowIHTIdCQocXip7g5jREWHeEIuJNug67mwnfAFxCjvTRiTd0Bw6oBwjM3FLya-RyEyWrejQOWSuC8CNWVUHISaSmEyZ7uM6wTi2m_58TaE9mQwlef32OPErPvvBpgL5pZIyQ4ymwrCIFQLBQQ');
assert (jwt ({'lil': 'xan'}, encode ('betrayed'), 'HS256') === 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsaWwiOiJ4YW4ifQ.md-oFvZagA-NXmZoRNyJOQ7zwK-PWUMmMQ_LI9ZOKaM');
// ---------------------------------------------------------------------------------------------------------------------
assert (exchange.soliditySha3 (['0x63581b9abf2b661da0ba247e0dda1b723dcff5e3', 100, 'lulwat']) === '0x1d3e95c10fc64aee6628ea59284503a4eafc6ff13c541f00753fbd2a66cea0f5');
assert (exchange.soliditySha3 ([234]) === '0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2');
assert (exchange.soliditySha3 (['234']) === '0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2');
assert (exchange.soliditySha3 (['Hello!%']) === '0x661136a4267dba9ccdf6bfddb7c00e714de936674c4bdb065a531cf1cb15c7fc');
assert (exchange.soliditySha3 (['0x407D73d8a49eeb85D32Cf465507dd71d507100c1']) === '0x4e8ebbefa452077428f93c9520d3edd60594ff452a29ac7d2ccc11d47f3ab95b');
-62
View File
@@ -1,62 +0,0 @@
'use strict'
const ccxt = require ('../../../../ccxt');
const assert = require ('assert');
const { ROUND_UP, ROUND_DOWN } = require ('../../../base/functions/misc');
const exchange = new ccxt.Exchange ({
'id': 'regirock',
});
// ----------------------------------------------------------------------------
assert (exchange.iso8601 (514862627000) === '1986-04-26T01:23:47.000Z');
assert (exchange.iso8601 (514862627559) === '1986-04-26T01:23:47.559Z');
assert (exchange.iso8601 (514862627062) === '1986-04-26T01:23:47.062Z');
assert (exchange.iso8601 (0) === '1970-01-01T00:00:00.000Z');
assert (exchange.iso8601 (-1) === undefined);
assert (exchange.iso8601 () === undefined);
assert (exchange.iso8601 (undefined) === undefined);
assert (exchange.iso8601 ('') === undefined);
assert (exchange.iso8601 ('a') === undefined);
assert (exchange.iso8601 ({}) === undefined);
// ----------------------------------------------------------------------------
assert (exchange.parse8601 ('1986-04-26T01:23:47.000Z') === 514862627000);
assert (exchange.parse8601 ('1986-04-26T01:23:47.559Z') === 514862627559);
assert (exchange.parse8601 ('1986-04-26T01:23:47.062Z') === 514862627062);
assert (exchange.parse8601 ('1986-04-26T01:23:47.06Z') === 514862627060);
assert (exchange.parse8601 ('1986-04-26T01:23:47.6Z') === 514862627600);
assert (exchange.parse8601 ('1977-13-13T00:00:00.000Z') === undefined);
assert (exchange.parse8601 ('1986-04-26T25:71:47.000Z') === undefined);
assert (exchange.parse8601 ('3333') === undefined);
assert (exchange.parse8601 ('Sr90') === undefined);
assert (exchange.parse8601 ('') === undefined);
assert (exchange.parse8601 () === undefined);
assert (exchange.parse8601 (undefined) === undefined);
assert (exchange.parse8601 ({}) === undefined);
assert (exchange.parse8601 (33) === undefined);
// ----------------------------------------------------------------------------
assert (exchange.parseDate ('1986-04-26 00:00:00') === 514857600000);
assert (exchange.parseDate ('1986-04-26T01:23:47.000Z') === 514862627000);
assert (exchange.parseDate ('1986-13-13 00:00:00') === undefined);
assert (exchange.roundTimeframe('5m', exchange.parse8601('2019-08-12 13:22:08'), ROUND_DOWN) === exchange.parse8601('2019-08-12 13:20:00'));
assert (exchange.roundTimeframe('10m', exchange.parse8601('2019-08-12 13:22:08'), ROUND_DOWN) === exchange.parse8601('2019-08-12 13:20:00'));
assert (exchange.roundTimeframe('30m', exchange.parse8601('2019-08-12 13:22:08'), ROUND_DOWN) === exchange.parse8601('2019-08-12 13:00:00'));
assert (exchange.roundTimeframe('1d', exchange.parse8601('2019-08-12 13:22:08'), ROUND_DOWN) === exchange.parse8601('2019-08-12 00:00:00'));
assert (exchange.roundTimeframe('5m', exchange.parse8601('2019-08-12 13:22:08'), ROUND_UP) === exchange.parse8601('2019-08-12 13:25:00'));
assert (exchange.roundTimeframe('10m', exchange.parse8601('2019-08-12 13:22:08'), ROUND_UP) === exchange.parse8601('2019-08-12 13:30:00'));
assert (exchange.roundTimeframe('30m', exchange.parse8601('2019-08-12 13:22:08'), ROUND_UP) === exchange.parse8601('2019-08-12 13:30:00'));
assert (exchange.roundTimeframe('1h', exchange.parse8601('2019-08-12 13:22:08'), ROUND_UP) === exchange.parse8601('2019-08-12 14:00:00'));
assert (exchange.roundTimeframe('1d', exchange.parse8601('2019-08-12 13:22:08'), ROUND_UP) === exchange.parse8601('2019-08-13 00:00:00'));
-155
View File
@@ -1,155 +0,0 @@
'use strict'
/* ------------------------------------------------------------------------ */
const { deepExtend, groupBy, filterBy, omit, sum, sortBy } = require ('../../../../ccxt')
const { strictEqual: equal, deepEqual } = require ('assert')
/* ------------------------------------------------------------------------ */
it ('deepExtend() works', () => {
let count = 0
const values = [{
a: 1,
b: 2,
d: {
a: 1,
b: [],
c: { test1: 123, test2: 321 }},
f: 5,
g: 123,
i: 321,
j: [1, 2],
},
{
b: 3,
c: 5,
d: {
b: { first: 'one', second: 'two' },
c: { test2: 222 }},
e: { one: 1, two: 2 },
f: [{ 'foo': 'bar' }],
g: (void 0),
h: /abc/g,
i: null,
j: [3, 4]
}]
const extended = deepExtend (...values)
deepEqual ({
a: 1,
b: 3,
d: {
a: 1,
b: { first: 'one', second: 'two' },
c: { test1: 123, test2: 222 }
},
f: [{ 'foo': 'bar' }],
g: undefined,
c: 5,
e: { one: 1, two: 2 },
h: /abc/g,
i: null,
j: [3, 4]
}, extended)
deepEqual (deepExtend (undefined, undefined, {'foo': 'bar' }), { 'foo': 'bar' })
})
/* ------------------------------------------------------------------------ */
it ('groupBy() works', () => {
const array = [
{ 'foo': 'a' },
{ 'foo': 'b' },
{ 'foo': 'c' },
{ 'foo': 'b' },
{ 'foo': 'c' },
{ 'foo': 'c' },
]
deepEqual (groupBy (array, 'foo'), {
'a': [ { 'foo': 'a' } ],
'b': [ { 'foo': 'b' }, { 'foo': 'b' } ],
'c': [ { 'foo': 'c' }, { 'foo': 'c' }, { 'foo': 'c' } ],
})
})
/* ------------------------------------------------------------------------ */
it ('filterBy() works', () => {
const array = [
{ 'foo': 'a' },
{ 'foo': undefined },
{ 'foo': 'b' },
{ },
{ 'foo': 'a', 'bar': 'b' },
{ 'foo': 'c' },
{ 'foo': 'd' },
{ 'foo': 'b' },
{ 'foo': 'c' },
{ 'foo': 'c' },
]
deepEqual (filterBy (array, 'foo', 'a'), [
{ 'foo': 'a' },
{ 'foo': 'a', 'bar': 'b' },
])
})
/* ------------------------------------------------------------------------ */
it ('omit works', () => {
deepEqual (omit ({ }, 'foo'), {})
deepEqual (omit ({ foo: 2 }, 'foo'), { })
deepEqual (omit ({ foo: 2, bar: 3 }, 'foo'), { bar: 3 })
deepEqual (omit ({ foo: 2, bar: 3 }, ['foo']), { bar: 3 })
deepEqual (omit ({ foo: 2, bar: 3 }), { foo: 2, bar: 3 })
deepEqual (omit ({ foo: 2, bar: 3 }, 'foo', 'bar'), {})
deepEqual (omit ({ foo: 2, bar: 3 }, ['foo'], 'bar'), {})
deepEqual (omit ({ 5: 2, bar: 3 }, [5]), { bar: 3 })
deepEqual (omit ({ 5: 2, bar: 3 }, 5), { bar: 3 })
})
/* ------------------------------------------------------------------------ */
it ('sum works', () => {
equal (undefined, sum ())
equal (2, sum (2))
equal (432, sum (2,30,400))
equal (432, sum (2, undefined, [88], 30, '7', 400, null))
})
/* ------------------------------------------------------------------------ */
it ('sortBy works', () => {
const arr = [{ x: 5 }, { x: 2 }, { x: 4 }, { x: 0 },{ x: 1 },{ x: 3 }]
sortBy (arr, 'x')
deepEqual (arr
[ { x: 0 },
{ x: 1 },
{ x: 2 },
{ x: 3 },
{ x: 4 },
{ x: 5 } ])
deepEqual (sortBy (arr, 'x', true),
[ { x: 5 },
{ x: 4 },
{ x: 3 },
{ x: 2 },
{ x: 1 },
{ x: 0 } ])
deepEqual (sortBy ([], 'x'), [])
})
/* ------------------------------------------------------------------------ */
-284
View File
@@ -1,284 +0,0 @@
'use strict'
const { numberToString, decimalToPrecision, ROUND, TRUNCATE, DECIMAL_PLACES, TICK_SIZE, PAD_WITH_ZERO, SIGNIFICANT_DIGITS, toWei, fromWei } = require ('../../../../ccxt');
const assert = require ('assert');
// ----------------------------------------------------------------------------
// toWei / fromWei
assert (toWei (1, 18) === '1000000000000000000');
assert (toWei (1, 17) === '100000000000000000');
assert (toWei (1, 16) === '10000000000000000');
assert (toWei ('1', 18) === '1000000000000000000');
assert (toWei ('1', 17) === '100000000000000000');
assert (toWei ('1', 16) === '10000000000000000');
assert (toWei (0, 18) === '0');
assert (toWei (1, 0) === '1');
assert (toWei (1, 1) === '10');
assert (toWei (1.3, 18) === '1300000000000000000');
assert (toWei ('1.3', 18) === '1300000000000000000');
assert (toWei (1.999, 17) === '199900000000000000');
assert (toWei ('1.999', 17) === '199900000000000000');
assert (toWei ('0.1', 18) === '100000000000000000');
assert (toWei ('0.01', 18) === '10000000000000000');
assert (toWei ('0.001', 18) === '1000000000000000');
assert (toWei (0.1, 18) === '100000000000000000');
assert (toWei (0.01, 18) === '10000000000000000');
assert (toWei (0.001, 18) === '1000000000000000');
assert (toWei ('0.3323340739', 18) === '332334073900000000');
assert (toWei (0.3323340739, 18) === '332334073900000000');
// let us test that we get the inverse for all these test
assert (fromWei ('1000000000000000000', 18) === 1.0);
assert (fromWei ('100000000000000000', 17) === 1.0);
assert (fromWei ('10000000000000000', 16) === 1.0);
assert (fromWei (1000000000000000000, 18) === 1.0);
assert (fromWei (100000000000000000, 17) === 1.0);
assert (fromWei (10000000000000000, 16) === 1.0);
assert (fromWei ('1300000000000000000', 18) === 1.3);
assert (fromWei (1300000000000000000, 18) === 1.3);
assert (fromWei ('199900000000000000', 17) === 1.999);
assert (fromWei (199900000000000000, 17) === 1.999);
assert (fromWei ('100000000000000000', 18) === 0.1);
assert (fromWei ('10000000000000000', 18) === 0.01);
assert (fromWei ('1000000000000000', 18) === 0.001);
assert (fromWei (100000000000000000, 18) === 0.1);
assert (fromWei (10000000000000000, 18) === 0.01);
assert (fromWei (1000000000000000, 18) === 0.001);
assert (fromWei ('332334073900000000', 18) === 0.3323340739);
assert (fromWei (332334073900000000, 18) === 0.3323340739);
// ----------------------------------------------------------------------------
// numberToString
assert (numberToString (-7.8e-7) === '-0.00000078');
assert (numberToString (7.8e-7) === '0.00000078');
assert (numberToString (-17.805e-7) === '-0.0000017805');
assert (numberToString (17.805e-7) === '0.0000017805');
assert (numberToString (-7.0005e27) === '-7000500000000000000000000000');
assert (numberToString (7.0005e27) === '7000500000000000000000000000');
assert (numberToString (-7.9e27) === '-7900000000000000000000000000');
assert (numberToString (7.9e27) === '7900000000000000000000000000');
assert (numberToString (-12.345) === '-12.345');
assert (numberToString (12.345) === '12.345');
assert (numberToString (0) === '0');
assert (numberToString (7.35946e21) === '7359460000000000000000');
// the following line breaks the test
// see https://github.com/ccxt/ccxt/issues/5744
// assert (numberToString (0.00000001) === '0.00000001');
// ----------------------------------------------------------------------------
// testDecimalToPrecisionTruncationToNDigitsAfterDot
assert (decimalToPrecision ('12.3456000', TRUNCATE, 100, DECIMAL_PLACES) === '12.3456');
assert (decimalToPrecision ('12.3456', TRUNCATE, 100, DECIMAL_PLACES) === '12.3456');
assert (decimalToPrecision ('12.3456', TRUNCATE, 4, DECIMAL_PLACES) === '12.3456');
assert (decimalToPrecision ('12.3456', TRUNCATE, 3, DECIMAL_PLACES) === '12.345');
assert (decimalToPrecision ('12.3456', TRUNCATE, 2, DECIMAL_PLACES) === '12.34');
assert (decimalToPrecision ('12.3456', TRUNCATE, 1, DECIMAL_PLACES) === '12.3');
assert (decimalToPrecision ('12.3456', TRUNCATE, 0, DECIMAL_PLACES) === '12');
assert (decimalToPrecision ('0.0000001', TRUNCATE, 8, DECIMAL_PLACES) === '0.0000001');
assert (decimalToPrecision ('0.00000001', TRUNCATE, 8, DECIMAL_PLACES) === '0.00000001');
assert (decimalToPrecision ('0.000000000', TRUNCATE, 9, DECIMAL_PLACES, PAD_WITH_ZERO) === '0.000000000');
assert (decimalToPrecision ('0.000000001', TRUNCATE, 9, DECIMAL_PLACES, PAD_WITH_ZERO) === '0.000000001');
assert (decimalToPrecision ('12.3456', TRUNCATE, -1, DECIMAL_PLACES) === '10');
assert (decimalToPrecision ('123.456', TRUNCATE, -1, DECIMAL_PLACES) === '120');
assert (decimalToPrecision ('123.456', TRUNCATE, -2, DECIMAL_PLACES) === '100');
assert (decimalToPrecision ('9.99999', TRUNCATE, -1, DECIMAL_PLACES) === '0');
assert (decimalToPrecision ('99.9999', TRUNCATE, -1, DECIMAL_PLACES) === '90');
assert (decimalToPrecision ('99.9999', TRUNCATE, -2, DECIMAL_PLACES) === '0');
assert (decimalToPrecision ('0', TRUNCATE, 0, DECIMAL_PLACES) === '0');
assert (decimalToPrecision ('-0.9', TRUNCATE, 0, DECIMAL_PLACES) === '0');
// ----------------------------------------------------------------------------
// testDecimalToPrecisionTruncationToNSignificantDigits
assert (decimalToPrecision ('0.000123456700', TRUNCATE, 100, SIGNIFICANT_DIGITS) === '0.0001234567');
assert (decimalToPrecision ('0.0001234567', TRUNCATE, 100, SIGNIFICANT_DIGITS) === '0.0001234567');
assert (decimalToPrecision ('0.0001234567', TRUNCATE, 7, SIGNIFICANT_DIGITS) === '0.0001234567');
assert (decimalToPrecision ('0.000123456', TRUNCATE, 6, SIGNIFICANT_DIGITS) === '0.000123456');
assert (decimalToPrecision ('0.000123456', TRUNCATE, 5, SIGNIFICANT_DIGITS) === '0.00012345');
assert (decimalToPrecision ('0.000123456', TRUNCATE, 2, SIGNIFICANT_DIGITS) === '0.00012');
assert (decimalToPrecision ('0.000123456', TRUNCATE, 1, SIGNIFICANT_DIGITS) === '0.0001');
assert (decimalToPrecision ('123.0000987654', TRUNCATE, 10, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) === '123.0000987');
assert (decimalToPrecision ('123.0000987654', TRUNCATE, 8, SIGNIFICANT_DIGITS) === '123.00009');
assert (decimalToPrecision ('123.0000987654', TRUNCATE, 7, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) === '123.0000');
assert (decimalToPrecision ('123.0000987654', TRUNCATE, 6, SIGNIFICANT_DIGITS) === '123');
assert (decimalToPrecision ('123.0000987654', TRUNCATE, 5, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) === '123.00');
assert (decimalToPrecision ('123.0000987654', TRUNCATE, 4, SIGNIFICANT_DIGITS) === '123');
assert (decimalToPrecision ('123.0000987654', TRUNCATE, 4, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) === '123.0');
assert (decimalToPrecision ('123.0000987654', TRUNCATE, 3, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) === '123');
assert (decimalToPrecision ('123.0000987654', TRUNCATE, 2, SIGNIFICANT_DIGITS) === '120');
assert (decimalToPrecision ('123.0000987654', TRUNCATE, 1, SIGNIFICANT_DIGITS) === '100');
assert (decimalToPrecision ('123.0000987654', TRUNCATE, 1, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) === '100');
assert (decimalToPrecision ('1234', TRUNCATE, 5, SIGNIFICANT_DIGITS) === '1234');
assert (decimalToPrecision ('1234', TRUNCATE, 5, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) === '1234.0');
assert (decimalToPrecision ('1234', TRUNCATE, 4, SIGNIFICANT_DIGITS) === '1234');
assert (decimalToPrecision ('1234', TRUNCATE, 4, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) === '1234');
assert (decimalToPrecision ('1234.69', TRUNCATE, 0, SIGNIFICANT_DIGITS) === '0');
assert (decimalToPrecision ('1234.69', TRUNCATE, 0, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) === '0');
// ----------------------------------------------------------------------------
// testDecimalToPrecisionRoundingToNDigitsAfterDot
assert (decimalToPrecision ('12.3456000', ROUND, 100, DECIMAL_PLACES) === '12.3456');
assert (decimalToPrecision ('12.3456', ROUND, 100, DECIMAL_PLACES) === '12.3456');
assert (decimalToPrecision ('12.3456', ROUND, 4, DECIMAL_PLACES) === '12.3456');
assert (decimalToPrecision ('12.3456', ROUND, 3, DECIMAL_PLACES) === '12.346');
assert (decimalToPrecision ('12.3456', ROUND, 2, DECIMAL_PLACES) === '12.35');
assert (decimalToPrecision ('12.3456', ROUND, 1, DECIMAL_PLACES) === '12.3');
assert (decimalToPrecision ('12.3456', ROUND, 0, DECIMAL_PLACES) === '12');
// a problematic case in PHP
assert (decimalToPrecision ('10000', ROUND, 6, DECIMAL_PLACES) === '10000');
assert (decimalToPrecision ('0.00003186', ROUND, 8, DECIMAL_PLACES) === '0.00003186');
assert (decimalToPrecision ('12.3456', ROUND, -1, DECIMAL_PLACES) === '10');
assert (decimalToPrecision ('123.456', ROUND, -1, DECIMAL_PLACES) === '120');
assert (decimalToPrecision ('123.456', ROUND, -2, DECIMAL_PLACES) === '100');
assert (decimalToPrecision ('9.99999', ROUND, -1, DECIMAL_PLACES) === '10');
assert (decimalToPrecision ('99.9999', ROUND, -1, DECIMAL_PLACES) === '100');
assert (decimalToPrecision ('99.9999', ROUND, -2, DECIMAL_PLACES) === '100');
assert (decimalToPrecision ('9.999', ROUND, 3, DECIMAL_PLACES) === '9.999');
assert (decimalToPrecision ('9.999', ROUND, 2, DECIMAL_PLACES) === '10');
assert (decimalToPrecision ('9.999', ROUND, 2, DECIMAL_PLACES, PAD_WITH_ZERO) === '10.00');
assert (decimalToPrecision ('99.999', ROUND, 2, DECIMAL_PLACES, PAD_WITH_ZERO) === '100.00');
assert (decimalToPrecision ('-99.999', ROUND, 2, DECIMAL_PLACES, PAD_WITH_ZERO) === '-100.00');
// ----------------------------------------------------------------------------
// testDecimalToPrecisionRoundingToNSignificantDigits
assert (decimalToPrecision ('0.000123456700', ROUND, 100, SIGNIFICANT_DIGITS) === '0.0001234567');
assert (decimalToPrecision ('0.0001234567', ROUND, 100, SIGNIFICANT_DIGITS) === '0.0001234567');
assert (decimalToPrecision ('0.0001234567', ROUND, 7, SIGNIFICANT_DIGITS) === '0.0001234567');
assert (decimalToPrecision ('0.000123456', ROUND, 6, SIGNIFICANT_DIGITS) === '0.000123456');
assert (decimalToPrecision ('0.000123456', ROUND, 5, SIGNIFICANT_DIGITS) === '0.00012346');
assert (decimalToPrecision ('0.000123456', ROUND, 4, SIGNIFICANT_DIGITS) === '0.0001235');
assert (decimalToPrecision ('0.00012', ROUND, 2, SIGNIFICANT_DIGITS) === '0.00012');
assert (decimalToPrecision ('0.0001', ROUND, 1, SIGNIFICANT_DIGITS) === '0.0001');
assert (decimalToPrecision ('123.0000987654', ROUND, 7, SIGNIFICANT_DIGITS) === '123.0001');
assert (decimalToPrecision ('123.0000987654', ROUND, 6, SIGNIFICANT_DIGITS) === '123');
assert (decimalToPrecision ('0.00098765', ROUND, 2, SIGNIFICANT_DIGITS) === '0.00099');
assert (decimalToPrecision ('0.00098765', ROUND, 2, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) === '0.00099');
assert (decimalToPrecision ('0.00098765', ROUND, 1, SIGNIFICANT_DIGITS) === '0.001');
assert (decimalToPrecision ('0.00098765', ROUND, 10, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) === '0.0009876500000');
assert (decimalToPrecision ('0.098765', ROUND, 1, SIGNIFICANT_DIGITS, PAD_WITH_ZERO) === '0.1');
assert (decimalToPrecision ('0', ROUND, 0, SIGNIFICANT_DIGITS) === '0');
assert (decimalToPrecision ('-0.123', ROUND, 0, SIGNIFICANT_DIGITS) === '0');
assert (decimalToPrecision ('0.00000044', ROUND, 5, SIGNIFICANT_DIGITS) === '0.00000044');
// ----------------------------------------------------------------------------
// testDecimalToPrecisionRoundingToTickSize
assert (decimalToPrecision ('0.000123456700', ROUND, 0.00012, TICK_SIZE) === '0.00012');
assert (decimalToPrecision ('0.0001234567', ROUND, 0.00013, TICK_SIZE) === '0.00013');
assert (decimalToPrecision ('0.0001234567', TRUNCATE, 0.00013, TICK_SIZE) === '0');
assert (decimalToPrecision ('101.000123456700', ROUND, 100, TICK_SIZE) === '100');
assert (decimalToPrecision ('0.000123456700', ROUND, 100, TICK_SIZE) === '0');
assert (decimalToPrecision ('165', TRUNCATE, 110, TICK_SIZE) === '110');
assert (decimalToPrecision ('3210', TRUNCATE, 1110, TICK_SIZE) === '2220');
assert (decimalToPrecision ('165', ROUND, 110, TICK_SIZE) === '220');
assert (decimalToPrecision ('0.000123456789', ROUND, 0.00000012, TICK_SIZE) === '0.00012348');
assert (decimalToPrecision ('0.000123456789', TRUNCATE, 0.00000012, TICK_SIZE) === '0.00012336');
assert (decimalToPrecision ('0.01', ROUND, 0.0001, TICK_SIZE, PAD_WITH_ZERO) === '0.0100');
assert (decimalToPrecision ('0.01', TRUNCATE, 0.0001, TICK_SIZE, PAD_WITH_ZERO) === '0.0100');
assert (decimalToPrecision ('-0.000123456789', ROUND, 0.00000012, TICK_SIZE) === '-0.00012348');
assert (decimalToPrecision ('-0.000123456789', TRUNCATE, 0.00000012, TICK_SIZE) === '-0.00012336');
assert (decimalToPrecision ('-165', TRUNCATE, 110, TICK_SIZE) === '-110');
assert (decimalToPrecision ('-165', ROUND, 110, TICK_SIZE) === '-220');
assert (decimalToPrecision ('-1650', TRUNCATE, 1100, TICK_SIZE) === '-1100');
assert (decimalToPrecision ('-1650', ROUND, 1100, TICK_SIZE) === '-2200');
assert (decimalToPrecision ('0.0006', TRUNCATE, 0.0001, TICK_SIZE) === '0.0006');
assert (decimalToPrecision ('-0.0006', TRUNCATE, 0.0001, TICK_SIZE) === '-0.0006');
assert (decimalToPrecision ('0.6', TRUNCATE, 0.2, TICK_SIZE) === '0.6');
assert (decimalToPrecision ('-0.6', TRUNCATE, 0.2, TICK_SIZE) === '-0.6');
assert (decimalToPrecision ('1.2', ROUND, 0.4, TICK_SIZE) === '1.2');
assert (decimalToPrecision ('-1.2', ROUND, 0.4, TICK_SIZE) === '-1.2');
assert (decimalToPrecision ('1.2', ROUND, 0.02, TICK_SIZE) === '1.2');
assert (decimalToPrecision ('-1.2', ROUND, 0.02, TICK_SIZE) === '-1.2');
assert (decimalToPrecision ('44', ROUND, 4.4, TICK_SIZE) === '44');
assert (decimalToPrecision ('-44', ROUND, 4.4, TICK_SIZE) === '-44');
assert (decimalToPrecision ('44.00000001', ROUND, 4.4, TICK_SIZE) === '44');
assert (decimalToPrecision ('-44.00000001', ROUND, 4.4, TICK_SIZE) === '-44');
// https://github.com/ccxt/ccxt/issues/6731
assert (decimalToPrecision ('20', TRUNCATE, 0.00000001, TICK_SIZE) === '20');
// ----------------------------------------------------------------------------
// testDecimalToPrecisionNegativeNumbers
assert (decimalToPrecision ('-0.123456', TRUNCATE, 5, DECIMAL_PLACES) === '-0.12345');
assert (decimalToPrecision ('-0.123456', ROUND, 5, DECIMAL_PLACES) === '-0.12346');
// ----------------------------------------------------------------------------
// decimalToPrecision: without dot / trailing dot
assert (decimalToPrecision ('123', TRUNCATE, 0) === '123');
assert (decimalToPrecision ('123', TRUNCATE, 5, DECIMAL_PLACES) === '123');
assert (decimalToPrecision ('123', TRUNCATE, 5, DECIMAL_PLACES, PAD_WITH_ZERO) === '123.00000');
assert (decimalToPrecision ('123.', TRUNCATE, 0, DECIMAL_PLACES) === '123');
assert (decimalToPrecision ('123.', TRUNCATE, 5, DECIMAL_PLACES, PAD_WITH_ZERO) === '123.00000');
assert (decimalToPrecision ('0.', TRUNCATE, 0) === '0');
assert (decimalToPrecision ('0.', TRUNCATE, 5, DECIMAL_PLACES, PAD_WITH_ZERO) === '0.00000');
// ----------------------------------------------------------------------------
// decimalToPrecision: rounding for equidistant digits
assert (decimalToPrecision ('1.44', ROUND, 1, DECIMAL_PLACES) === '1.4');
assert (decimalToPrecision ('1.45', ROUND, 1, DECIMAL_PLACES) === '1.5');
assert (decimalToPrecision ('1.45', ROUND, 0, DECIMAL_PLACES) === '1'); // not 2
// ----------------------------------------------------------------------------
// negative precision only implemented so far in python
// pretty useless for decimal applications as anything |x| < 5 === 0
// NO_PADDING and PAD_WITH_ZERO are ignored
assert (decimalToPrecision ('5', ROUND, -1, DECIMAL_PLACES) === '10');
assert (decimalToPrecision ('4.999', ROUND, -1, DECIMAL_PLACES) === '0');
assert (decimalToPrecision ('0.0431531423', ROUND, -1, DECIMAL_PLACES) === '0');
assert (decimalToPrecision ('-69.3', ROUND, -1, DECIMAL_PLACES) === '-70');
assert (decimalToPrecision ('5001', ROUND, -4, DECIMAL_PLACES) === '10000');
assert (decimalToPrecision ('4999.999', ROUND, -4, DECIMAL_PLACES) === '0');
assert (decimalToPrecision ('69.3', TRUNCATE, -2, DECIMAL_PLACES) === '0');
assert (decimalToPrecision ('-69.3', TRUNCATE, -2, DECIMAL_PLACES) === '0');
assert (decimalToPrecision ('69.3', TRUNCATE, -1, SIGNIFICANT_DIGITS) === '60');
assert (decimalToPrecision ('-69.3', TRUNCATE, -1, SIGNIFICANT_DIGITS) === '-60');
assert (decimalToPrecision ('69.3', TRUNCATE, -2, SIGNIFICANT_DIGITS) === '0');
assert (decimalToPrecision ('1602000000000000000000', TRUNCATE, 3, SIGNIFICANT_DIGITS) === '1600000000000000000000');
// ----------------------------------------------------------------------------
// testDecimalToPrecisionErrorHandling (todo)
//
// throws (() =>
// decimalToPrecision ('123456.789', TRUNCATE, -2, DECIMAL_PLACES),
// 'negative precision is not yet supported')
//
// throws (() =>
// decimalToPrecision ('foo'),
// "invalid number (contains an illegal character 'f')")
//
// throws (() =>
// decimalToPrecision ('0.01', TRUNCATE, -1, TICK_SIZE),
// "TICK_SIZE cant be used with negative numPrecisionDigits")
-71
View File
@@ -1,71 +0,0 @@
'use strict'
/* ------------------------------------------------------------------------ */
const { setTimeout_safe
, timeout
, now
, isWindows } = require ('../../../../ccxt')
const { strictEqual: equal } = require ('assert')
, approxEqual = (a, b) => equal (true, Math.abs (a - b) <= 20)
, rejectsWith = (msg, x) => x.then (() => { throw new Error ('not rejected!') })
.catch (e => { equal (e.message, msg) })
/* ------------------------------------------------------------------------ */
it ('setTimeout_safe is working', (done) => {
// TODO: make a more robust test that is not failing on certain machines under certain conditions
if (isWindows) {
// temporarily skip this test with appveyor
// todo: refix timer functions for windows properly
done ()
} else {
const start = now ()
const calls = []
const brokenSetTimeout = (done, ms) => {
calls.push ({ when: now () - start, ms_asked: ms })
return setTimeout (done, 100) // simulates a defect setTimeout implementation that sleeps wrong time (100ms always in this test)
}
// ask to sleep 250ms
setTimeout_safe (() => {
approxEqual (calls[0].ms_asked, 250)
approxEqual (calls[1].ms_asked, 150)
approxEqual (calls[2].ms_asked, 50)
done ()
}, 250, brokenSetTimeout)
}
})
/* ------------------------------------------------------------------------ */
it ('setTimeout_safe canceling is working', (done) => {
const brokenSetTimeout = (done, ms) => setTimeout (done, 100) // simulates a defect setTimeout implementation that sleeps wrong time (100ms always in this test)
const clear = setTimeout_safe (() => { throw new Error ('shouldnt happen!') }, 250, brokenSetTimeout)
setTimeout (() => { clear () }, 200)
setTimeout (() => { done () }, 400)
})
/* ------------------------------------------------------------------------ */
it ('timeout() is working', async () => {
equal ('foo', await timeout (200, new Promise (resolve => setTimeout (() => resolve ('foo'), 100))))
await rejectsWith ('foo', timeout (100, Promise.reject (new Error ('foo'))))
await rejectsWith ('timed out', timeout (100, new Promise ((resolve, reject) => setTimeout (() => reject (new Error ('foo')), 200))))
})
/* ------------------------------------------------------------------------ */
-54
View File
@@ -1,54 +0,0 @@
'use strict'
/* ------------------------------------------------------------------------ */
const { safeFloat, safeInteger, safeValue } = require ('../../../../ccxt')
const { strictEqual: equal, deepEqual } = require ('assert')
/* ------------------------------------------------------------------------ */
it ('safeFloat/safeInteger is robust', async () => {
const $default = {}
const fns = { safeFloat, safeInteger }
for (const fn of ['safeFloat', 'safeInteger']) {
equal (fns[fn] ({ 'x': false }, 'x', $default), $default)
equal (fns[fn] ({ 'x': true }, 'x', $default), $default)
equal (fns[fn] ({ 'x': [] }, 'x', $default), $default)
equal (fns[fn] ({ 'x': [0] }, 'x', $default), $default)
equal (fns[fn] ({ 'x': [1] }, 'x', $default), $default)
equal (fns[fn] ({ 'x': {} }, 'x', $default), $default)
equal (fns[fn] ({ 'x': Number.NaN }, 'x'), undefined)
equal (fns[fn] ({ 'x': Number.POSITIVE_INFINITY }, 'x'), undefined)
equal (fns[fn] ({ 'x': null }, 'x', undefined), undefined)
equal (fns[fn] ({ 'x': null }, 'x', $default), $default)
equal (fns[fn] ({ 'x': '1.0' }, 'x'), 1.0)
equal (fns[fn] ({ 'x': '-1.0' }, 'x'), -1.0)
equal (fns[fn] ({ 'x': 1.0 }, 'x'), 1.0)
equal (fns[fn] ({ 'x': 0 }, 'x'), 0)
equal (fns[fn] ({ 'x': undefined }, 'x', $default), $default)
equal (fns[fn] ({ 'x': "" }, 'x'), undefined)
equal (fns[fn] ({ 'x': "" }, 'x', 0), 0)
equal (fns[fn] ({}, 'x'), undefined)
equal (fns[fn] ({}, 'x', 0), 0)
}
equal (safeFloat ({ 'x': 1.59999999 }, 'x'), 1.59999999)
equal (safeInteger ({ 'x': 1.59999999 }, 'x'), 1)
})
/* ------------------------------------------------------------------------ */
it ('safeValue works', () => {
equal (safeValue ({}, 'foo'), undefined)
equal (safeValue ({}, 'foo', 'bar'), 'bar')
equal (safeValue ({ 'foo': 'bar' }, 'foo'), 'bar')
equal (safeValue ({ 'foo': '' }, 'foo'), '')
equal (safeValue ({ 'foo': 0 }, 'foo'), 0)
})
/* ------------------------------------------------------------------------ */
-242
View File
@@ -1,242 +0,0 @@
'use strict'
/* ------------------------------------------------------------------------ */
global.log = require ('ololog') // for easier debugging
/* ------------------------------------------------------------------------ */
const { Exchange, keys, values, unique, index, aggregate } = require ('../../../ccxt')
const { strictEqual: equal, deepEqual } = require ('assert')
/* ------------------------------------------------------------------------ */
describe ('ccxt base code', () => {
/* ------------------------------------------------------------------------ */
require ('./functions/test.generic')
require ('./functions/test.time')
require ('./functions/test.type')
// Some test files are transpiled to other languages and must be kept very simple so we put `it` call externally to them
// Some mocha reporters will swallow `assert` failures if they are outside of `it` clause so we must call `it`
it ('decimalToPrecision() works', () => {
require ('./functions/test.number')
})
it ('date&time functions work', () => {
require('./functions/test.datetime')
})
it ('cryptography code works', () => {
require('./functions/test.crypto')
})
/* ------------------------------------------------------------------------ */
it ('calculateFee() works', () => {
const price = 100.00
const amount = 10.00
const taker = 0.0025
const maker = 0.0010
const fees = { taker, maker }
const market = {
'id': 'foobar',
'symbol': 'FOO/BAR',
'base': 'FOO',
'quote': 'BAR',
'taker': taker,
'maker': maker,
'precision': {
'amount': 8,
'price': 8,
},
}
const exchange = new Exchange ({
'id': 'mock',
'markets': {
'FOO/BAR': market,
},
})
Object.keys (fees).forEach (takerOrMaker => {
const result = exchange.calculateFee (market['symbol'], 'limit', 'sell', amount, price, takerOrMaker, {})
deepEqual (result, {
'type': takerOrMaker,
'currency': 'BAR',
'rate': fees[takerOrMaker],
'cost': fees[takerOrMaker] * amount * price,
})
})
})
/* ------------------------------------------------------------------------ */
it.skip ('exchange config extension works', () => {
cost = { min: 0.001, max: 1000 }
precision = { amount: 3 }
const exchange = new binance ({
'markets': {
'ETH/BTC': { limits: { cost }, precision },
},
})
deepEqual (exchange.markets['ETH/BTC'].limits.cost, cost)
deepEqual (exchange.markets['ETH/BTC'].precision, { price: 6, amount: 3 })
deepEqual (exchange.markets['ETH/BTC'].symbol, 'ETH/BTC')
})
/* ------------------------------------------------------------------------ */
it ('aggregate() works', () => {
const bids = [
[ 789.1, 123.0 ],
[ 789.100, 123.0 ],
[ 123.0, 456.0 ],
[ 789.0, 123.0 ],
[ 789.10, 123.0 ],
]
const asks = [
[ 123.0, 456.0 ],
[ 789.0, 123.0 ],
[ 789.10, 123.0 ],
]
deepEqual (aggregate (bids.sort ()), [
[ 123.0, 456.0 ],
[ 789.0, 123.0 ],
[ 789.1, 369.0 ],
])
deepEqual (aggregate (asks.sort ()), [
[ 123.0, 456.0 ],
[ 789.0, 123.0 ],
[ 789.10, 123.0 ],
])
deepEqual (aggregate ([]), [])
})
/* ------------------------------------------------------------------------ */
it ('parseBalance() works', () => {
const exchange = new Exchange ({
'markets': {
'ETH/BTC': { 'id': 'ETH/BTC', 'symbol': 'ETH/BTC', 'base': 'ETH', 'quote': 'BTC', }
}
})
const input = {
'ETH': { 'free': 10, 'used': 10, 'total': 20 },
'ZEC': { 'free': 0, 'used': 0, 'total': 0 },
}
const expected = {
'ETH': { 'free': 10, 'used': 10, 'total': 20 },
'ZEC': { 'free': 0, 'used': 0, 'total': 0 },
'free': {
'ETH': 10,
'ZEC': 0,
},
'used': {
'ETH': 10,
'ZEC': 0,
},
'total': {
'ETH': 20,
'ZEC': 0,
},
}
const actual = exchange.parseBalance (input)
deepEqual (actual, expected)
})
/* ------------------------------------------------------------------------ */
it ('camelCase/camel_case property conversion works', () => {
const exchange = new Exchange ({ 'id': 'mock' })
const propsSeenBefore = index (
["isNode", "empty", "keys", "values", "extend", "clone", "index", "ordered", "unique", "keysort", "indexBy", "groupBy", "filterBy", "sortBy", "flatten", "pluck", "omit", "sum", "deepExtend", "uuid", "unCamelCase", "capitalize", "isNumber", "isArray", "isObject", "isString", "isStringCoercible", "isDictionary", "hasProps", "prop", "asFloat", "asInteger", "safeFloat", "safeInteger", "safeValue", "safeString", "decimal", "toFixed", "truncate", "truncateToString", "precisionFromString", "stringToBinary", "stringToBase64", "utf16ToBase64", "base64ToBinary", "base64ToString", "binaryToString", "binaryConcat", "urlencode", "rawencode", "urlencodeBase64", "hash", "hmac", "jwt", "time", "setTimeout_safe", "sleep", "TimedOut", "timeout", "throttle", "json", "unjson", "aggregate", "is_node", "index_by", "group_by", "filter_by", "sort_by", "deep_extend", "un_camel_case", "is_number", "is_array", "is_object", "is_string", "is_string_coercible", "is_dictionary", "has_props", "as_float", "as_integer", "safe_float", "safe_integer", "safe_value", "safe_string", "to_fixed", "truncate_to_string", "precision_from_string", "string_to_binary", "string_to_base64", "utf16To_base64", "base64To_binary", "base64To_string", "binary_to_string", "binary_concat", "urlencode_base64", "set_timeout_safe", "Timed_out", "encode", "decode", "userAgents", "headers", "proxy", "origin", "iso8601", "parse8601", "milliseconds", "microseconds", "seconds", "id", "enableRateLimit", "rateLimit", "parseJsonResponse", "substituteCommonCurrencyCodes", "parseBalanceFromOpenOrders", "verbose", "debug", "journal", "userAgent", "twofa", "timeframes", "hasPublicAPI", "hasPrivateAPI", "hasCORS", "hasDeposit", "hasFetchBalance", "hasFetchClosedOrders", "hasFetchCurrencies", "hasFetchMyTrades", "hasFetchOHLCV", "hasFetchOpenOrders", "hasFetchOrder", "hasFetchOrderBook", "hasFetchOrders", "hasFetchTicker", "hasFetchTickers", "hasFetchBidsAsks", "hasFetchTrades", "hasWithdraw", "hasCreateOrder", "hasCancelOrder", "apiKey", "secret", "uid", "login", "password", "requiredCredentials", "exceptions", "balance", "orderbooks", "tickers", "fees", "orders", "trades", "currencies", "last_http_response", "last_json_response", "arrayConcat", "market_id", "market_ids", "array_concat", "implode_params", "extract_params", "fetch_balance", "fetch_free_balance", "fetch_used_balance","fetch_total_balance", "fetch_l2_order_book", "fetch_order_book", "fetch_bids_asks", "fetch_tickers", "fetch_ticker", "fetch_trades", "fetch_order", "fetch_orders", "fetch_open_orders", "fetch_closed_orders", "fetch_order_status", "fetch_markets", "load_markets", "set_markets", "parse_balance", "parse_bid_ask", "parse_bids_asks", "parse_order_book", "parse_trades", "parse_orders", "parse_ohlcv", "parse_ohlcvs", "edit_limit_buy_order", "edit_limit_sell_order", "edit_limit_order", "edit_order", "create_limit_buy_order", "create_limit_sell_order", "create_market_buy_order", "create_market_sell_order", "create_order", "calculate_fee", "common_currency_code", "price_to_precision", "amount_to_precision", "amount_to_string", "fee_to_precision", "cost_to_precision", "constructor", "getMarket", "describe", "defaults", "nonce", "encodeURIComponent", "checkRequiredCredentials", "initRestRateLimiter", "defineRestApi", "fetch", "fetch2", "request", "handleErrors", "defaultErrorHandler", "handleRestErrors", "handleRestResponse", "setMarkets", "loadMarkets", "fetchBidsAsks", "fetchTickers", "fetchOrder", "fetchOrders", "fetchOpenOrders", "fetchClosedOrders", "fetchMyTrades", "fetchCurrencies", "fetchMarkets", "fetchOrderStatus", "account", "commonCurrencyCode", "currency", "market", "marketId", "marketIds", "symbol", "extractParams", "implodeParams", "url", "parseBidAsk", "parseBidsAsks", "fetchL2OrderBook", "parseOrderBook", "parseBalance", "fetchPartialBalance", "fetchFreeBalance", "fetchUsedBalance", "fetchTotalBalance", "filterBySinceLimit", "parseTrades", "parseOrders", "filterOrdersBySymbol", "parseOHLCV", "parseOHLCVs", "editLimitBuyOrder", "editLimitSellOrder", "editLimitOrder", "editOrder", "createLimitBuyOrder", "createLimitSellOrder", "createMarketBuyOrder", "createMarketSellOrder", "costToPrecision", "priceToPrecision", "amountToPrecision", "amountToLots", "feeToPrecision", "calculateFee", "Ymd", "YmdHMS"]
)
const props = index (Object.getOwnPropertyNames (exchange).concat (
Object.getOwnPropertyNames (exchange.constructor.prototype)))
for (const k of Array.from (propsSeenBefore))
if (this[k] && !props.has (k))
throw new Error (`missing prop: ${k}`)
for (const k of Array.from (props))
if (!propsSeenBefore.has (k))
log.magenta.noLocate (`+ ${k}`)
})
/* ------------------------------------------------------------------------ */
it ('camelCase/camel_case property conversion works #2', () => {
class Derived extends Exchange {}
const derived = new Derived ()
equal (typeof derived.load_markets, 'function')
})
/* ------------------------------------------------------------------------ */
it ('legacy .hasSomething maps to has.something automatically', () => {
const exchange = new Exchange ({
id: 'mock',
has: {
CORS: true,
publicAPI: false,
fetchDepositAddress: 'emulated'
}
})
equal (exchange.hasCORS, true)
equal (exchange.hasPublicAPI, false)
equal (exchange.hasFetchDepositAddress, true)
})
/* ------------------------------------------------------------------------ */
if (Exchange.hasWeb3 ()) {
it ('getZeroExOrderHashV2 return valid signature for example order', () => {
// based on https://github.com/0xProject/0x-monorepo/blob/development/python-packages/order_utils/test/test_generate_order_hash_hex.py
const exampleOrder = {
"makerAddress": "0x0000000000000000000000000000000000000000",
"takerAddress": "0x0000000000000000000000000000000000000000",
"senderAddress": "0x0000000000000000000000000000000000000000",
"feeRecipientAddress": "0x0000000000000000000000000000000000000000",
"makerAssetData": "0x0000000000000000000000000000000000000000",
"takerAssetData": "0x0000000000000000000000000000000000000000",
"salt": "0",
"makerFee": "0",
"takerFee": "0",
"makerAssetAmount": "0",
"takerAssetAmount": "0",
"expirationTimeSeconds": "0",
"exchangeAddress": "0x0000000000000000000000000000000000000000",
}
const expectedOrderHash = '0xfaa49b35faeb9197e9c3ba7a52075e6dad19739549f153b77dfcf59408a4b422';
class Derived extends Exchange {}
const derived = new Derived ()
const orderHash = derived.getZeroExOrderHashV2(exampleOrder)
equal (orderHash, expectedOrderHash)
})
}
})
/* ------------------------------------------------------------------------ */