@ledgerhq/coin-kaspa 1.13.2 → 1.14.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,47 @@
1
1
  # @ledgerhq/coin-framework
2
2
 
3
+ ## 1.14.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#16908](https://github.com/LedgerHQ/ledger-live/pull/16908) [`2eb1295`](https://github.com/LedgerHQ/ledger-live/commit/2eb12950dc9787812b5aef0b9dfcbbfdb4c5352d) Thanks [@YazhuEth](https://github.com/YazhuEth)! - Propagate network errors with full context in kaspa; add broadcast integ tests for kaspa and hedera
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [[`ed0dc8a`](https://github.com/LedgerHQ/ledger-live/commit/ed0dc8abc2c8f5054e655c4e12efe6fb433fbaca), [`4ddd97a`](https://github.com/LedgerHQ/ledger-live/commit/4ddd97a99bab5b581ad5ccfd36eb420ec4ee6352), [`7fafa10`](https://github.com/LedgerHQ/ledger-live/commit/7fafa10d8af581f4433a60ea908980a726d3a777), [`ac26c8b`](https://github.com/LedgerHQ/ledger-live/commit/ac26c8bffa9b5cc9f28bed5ce3d44e32982d655c), [`fb79639`](https://github.com/LedgerHQ/ledger-live/commit/fb79639eb81258bae4830ed6ffe375ae625054ad), [`0d11df6`](https://github.com/LedgerHQ/ledger-live/commit/0d11df6ef8dc781171071824ad1c39e3beed7730), [`b866ea6`](https://github.com/LedgerHQ/ledger-live/commit/b866ea67bcbd408a33dbc9233ef55298e2a8ef25), [`321a0e2`](https://github.com/LedgerHQ/ledger-live/commit/321a0e2ce948fac11f7bdf0e106eb0af57168caa), [`d308b1a`](https://github.com/LedgerHQ/ledger-live/commit/d308b1a6b9c629839f051cf367a527f4232120c7), [`21e69fe`](https://github.com/LedgerHQ/ledger-live/commit/21e69fea49cffc0b1204903e539a64b83e4b28f0), [`e6dc658`](https://github.com/LedgerHQ/ledger-live/commit/e6dc658b83ebd2102e19a1fead021443457c05d9), [`fb4d165`](https://github.com/LedgerHQ/ledger-live/commit/fb4d1656be8dc8e933e55600970a2e991fbaeebb), [`5bd95a9`](https://github.com/LedgerHQ/ledger-live/commit/5bd95a9ceaac4d08c87d635f721265357368f8ee), [`73bfe05`](https://github.com/LedgerHQ/ledger-live/commit/73bfe055ec23e0d630f2da9f4dbc9731b6fe5190)]:
12
+ - @ledgerhq/types-live@6.107.0
13
+ - @ledgerhq/ledger-wallet-framework@1.4.0
14
+ - @ledgerhq/live-env@2.34.0
15
+ - @ledgerhq/errors@6.35.0
16
+ - @ledgerhq/cryptoassets@13.47.0
17
+ - @ledgerhq/live-network@2.6.0
18
+ - @ledgerhq/devices@8.14.2
19
+
20
+ ## 1.14.0-next.1
21
+
22
+ ### Patch Changes
23
+
24
+ - Updated dependencies [[`e6dc658`](https://github.com/LedgerHQ/ledger-live/commit/e6dc658b83ebd2102e19a1fead021443457c05d9)]:
25
+ - @ledgerhq/cryptoassets@13.47.0-next.1
26
+ - @ledgerhq/ledger-wallet-framework@1.4.0-next.1
27
+
28
+ ## 1.14.0-next.0
29
+
30
+ ### Minor Changes
31
+
32
+ - [#16908](https://github.com/LedgerHQ/ledger-live/pull/16908) [`2eb1295`](https://github.com/LedgerHQ/ledger-live/commit/2eb12950dc9787812b5aef0b9dfcbbfdb4c5352d) Thanks [@YazhuEth](https://github.com/YazhuEth)! - Propagate network errors with full context in kaspa; add broadcast integ tests for kaspa and hedera
33
+
34
+ ### Patch Changes
35
+
36
+ - Updated dependencies [[`ed0dc8a`](https://github.com/LedgerHQ/ledger-live/commit/ed0dc8abc2c8f5054e655c4e12efe6fb433fbaca), [`4ddd97a`](https://github.com/LedgerHQ/ledger-live/commit/4ddd97a99bab5b581ad5ccfd36eb420ec4ee6352), [`7fafa10`](https://github.com/LedgerHQ/ledger-live/commit/7fafa10d8af581f4433a60ea908980a726d3a777), [`ac26c8b`](https://github.com/LedgerHQ/ledger-live/commit/ac26c8bffa9b5cc9f28bed5ce3d44e32982d655c), [`fb79639`](https://github.com/LedgerHQ/ledger-live/commit/fb79639eb81258bae4830ed6ffe375ae625054ad), [`0d11df6`](https://github.com/LedgerHQ/ledger-live/commit/0d11df6ef8dc781171071824ad1c39e3beed7730), [`b866ea6`](https://github.com/LedgerHQ/ledger-live/commit/b866ea67bcbd408a33dbc9233ef55298e2a8ef25), [`321a0e2`](https://github.com/LedgerHQ/ledger-live/commit/321a0e2ce948fac11f7bdf0e106eb0af57168caa), [`d308b1a`](https://github.com/LedgerHQ/ledger-live/commit/d308b1a6b9c629839f051cf367a527f4232120c7), [`21e69fe`](https://github.com/LedgerHQ/ledger-live/commit/21e69fea49cffc0b1204903e539a64b83e4b28f0), [`fb4d165`](https://github.com/LedgerHQ/ledger-live/commit/fb4d1656be8dc8e933e55600970a2e991fbaeebb), [`5bd95a9`](https://github.com/LedgerHQ/ledger-live/commit/5bd95a9ceaac4d08c87d635f721265357368f8ee), [`73bfe05`](https://github.com/LedgerHQ/ledger-live/commit/73bfe055ec23e0d630f2da9f4dbc9731b6fe5190)]:
37
+ - @ledgerhq/types-live@6.107.0-next.0
38
+ - @ledgerhq/ledger-wallet-framework@1.4.0-next.0
39
+ - @ledgerhq/live-env@2.34.0-next.0
40
+ - @ledgerhq/errors@6.35.0-next.0
41
+ - @ledgerhq/cryptoassets@13.47.0-next.0
42
+ - @ledgerhq/live-network@2.6.0-next.0
43
+ - @ledgerhq/devices@8.14.2-next.0
44
+
3
45
  ## 1.13.2
4
46
 
5
47
  ### Patch Changes
package/jest.config.js CHANGED
@@ -22,6 +22,7 @@ module.exports = {
22
22
  testPathIgnorePatterns: ["lib/", "lib-es/", ".integ.test.ts"],
23
23
  reporters: [
24
24
  "default",
25
+ ...(process.env.CI ? ["github-actions"] : []),
25
26
  ["jest-sonar", { outputName: "sonar-executionTests-report.xml", reportedFilePath: "absolute" }],
26
27
  ],
27
28
  coveragePathIgnorePatterns: ["src/test", "src/types", "src/index.ts"],
@@ -1 +1 @@
1
- {"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../src/bridge/broadcast.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,WAAW,CAI7D,CAAC"}
1
+ {"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../src/bridge/broadcast.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,WAAW,CAO7D,CAAC"}
@@ -10,6 +10,9 @@ const network_1 = require("../network");
10
10
  const broadcast = async ({ signedOperation }) => {
11
11
  const { signature, operation } = signedOperation;
12
12
  const hash = (await (0, network_1.submitTransaction)(signature)).txId;
13
+ if (!hash) {
14
+ throw new Error("kaspa: broadcast returned no transaction id");
15
+ }
13
16
  return (0, operation_1.patchOperationWithHash)(operation, hash);
14
17
  };
15
18
  exports.broadcast = broadcast;
@@ -1 +1 @@
1
- {"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../../src/bridge/broadcast.ts"],"names":[],"mappings":";;;AAAA,2EAAqF;AAErF,wCAA+C;AAG/C;;;GAGG;AACI,MAAM,SAAS,GAA4C,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;IAC9F,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC;IACjD,MAAM,IAAI,GAAG,CAAC,MAAM,IAAA,2BAAiB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,OAAO,IAAA,kCAAsB,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC,CAAC;AAJW,QAAA,SAAS,aAIpB"}
1
+ {"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../../src/bridge/broadcast.ts"],"names":[],"mappings":";;;AAAA,2EAAqF;AAErF,wCAA+C;AAG/C;;;GAGG;AACI,MAAM,SAAS,GAA4C,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;IAC9F,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC;IACjD,MAAM,IAAI,GAAG,CAAC,MAAM,IAAA,2BAAiB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,IAAA,kCAAsB,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC,CAAC;AAPW,QAAA,SAAS,aAOpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"submitTransaction.d.ts","sourceRoot":"","sources":["../../src/network/submitTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAGxD,eAAO,MAAM,iBAAiB,GAC5B,iBAAiB,MAAM,KACtB,OAAO,CAAC,4BAA4B,CAqBtC,CAAC"}
1
+ {"version":3,"file":"submitTransaction.d.ts","sourceRoot":"","sources":["../../src/network/submitTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAGxD,eAAO,MAAM,iBAAiB,GAC5B,iBAAiB,MAAM,KACtB,OAAO,CAAC,4BAA4B,CAkBtC,CAAC"}
@@ -3,25 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.submitTransaction = void 0;
4
4
  const config_1 = require("./config");
5
5
  const submitTransaction = async (transactionJson) => {
6
- try {
7
- const response = await fetch(`${config_1.API_BASE}/transactions`, {
8
- method: "POST",
9
- headers: {
10
- "Content-Type": "application/json",
11
- },
12
- body: transactionJson,
13
- });
14
- if (!response.ok) {
15
- throw new Error(`Failed to submit transaction. Status: ${response.status}`);
16
- }
17
- const txId = (await response.json()).transactionId;
18
- return {
19
- txId,
20
- };
21
- }
22
- catch (error) {
23
- throw new Error(`Error submitting transaction: ${error}`);
6
+ const response = await fetch(`${config_1.API_BASE}/transactions`, {
7
+ method: "POST",
8
+ headers: {
9
+ "Content-Type": "application/json",
10
+ },
11
+ body: transactionJson,
12
+ });
13
+ if (!response.ok) {
14
+ const body = await response.text().catch(() => "");
15
+ throw new Error(`kaspa: broadcast failed with status ${response.status}${body ? `: ${body}` : ""}`);
24
16
  }
17
+ const txId = (await response.json()).transactionId;
18
+ return { txId };
25
19
  };
26
20
  exports.submitTransaction = submitTransaction;
27
21
  //# sourceMappingURL=submitTransaction.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"submitTransaction.js","sourceRoot":"","sources":["../../src/network/submitTransaction.ts"],"names":[],"mappings":";;;AACA,qCAAoC;AAE7B,MAAM,iBAAiB,GAAG,KAAK,EACpC,eAAuB,EACgB,EAAE;IACzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,iBAAQ,eAAe,EAAE;YACvD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,yCAAyC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,IAAI,GAAW,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC;QAC3D,OAAO;YACL,IAAI;SACL,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC,CAAC;AAvBW,QAAA,iBAAiB,qBAuB5B"}
1
+ {"version":3,"file":"submitTransaction.js","sourceRoot":"","sources":["../../src/network/submitTransaction.ts"],"names":[],"mappings":";;;AACA,qCAAoC;AAE7B,MAAM,iBAAiB,GAAG,KAAK,EACpC,eAAuB,EACgB,EAAE;IACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,iBAAQ,eAAe,EAAE;QACvD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,eAAe;KACtB,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,KAAK,CACb,uCAAuC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACnF,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAW,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC;IAC3D,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC,CAAC;AApBW,QAAA,iBAAiB,qBAoB5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../src/bridge/broadcast.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,WAAW,CAI7D,CAAC"}
1
+ {"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../src/bridge/broadcast.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,WAAW,CAO7D,CAAC"}
@@ -7,6 +7,9 @@ import { submitTransaction } from "../network";
7
7
  export const broadcast = async ({ signedOperation }) => {
8
8
  const { signature, operation } = signedOperation;
9
9
  const hash = (await submitTransaction(signature)).txId;
10
+ if (!hash) {
11
+ throw new Error("kaspa: broadcast returned no transaction id");
12
+ }
10
13
  return patchOperationWithHash(operation, hash);
11
14
  };
12
15
  //# sourceMappingURL=broadcast.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../../src/bridge/broadcast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAErF,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAA4C,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;IAC9F,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC;IACjD,MAAM,IAAI,GAAG,CAAC,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,OAAO,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC,CAAC"}
1
+ {"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../../src/bridge/broadcast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAErF,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAA4C,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;IAC9F,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC;IACjD,MAAM,IAAI,GAAG,CAAC,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"submitTransaction.d.ts","sourceRoot":"","sources":["../../src/network/submitTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAGxD,eAAO,MAAM,iBAAiB,GAC5B,iBAAiB,MAAM,KACtB,OAAO,CAAC,4BAA4B,CAqBtC,CAAC"}
1
+ {"version":3,"file":"submitTransaction.d.ts","sourceRoot":"","sources":["../../src/network/submitTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAGxD,eAAO,MAAM,iBAAiB,GAC5B,iBAAiB,MAAM,KACtB,OAAO,CAAC,4BAA4B,CAkBtC,CAAC"}
@@ -1,23 +1,17 @@
1
1
  import { API_BASE } from "./config";
2
2
  export const submitTransaction = async (transactionJson) => {
3
- try {
4
- const response = await fetch(`${API_BASE}/transactions`, {
5
- method: "POST",
6
- headers: {
7
- "Content-Type": "application/json",
8
- },
9
- body: transactionJson,
10
- });
11
- if (!response.ok) {
12
- throw new Error(`Failed to submit transaction. Status: ${response.status}`);
13
- }
14
- const txId = (await response.json()).transactionId;
15
- return {
16
- txId,
17
- };
18
- }
19
- catch (error) {
20
- throw new Error(`Error submitting transaction: ${error}`);
3
+ const response = await fetch(`${API_BASE}/transactions`, {
4
+ method: "POST",
5
+ headers: {
6
+ "Content-Type": "application/json",
7
+ },
8
+ body: transactionJson,
9
+ });
10
+ if (!response.ok) {
11
+ const body = await response.text().catch(() => "");
12
+ throw new Error(`kaspa: broadcast failed with status ${response.status}${body ? `: ${body}` : ""}`);
21
13
  }
14
+ const txId = (await response.json()).transactionId;
15
+ return { txId };
22
16
  };
23
17
  //# sourceMappingURL=submitTransaction.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"submitTransaction.js","sourceRoot":"","sources":["../../src/network/submitTransaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,eAAuB,EACgB,EAAE;IACzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,eAAe,EAAE;YACvD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,yCAAyC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,IAAI,GAAW,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC;QAC3D,OAAO;YACL,IAAI;SACL,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"submitTransaction.js","sourceRoot":"","sources":["../../src/network/submitTransaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,eAAuB,EACgB,EAAE;IACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,eAAe,EAAE;QACvD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,eAAe;KACtB,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,KAAK,CACb,uCAAuC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACnF,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAW,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC;IAC3D,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/coin-kaspa",
3
- "version": "1.13.2",
3
+ "version": "1.14.0",
4
4
  "description": "Ledger Kaspa Coin integration",
5
5
  "keywords": [
6
6
  "Ledger",
@@ -103,15 +103,15 @@
103
103
  "lru-cache": "^7.14.1",
104
104
  "prando": "^6.0.1",
105
105
  "rxjs": "7.8.2",
106
- "@ledgerhq/cryptoassets": "^13.46.2",
106
+ "@ledgerhq/cryptoassets": "^13.47.0",
107
107
  "@ledgerhq/devices": "8.14.2",
108
- "@ledgerhq/errors": "^6.34.1",
109
- "@ledgerhq/ledger-wallet-framework": "^1.3.2",
110
- "@ledgerhq/live-env": "^2.33.0",
111
- "@ledgerhq/live-network": "^2.5.2",
108
+ "@ledgerhq/errors": "^6.35.0",
109
+ "@ledgerhq/ledger-wallet-framework": "^1.4.0",
110
+ "@ledgerhq/live-env": "^2.34.0",
111
+ "@ledgerhq/live-network": "^2.6.0",
112
112
  "@ledgerhq/logs": "^6.17.0",
113
113
  "@ledgerhq/types-cryptoassets": "^7.36.0",
114
- "@ledgerhq/types-live": "^6.106.0"
114
+ "@ledgerhq/types-live": "^6.107.0"
115
115
  },
116
116
  "devDependencies": {
117
117
  "@swc/core": "1.15.11",
@@ -0,0 +1,48 @@
1
+ import { addressToScriptPublicKey } from "../logic/kaspaAddresses";
2
+ import {
3
+ KaspaHwTransaction,
4
+ KaspaHwTransactionInput,
5
+ KaspaHwTransactionOutput,
6
+ } from "../types/kaspaHwTransaction";
7
+ import { broadcast } from "./broadcast";
8
+
9
+ const BURN_ADDRESS = "kaspa:qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx9awp4e";
10
+ const FAKE_PREV_TX_ID = "a".repeat(64);
11
+ const FAKE_SIGNATURE = "b".repeat(128);
12
+
13
+ describe("Broadcast", () => {
14
+ it("throws orphan error when referenced UTXO does not exist", async () => {
15
+ const input = new KaspaHwTransactionInput({
16
+ value: 1000,
17
+ prevTxId: FAKE_PREV_TX_ID,
18
+ outpointIndex: 0,
19
+ addressType: 0,
20
+ addressIndex: 0,
21
+ address: BURN_ADDRESS,
22
+ });
23
+ input.setSignature(FAKE_SIGNATURE);
24
+
25
+ const output = new KaspaHwTransactionOutput({
26
+ value: 900,
27
+ scriptPublicKey: addressToScriptPublicKey(BURN_ADDRESS),
28
+ });
29
+
30
+ const tx = new KaspaHwTransaction({
31
+ inputs: [input],
32
+ outputs: [output],
33
+ version: 0,
34
+ fee: 100,
35
+ });
36
+
37
+ const signature = JSON.stringify(tx.toApiJSON());
38
+
39
+ await expect(
40
+ broadcast({
41
+ signedOperation: {
42
+ signature,
43
+ operation: { id: "integ", hash: "", extra: {} },
44
+ },
45
+ } as any),
46
+ ).rejects.toThrow(/Rejected transaction .+ is an orphan where orphan is disallowed/);
47
+ });
48
+ });
@@ -10,5 +10,8 @@ import { Transaction } from "../types";
10
10
  export const broadcast: AccountBridge<Transaction>["broadcast"] = async ({ signedOperation }) => {
11
11
  const { signature, operation } = signedOperation;
12
12
  const hash = (await submitTransaction(signature)).txId;
13
+ if (!hash) {
14
+ throw new Error("kaspa: broadcast returned no transaction id");
15
+ }
13
16
  return patchOperationWithHash(operation, hash);
14
17
  };
@@ -4,24 +4,21 @@ import { API_BASE } from "./config";
4
4
  export const submitTransaction = async (
5
5
  transactionJson: string,
6
6
  ): Promise<ApiResponseSubmitTransaction> => {
7
- try {
8
- const response = await fetch(`${API_BASE}/transactions`, {
9
- method: "POST",
10
- headers: {
11
- "Content-Type": "application/json",
12
- },
13
- body: transactionJson,
14
- });
7
+ const response = await fetch(`${API_BASE}/transactions`, {
8
+ method: "POST",
9
+ headers: {
10
+ "Content-Type": "application/json",
11
+ },
12
+ body: transactionJson,
13
+ });
15
14
 
16
- if (!response.ok) {
17
- throw new Error(`Failed to submit transaction. Status: ${response.status}`);
18
- }
19
-
20
- const txId: string = (await response.json()).transactionId;
21
- return {
22
- txId,
23
- };
24
- } catch (error) {
25
- throw new Error(`Error submitting transaction: ${error}`);
15
+ if (!response.ok) {
16
+ const body = await response.text().catch(() => "");
17
+ throw new Error(
18
+ `kaspa: broadcast failed with status ${response.status}${body ? `: ${body}` : ""}`,
19
+ );
26
20
  }
21
+
22
+ const txId: string = (await response.json()).transactionId;
23
+ return { txId };
27
24
  };
@@ -28,6 +28,7 @@ describe("submitTransaction function", () => {
28
28
  global.fetch = jest.fn().mockResolvedValueOnce({
29
29
  ok: false,
30
30
  status: 500,
31
+ text: async () => "",
31
32
  });
32
33
 
33
34
  const transactionDetails = {
@@ -35,7 +36,7 @@ describe("submitTransaction function", () => {
35
36
  };
36
37
 
37
38
  await expect(submitTransaction(JSON.stringify(transactionDetails))).rejects.toThrow(
38
- "Failed to submit transaction. Status: 500",
39
+ "kaspa: broadcast failed with status 500",
39
40
  );
40
41
  });
41
42
 
@@ -47,7 +48,7 @@ describe("submitTransaction function", () => {
47
48
  };
48
49
 
49
50
  await expect(submitTransaction(JSON.stringify(transactionDetails))).rejects.toThrow(
50
- "Error submitting transaction: Error: Network error",
51
+ "Network error",
51
52
  );
52
53
  });
53
54
  });