@ledgerhq/hw-app-eth 6.30.5 → 6.31.0-next.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 +13 -0
- package/README.md +1 -1
- package/lib/services/ledger/erc20.d.ts +2 -2
- package/lib/services/ledger/erc20.d.ts.map +1 -1
- package/lib/services/ledger/erc20.js +25 -9
- package/lib/services/ledger/erc20.js.map +1 -1
- package/lib-es/services/ledger/erc20.d.ts +2 -2
- package/lib-es/services/ledger/erc20.d.ts.map +1 -1
- package/lib-es/services/ledger/erc20.js +25 -9
- package/lib-es/services/ledger/erc20.js.map +1 -1
- package/package.json +4 -4
- package/src/services/ledger/erc20.ts +31 -14
- package/tests/ERC20/ERC20-CAL-KO.unit.test.ts +34 -2
- package/tests/ERC20/ERC20-CAL-OK.unit.test.ts +36 -2
- package/tests/{Eth.test.ts → Eth.integration.test.ts} +5 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @ledgerhq/hw-app-eth
|
|
2
2
|
|
|
3
|
+
## 6.31.0-next.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#2405](https://github.com/LedgerHQ/ledger-live/pull/2405) [`7eb8b1a39b`](https://github.com/LedgerHQ/ledger-live/commit/7eb8b1a39b36a5b336d95f89a92edf7ee22bcd26) Thanks [@lambertkevin](https://github.com/lambertkevin)! - Add resilience to malformed dynamic CAL
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [[`3ca4c9763d`](https://github.com/LedgerHQ/ledger-live/commit/3ca4c9763dd7c7ab7891efbd3cb6785cda2d038f), [`0e7ff249f7`](https://github.com/LedgerHQ/ledger-live/commit/0e7ff249f7e1160ff3888e52767ef91151efbedd), [`dcfeef0a2c`](https://github.com/LedgerHQ/ledger-live/commit/dcfeef0a2c0f8c3d344d2943b3d21654f15ae184), [`c2779b1cab`](https://github.com/LedgerHQ/ledger-live/commit/c2779b1cab18a1d5747ca955f5ceee86db920f57)]:
|
|
12
|
+
- @ledgerhq/cryptoassets@8.0.0-next.0
|
|
13
|
+
- @ledgerhq/hw-transport@6.28.0-next.0
|
|
14
|
+
- @ledgerhq/hw-transport-mocker@6.27.11-next.0
|
|
15
|
+
|
|
3
16
|
## 6.30.5
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -452,7 +452,7 @@ Retrieve the token information by a given contract address if any
|
|
|
452
452
|
|
|
453
453
|
* `contract` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**
|
|
454
454
|
* `chainId` **[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)**
|
|
455
|
-
* `erc20SignaturesBlob` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?**
|
|
455
|
+
* `erc20SignaturesBlob` **([string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) | null)?**
|
|
456
456
|
|
|
457
457
|
Returns **(TokenInfo | null | [undefined](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/undefined))**
|
|
458
458
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { LoadConfig } from "../types";
|
|
3
|
-
export declare const findERC20SignaturesInfo: (userLoadConfig: LoadConfig) => Promise<string |
|
|
3
|
+
export declare const findERC20SignaturesInfo: (userLoadConfig: LoadConfig) => Promise<string | null>;
|
|
4
4
|
/**
|
|
5
5
|
* Retrieve the token information by a given contract address if any
|
|
6
6
|
*/
|
|
7
|
-
export declare const byContractAddressAndChainId: (contract: string, chainId: number, erc20SignaturesBlob?: string | undefined) => TokenInfo | null | undefined;
|
|
7
|
+
export declare const byContractAddressAndChainId: (contract: string, chainId: number, erc20SignaturesBlob?: string | null | undefined) => TokenInfo | null | undefined;
|
|
8
8
|
/**
|
|
9
9
|
* list all the ERC20 tokens informations
|
|
10
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erc20.d.ts","sourceRoot":"","sources":["../../../src/services/ledger/erc20.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,eAAO,MAAM,uBAAuB,mBAClB,UAAU,KACzB,QAAQ,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"erc20.d.ts","sourceRoot":"","sources":["../../../src/services/ledger/erc20.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,eAAO,MAAM,uBAAuB,mBAClB,UAAU,KACzB,QAAQ,MAAM,GAAG,IAAI,CAmBvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B,aAC5B,MAAM,WACP,MAAM,sDAEd,SAAS,GAAG,IAAI,GAAG,SAcrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,IAAI,gDAAmC,SAAS,EAW5D,CAAC;AAEF,oBAAY,SAAS,GAAG;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AACF,oBAAY,GAAG,GAAG;IAChB,oBAAoB,EAAE,CACpB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,KACP,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,IAAI,EAAE,MAAM,SAAS,EAAE,CAAC;CACzB,CAAC"}
|
|
@@ -45,23 +45,29 @@ var logs_1 = require("@ledgerhq/logs");
|
|
|
45
45
|
var axios_1 = __importDefault(require("axios"));
|
|
46
46
|
var loadConfig_1 = require("./loadConfig");
|
|
47
47
|
var findERC20SignaturesInfo = function (userLoadConfig) { return __awaiter(void 0, void 0, void 0, function () {
|
|
48
|
-
var cryptoassetsBaseURL, url,
|
|
48
|
+
var cryptoassetsBaseURL, url, blob;
|
|
49
49
|
return __generator(this, function (_a) {
|
|
50
50
|
switch (_a.label) {
|
|
51
51
|
case 0:
|
|
52
52
|
cryptoassetsBaseURL = (0, loadConfig_1.getLoadConfig)(userLoadConfig).cryptoassetsBaseURL;
|
|
53
53
|
if (!cryptoassetsBaseURL)
|
|
54
|
-
return [2 /*return
|
|
54
|
+
return [2 /*return*/, null];
|
|
55
55
|
url = "".concat(cryptoassetsBaseURL, "/erc20-signatures.json");
|
|
56
|
-
return [4 /*yield*/, axios_1["default"]
|
|
56
|
+
return [4 /*yield*/, axios_1["default"]
|
|
57
|
+
.get(url)
|
|
58
|
+
.then(function (_a) {
|
|
59
|
+
var data = _a.data;
|
|
60
|
+
if (!data || typeof data !== "string") {
|
|
61
|
+
throw new Error("ERC20 signatures file is malformed ".concat(url));
|
|
62
|
+
}
|
|
63
|
+
return data;
|
|
64
|
+
})["catch"](function (e) {
|
|
57
65
|
(0, logs_1.log)("error", "could not fetch from " + url + ": " + String(e));
|
|
58
66
|
return null;
|
|
59
67
|
})];
|
|
60
68
|
case 1:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
return [2 /*return*/];
|
|
64
|
-
return [2 /*return*/, response.data];
|
|
69
|
+
blob = _a.sent();
|
|
70
|
+
return [2 /*return*/, blob];
|
|
65
71
|
}
|
|
66
72
|
});
|
|
67
73
|
}); };
|
|
@@ -72,7 +78,12 @@ exports.findERC20SignaturesInfo = findERC20SignaturesInfo;
|
|
|
72
78
|
var byContractAddressAndChainId = function (contract, chainId, erc20SignaturesBlob) {
|
|
73
79
|
// If we are able to fetch data from s3 bucket that contains dynamic CAL
|
|
74
80
|
if (erc20SignaturesBlob) {
|
|
75
|
-
|
|
81
|
+
try {
|
|
82
|
+
return parse(erc20SignaturesBlob).byContractAndChainId(asContractAddress(contract), chainId);
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
return get().byContractAndChainId(asContractAddress(contract), chainId);
|
|
86
|
+
}
|
|
76
87
|
}
|
|
77
88
|
// the static fallback when dynamic cal is not provided
|
|
78
89
|
return get().byContractAndChainId(asContractAddress(contract), chainId);
|
|
@@ -84,7 +95,12 @@ exports.byContractAddressAndChainId = byContractAddressAndChainId;
|
|
|
84
95
|
var list = function (erc20SignaturesBlob) {
|
|
85
96
|
// If we are able to fetch data from s3 bucket that contains dynamic CAL
|
|
86
97
|
if (erc20SignaturesBlob) {
|
|
87
|
-
|
|
98
|
+
try {
|
|
99
|
+
return parse(erc20SignaturesBlob).list();
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
return get().list();
|
|
103
|
+
}
|
|
88
104
|
}
|
|
89
105
|
// the static fallback when dynamic cal is not provided
|
|
90
106
|
return get().list();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erc20.js","sourceRoot":"","sources":["../../../src/services/ledger/erc20.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kGAAgE;AAChE,uCAAqC;AACrC,gDAA0B;AAE1B,2CAA6C;AAEtC,IAAM,uBAAuB,GAAG,UACrC,cAA0B;;;;;gBAElB,mBAAmB,GAAK,IAAA,0BAAa,EAAC,cAAc,CAAC,oBAAlC,CAAmC;gBAC9D,IAAI,CAAC,mBAAmB;oBAAE,sBAAO;
|
|
1
|
+
{"version":3,"file":"erc20.js","sourceRoot":"","sources":["../../../src/services/ledger/erc20.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { LoadConfig } from "../types";
|
|
3
|
-
export declare const findERC20SignaturesInfo: (userLoadConfig: LoadConfig) => Promise<string |
|
|
3
|
+
export declare const findERC20SignaturesInfo: (userLoadConfig: LoadConfig) => Promise<string | null>;
|
|
4
4
|
/**
|
|
5
5
|
* Retrieve the token information by a given contract address if any
|
|
6
6
|
*/
|
|
7
|
-
export declare const byContractAddressAndChainId: (contract: string, chainId: number, erc20SignaturesBlob?: string | undefined) => TokenInfo | null | undefined;
|
|
7
|
+
export declare const byContractAddressAndChainId: (contract: string, chainId: number, erc20SignaturesBlob?: string | null | undefined) => TokenInfo | null | undefined;
|
|
8
8
|
/**
|
|
9
9
|
* list all the ERC20 tokens informations
|
|
10
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erc20.d.ts","sourceRoot":"","sources":["../../../src/services/ledger/erc20.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,eAAO,MAAM,uBAAuB,mBAClB,UAAU,KACzB,QAAQ,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"erc20.d.ts","sourceRoot":"","sources":["../../../src/services/ledger/erc20.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,eAAO,MAAM,uBAAuB,mBAClB,UAAU,KACzB,QAAQ,MAAM,GAAG,IAAI,CAmBvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B,aAC5B,MAAM,WACP,MAAM,sDAEd,SAAS,GAAG,IAAI,GAAG,SAcrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,IAAI,gDAAmC,SAAS,EAW5D,CAAC;AAEF,oBAAY,SAAS,GAAG;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AACF,oBAAY,GAAG,GAAG;IAChB,oBAAoB,EAAE,CACpB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,KACP,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,IAAI,EAAE,MAAM,SAAS,EAAE,CAAC;CACzB,CAAC"}
|
|
@@ -39,23 +39,29 @@ import { log } from "@ledgerhq/logs";
|
|
|
39
39
|
import axios from "axios";
|
|
40
40
|
import { getLoadConfig } from "./loadConfig";
|
|
41
41
|
export var findERC20SignaturesInfo = function (userLoadConfig) { return __awaiter(void 0, void 0, void 0, function () {
|
|
42
|
-
var cryptoassetsBaseURL, url,
|
|
42
|
+
var cryptoassetsBaseURL, url, blob;
|
|
43
43
|
return __generator(this, function (_a) {
|
|
44
44
|
switch (_a.label) {
|
|
45
45
|
case 0:
|
|
46
46
|
cryptoassetsBaseURL = getLoadConfig(userLoadConfig).cryptoassetsBaseURL;
|
|
47
47
|
if (!cryptoassetsBaseURL)
|
|
48
|
-
return [2 /*return
|
|
48
|
+
return [2 /*return*/, null];
|
|
49
49
|
url = "".concat(cryptoassetsBaseURL, "/erc20-signatures.json");
|
|
50
|
-
return [4 /*yield*/, axios
|
|
50
|
+
return [4 /*yield*/, axios
|
|
51
|
+
.get(url)
|
|
52
|
+
.then(function (_a) {
|
|
53
|
+
var data = _a.data;
|
|
54
|
+
if (!data || typeof data !== "string") {
|
|
55
|
+
throw new Error("ERC20 signatures file is malformed ".concat(url));
|
|
56
|
+
}
|
|
57
|
+
return data;
|
|
58
|
+
})["catch"](function (e) {
|
|
51
59
|
log("error", "could not fetch from " + url + ": " + String(e));
|
|
52
60
|
return null;
|
|
53
61
|
})];
|
|
54
62
|
case 1:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
return [2 /*return*/];
|
|
58
|
-
return [2 /*return*/, response.data];
|
|
63
|
+
blob = _a.sent();
|
|
64
|
+
return [2 /*return*/, blob];
|
|
59
65
|
}
|
|
60
66
|
});
|
|
61
67
|
}); };
|
|
@@ -65,7 +71,12 @@ export var findERC20SignaturesInfo = function (userLoadConfig) { return __awaite
|
|
|
65
71
|
export var byContractAddressAndChainId = function (contract, chainId, erc20SignaturesBlob) {
|
|
66
72
|
// If we are able to fetch data from s3 bucket that contains dynamic CAL
|
|
67
73
|
if (erc20SignaturesBlob) {
|
|
68
|
-
|
|
74
|
+
try {
|
|
75
|
+
return parse(erc20SignaturesBlob).byContractAndChainId(asContractAddress(contract), chainId);
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
return get().byContractAndChainId(asContractAddress(contract), chainId);
|
|
79
|
+
}
|
|
69
80
|
}
|
|
70
81
|
// the static fallback when dynamic cal is not provided
|
|
71
82
|
return get().byContractAndChainId(asContractAddress(contract), chainId);
|
|
@@ -76,7 +87,12 @@ export var byContractAddressAndChainId = function (contract, chainId, erc20Signa
|
|
|
76
87
|
export var list = function (erc20SignaturesBlob) {
|
|
77
88
|
// If we are able to fetch data from s3 bucket that contains dynamic CAL
|
|
78
89
|
if (erc20SignaturesBlob) {
|
|
79
|
-
|
|
90
|
+
try {
|
|
91
|
+
return parse(erc20SignaturesBlob).list();
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
return get().list();
|
|
95
|
+
}
|
|
80
96
|
}
|
|
81
97
|
// the static fallback when dynamic cal is not provided
|
|
82
98
|
return get().list();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erc20.js","sourceRoot":"","sources":["../../../src/services/ledger/erc20.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,IAAI,MAAM,8CAA8C,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,IAAM,uBAAuB,GAAG,UACrC,cAA0B;;;;;gBAElB,mBAAmB,GAAK,aAAa,CAAC,cAAc,CAAC,oBAAlC,CAAmC;gBAC9D,IAAI,CAAC,mBAAmB;oBAAE,sBAAO;
|
|
1
|
+
{"version":3,"file":"erc20.js","sourceRoot":"","sources":["../../../src/services/ledger/erc20.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/hw-app-eth",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.31.0-next.0",
|
|
4
4
|
"description": "Ledger Hardware Wallet Ethereum Application API",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ledger",
|
|
@@ -32,10 +32,10 @@
|
|
|
32
32
|
"axios": "^0.26.1",
|
|
33
33
|
"bignumber.js": "^9.1.0",
|
|
34
34
|
"crypto-js": "^4.1.1",
|
|
35
|
-
"@ledgerhq/cryptoassets": "^
|
|
35
|
+
"@ledgerhq/cryptoassets": "^8.0.0-next.0",
|
|
36
36
|
"@ledgerhq/errors": "^6.12.3",
|
|
37
|
-
"@ledgerhq/hw-transport": "^6.
|
|
38
|
-
"@ledgerhq/hw-transport-mocker": "^6.27.
|
|
37
|
+
"@ledgerhq/hw-transport": "^6.28.0-next.0",
|
|
38
|
+
"@ledgerhq/hw-transport-mocker": "^6.27.11-next.0",
|
|
39
39
|
"@ledgerhq/logs": "^6.10.1"
|
|
40
40
|
},
|
|
41
41
|
"gitHead": "dd0dea64b58e5a9125c8a422dcffd29e5ef6abec",
|
|
@@ -6,16 +6,25 @@ import { getLoadConfig } from "./loadConfig";
|
|
|
6
6
|
|
|
7
7
|
export const findERC20SignaturesInfo = async (
|
|
8
8
|
userLoadConfig: LoadConfig
|
|
9
|
-
): Promise<string |
|
|
9
|
+
): Promise<string | null> => {
|
|
10
10
|
const { cryptoassetsBaseURL } = getLoadConfig(userLoadConfig);
|
|
11
|
-
if (!cryptoassetsBaseURL) return;
|
|
11
|
+
if (!cryptoassetsBaseURL) return null;
|
|
12
|
+
|
|
12
13
|
const url = `${cryptoassetsBaseURL}/erc20-signatures.json`;
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
const blob = await axios
|
|
15
|
+
.get<string>(url)
|
|
16
|
+
.then(({ data }) => {
|
|
17
|
+
if (!data || typeof data !== "string") {
|
|
18
|
+
throw new Error(`ERC20 signatures file is malformed ${url}`);
|
|
19
|
+
}
|
|
20
|
+
return data;
|
|
21
|
+
})
|
|
22
|
+
.catch((e) => {
|
|
23
|
+
log("error", "could not fetch from " + url + ": " + String(e));
|
|
24
|
+
return null;
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
return blob;
|
|
19
28
|
};
|
|
20
29
|
|
|
21
30
|
/**
|
|
@@ -24,14 +33,18 @@ export const findERC20SignaturesInfo = async (
|
|
|
24
33
|
export const byContractAddressAndChainId = (
|
|
25
34
|
contract: string,
|
|
26
35
|
chainId: number,
|
|
27
|
-
erc20SignaturesBlob?: string
|
|
36
|
+
erc20SignaturesBlob?: string | null
|
|
28
37
|
): TokenInfo | null | undefined => {
|
|
29
38
|
// If we are able to fetch data from s3 bucket that contains dynamic CAL
|
|
30
39
|
if (erc20SignaturesBlob) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
40
|
+
try {
|
|
41
|
+
return parse(erc20SignaturesBlob).byContractAndChainId(
|
|
42
|
+
asContractAddress(contract),
|
|
43
|
+
chainId
|
|
44
|
+
);
|
|
45
|
+
} catch (e) {
|
|
46
|
+
return get().byContractAndChainId(asContractAddress(contract), chainId);
|
|
47
|
+
}
|
|
35
48
|
}
|
|
36
49
|
// the static fallback when dynamic cal is not provided
|
|
37
50
|
return get().byContractAndChainId(asContractAddress(contract), chainId);
|
|
@@ -43,7 +56,11 @@ export const byContractAddressAndChainId = (
|
|
|
43
56
|
export const list = (erc20SignaturesBlob?: string): TokenInfo[] => {
|
|
44
57
|
// If we are able to fetch data from s3 bucket that contains dynamic CAL
|
|
45
58
|
if (erc20SignaturesBlob) {
|
|
46
|
-
|
|
59
|
+
try {
|
|
60
|
+
return parse(erc20SignaturesBlob).list();
|
|
61
|
+
} catch (e) {
|
|
62
|
+
return get().list();
|
|
63
|
+
}
|
|
47
64
|
}
|
|
48
65
|
// the static fallback when dynamic cal is not provided
|
|
49
66
|
return get().list();
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import axios from "axios";
|
|
1
2
|
import fs from "fs/promises";
|
|
2
3
|
import path from "path";
|
|
3
4
|
import {
|
|
@@ -15,7 +16,7 @@ jest.mock("@ledgerhq/cryptoassets/data/erc20-signatures", () => "");
|
|
|
15
16
|
|
|
16
17
|
describe("ERC20 dynamic cal", () => {
|
|
17
18
|
describe("ERC20 is not in local CAL", () => {
|
|
18
|
-
|
|
19
|
+
it("should be successfully signin transaction from dynamic CAL", async () => {
|
|
19
20
|
const apdusBuffer = await fs.readFile(
|
|
20
21
|
path.resolve("./tests/fixtures/apdus/ERC20-OK.apdus"),
|
|
21
22
|
"utf-8"
|
|
@@ -43,7 +44,7 @@ describe("ERC20 dynamic cal", () => {
|
|
|
43
44
|
});
|
|
44
45
|
});
|
|
45
46
|
|
|
46
|
-
|
|
47
|
+
it("should ask for blind sign if not in dynamic & local CAL", async () => {
|
|
47
48
|
const apdusBuffer = await fs.readFile(
|
|
48
49
|
path.resolve("./tests/fixtures/apdus/ERC20-KO.apdus"),
|
|
49
50
|
"utf-8"
|
|
@@ -70,5 +71,36 @@ describe("ERC20 dynamic cal", () => {
|
|
|
70
71
|
);
|
|
71
72
|
}
|
|
72
73
|
});
|
|
74
|
+
|
|
75
|
+
it("shouldn't break if the dynamic CAL is malformed", async () => {
|
|
76
|
+
jest
|
|
77
|
+
.spyOn(axios, "get")
|
|
78
|
+
.mockImplementationOnce(async () => ({ data: { 123: "ok" } })); // malformed response. Should be a string but here returning an object imcompatible w/ buffer.from
|
|
79
|
+
const apdusBuffer = await fs.readFile(
|
|
80
|
+
path.resolve("./tests/fixtures/apdus/ERC20-KO.apdus"),
|
|
81
|
+
"utf-8"
|
|
82
|
+
);
|
|
83
|
+
const transport = await openTransportReplayer(
|
|
84
|
+
RecordStore.fromString(`${apdusBuffer}`)
|
|
85
|
+
);
|
|
86
|
+
const resolutionConfig = { erc20: true };
|
|
87
|
+
const resolution = await ledgerService.resolveTransaction(
|
|
88
|
+
txHex,
|
|
89
|
+
{ cryptoassetsBaseURL: "working" },
|
|
90
|
+
resolutionConfig
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
const eth = new Eth(transport);
|
|
94
|
+
|
|
95
|
+
try {
|
|
96
|
+
await eth.signTransaction("44'/60'/0'/0/0", txHex, resolution);
|
|
97
|
+
} catch (e) {
|
|
98
|
+
expect(e).toStrictEqual(
|
|
99
|
+
new EthAppPleaseEnableContractData(
|
|
100
|
+
"Please enable Blind signing or Contract data in the Ethereum app Settings"
|
|
101
|
+
)
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
73
105
|
});
|
|
74
106
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import axios from "axios";
|
|
1
2
|
import fs from "fs/promises";
|
|
2
3
|
import path from "path";
|
|
3
4
|
import {
|
|
@@ -12,7 +13,7 @@ const txHex =
|
|
|
12
13
|
|
|
13
14
|
describe("ERC20 dynamic cal", () => {
|
|
14
15
|
describe("ERC20 is in local CAL", () => {
|
|
15
|
-
|
|
16
|
+
it("should be successfully signin transaction from dynamic CAL", async () => {
|
|
16
17
|
const apdusBuffer = await fs.readFile(
|
|
17
18
|
path.resolve("./tests/fixtures/apdus/ERC20-OK.apdus"),
|
|
18
19
|
"utf-8"
|
|
@@ -40,7 +41,7 @@ describe("ERC20 dynamic cal", () => {
|
|
|
40
41
|
});
|
|
41
42
|
});
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
it("should be successfully signin transaction from local CAL", async () => {
|
|
44
45
|
const apdusBuffer = await fs.readFile(
|
|
45
46
|
path.resolve("./tests/fixtures/apdus/ERC20-OK.apdus"),
|
|
46
47
|
"utf-8"
|
|
@@ -68,5 +69,38 @@ describe("ERC20 dynamic cal", () => {
|
|
|
68
69
|
s: "4f445c94cc869f01e194478a3b876052716ae7676247664acec371b6e6ad16e4",
|
|
69
70
|
});
|
|
70
71
|
});
|
|
72
|
+
|
|
73
|
+
it("shouldn't break if the dynamic CAL is malformed", async () => {
|
|
74
|
+
jest
|
|
75
|
+
.spyOn(axios, "get")
|
|
76
|
+
.mockImplementationOnce(async () => ({ data: { 123: "ok" } })); // malformed response. Should be a string but here returning an object imcompatible w/ buffer.from
|
|
77
|
+
const apdusBuffer = await fs.readFile(
|
|
78
|
+
path.resolve("./tests/fixtures/apdus/ERC20-OK.apdus"),
|
|
79
|
+
"utf-8"
|
|
80
|
+
);
|
|
81
|
+
const transport = await openTransportReplayer(
|
|
82
|
+
RecordStore.fromString(`${apdusBuffer}`)
|
|
83
|
+
);
|
|
84
|
+
const resolutionConfig = { erc20: true };
|
|
85
|
+
const resolution = await ledgerService.resolveTransaction(
|
|
86
|
+
txHex,
|
|
87
|
+
{ cryptoassetsBaseURL: "working" },
|
|
88
|
+
resolutionConfig
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
const eth = new Eth(transport);
|
|
92
|
+
|
|
93
|
+
const result = await eth.signTransaction(
|
|
94
|
+
"44'/60'/0'/0/0",
|
|
95
|
+
txHex,
|
|
96
|
+
resolution
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
expect(result).toMatchObject({
|
|
100
|
+
v: "26",
|
|
101
|
+
r: "006c000371dc04c5752287a9901b1fac4b069eb1410173db39c407ae725e4a6e",
|
|
102
|
+
s: "4f445c94cc869f01e194478a3b876052716ae7676247664acec371b6e6ad16e4",
|
|
103
|
+
});
|
|
104
|
+
});
|
|
71
105
|
});
|
|
72
106
|
});
|
|
@@ -10,7 +10,11 @@ import paraswapJSON from "./paraswap.json";
|
|
|
10
10
|
|
|
11
11
|
async function signTxWithResolution(eth, path, tx) {
|
|
12
12
|
const resolution = await ledgerService
|
|
13
|
-
.resolveTransaction(
|
|
13
|
+
.resolveTransaction(
|
|
14
|
+
tx,
|
|
15
|
+
{},
|
|
16
|
+
{ externalPlugins: true, erc20: true, nft: true }
|
|
17
|
+
)
|
|
14
18
|
.catch((e) => {
|
|
15
19
|
console.warn(
|
|
16
20
|
"an error occurred in resolveTransaction => fallback to blind signing: " +
|