@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 +6 -0
- package/lib/api/index.d.ts.map +1 -1
- package/lib/api/index.js +2 -1
- package/lib/api/index.js.map +1 -1
- package/lib/api/validateAddress.d.ts +3 -0
- package/lib/api/validateAddress.d.ts.map +1 -0
- package/lib/api/validateAddress.js +11 -0
- package/lib/api/validateAddress.js.map +1 -0
- package/lib-es/api/index.d.ts.map +1 -1
- package/lib-es/api/index.js +2 -1
- package/lib-es/api/index.js.map +1 -1
- package/lib-es/api/validateAddress.d.ts +3 -0
- package/lib-es/api/validateAddress.d.ts.map +1 -0
- package/lib-es/api/validateAddress.js +8 -0
- package/lib-es/api/validateAddress.js.map +1 -0
- package/package.json +1 -1
- package/src/api/index.integ.test.ts +0 -1
- package/src/api/index.ts +2 -1
- package/src/api/validateAddress.test.ts +23 -0
- package/src/api/validateAddress.ts +14 -0
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
|
package/lib/api/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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:
|
|
34
|
+
validateAddress: validateAddress_1.validateAddress,
|
|
34
35
|
craftTransactionData: (0, index_1.notSupported)('craftTransactionData'),
|
|
35
36
|
};
|
|
36
37
|
}
|
package/lib/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";AAAA,4CAA4C;AAC5C,sCAAsC;;;;;
|
|
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;
|
|
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-es/api/index.js
CHANGED
|
@@ -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
|
|
28
|
+
validateAddress,
|
|
28
29
|
craftTransactionData: notSupported('craftTransactionData'),
|
|
29
30
|
};
|
|
30
31
|
}
|
package/lib-es/api/index.js.map
CHANGED
|
@@ -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;
|
|
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
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
|
|
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
|
+
}
|