@v3finance/monitoring-sdk 0.1.0 → 0.2.0

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.
Files changed (154) hide show
  1. package/CHANGELOG.md +21 -11
  2. package/README.md +223 -148
  3. package/dist/cjs/client.d.ts +23 -42
  4. package/dist/cjs/client.d.ts.map +1 -1
  5. package/dist/cjs/client.js +44 -53
  6. package/dist/cjs/client.js.map +1 -1
  7. package/dist/cjs/core/errors.d.ts +18 -18
  8. package/dist/cjs/core/errors.d.ts.map +1 -1
  9. package/dist/cjs/core/errors.js +17 -17
  10. package/dist/cjs/core/errors.js.map +1 -1
  11. package/dist/cjs/core/http.d.ts +22 -26
  12. package/dist/cjs/core/http.d.ts.map +1 -1
  13. package/dist/cjs/core/http.js +28 -36
  14. package/dist/cjs/core/http.js.map +1 -1
  15. package/dist/cjs/core/pagination.d.ts +6 -7
  16. package/dist/cjs/core/pagination.d.ts.map +1 -1
  17. package/dist/cjs/core/pagination.js +1 -1
  18. package/dist/cjs/core/pagination.js.map +1 -1
  19. package/dist/cjs/core/scope.d.ts +8 -0
  20. package/dist/cjs/core/scope.d.ts.map +1 -0
  21. package/dist/cjs/core/scope.js +3 -0
  22. package/dist/cjs/core/scope.js.map +1 -0
  23. package/dist/cjs/generated/types.d.ts +129 -117
  24. package/dist/cjs/generated/types.d.ts.map +1 -1
  25. package/dist/cjs/generated/types.js +1 -1
  26. package/dist/cjs/generated/types.js.map +1 -1
  27. package/dist/cjs/index.d.ts +6 -6
  28. package/dist/cjs/index.d.ts.map +1 -1
  29. package/dist/cjs/index.js +13 -16
  30. package/dist/cjs/index.js.map +1 -1
  31. package/dist/cjs/resources/account.d.ts +12 -51
  32. package/dist/cjs/resources/account.d.ts.map +1 -1
  33. package/dist/cjs/resources/account.js +17 -61
  34. package/dist/cjs/resources/account.js.map +1 -1
  35. package/dist/cjs/resources/addresses.d.ts +49 -65
  36. package/dist/cjs/resources/addresses.d.ts.map +1 -1
  37. package/dist/cjs/resources/addresses.js +60 -69
  38. package/dist/cjs/resources/addresses.js.map +1 -1
  39. package/dist/cjs/resources/catalog.d.ts +17 -10
  40. package/dist/cjs/resources/catalog.d.ts.map +1 -1
  41. package/dist/cjs/resources/catalog.js +23 -17
  42. package/dist/cjs/resources/catalog.js.map +1 -1
  43. package/dist/cjs/resources/deliveries.d.ts +34 -23
  44. package/dist/cjs/resources/deliveries.d.ts.map +1 -1
  45. package/dist/cjs/resources/deliveries.js +27 -17
  46. package/dist/cjs/resources/deliveries.js.map +1 -1
  47. package/dist/cjs/resources/transactions.d.ts +14 -14
  48. package/dist/cjs/resources/transactions.d.ts.map +1 -1
  49. package/dist/cjs/resources/transactions.js +15 -16
  50. package/dist/cjs/resources/transactions.js.map +1 -1
  51. package/dist/cjs/resources/webhooks.d.ts +22 -0
  52. package/dist/cjs/resources/webhooks.d.ts.map +1 -0
  53. package/dist/cjs/resources/webhooks.js +35 -0
  54. package/dist/cjs/resources/webhooks.js.map +1 -0
  55. package/dist/cjs/units.d.ts +11 -11
  56. package/dist/cjs/units.js +14 -14
  57. package/dist/cjs/units.js.map +1 -1
  58. package/dist/cjs/version.d.ts +3 -3
  59. package/dist/cjs/version.d.ts.map +1 -1
  60. package/dist/cjs/version.js +3 -3
  61. package/dist/cjs/version.js.map +1 -1
  62. package/dist/cjs/webhooks.d.ts +33 -28
  63. package/dist/cjs/webhooks.d.ts.map +1 -1
  64. package/dist/cjs/webhooks.js +33 -28
  65. package/dist/cjs/webhooks.js.map +1 -1
  66. package/dist/esm/client.d.ts +23 -42
  67. package/dist/esm/client.d.ts.map +1 -1
  68. package/dist/esm/client.js +46 -55
  69. package/dist/esm/client.js.map +1 -1
  70. package/dist/esm/core/errors.d.ts +18 -18
  71. package/dist/esm/core/errors.d.ts.map +1 -1
  72. package/dist/esm/core/errors.js +17 -17
  73. package/dist/esm/core/errors.js.map +1 -1
  74. package/dist/esm/core/http.d.ts +22 -26
  75. package/dist/esm/core/http.d.ts.map +1 -1
  76. package/dist/esm/core/http.js +28 -36
  77. package/dist/esm/core/http.js.map +1 -1
  78. package/dist/esm/core/pagination.d.ts +6 -7
  79. package/dist/esm/core/pagination.d.ts.map +1 -1
  80. package/dist/esm/core/pagination.js +1 -1
  81. package/dist/esm/core/pagination.js.map +1 -1
  82. package/dist/esm/core/scope.d.ts +8 -0
  83. package/dist/esm/core/scope.d.ts.map +1 -0
  84. package/dist/esm/core/scope.js +2 -0
  85. package/dist/esm/core/scope.js.map +1 -0
  86. package/dist/esm/generated/types.d.ts +129 -117
  87. package/dist/esm/generated/types.d.ts.map +1 -1
  88. package/dist/esm/generated/types.js +1 -1
  89. package/dist/esm/generated/types.js.map +1 -1
  90. package/dist/esm/index.d.ts +6 -6
  91. package/dist/esm/index.d.ts.map +1 -1
  92. package/dist/esm/index.js +6 -6
  93. package/dist/esm/index.js.map +1 -1
  94. package/dist/esm/resources/account.d.ts +12 -51
  95. package/dist/esm/resources/account.d.ts.map +1 -1
  96. package/dist/esm/resources/account.js +15 -57
  97. package/dist/esm/resources/account.js.map +1 -1
  98. package/dist/esm/resources/addresses.d.ts +49 -65
  99. package/dist/esm/resources/addresses.d.ts.map +1 -1
  100. package/dist/esm/resources/addresses.js +60 -69
  101. package/dist/esm/resources/addresses.js.map +1 -1
  102. package/dist/esm/resources/catalog.d.ts +17 -10
  103. package/dist/esm/resources/catalog.d.ts.map +1 -1
  104. package/dist/esm/resources/catalog.js +23 -17
  105. package/dist/esm/resources/catalog.js.map +1 -1
  106. package/dist/esm/resources/deliveries.d.ts +34 -23
  107. package/dist/esm/resources/deliveries.d.ts.map +1 -1
  108. package/dist/esm/resources/deliveries.js +27 -17
  109. package/dist/esm/resources/deliveries.js.map +1 -1
  110. package/dist/esm/resources/transactions.d.ts +14 -14
  111. package/dist/esm/resources/transactions.d.ts.map +1 -1
  112. package/dist/esm/resources/transactions.js +15 -16
  113. package/dist/esm/resources/transactions.js.map +1 -1
  114. package/dist/esm/resources/webhooks.d.ts +22 -0
  115. package/dist/esm/resources/webhooks.d.ts.map +1 -0
  116. package/dist/esm/resources/webhooks.js +31 -0
  117. package/dist/esm/resources/webhooks.js.map +1 -0
  118. package/dist/esm/units.d.ts +11 -11
  119. package/dist/esm/units.js +14 -14
  120. package/dist/esm/units.js.map +1 -1
  121. package/dist/esm/version.d.ts +3 -3
  122. package/dist/esm/version.d.ts.map +1 -1
  123. package/dist/esm/version.js +3 -3
  124. package/dist/esm/version.js.map +1 -1
  125. package/dist/esm/webhooks.d.ts +33 -28
  126. package/dist/esm/webhooks.d.ts.map +1 -1
  127. package/dist/esm/webhooks.js +33 -28
  128. package/dist/esm/webhooks.js.map +1 -1
  129. package/package.json +8 -5
  130. package/src/client.ts +50 -61
  131. package/src/core/errors.ts +18 -18
  132. package/src/core/http.ts +45 -55
  133. package/src/core/pagination.ts +7 -8
  134. package/src/core/scope.ts +8 -0
  135. package/src/generated/types.ts +139 -125
  136. package/src/index.ts +7 -24
  137. package/src/resources/account.ts +18 -72
  138. package/src/resources/addresses.ts +84 -109
  139. package/src/resources/catalog.ts +28 -19
  140. package/src/resources/deliveries.ts +43 -30
  141. package/src/resources/transactions.ts +18 -17
  142. package/src/resources/webhooks.ts +36 -0
  143. package/src/units.ts +14 -14
  144. package/src/version.ts +3 -3
  145. package/src/webhooks.ts +37 -32
  146. package/dist/cjs/resources/clients.d.ts +0 -84
  147. package/dist/cjs/resources/clients.d.ts.map +0 -1
  148. package/dist/cjs/resources/clients.js +0 -102
  149. package/dist/cjs/resources/clients.js.map +0 -1
  150. package/dist/esm/resources/clients.d.ts +0 -84
  151. package/dist/esm/resources/clients.d.ts.map +0 -1
  152. package/dist/esm/resources/clients.js +0 -97
  153. package/dist/esm/resources/clients.js.map +0 -1
  154. package/src/resources/clients.ts +0 -135
@@ -2,33 +2,32 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TransactionsResource = void 0;
4
4
  const http_js_1 = require("../core/http.js");
5
- /** Любая транзакция сети по хешу — не только те, о которых пришёл вебхук */
5
+ /** Any transaction on a supported network, by hash. */
6
6
  class TransactionsResource {
7
- #http;
8
- constructor(http) {
9
- this.#http = http;
7
+ #scope;
8
+ /** @internal */
9
+ constructor(scope) {
10
+ this.#scope = scope;
10
11
  }
11
12
  /**
12
- * Статус, блок, подтверждения, финальность, комиссия и все переводы внутри транзакции; для ваших адресов —
13
- * направление и вебхуки, которые мы по ней отправили.
13
+ * Retrieves a transaction — not only the ones you were notified about: status, confirmations, finality, fee and
14
+ * every transfer inside it, plus your monitored addresses and the webhooks sent to you for it.
14
15
  *
15
- * `final: true` — транзакцию уже не отменить: в TRON блок солидифицирован (около минуты), в EVM —
16
- * финализирован (Ethereum — около 13 минут). Крупные суммы зачисляйте после `final`.
16
+ * `final: true` means the transaction can no longer be reverted: on TRON the block is solidified (about 1 minute),
17
+ * on EVM networks it is finalized (about 13 minutes on Ethereum). Credit large amounts once the transaction is final.
17
18
  *
18
- * Не больше 60 запросов в минуту на ключ; при превышении SDK подождёт и повторит.
19
- *
20
- * @param network - slug (`tron`, `ethereum`) или CAIP-2
21
- * @param hash - EVM — `0x` + 64 hex; TRON — 64 hex (можно с `0x`)
22
- * @throws {@link MonitoringApiError} 404 — такой транзакции в сети нет
19
+ * @param network - Network slug (`tron`, `ethereum`) or CAIP-2 ID.
20
+ * @param hash - EVM: `0x` followed by 64 hex characters. TRON: 64 hex characters.
21
+ * @throws {@link MonitoringApiError} `404` when the transaction does not exist on the network.
23
22
  *
24
23
  * @example
25
24
  * ```ts
26
- * const tx = await monitoring.transactions.get('tron', webhook.tx.id)
27
- * if (tx.status === 'success' && tx.final) credit(webhook)
25
+ * const tx = await monitoring.transactions.get('tron', event.tx.id)
26
+ * if (tx.status === 'success' && tx.final) await credit(event.tx)
28
27
  * ```
29
28
  */
30
29
  get(network, hash, options) {
31
- return this.#http.request({ method: 'GET', path: `/v1/networks/${(0, http_js_1.seg)(network)}/transactions/${(0, http_js_1.seg)(hash)}`, idempotent: true, options });
30
+ return this.#scope.http.request({ method: 'GET', path: `/v1/networks/${(0, http_js_1.seg)(network)}/transactions/${(0, http_js_1.seg)(hash)}`, idempotent: true, options });
32
31
  }
33
32
  }
34
33
  exports.TransactionsResource = TransactionsResource;
@@ -1 +1 @@
1
- {"version":3,"file":"transactions.js","sourceRoot":"","sources":["../../../src/resources/transactions.ts"],"names":[],"mappings":";;;AAAA,6CAA2E;AAG3E,4EAA4E;AAC5E;IACW,KAAK,CAAY;IAC1B,YAAY,IAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;IACnB,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,GAAG,CAAC,OAAe,EAAE,IAAY,EAAE,OAAwB;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,OAAO,CAAC,iBAAiB,IAAA,aAAG,EAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;IACzI,CAAC;CACF"}
1
+ {"version":3,"file":"transactions.js","sourceRoot":"","sources":["../../../src/resources/transactions.ts"],"names":[],"mappings":";;;AAAA,6CAA0D;AAI1D,uDAAuD;AACvD;IACW,MAAM,CAAO;IAEtB,gBAAgB;IAChB,YAAY,KAAY;QACtB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;IACrB,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,GAAG,CAAC,OAAe,EAAE,IAAY,EAAE,OAAwB;QACzD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,IAAA,aAAG,EAAC,OAAO,CAAC,iBAAiB,IAAA,aAAG,EAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;IAC/I,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import type { RequestOptions } from '../core/http.js';
2
+ import type { Scope } from '../core/scope.js';
3
+ import type { TestWebhookRequest, TestWebhookResult } from '../generated/types.js';
4
+ /** Test your webhook endpoint. To receive webhooks, see {@link parseWebhook}. */
5
+ export declare class WebhooksResource {
6
+ #private;
7
+ /** @internal */
8
+ constructor(scope: Scope);
9
+ /**
10
+ * Sends a signed test webhook to your webhook URL and returns the outcome, the signature and the exact body sent.
11
+ * Test webhooks have `"test": true` in the body and the `x-webhook-test: 1` header — do not credit them.
12
+ * Limited to 10 per minute.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const { delivery } = await monitoring.webhooks.sendTest({ asset: 'USDT' })
17
+ * if (!delivery.ok) console.error('Endpoint responded with', delivery.status ?? delivery.error)
18
+ * ```
19
+ */
20
+ sendTest(params?: TestWebhookRequest, options?: RequestOptions): Promise<TestWebhookResult>;
21
+ }
22
+ //# sourceMappingURL=webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../../src/resources/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAElF,iFAAiF;AACjF,qBAAa,gBAAgB;;IAG3B,gBAAgB;IAChB,YAAY,KAAK,EAAE,KAAK,EAEvB;IAED;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,MAAM,GAAE,kBAAuB,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAUpG;CACF"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebhooksResource = void 0;
4
+ /** Test your webhook endpoint. To receive webhooks, see {@link parseWebhook}. */
5
+ class WebhooksResource {
6
+ #scope;
7
+ /** @internal */
8
+ constructor(scope) {
9
+ this.#scope = scope;
10
+ }
11
+ /**
12
+ * Sends a signed test webhook to your webhook URL and returns the outcome, the signature and the exact body sent.
13
+ * Test webhooks have `"test": true` in the body and the `x-webhook-test: 1` header — do not credit them.
14
+ * Limited to 10 per minute.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * const { delivery } = await monitoring.webhooks.sendTest({ asset: 'USDT' })
19
+ * if (!delivery.ok) console.error('Endpoint responded with', delivery.status ?? delivery.error)
20
+ * ```
21
+ */
22
+ async sendTest(params = {}, options) {
23
+ return this.#scope.http.request({
24
+ method: 'POST',
25
+ path: `${await this.#scope.clientPath()}/webhooks/test`,
26
+ body: params,
27
+ idempotent: false,
28
+ // 502 means "your endpoint did not accept it": an outcome, not a failed request
29
+ acceptStatuses: [502],
30
+ options,
31
+ });
32
+ }
33
+ }
34
+ exports.WebhooksResource = WebhooksResource;
35
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../src/resources/webhooks.ts"],"names":[],"mappings":";;;AAIA,iFAAiF;AACjF;IACW,MAAM,CAAO;IAEtB,gBAAgB;IAChB,YAAY,KAAY;QACtB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;IACrB,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAuB,EAAE,EAAE,OAAwB;QACtE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YAC9B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,gBAAgB;YACvD,IAAI,EAAE,MAAM;YACZ,UAAU,EAAE,KAAK;YACjB,gFAAgF;YAChF,cAAc,EAAE,CAAC,GAAG,CAAC;YACrB,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -1,28 +1,28 @@
1
1
  /**
2
- * Суммы в API и вебхуках — строки в минимальных единицах (sun, wei; у USDT 6 знаков после запятой): uint256 не
3
- * помещается в `number`. Эти функции переводят их в привычный вид и обратно без потери точности.
4
- * Знаки после запятой актива — `decimals` из `monitoring.assets.list()`.
2
+ * Amounts in the API and in webhooks are decimal strings in the asset's smallest unit (sun, wei; USDT has 6 decimals),
3
+ * because uint256 values do not fit in a `number`. These helpers convert them without losing precision. The decimals
4
+ * of every asset are returned by `monitoring.assets.list()`.
5
5
  */
6
6
  /**
7
- * Минимальные единицы → строка в монетах.
7
+ * Converts an amount in the smallest unit to a decimal string.
8
8
  *
9
9
  * @example
10
10
  * ```ts
11
- * formatUnits('100000000', 6) // '100' — 100 USDT
12
- * formatUnits('1500000', 6) // '1.5'
13
- * formatUnits('10090000000000000', 18) // '0.01009' — ETH
11
+ * formatUnits('100000000', 6) // '100' — 100 USDT
12
+ * formatUnits('1500000', 6) // '1.5'
13
+ * formatUnits('10090000000000000', 18) // '0.01009' — ETH
14
14
  * ```
15
15
  */
16
16
  export declare function formatUnits(value: string | bigint, decimals: number): string;
17
17
  /**
18
- * Строка в монетах → минимальные единицы.
18
+ * Converts a decimal string to an amount in the smallest unit.
19
19
  *
20
- * @throws RangeError — больше знаков после запятой, чем у актива, или не число
20
+ * @throws RangeError when the amount is not a non-negative decimal or has more decimal places than the asset.
21
21
  *
22
22
  * @example
23
23
  * ```ts
24
- * parseUnits('1.5', 6) // '1500000'
25
- * parseUnits('100', 6) // '100000000'
24
+ * parseUnits('1.5', 6) // '1500000'
25
+ * parseUnits('100', 6) // '100000000'
26
26
  * ```
27
27
  */
28
28
  export declare function parseUnits(amount: string, decimals: number): string;
package/dist/cjs/units.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  /**
3
- * Суммы в API и вебхуках — строки в минимальных единицах (sun, wei; у USDT 6 знаков после запятой): uint256 не
4
- * помещается в `number`. Эти функции переводят их в привычный вид и обратно без потери точности.
5
- * Знаки после запятой актива — `decimals` из `monitoring.assets.list()`.
3
+ * Amounts in the API and in webhooks are decimal strings in the asset's smallest unit (sun, wei; USDT has 6 decimals),
4
+ * because uint256 values do not fit in a `number`. These helpers convert them without losing precision. The decimals
5
+ * of every asset are returned by `monitoring.assets.list()`.
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.formatUnits = formatUnits;
@@ -10,20 +10,20 @@ exports.parseUnits = parseUnits;
10
10
  const INTEGER = /^-?\d+$/;
11
11
  const DECIMAL = /^(\d+)(?:\.(\d+))?$/;
12
12
  /**
13
- * Минимальные единицы → строка в монетах.
13
+ * Converts an amount in the smallest unit to a decimal string.
14
14
  *
15
15
  * @example
16
16
  * ```ts
17
- * formatUnits('100000000', 6) // '100' — 100 USDT
18
- * formatUnits('1500000', 6) // '1.5'
19
- * formatUnits('10090000000000000', 18) // '0.01009' — ETH
17
+ * formatUnits('100000000', 6) // '100' — 100 USDT
18
+ * formatUnits('1500000', 6) // '1.5'
19
+ * formatUnits('10090000000000000', 18) // '0.01009' — ETH
20
20
  * ```
21
21
  */
22
22
  function formatUnits(value, decimals) {
23
23
  assertDecimals(decimals);
24
24
  const raw = typeof value === 'bigint' ? value.toString() : value.trim();
25
25
  if (!INTEGER.test(raw))
26
- throw new RangeError(`formatUnits: integer in minimal units expected, got ${JSON.stringify(value)}`);
26
+ throw new RangeError(`formatUnits: expected an integer amount in the smallest unit, got ${JSON.stringify(value)}`);
27
27
  const negative = raw.startsWith('-');
28
28
  const digits = (negative ? raw.slice(1) : raw).replace(/^0+(?=\d)/, '');
29
29
  if (decimals === 0)
@@ -35,21 +35,21 @@ function formatUnits(value, decimals) {
35
35
  return `${sign}${whole}${fraction ? `.${fraction}` : ''}`;
36
36
  }
37
37
  /**
38
- * Строка в монетах → минимальные единицы.
38
+ * Converts a decimal string to an amount in the smallest unit.
39
39
  *
40
- * @throws RangeError — больше знаков после запятой, чем у актива, или не число
40
+ * @throws RangeError when the amount is not a non-negative decimal or has more decimal places than the asset.
41
41
  *
42
42
  * @example
43
43
  * ```ts
44
- * parseUnits('1.5', 6) // '1500000'
45
- * parseUnits('100', 6) // '100000000'
44
+ * parseUnits('1.5', 6) // '1500000'
45
+ * parseUnits('100', 6) // '100000000'
46
46
  * ```
47
47
  */
48
48
  function parseUnits(amount, decimals) {
49
49
  assertDecimals(decimals);
50
50
  const m = DECIMAL.exec(amount.trim());
51
51
  if (!m)
52
- throw new RangeError(`parseUnits: non-negative decimal expected, got ${JSON.stringify(amount)}`);
52
+ throw new RangeError(`parseUnits: expected a non-negative decimal, got ${JSON.stringify(amount)}`);
53
53
  const fraction = m[2] ?? '';
54
54
  if (fraction.length > decimals)
55
55
  throw new RangeError(`parseUnits: ${amount} has more than ${decimals} decimal places`);
@@ -57,6 +57,6 @@ function parseUnits(amount, decimals) {
57
57
  }
58
58
  function assertDecimals(decimals) {
59
59
  if (!Number.isInteger(decimals) || decimals < 0 || decimals > 255)
60
- throw new RangeError(`decimals: integer 0..255 expected, got ${decimals}`);
60
+ throw new RangeError(`decimals: expected an integer from 0 to 255, got ${decimals}`);
61
61
  }
62
62
  //# sourceMappingURL=units.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/units.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;AAEH,MAAM,OAAO,GAAG,SAAS,CAAA;AACzB,MAAM,OAAO,GAAG,qBAAqB,CAAA;AAErC;;;;;;;;;GASG;AACH,qBAA4B,KAAsB,EAAE,QAAgB;IAClE,cAAc,CAAC,QAAQ,CAAC,CAAA;IACxB,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IACvE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,uDAAuD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC5H,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;IACpC,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IACvE,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,CAAC,QAAQ,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAA;IAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAA;IACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAC3D,MAAM,IAAI,GAAG,QAAQ,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/D,OAAO,GAAG,IAAI,GAAG,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AAC3D,CAAC;AAED;;;;;;;;;;GAUG;AACH,oBAA2B,MAAc,EAAE,QAAgB;IACzD,cAAc,CAAC,QAAQ,CAAC,CAAA;IACxB,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IACrC,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,kDAAkD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACxG,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ;QAAE,MAAM,IAAI,UAAU,CAAC,eAAe,MAAM,kBAAkB,QAAQ,iBAAiB,CAAC,CAAA;IACtH,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;AAClE,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,GAAG;QAAE,MAAM,IAAI,UAAU,CAAC,0CAA0C,QAAQ,EAAE,CAAC,CAAA;AAC/I,CAAC"}
1
+ {"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/units.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;AAEH,MAAM,OAAO,GAAG,SAAS,CAAA;AACzB,MAAM,OAAO,GAAG,qBAAqB,CAAA;AAErC;;;;;;;;;GASG;AACH,qBAA4B,KAAsB,EAAE,QAAgB;IAClE,cAAc,CAAC,QAAQ,CAAC,CAAA;IACxB,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IACvE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,qEAAqE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC1I,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;IACpC,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IACvE,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,CAAC,QAAQ,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAA;IAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAA;IACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAC3D,MAAM,IAAI,GAAG,QAAQ,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/D,OAAO,GAAG,IAAI,GAAG,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AAC3D,CAAC;AAED;;;;;;;;;;GAUG;AACH,oBAA2B,MAAc,EAAE,QAAgB;IACzD,cAAc,CAAC,QAAQ,CAAC,CAAA;IACxB,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IACrC,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,oDAAoD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC1G,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ;QAAE,MAAM,IAAI,UAAU,CAAC,eAAe,MAAM,kBAAkB,QAAQ,iBAAiB,CAAC,CAAA;IACtH,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;AAClE,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,GAAG;QAAE,MAAM,IAAI,UAAU,CAAC,oDAAoD,QAAQ,EAAE,CAAC,CAAA;AACzJ,CAAC"}
@@ -1,5 +1,5 @@
1
- /** Версия SDK: уходит в заголовке `user-agent`. Тест сверяет её с package.json */
2
- export declare const SDK_VERSION = "0.1.0";
3
- /** Адрес API по умолчанию */
1
+ /** SDK version, sent in the `user-agent` header. */
2
+ export declare const SDK_VERSION = "0.2.0";
3
+ /** Default API base URL. */
4
4
  export declare const DEFAULT_BASE_URL = "https://monitoring.v3.finance";
5
5
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,eAAO,MAAM,WAAW,UAAU,CAAA;AAElC,6BAA6B;AAC7B,eAAO,MAAM,gBAAgB,kCAAkC,CAAA"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,eAAO,MAAM,WAAW,UAAU,CAAA;AAElC,4BAA4B;AAC5B,eAAO,MAAM,gBAAgB,kCAAkC,CAAA"}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DEFAULT_BASE_URL = exports.SDK_VERSION = void 0;
4
- /** Версия SDK: уходит в заголовке `user-agent`. Тест сверяет её с package.json */
5
- exports.SDK_VERSION = '0.1.0';
6
- /** Адрес API по умолчанию */
4
+ /** SDK version, sent in the `user-agent` header. */
5
+ exports.SDK_VERSION = '0.2.0';
6
+ /** Default API base URL. */
7
7
  exports.DEFAULT_BASE_URL = 'https://monitoring.v3.finance';
8
8
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAA,kFAAkF;AACrE,QAAA,WAAW,GAAG,OAAO,CAAA;AAElC,6BAA6B;AAChB,QAAA,gBAAgB,GAAG,+BAA+B,CAAA"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAA,oDAAoD;AACvC,QAAA,WAAW,GAAG,OAAO,CAAA;AAElC,4BAA4B;AACf,QAAA,gBAAgB,GAAG,+BAA+B,CAAA"}
@@ -1,56 +1,60 @@
1
1
  /**
2
- * Приём вебхуков: проверка подписи и разбор тела. Работает без клиента API и без сети — нужен только секрет
3
- * подписи клиента. Использует WebCrypto: Node.js 20+, Bun, Deno, Cloudflare Workers.
2
+ * Receiving webhooks: signature verification and parsing. No API key or network access is needed — only your
3
+ * webhook secret. Uses Web Crypto, so it runs on Node.js 20+, Bun, Deno and Cloudflare Workers.
4
4
  */
5
5
  import type { WebhookPayload } from './generated/types.js';
6
- /** Заголовки вебхука */
6
+ /** Headers sent with every webhook. */
7
7
  export declare const WEBHOOK_HEADERS: {
8
- /** HMAC-SHA256 сырого тела секретом клиента, hex в нижнем регистре */
8
+ /** HMAC-SHA256 of the raw body keyed with your webhook secret, hex-encoded. */
9
9
  readonly signature: 'x-signature';
10
- /** id клиента */
10
+ /** Your client ID. */
11
11
  readonly clientId: 'x-client-id';
12
- /** `1` у тестового вебхука — такой не зачислять */
12
+ /** `1` for test webhooks. */
13
13
  readonly test: 'x-webhook-test';
14
14
  };
15
15
  /**
16
- * Тело вебхука ровно как пришло — сырые байты или строка. Не `JSON.parse` + `JSON.stringify`: подпись считается
17
- * по исходным байтам, и любое переформатирование её ломает.
16
+ * The raw request body, exactly as received. Do not parse and re-serialize the JSON: the signature is computed over
17
+ * the original bytes.
18
18
  */
19
19
  export type WebhookBody = string | Uint8Array | ArrayBuffer;
20
20
  /**
21
- * Откуда взять подпись: значение заголовка `x-signature` или все заголовки запроса — Fetch `Headers`
22
- * (Hono, Next.js, Workers) или объект Node.js (`req.headers` в Express, Fastify).
21
+ * Where to read the signature from: the value of the `x-signature` header, or all request headers — a Fetch
22
+ * `Headers` object (Next.js, Hono, Cloudflare Workers) or a Node.js headers object (`req.headers` in Express, Fastify).
23
23
  */
24
24
  export type SignatureSource = string | null | undefined | Headers | Record<string, string | string[] | undefined>;
25
25
  /**
26
- * Подпись тела секретом клиента — как её считает сервис. Нужна в тестах вашего обработчика вебхуков.
26
+ * Computes the signature of a body the way the API does. Useful for testing your webhook handler.
27
27
  *
28
28
  * @example
29
29
  * ```ts
30
- * const body = JSON.stringify({ tx: { …, id: 'test' } })
31
- * await fetch('http://localhost:3000/webhooks', { method: 'POST', body, headers: { 'x-signature': await signWebhookBody(body, secret) } })
30
+ * const body = JSON.stringify({ tx: { network: 'TRON', asset: 'USDT', … } })
31
+ * await fetch('http://localhost:3000/webhooks/monitoring', {
32
+ * method: 'POST',
33
+ * body,
34
+ * headers: { 'content-type': 'application/json', 'x-signature': await signWebhookBody(body, secret) },
35
+ * })
32
36
  * ```
33
37
  */
34
38
  export declare function signWebhookBody(body: WebhookBody, secret: string): Promise<string>;
35
39
  /**
36
- * Проверяет подпись вебхука: `true` — тело пришло от сервиса и не изменено.
40
+ * Verifies a webhook signature. Returns `true` when the body was sent by the API and was not modified.
37
41
  *
38
- * @param body - сырое тело запроса
39
- * @param signature - заголовок `x-signature` или все заголовки запроса
40
- * @param secret - секрет подписи клиента
42
+ * @param body - Raw request body.
43
+ * @param signature - The `x-signature` header, or all request headers.
44
+ * @param secret - Your webhook secret.
41
45
  */
42
46
  export declare function verifyWebhookSignature(body: WebhookBody, signature: SignatureSource, secret: string): Promise<boolean>;
43
47
  /**
44
- * Проверяет подпись и возвращает разобранный вебхук.
48
+ * Verifies the signature and returns the parsed webhook.
45
49
  *
46
- * Дальше — по правилам приёма: тестовый вебхук ({@link isTestWebhook}) не зачислять; один и тот же вебхук может
47
- * прийти повторно — обрабатывайте идемпотентно по {@link webhookIdempotencyKey}; ответьте 2xx в течение 15 секунд.
48
- * Вебхук уходит, как только перевод попал в блок, — для крупных сумм дождитесь финальности
49
- * (`monitoring.transactions.get(...).final`).
50
+ * Respond with a 2xx status within 15 seconds. Process webhooks idempotently by {@link webhookIdempotencyKey} — the
51
+ * same webhook may arrive more than once — and do not credit test webhooks ({@link isTestWebhook}). Webhooks are sent
52
+ * as soon as a transfer is included in a block; before crediting large amounts, check that the transaction is final
53
+ * with `monitoring.transactions.get()`.
50
54
  *
51
- * @throws {@link WebhookSignatureError} подпись не совпала — ответьте 401 и ничего не зачисляйте
55
+ * @throws {@link WebhookSignatureError} when the signature does not match. Respond with `401` and do not process it.
52
56
  *
53
- * @example Express — нужен сырой body
57
+ * @example Express (use the raw body)
54
58
  * ```ts
55
59
  * app.post('/webhooks/monitoring', express.raw({ type: 'application/json' }), async (req, res) => {
56
60
  * const event = await parseWebhook(req.body, req.headers, process.env.MONITORING_WEBHOOK_SECRET!)
@@ -59,17 +63,18 @@ export declare function verifyWebhookSignature(body: WebhookBody, signature: Sig
59
63
  * })
60
64
  * ```
61
65
  *
62
- * @example Hono, Next.js route handler, Cloudflare Workers
66
+ * @example Next.js route handlers, Hono, Cloudflare Workers
63
67
  * ```ts
64
68
  * const event = await parseWebhook(await request.text(), request.headers, env.MONITORING_WEBHOOK_SECRET)
65
69
  * ```
66
70
  */
67
71
  export declare function parseWebhook(body: WebhookBody, signature: SignatureSource, secret: string): Promise<WebhookPayload>;
68
- /** Тестовый вебхук (из панели или `clients.sendTestWebhook`) — такой не зачислять */
72
+ /** `true` for test webhooks. Do not credit them. */
69
73
  export declare function isTestWebhook(event: WebhookPayload): boolean;
70
74
  /**
71
- * Ключ идемпотентности вебхука: сеть, транзакция и номер лога. Один перевод — один ключ, даже если вебхук пришёл
72
- * несколько раз. В одной транзакции EVM может быть несколько переводов токенов — у них разный `logIndex`.
75
+ * Idempotency key of a webhook: network, transaction hash and log index. A transfer always has the same key, however
76
+ * many times its webhook is delivered. An EVM transaction can contain several token transfers; they differ by
77
+ * `logIndex`.
73
78
  *
74
79
  * @example `"TRON:1249cb…a5fc45:"`, `"ETHEREUM:0x3fbc…1d57:7"`
75
80
  */
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/webhooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE1D,wBAAwB;AACxB,eAAO,MAAM,eAAe;IAC1B,sEAAsE;aACtE,SAAS,EAAE,aAAa;IACxB,iBAAiB;aACjB,QAAQ,EAAE,aAAa;IACvB,mDAAmD;aACnD,IAAI,EAAE,gBAAgB;CACd,CAAA;AAEV;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,CAAA;AAE3D;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;AA0BjH;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIxF;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI5H;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAWzH;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAEnE"}
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/webhooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE1D,uCAAuC;AACvC,eAAO,MAAM,eAAe;IAC1B,+EAA+E;aAC/E,SAAS,EAAE,aAAa;IACxB,sBAAsB;aACtB,QAAQ,EAAE,aAAa;IACvB,6BAA6B;aAC7B,IAAI,EAAE,gBAAgB;CACd,CAAA;AAEV;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,CAAA;AAE3D;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;AA0BjH;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIxF;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI5H;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAWzH;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAE5D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAEnE"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /**
3
- * Приём вебхуков: проверка подписи и разбор тела. Работает без клиента API и без сети — нужен только секрет
4
- * подписи клиента. Использует WebCrypto: Node.js 20+, Bun, Deno, Cloudflare Workers.
3
+ * Receiving webhooks: signature verification and parsing. No API key or network access is needed — only your
4
+ * webhook secret. Uses Web Crypto, so it runs on Node.js 20+, Bun, Deno and Cloudflare Workers.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.WEBHOOK_HEADERS = void 0;
@@ -11,20 +11,20 @@ exports.parseWebhook = parseWebhook;
11
11
  exports.isTestWebhook = isTestWebhook;
12
12
  exports.webhookIdempotencyKey = webhookIdempotencyKey;
13
13
  const errors_js_1 = require("./core/errors.js");
14
- /** Заголовки вебхука */
14
+ /** Headers sent with every webhook. */
15
15
  exports.WEBHOOK_HEADERS = {
16
- /** HMAC-SHA256 сырого тела секретом клиента, hex в нижнем регистре */
16
+ /** HMAC-SHA256 of the raw body keyed with your webhook secret, hex-encoded. */
17
17
  signature: 'x-signature',
18
- /** id клиента */
18
+ /** Your client ID. */
19
19
  clientId: 'x-client-id',
20
- /** `1` у тестового вебхука — такой не зачислять */
20
+ /** `1` for test webhooks. */
21
21
  test: 'x-webhook-test',
22
22
  };
23
23
  const encoder = new TextEncoder();
24
24
  function bytesOf(body) {
25
25
  if (typeof body === 'string')
26
26
  return encoder.encode(body);
27
- // копия: WebCrypto не принимает view над SharedArrayBuffer (Buffer в Node.js — тоже Uint8Array)
27
+ // copy: Web Crypto does not accept views over a SharedArrayBuffer (a Node.js Buffer is a Uint8Array too)
28
28
  return body instanceof Uint8Array ? new Uint8Array(body) : new Uint8Array(body);
29
29
  }
30
30
  function signatureOf(source) {
@@ -37,7 +37,7 @@ function signatureOf(source) {
37
37
  const value = source[exports.WEBHOOK_HEADERS.signature];
38
38
  return Array.isArray(value) ? value[0] : value;
39
39
  }
40
- /** Сравнение без утечки по времени: время не зависит от того, где строки расходятся */
40
+ /** Constant-time comparison. */
41
41
  function safeEqual(a, b) {
42
42
  if (a.length !== b.length)
43
43
  return false;
@@ -47,12 +47,16 @@ function safeEqual(a, b) {
47
47
  return diff === 0;
48
48
  }
49
49
  /**
50
- * Подпись тела секретом клиента — как её считает сервис. Нужна в тестах вашего обработчика вебхуков.
50
+ * Computes the signature of a body the way the API does. Useful for testing your webhook handler.
51
51
  *
52
52
  * @example
53
53
  * ```ts
54
- * const body = JSON.stringify({ tx: { …, id: 'test' } })
55
- * await fetch('http://localhost:3000/webhooks', { method: 'POST', body, headers: { 'x-signature': await signWebhookBody(body, secret) } })
54
+ * const body = JSON.stringify({ tx: { network: 'TRON', asset: 'USDT', … } })
55
+ * await fetch('http://localhost:3000/webhooks/monitoring', {
56
+ * method: 'POST',
57
+ * body,
58
+ * headers: { 'content-type': 'application/json', 'x-signature': await signWebhookBody(body, secret) },
59
+ * })
56
60
  * ```
57
61
  */
58
62
  async function signWebhookBody(body, secret) {
@@ -61,11 +65,11 @@ async function signWebhookBody(body, secret) {
61
65
  return Array.from(mac, (b) => b.toString(16).padStart(2, '0')).join('');
62
66
  }
63
67
  /**
64
- * Проверяет подпись вебхука: `true` — тело пришло от сервиса и не изменено.
68
+ * Verifies a webhook signature. Returns `true` when the body was sent by the API and was not modified.
65
69
  *
66
- * @param body - сырое тело запроса
67
- * @param signature - заголовок `x-signature` или все заголовки запроса
68
- * @param secret - секрет подписи клиента
70
+ * @param body - Raw request body.
71
+ * @param signature - The `x-signature` header, or all request headers.
72
+ * @param secret - Your webhook secret.
69
73
  */
70
74
  async function verifyWebhookSignature(body, signature, secret) {
71
75
  const given = signatureOf(signature)?.trim().toLowerCase();
@@ -74,16 +78,16 @@ async function verifyWebhookSignature(body, signature, secret) {
74
78
  return safeEqual(await signWebhookBody(body, secret), given);
75
79
  }
76
80
  /**
77
- * Проверяет подпись и возвращает разобранный вебхук.
81
+ * Verifies the signature and returns the parsed webhook.
78
82
  *
79
- * Дальше — по правилам приёма: тестовый вебхук ({@link isTestWebhook}) не зачислять; один и тот же вебхук может
80
- * прийти повторно — обрабатывайте идемпотентно по {@link webhookIdempotencyKey}; ответьте 2xx в течение 15 секунд.
81
- * Вебхук уходит, как только перевод попал в блок, — для крупных сумм дождитесь финальности
82
- * (`monitoring.transactions.get(...).final`).
83
+ * Respond with a 2xx status within 15 seconds. Process webhooks idempotently by {@link webhookIdempotencyKey} — the
84
+ * same webhook may arrive more than once — and do not credit test webhooks ({@link isTestWebhook}). Webhooks are sent
85
+ * as soon as a transfer is included in a block; before crediting large amounts, check that the transaction is final
86
+ * with `monitoring.transactions.get()`.
83
87
  *
84
- * @throws {@link WebhookSignatureError} подпись не совпала — ответьте 401 и ничего не зачисляйте
88
+ * @throws {@link WebhookSignatureError} when the signature does not match. Respond with `401` and do not process it.
85
89
  *
86
- * @example Express — нужен сырой body
90
+ * @example Express (use the raw body)
87
91
  * ```ts
88
92
  * app.post('/webhooks/monitoring', express.raw({ type: 'application/json' }), async (req, res) => {
89
93
  * const event = await parseWebhook(req.body, req.headers, process.env.MONITORING_WEBHOOK_SECRET!)
@@ -92,7 +96,7 @@ async function verifyWebhookSignature(body, signature, secret) {
92
96
  * })
93
97
  * ```
94
98
  *
95
- * @example Hono, Next.js route handler, Cloudflare Workers
99
+ * @example Next.js route handlers, Hono, Cloudflare Workers
96
100
  * ```ts
97
101
  * const event = await parseWebhook(await request.text(), request.headers, env.MONITORING_WEBHOOK_SECRET)
98
102
  * ```
@@ -104,21 +108,22 @@ async function parseWebhook(body, signature, secret) {
104
108
  try {
105
109
  payload = JSON.parse(typeof body === 'string' ? body : new TextDecoder().decode(bytesOf(body)));
106
110
  }
107
- catch (e) {
108
- throw new errors_js_1.MonitoringError('webhook body is not valid JSON', { cause: e });
111
+ catch (error) {
112
+ throw new errors_js_1.MonitoringError('webhook body is not valid JSON', { cause: error });
109
113
  }
110
114
  const tx = payload?.tx;
111
115
  if (typeof tx !== 'object' || tx === null || typeof tx.id !== 'string')
112
116
  throw new errors_js_1.MonitoringError('webhook body has no tx');
113
117
  return payload;
114
118
  }
115
- /** Тестовый вебхук (из панели или `clients.sendTestWebhook`) — такой не зачислять */
119
+ /** `true` for test webhooks. Do not credit them. */
116
120
  function isTestWebhook(event) {
117
121
  return event.test === true;
118
122
  }
119
123
  /**
120
- * Ключ идемпотентности вебхука: сеть, транзакция и номер лога. Один перевод — один ключ, даже если вебхук пришёл
121
- * несколько раз. В одной транзакции EVM может быть несколько переводов токенов — у них разный `logIndex`.
124
+ * Idempotency key of a webhook: network, transaction hash and log index. A transfer always has the same key, however
125
+ * many times its webhook is delivered. An EVM transaction can contain several token transfers; they differ by
126
+ * `logIndex`.
122
127
  *
123
128
  * @example `"TRON:1249cb…a5fc45:"`, `"ETHEREUM:0x3fbc…1d57:7"`
124
129
  */
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/webhooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/webhooks.ts"],"names":[],"mappings":"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"}