@ledgerhq/coin-hypercore 0.4.2 → 0.4.3

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,11 @@
1
1
  # @ledgerhq/coin-hypercore
2
2
 
3
+ ## 0.4.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [#758](https://github.com/LedgerHQ/coin-modules/pull/758) [`aa464dd`](https://github.com/LedgerHQ/coin-modules/commit/aa464dd83fe9fcaf730ab9857a9b5853b23544bf) Thanks [@YazhuEth](https://github.com/YazhuEth)! - Implement `validateAddress` so the generic coin framework can validate HyperCore recipients/addresses. It previously threw `notSupported`, which broke address validation now that the framework consumes it from the `CoinModuleApi` instance. HyperCore addresses are Ethereum-format, so this checks the `0x`-prefixed 40-hex-character shape.
8
+
3
9
  ## 0.4.2
4
10
 
5
11
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,aAAa,EAAgB,MAAM,2CAA2C,CAAA;AAC5F,OAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,WAAW,CAAA;AAK5D,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,aAAa,CAuBhE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,aAAa,EAAgB,MAAM,2CAA2C,CAAA;AAC5F,OAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,WAAW,CAAA;AAM5D,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,aAAa,CAuBhE"}
package/lib/api/index.js CHANGED
@@ -11,6 +11,7 @@ const config_1 = __importDefault(require("../config"));
11
11
  const getBalance_1 = require("./getBalance");
12
12
  const lastBlock_1 = require("./lastBlock");
13
13
  const listOperations_1 = require("./listOperations");
14
+ const validateAddress_1 = require("./validateAddress");
14
15
  function createApi(config) {
15
16
  config_1.default.setCoinConfig(() => ({ ...config, status: { type: 'active' } }));
16
17
  return {
@@ -30,7 +31,7 @@ function createApi(config) {
30
31
  broadcast: (0, index_1.notSupported)('broadcast'),
31
32
  validateIntent: (0, index_1.notSupported)('validateIntent'),
32
33
  getNextSequence: (0, index_1.notSupported)('getNextSequence'),
33
- validateAddress: (0, index_1.notSupported)('validateAddress'),
34
+ validateAddress: validateAddress_1.validateAddress,
34
35
  craftTransactionData: (0, index_1.notSupported)('craftTransactionData'),
35
36
  };
36
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";AAAA,4CAA4C;AAC5C,sCAAsC;;;;;AAQtC,8BAuBC;AA7BD,qEAA4F;AAC5F,uDAA4D;AAC5D,6CAAyC;AACzC,2CAAuC;AACvC,qDAAiD;AAEjD,SAAgB,SAAS,CAAC,MAAuB;IAC/C,gBAAU,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAA;IAE3E,OAAO;QACL,SAAS,EAAT,qBAAS;QACT,YAAY,EAAE,IAAA,oBAAY,EAAC,cAAc,CAAC;QAC1C,QAAQ,EAAE,IAAA,oBAAY,EAAC,UAAU,CAAC;QAClC,IAAI,EAAE,IAAA,oBAAY,EAAC,MAAM,CAAC;QAC1B,aAAa,EAAE,IAAA,oBAAY,EAAC,eAAe,CAAC;QAC5C,UAAU,EAAV,uBAAU;QACV,cAAc,EAAd,+BAAc;QACd,SAAS,EAAE,IAAA,oBAAY,EAAC,WAAW,CAAC;QACpC,UAAU,EAAE,IAAA,oBAAY,EAAC,YAAY,CAAC;QACtC,gBAAgB,EAAE,IAAA,oBAAY,EAAC,kBAAkB,CAAC;QAClD,mBAAmB,EAAE,IAAA,oBAAY,EAAC,qBAAqB,CAAC;QACxD,YAAY,EAAE,IAAA,oBAAY,EAAC,cAAc,CAAC;QAC1C,OAAO,EAAE,IAAA,oBAAY,EAAC,SAAS,CAAC;QAChC,SAAS,EAAE,IAAA,oBAAY,EAAC,WAAW,CAAC;QACpC,cAAc,EAAE,IAAA,oBAAY,EAAC,gBAAgB,CAAC;QAC9C,eAAe,EAAE,IAAA,oBAAY,EAAC,iBAAiB,CAAC;QAChD,eAAe,EAAE,IAAA,oBAAY,EAAC,iBAAiB,CAAC;QAChD,oBAAoB,EAAE,IAAA,oBAAY,EAAC,sBAAsB,CAAC;KAC3D,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";AAAA,4CAA4C;AAC5C,sCAAsC;;;;;AAStC,8BAuBC;AA9BD,qEAA4F;AAC5F,uDAA4D;AAC5D,6CAAyC;AACzC,2CAAuC;AACvC,qDAAiD;AACjD,uDAAmD;AAEnD,SAAgB,SAAS,CAAC,MAAuB;IAC/C,gBAAU,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAA;IAE3E,OAAO;QACL,SAAS,EAAT,qBAAS;QACT,YAAY,EAAE,IAAA,oBAAY,EAAC,cAAc,CAAC;QAC1C,QAAQ,EAAE,IAAA,oBAAY,EAAC,UAAU,CAAC;QAClC,IAAI,EAAE,IAAA,oBAAY,EAAC,MAAM,CAAC;QAC1B,aAAa,EAAE,IAAA,oBAAY,EAAC,eAAe,CAAC;QAC5C,UAAU,EAAV,uBAAU;QACV,cAAc,EAAd,+BAAc;QACd,SAAS,EAAE,IAAA,oBAAY,EAAC,WAAW,CAAC;QACpC,UAAU,EAAE,IAAA,oBAAY,EAAC,YAAY,CAAC;QACtC,gBAAgB,EAAE,IAAA,oBAAY,EAAC,kBAAkB,CAAC;QAClD,mBAAmB,EAAE,IAAA,oBAAY,EAAC,qBAAqB,CAAC;QACxD,YAAY,EAAE,IAAA,oBAAY,EAAC,cAAc,CAAC;QAC1C,OAAO,EAAE,IAAA,oBAAY,EAAC,SAAS,CAAC;QAChC,SAAS,EAAE,IAAA,oBAAY,EAAC,WAAW,CAAC;QACpC,cAAc,EAAE,IAAA,oBAAY,EAAC,gBAAgB,CAAC;QAC9C,eAAe,EAAE,IAAA,oBAAY,EAAC,iBAAiB,CAAC;QAChD,eAAe,EAAf,iCAAe;QACf,oBAAoB,EAAE,IAAA,oBAAY,EAAC,sBAAsB,CAAC;KAC3D,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AddressValidationCurrencyParameters } from '@ledgerhq/coin-module-framework/api/types';
2
+ export declare function validateAddress(address: string, _parameters: Partial<AddressValidationCurrencyParameters>): Promise<boolean>;
3
+ //# sourceMappingURL=validateAddress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateAddress.d.ts","sourceRoot":"","sources":["../../src/api/validateAddress.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,2CAA2C,CAAA;AAKpG,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,OAAO,CAAC,mCAAmC,CAAC,GACxD,OAAO,CAAC,OAAO,CAAC,CAElB"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ // SPDX-FileCopyrightText: © 2024 LEDGER SAS
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.validateAddress = validateAddress;
6
+ // Ethereum-format address; validate hex shape only (no EIP-55 checksum — no keccak dep).
7
+ const ETH_ADDRESS_REGEX = /^0x[0-9a-fA-F]{40}$/;
8
+ async function validateAddress(address, _parameters) {
9
+ return ETH_ADDRESS_REGEX.test(address);
10
+ }
11
+ //# sourceMappingURL=validateAddress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateAddress.js","sourceRoot":"","sources":["../../src/api/validateAddress.ts"],"names":[],"mappings":";AAAA,4CAA4C;AAC5C,sCAAsC;;AAOtC,0CAKC;AARD,yFAAyF;AACzF,MAAM,iBAAiB,GAAG,qBAAqB,CAAA;AAExC,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,WAAyD;IAEzD,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACxC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,aAAa,EAAgB,MAAM,2CAA2C,CAAA;AAC5F,OAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,WAAW,CAAA;AAK5D,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,aAAa,CAuBhE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,aAAa,EAAgB,MAAM,2CAA2C,CAAA;AAC5F,OAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,WAAW,CAAA;AAM5D,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,aAAa,CAuBhE"}
@@ -5,6 +5,7 @@ import coinConfig from '../config';
5
5
  import { getBalance } from './getBalance';
6
6
  import { lastBlock } from './lastBlock';
7
7
  import { listOperations } from './listOperations';
8
+ import { validateAddress } from './validateAddress';
8
9
  export function createApi(config) {
9
10
  coinConfig.setCoinConfig(() => ({ ...config, status: { type: 'active' } }));
10
11
  return {
@@ -24,7 +25,7 @@ export function createApi(config) {
24
25
  broadcast: notSupported('broadcast'),
25
26
  validateIntent: notSupported('validateIntent'),
26
27
  getNextSequence: notSupported('getNextSequence'),
27
- validateAddress: notSupported('validateAddress'),
28
+ validateAddress,
28
29
  craftTransactionData: notSupported('craftTransactionData'),
29
30
  };
30
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sCAAsC;AAEtC,OAAO,EAAsB,YAAY,EAAE,MAAM,2CAA2C,CAAA;AAC5F,OAAO,UAAoC,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,MAAM,UAAU,SAAS,CAAC,MAAuB;IAC/C,UAAU,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAA;IAE3E,OAAO;QACL,SAAS;QACT,YAAY,EAAE,YAAY,CAAC,cAAc,CAAC;QAC1C,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC;QAClC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC;QAC1B,aAAa,EAAE,YAAY,CAAC,eAAe,CAAC;QAC5C,UAAU;QACV,cAAc;QACd,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC;QACpC,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC;QACtC,gBAAgB,EAAE,YAAY,CAAC,kBAAkB,CAAC;QAClD,mBAAmB,EAAE,YAAY,CAAC,qBAAqB,CAAC;QACxD,YAAY,EAAE,YAAY,CAAC,cAAc,CAAC;QAC1C,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC;QAChC,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC;QACpC,cAAc,EAAE,YAAY,CAAC,gBAAgB,CAAC;QAC9C,eAAe,EAAE,YAAY,CAAC,iBAAiB,CAAC;QAChD,eAAe,EAAE,YAAY,CAAC,iBAAiB,CAAC;QAChD,oBAAoB,EAAE,YAAY,CAAC,sBAAsB,CAAC;KAC3D,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sCAAsC;AAEtC,OAAO,EAAsB,YAAY,EAAE,MAAM,2CAA2C,CAAA;AAC5F,OAAO,UAAoC,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,UAAU,SAAS,CAAC,MAAuB;IAC/C,UAAU,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAA;IAE3E,OAAO;QACL,SAAS;QACT,YAAY,EAAE,YAAY,CAAC,cAAc,CAAC;QAC1C,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC;QAClC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC;QAC1B,aAAa,EAAE,YAAY,CAAC,eAAe,CAAC;QAC5C,UAAU;QACV,cAAc;QACd,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC;QACpC,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC;QACtC,gBAAgB,EAAE,YAAY,CAAC,kBAAkB,CAAC;QAClD,mBAAmB,EAAE,YAAY,CAAC,qBAAqB,CAAC;QACxD,YAAY,EAAE,YAAY,CAAC,cAAc,CAAC;QAC1C,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC;QAChC,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC;QACpC,cAAc,EAAE,YAAY,CAAC,gBAAgB,CAAC;QAC9C,eAAe,EAAE,YAAY,CAAC,iBAAiB,CAAC;QAChD,eAAe;QACf,oBAAoB,EAAE,YAAY,CAAC,sBAAsB,CAAC;KAC3D,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AddressValidationCurrencyParameters } from '@ledgerhq/coin-module-framework/api/types';
2
+ export declare function validateAddress(address: string, _parameters: Partial<AddressValidationCurrencyParameters>): Promise<boolean>;
3
+ //# sourceMappingURL=validateAddress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateAddress.d.ts","sourceRoot":"","sources":["../../src/api/validateAddress.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,2CAA2C,CAAA;AAKpG,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,OAAO,CAAC,mCAAmC,CAAC,GACxD,OAAO,CAAC,OAAO,CAAC,CAElB"}
@@ -0,0 +1,8 @@
1
+ // SPDX-FileCopyrightText: © 2024 LEDGER SAS
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // Ethereum-format address; validate hex shape only (no EIP-55 checksum — no keccak dep).
4
+ const ETH_ADDRESS_REGEX = /^0x[0-9a-fA-F]{40}$/;
5
+ export async function validateAddress(address, _parameters) {
6
+ return ETH_ADDRESS_REGEX.test(address);
7
+ }
8
+ //# sourceMappingURL=validateAddress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateAddress.js","sourceRoot":"","sources":["../../src/api/validateAddress.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,sCAAsC;AAItC,yFAAyF;AACzF,MAAM,iBAAiB,GAAG,qBAAqB,CAAA;AAE/C,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,WAAyD;IAEzD,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACxC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/coin-hypercore",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
4
4
  "description": "Ledger Hypercore Coin integration",
5
5
  "keywords": [
6
6
  "Ledger",
@@ -23,7 +23,6 @@ describe('Hypercore Api (Alpaca stub)', () => {
23
23
  'broadcast',
24
24
  'validateIntent',
25
25
  'getNextSequence',
26
- 'validateAddress',
27
26
  'craftTransactionData',
28
27
  ])('%s throws "not supported"', (name) => {
29
28
  expect(api[name]).toThrow('not supported')
package/src/api/index.ts CHANGED
@@ -6,6 +6,7 @@ import coinConfig, { type HypercoreConfig } from '../config'
6
6
  import { getBalance } from './getBalance'
7
7
  import { lastBlock } from './lastBlock'
8
8
  import { listOperations } from './listOperations'
9
+ import { validateAddress } from './validateAddress'
9
10
 
10
11
  export function createApi(config: HypercoreConfig): CoinModuleApi {
11
12
  coinConfig.setCoinConfig(() => ({ ...config, status: { type: 'active' } }))
@@ -27,7 +28,7 @@ export function createApi(config: HypercoreConfig): CoinModuleApi {
27
28
  broadcast: notSupported('broadcast'),
28
29
  validateIntent: notSupported('validateIntent'),
29
30
  getNextSequence: notSupported('getNextSequence'),
30
- validateAddress: notSupported('validateAddress'),
31
+ validateAddress,
31
32
  craftTransactionData: notSupported('craftTransactionData'),
32
33
  }
33
34
  }
@@ -0,0 +1,23 @@
1
+ // SPDX-FileCopyrightText: © 2024 LEDGER SAS
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { validateAddress } from './validateAddress'
5
+
6
+ describe('validateAddress', () => {
7
+ it.each([
8
+ '0x90D5b3f3FaA3cd61fBd78bF1CE3DdB2100F4BFb2', // checksummed
9
+ '0x90d5b3f3faa3cd61fbd78bf1ce3ddb2100f4bfb2', // lowercase
10
+ ])('accepts a well-formed Ethereum address (%s)', async (address) => {
11
+ expect(await validateAddress(address, {})).toBe(true)
12
+ })
13
+
14
+ it.each([
15
+ '', // empty
16
+ '90D5b3f3FaA3cd61fBd78bF1CE3DdB2100F4BFb2', // missing 0x prefix
17
+ '0x90D5b3f3FaA3cd61fBd78bF1CE3DdB2100F4BF', // too short
18
+ '0x90D5b3f3FaA3cd61fBd78bF1CE3DdB2100F4BFb2ab', // too long
19
+ '0xZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ', // non-hex
20
+ ])('rejects a malformed address (%s)', async (address) => {
21
+ expect(await validateAddress(address, {})).toBe(false)
22
+ })
23
+ })
@@ -0,0 +1,14 @@
1
+ // SPDX-FileCopyrightText: © 2024 LEDGER SAS
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { AddressValidationCurrencyParameters } from '@ledgerhq/coin-module-framework/api/types'
5
+
6
+ // Ethereum-format address; validate hex shape only (no EIP-55 checksum — no keccak dep).
7
+ const ETH_ADDRESS_REGEX = /^0x[0-9a-fA-F]{40}$/
8
+
9
+ export async function validateAddress(
10
+ address: string,
11
+ _parameters: Partial<AddressValidationCurrencyParameters>
12
+ ): Promise<boolean> {
13
+ return ETH_ADDRESS_REGEX.test(address)
14
+ }