@cityofzion/blockchain-service 1.18.0 → 1.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -24,6 +24,4 @@ type NormalizedHashOptions = {
24
24
  };
25
25
  export declare function normalizeHash(hash: string, options?: NormalizedHashOptions): string;
26
26
  export declare function denormalizeHash(hash: string): string;
27
- export declare function countDecimals(value: string | number): number;
28
- export declare function formatNumber(value?: string | number, decimals?: number): string;
29
27
  export {};
package/dist/functions.js CHANGED
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.formatNumber = exports.countDecimals = exports.denormalizeHash = exports.normalizeHash = exports.generateAccountForBlockchainService = exports.generateAccount = exports.fetchAccounts = exports.waitForAccountTransaction = exports.waitForTransaction = exports.wait = exports.hasLedger = exports.hasExplorerService = exports.hasNft = exports.isCalculableFee = exports.isClaimable = exports.hasNameService = void 0;
12
+ exports.denormalizeHash = exports.normalizeHash = exports.generateAccountForBlockchainService = exports.generateAccount = exports.fetchAccounts = exports.waitForAccountTransaction = exports.waitForTransaction = exports.wait = exports.hasLedger = exports.hasExplorerService = exports.hasNft = exports.isCalculableFee = exports.isClaimable = exports.hasNameService = void 0;
13
13
  function hasNameService(service) {
14
14
  return 'resolveNameServiceDomain' in service && 'validateNameServiceDomainFormat' in service;
15
15
  }
@@ -51,7 +51,7 @@ function waitForTransaction(service, txId) {
51
51
  yield service.blockchainDataService.getTransaction(txId);
52
52
  return true;
53
53
  }
54
- catch (_b) {
54
+ catch (_a) {
55
55
  // Empty block
56
56
  }
57
57
  attempts++;
@@ -73,7 +73,7 @@ function waitForAccountTransaction(params) {
73
73
  if (isTransactionConfirmed)
74
74
  return true;
75
75
  }
76
- catch (_b) {
76
+ catch (_a) {
77
77
  // Empty block
78
78
  }
79
79
  attempts++;
@@ -96,7 +96,7 @@ function fetchAccounts(blockchainServices, initialIndex, getAccountCallback) {
96
96
  if (!transactions || transactions.length <= 0)
97
97
  shouldBreak = true;
98
98
  }
99
- catch (_b) {
99
+ catch (_a) {
100
100
  shouldBreak = true;
101
101
  }
102
102
  accounts.push(generatedAccount);
@@ -123,9 +123,9 @@ function generateAccountForBlockchainService(blockchainServices, getAccountCallb
123
123
  return __awaiter(this, void 0, void 0, function* () {
124
124
  const accountsByBlockchainService = new Map();
125
125
  const promises = blockchainServices.map((service) => __awaiter(this, void 0, void 0, function* () {
126
- var _b;
126
+ var _a;
127
127
  const firstAccount = yield getAccountCallback(service, 0);
128
- const untilIndex = (_b = untilIndexByBlockchainService === null || untilIndexByBlockchainService === void 0 ? void 0 : untilIndexByBlockchainService[service.name]) === null || _b === void 0 ? void 0 : _b[firstAccount.address];
128
+ const untilIndex = (_a = untilIndexByBlockchainService === null || untilIndexByBlockchainService === void 0 ? void 0 : untilIndexByBlockchainService[service.name]) === null || _a === void 0 ? void 0 : _a[firstAccount.address];
129
129
  if (untilIndex === undefined) {
130
130
  const accounts = yield fetchAccounts(service, 1, getAccountCallback);
131
131
  accountsByBlockchainService.set(service.name, [firstAccount, ...accounts]);
@@ -152,29 +152,3 @@ function denormalizeHash(hash) {
152
152
  return hash.startsWith('0x') ? hash : `0x${hash}`;
153
153
  }
154
154
  exports.denormalizeHash = denormalizeHash;
155
- function countDecimals(value) {
156
- var _b;
157
- const [, decimals] = value.toString().split('.');
158
- return (_b = decimals === null || decimals === void 0 ? void 0 : decimals.length) !== null && _b !== void 0 ? _b : 0;
159
- }
160
- exports.countDecimals = countDecimals;
161
- function formatNumber(value, decimals = 0) {
162
- if (!value)
163
- return '0';
164
- let newValue = typeof value === 'number' ? value.toFixed(decimals) : value;
165
- newValue = newValue.replace(/,|\.\.|\.,/g, '.');
166
- if (decimals === 0) {
167
- newValue = newValue.split('.')[0];
168
- }
169
- else {
170
- newValue = newValue.replace(/[^\d.]/g, '');
171
- const countedDecimals = countDecimals(newValue);
172
- if (countedDecimals > decimals) {
173
- newValue = newValue.slice(0, newValue.length - countedDecimals + decimals);
174
- }
175
- }
176
- return newValue.replace(/\s|-/g, '').replace(/^([^.]*\.)(.*)$/, function (_a, b, c) {
177
- return b + c.replace(/\./g, '');
178
- });
179
- }
180
- exports.formatNumber = formatNumber;
@@ -0,0 +1,16 @@
1
+ type FormatNumberOptions = {
2
+ decimals?: number;
3
+ shouldRemoveLeadingZero?: boolean;
4
+ shouldRemoveTrailingZero?: boolean;
5
+ };
6
+ export declare class BSNumberHelper {
7
+ static readonly sciNotationRegex: RegExp;
8
+ static countDecimals(value: string | number): number;
9
+ static sanitizeCommasAndDotsInNumber(value: string): string;
10
+ static isSciNotationValue(value: string): boolean;
11
+ static convertSciNotationValueToString(value: number): string;
12
+ static removeLeadingZero(value: string): string;
13
+ static removeTrailingZero(value: string): string;
14
+ static formatNumber(value?: string | number, options?: FormatNumberOptions): string;
15
+ }
16
+ export {};
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BSNumberHelper = void 0;
4
+ class BSNumberHelper {
5
+ static countDecimals(value) {
6
+ var _b;
7
+ const [, decimals] = value.toString().split('.');
8
+ return (_b = decimals === null || decimals === void 0 ? void 0 : decimals.length) !== null && _b !== void 0 ? _b : 0;
9
+ }
10
+ static sanitizeCommasAndDotsInNumber(value) {
11
+ let newValue = value.replace(/,|\.\.|\.,|,,/g, '.');
12
+ const parts = newValue.split('.');
13
+ if (parts.length > 2)
14
+ newValue = `${parts[0]}.${parts.slice(1).join('')}`;
15
+ return newValue;
16
+ }
17
+ static isSciNotationValue(value) {
18
+ return BSNumberHelper.sciNotationRegex.test(value);
19
+ }
20
+ static convertSciNotationValueToString(value) {
21
+ if (Math.abs(value) < 1.0) {
22
+ const parts = value.toString().split('e-');
23
+ const hasNegativeExponent = parts.length === 2;
24
+ if (hasNegativeExponent) {
25
+ const negativeExponent = parseInt(parts[1], 10);
26
+ value *= Math.pow(10, negativeExponent - 1);
27
+ return `0.${'0'.repeat(negativeExponent - 1)}${value.toString().substring(2)}`;
28
+ }
29
+ }
30
+ return value.toString();
31
+ }
32
+ static removeLeadingZero(value) {
33
+ return value.replace(/^0+(?!\.)/, '') || '0';
34
+ }
35
+ static removeTrailingZero(value) {
36
+ return value.replace(/(\.\d*?[1-9])0+$/g, '$1').replace(/\.0+$/, '');
37
+ }
38
+ static formatNumber(value, options) {
39
+ if (!value)
40
+ return '0';
41
+ const { decimals = 0, shouldRemoveLeadingZero = true, shouldRemoveTrailingZero = true } = options !== null && options !== void 0 ? options : {};
42
+ let newValue = typeof value === 'number' ? value.toString() : value.trim();
43
+ newValue = BSNumberHelper.sanitizeCommasAndDotsInNumber(newValue);
44
+ const newValueAsNumber = Number(newValue);
45
+ if (isNaN(newValueAsNumber))
46
+ return '0';
47
+ const isNegativeValue = newValue.startsWith('-');
48
+ if (BSNumberHelper.isSciNotationValue(newValue))
49
+ newValue = BSNumberHelper.convertSciNotationValueToString(newValueAsNumber);
50
+ if (decimals === 0)
51
+ newValue = newValue.split('.')[0];
52
+ else {
53
+ newValue = newValue.replace(/[^\d.]/g, '');
54
+ const countedDecimals = BSNumberHelper.countDecimals(newValue);
55
+ if (countedDecimals > decimals)
56
+ newValue = newValue.slice(0, newValue.length - countedDecimals + decimals);
57
+ }
58
+ newValue = newValue.replace(/\s|-/g, '').replace(/^([^.]*\.)(.*)$/, (_a, b, c) => b + c.replace(/\./g, ''));
59
+ if (shouldRemoveLeadingZero)
60
+ newValue = BSNumberHelper.removeLeadingZero(newValue);
61
+ if (shouldRemoveTrailingZero)
62
+ newValue = BSNumberHelper.removeTrailingZero(newValue);
63
+ if (newValue.startsWith('.'))
64
+ newValue = `0${newValue}`;
65
+ if (newValue.endsWith('.'))
66
+ newValue = newValue.slice(0, newValue.length - 1);
67
+ if (!newValue)
68
+ newValue = '0';
69
+ if (newValue !== '0' && isNegativeValue)
70
+ newValue = `-${newValue}`;
71
+ return newValue;
72
+ }
73
+ }
74
+ exports.BSNumberHelper = BSNumberHelper;
75
+ BSNumberHelper.sciNotationRegex = /^[+-]?\d+(\.\d+)?e[+-]?\d+$/i;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './constants/BSCommonConstants';
2
2
  export * from './helpers/BSFullTransactionsByAddressHelper';
3
3
  export * from './helpers/BSPromisesHelper';
4
+ export * from './helpers/BSNumberHelper';
4
5
  export * from './services/exchange-data/CryptoCompareEDS';
5
6
  export * from './services/exchange-data/FlamingoForthewinEDS';
6
7
  export * from './BSAggregator';
package/dist/index.js CHANGED
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./constants/BSCommonConstants"), exports);
18
18
  __exportStar(require("./helpers/BSFullTransactionsByAddressHelper"), exports);
19
19
  __exportStar(require("./helpers/BSPromisesHelper"), exports);
20
+ __exportStar(require("./helpers/BSNumberHelper"), exports);
20
21
  __exportStar(require("./services/exchange-data/CryptoCompareEDS"), exports);
21
22
  __exportStar(require("./services/exchange-data/FlamingoForthewinEDS"), exports);
22
23
  __exportStar(require("./BSAggregator"), exports);
@@ -76,12 +76,17 @@ export interface BSWithLedger<BSName extends string = string> {
76
76
  ledgerService: LedgerService<BSName>;
77
77
  generateAccountFromPublicKey(publicKey: string): Account<BSName>;
78
78
  }
79
+ export type TransactionNotificationTypedResponse = {
80
+ type: string;
81
+ value?: string;
82
+ };
83
+ export type TransactionNotificationStateResponse = {
84
+ type: string;
85
+ value?: string | TransactionNotificationTypedResponse[];
86
+ };
79
87
  export type TransactionNotifications = {
80
88
  eventName: string;
81
- state: {
82
- type: string;
83
- value: string;
84
- }[];
89
+ state?: TransactionNotificationStateResponse | TransactionNotificationStateResponse[];
85
90
  };
86
91
  export type TransactionTransferAsset = {
87
92
  amount: string;
@@ -132,7 +137,7 @@ export type ExportTransactionsByAddressParams = {
132
137
  };
133
138
  export type FullTransactionNftEvent = {
134
139
  eventType: 'nft';
135
- amount: string;
140
+ amount?: string;
136
141
  methodName: string;
137
142
  hash: string;
138
143
  hashUrl?: string;
@@ -149,7 +154,7 @@ export type FullTransactionNftEvent = {
149
154
  };
150
155
  export type FullTransactionAssetEvent = {
151
156
  eventType: 'token';
152
- amount: string;
157
+ amount?: string;
153
158
  methodName: string;
154
159
  hash: string;
155
160
  hashUrl?: string;
@@ -167,8 +172,8 @@ export type FullTransactionsItem = {
167
172
  date: string;
168
173
  invocationCount: number;
169
174
  notificationCount: number;
170
- networkFeeAmount: string;
171
- systemFeeAmount: string;
175
+ networkFeeAmount?: string;
176
+ systemFeeAmount?: string;
172
177
  events: (FullTransactionAssetEvent | FullTransactionNftEvent)[];
173
178
  };
174
179
  export type FullTransactionsByAddressResponse = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cityofzion/blockchain-service",
3
- "version": "1.18.0",
3
+ "version": "1.18.2",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "repository": "https://github.com/CityOfZion/blockchain-services",
@@ -11,12 +11,16 @@
11
11
  ],
12
12
  "devDependencies": {
13
13
  "@types/node": "~20.2.5",
14
+ "@types/jest": "29.5.3",
14
15
  "@typescript-eslint/eslint-plugin": "^6.5.0",
15
16
  "@typescript-eslint/parser": "^6.5.0",
17
+ "dotenv": "16.3.1",
16
18
  "eslint": "^8.48.0",
17
19
  "ts-node": "10.9.1",
18
20
  "typescript": "4.9.5",
19
- "typed-emitter": "~2.1.0"
21
+ "typed-emitter": "~2.1.0",
22
+ "jest": "29.6.2",
23
+ "ts-jest": "29.1.1"
20
24
  },
21
25
  "dependencies": {
22
26
  "@ledgerhq/hw-transport": "~6.30.5",
@@ -24,7 +28,8 @@
24
28
  "date-fns": "~4.1.0"
25
29
  },
26
30
  "scripts": {
27
- "build": "tsc",
31
+ "build": "tsc --project tsconfig.build.json",
32
+ "test": "jest --config jest.config.ts",
28
33
  "lint": "eslint .",
29
34
  "format": "eslint --fix"
30
35
  }