@onekeyfe/hd-core 1.1.4-alpha.2 → 1.1.5

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 (62) hide show
  1. package/dist/api/BaseMethod.d.ts +2 -0
  2. package/dist/api/BaseMethod.d.ts.map +1 -1
  3. package/dist/api/allnetwork/AllNetworkGetAddress.d.ts +4 -28
  4. package/dist/api/allnetwork/AllNetworkGetAddress.d.ts.map +1 -1
  5. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts +47 -0
  6. package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -0
  7. package/dist/api/allnetwork/AllNetworkGetAddressByLoop.d.ts +8 -0
  8. package/dist/api/allnetwork/AllNetworkGetAddressByLoop.d.ts.map +1 -0
  9. package/dist/api/btc/BTCGetPublicKey.d.ts.map +1 -1
  10. package/dist/api/cosmos/CosmosGetPublicKey.d.ts +1 -1
  11. package/dist/api/cosmos/CosmosGetPublicKey.d.ts.map +1 -1
  12. package/dist/api/device/DeviceUnlock.d.ts +0 -2
  13. package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
  14. package/dist/api/evm/EVMGetPublicKey.d.ts +1 -0
  15. package/dist/api/evm/EVMGetPublicKey.d.ts.map +1 -1
  16. package/dist/api/index.d.ts +1 -0
  17. package/dist/api/index.d.ts.map +1 -1
  18. package/dist/core/RequestQueue.d.ts +4 -0
  19. package/dist/core/RequestQueue.d.ts.map +1 -1
  20. package/dist/core/index.d.ts +3 -2
  21. package/dist/core/index.d.ts.map +1 -1
  22. package/dist/device/Device.d.ts +4 -1
  23. package/dist/device/Device.d.ts.map +1 -1
  24. package/dist/device/DeviceCommands.d.ts +4 -4
  25. package/dist/events/call.d.ts +9 -0
  26. package/dist/events/call.d.ts.map +1 -1
  27. package/dist/events/core.d.ts +2 -2
  28. package/dist/events/core.d.ts.map +1 -1
  29. package/dist/events/iframe.d.ts +11 -1
  30. package/dist/events/iframe.d.ts.map +1 -1
  31. package/dist/index.d.ts +43 -13
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +406 -150
  34. package/dist/inject.d.ts +3 -0
  35. package/dist/inject.d.ts.map +1 -1
  36. package/dist/types/api/allNetworkGetAddress.d.ts +12 -3
  37. package/dist/types/api/allNetworkGetAddress.d.ts.map +1 -1
  38. package/dist/types/api/evmGetPublicKey.d.ts +1 -0
  39. package/dist/types/api/evmGetPublicKey.d.ts.map +1 -1
  40. package/dist/types/api/index.d.ts +2 -1
  41. package/dist/types/api/index.d.ts.map +1 -1
  42. package/package.json +4 -4
  43. package/src/api/BaseMethod.ts +3 -0
  44. package/src/api/allnetwork/AllNetworkGetAddress.ts +19 -408
  45. package/src/api/allnetwork/AllNetworkGetAddressBase.ts +480 -0
  46. package/src/api/allnetwork/AllNetworkGetAddressByLoop.ts +161 -0
  47. package/src/api/btc/BTCGetPublicKey.ts +13 -0
  48. package/src/api/cosmos/CosmosGetPublicKey.ts +1 -1
  49. package/src/api/device/DeviceUnlock.ts +1 -48
  50. package/src/api/evm/EVMGetPublicKey.ts +9 -3
  51. package/src/api/index.ts +1 -0
  52. package/src/core/RequestQueue.ts +26 -0
  53. package/src/core/index.ts +42 -24
  54. package/src/device/Device.ts +66 -0
  55. package/src/events/call.ts +10 -0
  56. package/src/events/core.ts +7 -1
  57. package/src/events/iframe.ts +12 -1
  58. package/src/index.ts +2 -1
  59. package/src/inject.ts +47 -0
  60. package/src/types/api/allNetworkGetAddress.ts +17 -3
  61. package/src/types/api/evmGetPublicKey.ts +1 -0
  62. package/src/types/api/index.ts +2 -1
package/dist/index.js CHANGED
@@ -26,6 +26,82 @@ var ByteBuffer__default = /*#__PURE__*/_interopDefaultLegacy(ByteBuffer);
26
26
  var BigNumber__default = /*#__PURE__*/_interopDefaultLegacy(BigNumber);
27
27
  var JSZip__default = /*#__PURE__*/_interopDefaultLegacy(JSZip);
28
28
 
29
+ /******************************************************************************
30
+ Copyright (c) Microsoft Corporation.
31
+
32
+ Permission to use, copy, modify, and/or distribute this software for any
33
+ purpose with or without fee is hereby granted.
34
+
35
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
36
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
37
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
38
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
39
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
40
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
41
+ PERFORMANCE OF THIS SOFTWARE.
42
+ ***************************************************************************** */
43
+
44
+ function __rest(s, e) {
45
+ var t = {};
46
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
47
+ t[p] = s[p];
48
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
49
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
50
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
51
+ t[p[i]] = s[p[i]];
52
+ }
53
+ return t;
54
+ }
55
+
56
+ function __awaiter(thisArg, _arguments, P, generator) {
57
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
58
+ return new (P || (P = Promise))(function (resolve, reject) {
59
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
60
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
61
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
62
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
63
+ });
64
+ }
65
+
66
+ function __values(o) {
67
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
68
+ if (m) return m.call(o);
69
+ if (o && typeof o.length === "number") return {
70
+ next: function () {
71
+ if (o && i >= o.length) o = void 0;
72
+ return { value: o && o[i++], done: !o };
73
+ }
74
+ };
75
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
76
+ }
77
+
78
+ function __asyncValues(o) {
79
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
80
+ var m = o[Symbol.asyncIterator], i;
81
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
82
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
83
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
84
+ }
85
+
86
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
87
+ var e = new Error(message);
88
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
89
+ };
90
+
91
+ const callbackManager = new Map();
92
+ const generateCallbackId = () => `callback_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
93
+ const registerCallback = (id, callback) => {
94
+ callbackManager.set(id, callback);
95
+ };
96
+ const executeCallback = (id, ...args) => {
97
+ const callback = callbackManager.get(id);
98
+ if (callback) {
99
+ callback(...args);
100
+ }
101
+ };
102
+ const cleanupCallback = (id) => {
103
+ callbackManager.delete(id);
104
+ };
29
105
  const inject = ({ call, cancel, dispose, eventEmitter, init, updateSettings, switchTransport, uiResponse, }) => {
30
106
  const api = Object.assign({ on: (type, fn) => {
31
107
  eventEmitter.on(type, fn);
@@ -77,6 +153,20 @@ const createCoreApi = (call) => ({
77
153
  getNextU2FCounter: (connectId, params) => call(Object.assign(Object.assign({}, params), { connectId, method: 'getNextU2FCounter' })),
78
154
  setU2FCounter: (connectId, params) => call(Object.assign(Object.assign({}, params), { connectId, method: 'setU2FCounter' })),
79
155
  allNetworkGetAddress: (connectId, deviceId, params) => call(Object.assign(Object.assign({}, params), { connectId, deviceId, method: 'allNetworkGetAddress' })),
156
+ allNetworkGetAddressByLoop: (connectId, deviceId, params) => {
157
+ const { onLoopItemResponse, onAllItemsResponse } = params, restParams = __rest(params, ["onLoopItemResponse", "onAllItemsResponse"]);
158
+ const callbackId = generateCallbackId();
159
+ registerCallback(callbackId, onLoopItemResponse);
160
+ const callbackIdFinish = generateCallbackId();
161
+ registerCallback(callbackIdFinish, (data) => {
162
+ onAllItemsResponse === null || onAllItemsResponse === void 0 ? void 0 : onAllItemsResponse(data);
163
+ cleanupCallback(callbackIdFinish);
164
+ cleanupCallback(callbackId);
165
+ });
166
+ return call(Object.assign(Object.assign({}, restParams), { connectId,
167
+ deviceId, method: 'allNetworkGetAddressByLoop', callbackId,
168
+ callbackIdFinish }));
169
+ },
80
170
  evmGetAddress: (connectId, deviceId, params) => call(Object.assign(Object.assign({}, params), { connectId, deviceId, method: 'evmGetAddress' })),
81
171
  evmGetPublicKey: (connectId, deviceId, params) => call(Object.assign(Object.assign({}, params), { connectId, deviceId, method: 'evmGetPublicKey' })),
82
172
  evmSignMessage: (connectId, deviceId, params) => call(Object.assign(Object.assign({}, params), { connectId, deviceId, method: 'evmSignMessage' })),
@@ -684,68 +774,6 @@ const topLevelInject = () => {
684
774
  return api;
685
775
  };
686
776
 
687
- /******************************************************************************
688
- Copyright (c) Microsoft Corporation.
689
-
690
- Permission to use, copy, modify, and/or distribute this software for any
691
- purpose with or without fee is hereby granted.
692
-
693
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
694
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
695
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
696
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
697
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
698
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
699
- PERFORMANCE OF THIS SOFTWARE.
700
- ***************************************************************************** */
701
-
702
- function __rest(s, e) {
703
- var t = {};
704
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
705
- t[p] = s[p];
706
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
707
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
708
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
709
- t[p[i]] = s[p[i]];
710
- }
711
- return t;
712
- }
713
-
714
- function __awaiter(thisArg, _arguments, P, generator) {
715
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
716
- return new (P || (P = Promise))(function (resolve, reject) {
717
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
718
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
719
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
720
- step((generator = generator.apply(thisArg, _arguments || [])).next());
721
- });
722
- }
723
-
724
- function __values(o) {
725
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
726
- if (m) return m.call(o);
727
- if (o && typeof o.length === "number") return {
728
- next: function () {
729
- if (o && i >= o.length) o = void 0;
730
- return { value: o && o[i++], done: !o };
731
- }
732
- };
733
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
734
- }
735
-
736
- function __asyncValues(o) {
737
- if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
738
- var m = o[Symbol.asyncIterator], i;
739
- return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
740
- function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
741
- function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
742
- }
743
-
744
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
745
- var e = new Error(message);
746
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
747
- };
748
-
749
777
  const LOG_EVENT = 'LOG_EVENT';
750
778
  const LOG = {
751
779
  OUTPUT: 'log-output',
@@ -25822,6 +25850,7 @@ const IFRAME = {
25822
25850
  CALL: 'iframe-call',
25823
25851
  CANCEL: 'iframe-cancel',
25824
25852
  SWITCH_TRANSPORT: 'iframe-switch-transport',
25853
+ CALLBACK: 'iframe-callback',
25825
25854
  };
25826
25855
  const createIFrameMessage = (type, payload) => ({
25827
25856
  event: UI_EVENT,
@@ -26715,6 +26744,15 @@ class Device extends events.exports {
26715
26744
  const env = DataManager.getSettings('env');
26716
26745
  if ((this.isUsedHere() && !this.keepSession && this.mainId) ||
26717
26746
  (this.mainId && DataManager.isBleConnect(env))) {
26747
+ if (this.pendingCallbackPromise) {
26748
+ try {
26749
+ Log$a.debug('Waiting for callback tasks to complete before releasing device (in release method)');
26750
+ yield this.pendingCallbackPromise.promise;
26751
+ }
26752
+ catch (error) {
26753
+ Log$a.error('Error waiting for callback tasks in release method:', error);
26754
+ }
26755
+ }
26718
26756
  if (this.commands) {
26719
26757
  this.commands.dispose(false);
26720
26758
  if (this.commands.callPromise) {
@@ -27095,6 +27133,46 @@ class Device extends events.exports {
27095
27133
  return res.message;
27096
27134
  });
27097
27135
  }
27136
+ supportUnlockVersionRange() {
27137
+ return {
27138
+ pro: {
27139
+ min: '4.15.0',
27140
+ },
27141
+ };
27142
+ }
27143
+ unlockDevice() {
27144
+ var _a;
27145
+ return __awaiter(this, void 0, void 0, function* () {
27146
+ const firmwareVersion = (_a = getDeviceFirmwareVersion(this.features)) === null || _a === void 0 ? void 0 : _a.join('.');
27147
+ const versionRange = getMethodVersionRange(this.features, type => this.supportUnlockVersionRange()[type]);
27148
+ if (versionRange && semver__default["default"].gte(firmwareVersion, versionRange.min)) {
27149
+ const res = yield this.commands.typedCall('UnLockDevice', 'UnLockDeviceResponse');
27150
+ if (this.features) {
27151
+ this.features.unlocked = res.message.unlocked == null ? null : res.message.unlocked;
27152
+ this.features.unlocked_attach_pin =
27153
+ res.message.unlocked_attach_pin == null ? undefined : res.message.unlocked_attach_pin;
27154
+ this.features.passphrase_protection =
27155
+ res.message.passphrase_protection == null ? null : res.message.passphrase_protection;
27156
+ return Promise.resolve(this.features);
27157
+ }
27158
+ const featuresRes = yield this.commands.typedCall('GetFeatures', 'Features');
27159
+ this._updateFeatures(featuresRes.message);
27160
+ return Promise.resolve(featuresRes.message);
27161
+ }
27162
+ const { type } = yield this.commands.typedCall('GetAddress', 'Address', {
27163
+ address_n: [toHardened(44), toHardened(1), toHardened(0), 0, 0],
27164
+ coin_name: 'Testnet',
27165
+ script_type: 'SPENDADDRESS',
27166
+ show_display: false,
27167
+ });
27168
+ if (type === 'CallMethodError') {
27169
+ throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'unlock device error');
27170
+ }
27171
+ const res = yield this.commands.typedCall('GetFeatures', 'Features');
27172
+ this._updateFeatures(res.message);
27173
+ return Promise.resolve(res.message);
27174
+ });
27175
+ }
27098
27176
  checkPassphraseStateSafety(passphraseState, useEmptyPassphrase, skipPassphraseCheck) {
27099
27177
  return __awaiter(this, void 0, void 0, function* () {
27100
27178
  if (!this.features)
@@ -28667,42 +28745,9 @@ class DeviceUnlock extends BaseMethod {
28667
28745
  init() {
28668
28746
  this.useDevicePassphraseState = false;
28669
28747
  }
28670
- supportUnlockVersionRange() {
28671
- return {
28672
- pro: {
28673
- min: '4.15.0',
28674
- },
28675
- };
28676
- }
28677
28748
  run() {
28678
- var _a;
28679
28749
  return __awaiter(this, void 0, void 0, function* () {
28680
- const firmwareVersion = (_a = getDeviceFirmwareVersion(this.device.features)) === null || _a === void 0 ? void 0 : _a.join('.');
28681
- const versionRange = getMethodVersionRange(this.device.features, type => this.supportUnlockVersionRange()[type]);
28682
- if (versionRange && semver__default["default"].gte(firmwareVersion, versionRange.min)) {
28683
- const res = yield this.device.commands.typedCall('UnLockDevice', 'UnLockDeviceResponse');
28684
- if (this.device.features) {
28685
- this.device.features.unlocked = res.message.unlocked == null ? null : res.message.unlocked;
28686
- this.device.features.unlocked_attach_pin =
28687
- res.message.unlocked_attach_pin == null ? undefined : res.message.unlocked_attach_pin;
28688
- this.device.features.passphrase_protection =
28689
- res.message.passphrase_protection == null ? null : res.message.passphrase_protection;
28690
- return Promise.resolve(this.device.features);
28691
- }
28692
- const featuresRes = yield this.device.commands.typedCall('GetFeatures', 'Features');
28693
- return Promise.resolve(featuresRes.message);
28694
- }
28695
- const { type } = yield this.device.commands.typedCall('GetAddress', 'Address', {
28696
- address_n: [toHardened(44), toHardened(1), toHardened(0), 0, 0],
28697
- coin_name: 'Testnet',
28698
- script_type: 'SPENDADDRESS',
28699
- show_display: false,
28700
- });
28701
- if (type === 'CallMethodError') {
28702
- throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, 'Get the passphrase state error');
28703
- }
28704
- const res = yield this.device.commands.typedCall('GetFeatures', 'Features');
28705
- return Promise.resolve(res.message);
28750
+ return this.device.unlockDevice();
28706
28751
  });
28707
28752
  }
28708
28753
  }
@@ -30065,12 +30110,17 @@ const networkConfigMap = {
30065
30110
  methodName: 'neoGetAddress',
30066
30111
  },
30067
30112
  };
30068
- class AllNetworkGetAddress extends BaseMethod {
30113
+ class AllNetworkGetAddressBase extends BaseMethod {
30114
+ constructor() {
30115
+ super(...arguments);
30116
+ this.abortController = null;
30117
+ }
30069
30118
  init() {
30119
+ var _a, _b;
30070
30120
  this.checkDeviceId = true;
30071
30121
  this.allowDeviceMode = [...this.allowDeviceMode, UI_REQUEST.NOT_INITIALIZE];
30072
30122
  validateParams(this.payload, [{ name: 'bundle', type: 'array' }]);
30073
- this.payload.bundle.forEach((batch) => {
30123
+ (_b = (_a = this.payload) === null || _a === void 0 ? void 0 : _a.bundle) === null || _b === void 0 ? void 0 : _b.forEach((batch) => {
30074
30124
  validateParams(batch, [
30075
30125
  { name: 'path', required: true },
30076
30126
  { name: 'network', type: 'string', required: true },
@@ -30096,7 +30146,7 @@ class AllNetworkGetAddress extends BaseMethod {
30096
30146
  _originalIndex: originalIndex,
30097
30147
  };
30098
30148
  }
30099
- callMethod(methodName, params) {
30149
+ callMethod(methodName, params, rootFingerprint) {
30100
30150
  var _a;
30101
30151
  return __awaiter(this, void 0, void 0, function* () {
30102
30152
  const method = findMethod({
@@ -30110,12 +30160,29 @@ class AllNetworkGetAddress extends BaseMethod {
30110
30160
  try {
30111
30161
  method.init();
30112
30162
  (_a = method.setDevice) === null || _a === void 0 ? void 0 : _a.call(method, this.device);
30163
+ method.context = this.context;
30164
+ const onSignalAbort = () => {
30165
+ var _a;
30166
+ (_a = this.abortController) === null || _a === void 0 ? void 0 : _a.abort(hdShared.HardwareErrorCodeMessage[hdShared.HardwareErrorCode.RepeatUnlocking]);
30167
+ };
30168
+ const _onDeviceButtonHandler = (...[device, request]) => {
30169
+ if (request.code === 'ButtonRequest_PinEntry' ||
30170
+ request.code === 'ButtonRequest_AttachPin') {
30171
+ onSignalAbort();
30172
+ }
30173
+ else {
30174
+ onDeviceButtonHandler(device, request);
30175
+ }
30176
+ };
30177
+ this.device.on(DEVICE.BUTTON, _onDeviceButtonHandler);
30178
+ this.device.on(DEVICE.PIN, onSignalAbort);
30179
+ this.device.on(DEVICE.PASSPHRASE, onSignalAbort);
30113
30180
  preCheckDeviceSupport(this.device, method);
30114
30181
  const response = yield method.run();
30115
30182
  if (!Array.isArray(response) || response.length === 0) {
30116
30183
  throw new Error('No response');
30117
30184
  }
30118
- result = response.map((item, index) => (Object.assign(Object.assign({}, params.bundle[index]._originRequestParams), { success: true, payload: item })));
30185
+ result = response.map((item, index) => (Object.assign(Object.assign({}, params.bundle[index]._originRequestParams), { success: true, payload: Object.assign(Object.assign({}, item), { rootFingerprint }) })));
30119
30186
  }
30120
30187
  catch (e) {
30121
30188
  const error = handleSkippableHardwareError(e, this.device, method);
@@ -30136,45 +30203,24 @@ class AllNetworkGetAddress extends BaseMethod {
30136
30203
  });
30137
30204
  }
30138
30205
  run() {
30139
- var _a, _b;
30140
30206
  return __awaiter(this, void 0, void 0, function* () {
30141
- const responses = [];
30142
- const resultMap = {};
30143
- const { bundle } = this.payload;
30144
- const methodGroups = bundle
30145
- .map((param, index) => this.generateMethodName({
30146
- network: param.network,
30147
- payload: param,
30148
- originalIndex: index,
30149
- }))
30150
- .reduce((acc, cur) => {
30151
- if (!acc[cur.methodName]) {
30152
- acc[cur.methodName] = [];
30153
- }
30154
- acc[cur.methodName].push(cur);
30155
- return acc;
30156
- }, {});
30157
- let i = 0;
30158
- for (const [methodName, params] of Object.entries(methodGroups)) {
30159
- const methodParams = {
30160
- bundle: params.map(param => (Object.assign({}, param.params))),
30161
- };
30162
- const response = yield this.callMethod(methodName, methodParams);
30163
- for (let i = 0; i < params.length; i++) {
30164
- const { _originRequestParams, _originalIndex } = params[i];
30165
- const responseKey = `${_originalIndex}`;
30166
- resultMap[responseKey] = Object.assign(Object.assign({}, _originRequestParams), response[i]);
30167
- }
30168
- if (((_b = (_a = this.payload) === null || _a === void 0 ? void 0 : _a.bundle) === null || _b === void 0 ? void 0 : _b.length) > 1) {
30169
- const progress = Math.round(((i + 1) / this.payload.bundle.length) * 100);
30170
- this.postMessage(createUiMessage(UI_REQUEST.DEVICE_PROGRESS, { progress }));
30207
+ const res = yield this.device.commands.typedCall('GetPublicKey', 'PublicKey', {
30208
+ address_n: [toHardened(44), toHardened(1), toHardened(0)],
30209
+ coin_name: 'Testnet',
30210
+ script_type: 'SPENDADDRESS',
30211
+ show_display: false,
30212
+ });
30213
+ this.postMessage(createUiMessage(UI_REQUEST.CLOSE_UI_PIN_WINDOW));
30214
+ if (res.message.root_fingerprint == null) {
30215
+ throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.CallMethodInvalidParameter);
30216
+ }
30217
+ this.abortController = new AbortController();
30218
+ return this.getAllNetworkAddress(res.message.root_fingerprint).catch(e => {
30219
+ if (e instanceof hdShared.HardwareError && e.errorCode === hdShared.HardwareErrorCode.RepeatUnlocking) {
30220
+ throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RepeatUnlocking, e.message);
30171
30221
  }
30172
- i++;
30173
- }
30174
- for (let i = 0; i < bundle.length; i++) {
30175
- responses.push(resultMap[i]);
30176
- }
30177
- return Promise.resolve(responses);
30222
+ throw e;
30223
+ });
30178
30224
  });
30179
30225
  }
30180
30226
  }
@@ -30195,10 +30241,7 @@ function handleSkippableHardwareError(e, device, method) {
30195
30241
  let error;
30196
30242
  if (e instanceof hdShared.HardwareError && e.errorCode !== hdShared.HardwareErrorCode.RuntimeError) {
30197
30243
  const { errorCode } = e;
30198
- if (errorCode === hdShared.HardwareErrorCode.CallMethodInvalidParameter) {
30199
- error = e;
30200
- }
30201
- else if (errorCode === hdShared.HardwareErrorCode.CallMethodNeedUpgradeFirmware) {
30244
+ if (errorCode === hdShared.HardwareErrorCode.CallMethodNeedUpgradeFirmware) {
30202
30245
  error = e;
30203
30246
  }
30204
30247
  else if (errorCode === hdShared.HardwareErrorCode.DeviceNotSupportMethod) {
@@ -30224,6 +30267,164 @@ function handleSkippableHardwareError(e, device, method) {
30224
30267
  return error;
30225
30268
  }
30226
30269
 
30270
+ class AllNetworkGetAddress extends AllNetworkGetAddressBase {
30271
+ getAllNetworkAddress(rootFingerprint) {
30272
+ var _a, _b, _c, _d;
30273
+ return __awaiter(this, void 0, void 0, function* () {
30274
+ const responses = [];
30275
+ const resultMap = {};
30276
+ const { bundle } = this.payload;
30277
+ const methodGroups = bundle
30278
+ .map((param, index) => this.generateMethodName({
30279
+ network: param.network,
30280
+ payload: param,
30281
+ originalIndex: index,
30282
+ }))
30283
+ .reduce((acc, cur) => {
30284
+ if (!acc[cur.methodName]) {
30285
+ acc[cur.methodName] = [];
30286
+ }
30287
+ acc[cur.methodName].push(cur);
30288
+ return acc;
30289
+ }, {});
30290
+ let i = 0;
30291
+ for (const [methodName, params] of Object.entries(methodGroups)) {
30292
+ const methodParams = {
30293
+ bundle: params.map(param => (Object.assign({}, param.params))),
30294
+ };
30295
+ if ((_a = this.abortController) === null || _a === void 0 ? void 0 : _a.signal.aborted) {
30296
+ throw new Error(hdShared.HardwareErrorCodeMessage[hdShared.HardwareErrorCode.RepeatUnlocking]);
30297
+ }
30298
+ const response = yield this.callMethod(methodName, methodParams, rootFingerprint);
30299
+ if ((_b = this.abortController) === null || _b === void 0 ? void 0 : _b.signal.aborted) {
30300
+ throw new Error(hdShared.HardwareErrorCodeMessage[hdShared.HardwareErrorCode.RepeatUnlocking]);
30301
+ }
30302
+ for (let i = 0; i < params.length; i++) {
30303
+ const { _originRequestParams, _originalIndex } = params[i];
30304
+ const responseKey = `${_originalIndex}`;
30305
+ resultMap[responseKey] = Object.assign(Object.assign({}, _originRequestParams), response[i]);
30306
+ }
30307
+ if (((_d = (_c = this.payload) === null || _c === void 0 ? void 0 : _c.bundle) === null || _d === void 0 ? void 0 : _d.length) > 1) {
30308
+ const progress = Math.round(((i + 1) / this.payload.bundle.length) * 100);
30309
+ this.postMessage(createUiMessage(UI_REQUEST.DEVICE_PROGRESS, { progress }));
30310
+ }
30311
+ i++;
30312
+ }
30313
+ for (let i = 0; i < bundle.length; i++) {
30314
+ responses.push(resultMap[i]);
30315
+ }
30316
+ this.abortController = null;
30317
+ return Promise.resolve(responses);
30318
+ });
30319
+ }
30320
+ }
30321
+
30322
+ class AllNetworkGetAddressByLoop extends AllNetworkGetAddressBase {
30323
+ getAllNetworkAddress(rootFingerprint) {
30324
+ return __awaiter(this, void 0, void 0, function* () {
30325
+ const { callbackId, callbackIdFinish } = this.payload;
30326
+ if (!callbackId) {
30327
+ throw new Error('callbackId is required');
30328
+ }
30329
+ if (!callbackIdFinish) {
30330
+ throw new Error('callbackIdFinish is required');
30331
+ }
30332
+ const bundle = this.payload.bundle || [this.payload];
30333
+ const callbackPromise = this.processCallbacksInBackground(bundle, rootFingerprint, callbackId, callbackIdFinish);
30334
+ this.device.pendingCallbackPromise = hdShared.createDeferred(callbackPromise);
30335
+ if (this.context && this.payload.connectId) {
30336
+ this.context.registerCallbackTask(this.payload.connectId, this.device.pendingCallbackPromise);
30337
+ }
30338
+ return Promise.resolve([]);
30339
+ });
30340
+ }
30341
+ processCallbacksInBackground(bundle, rootFingerprint, callbackId, callbackIdFinish) {
30342
+ var _a, _b, _c;
30343
+ return __awaiter(this, void 0, void 0, function* () {
30344
+ try {
30345
+ const allResults = [];
30346
+ for (let i = 0; i < bundle.length; i++) {
30347
+ const item = bundle[i];
30348
+ if ((_a = this.abortController) === null || _a === void 0 ? void 0 : _a.signal.aborted) {
30349
+ throw new Error(hdShared.HardwareErrorCodeMessage[hdShared.HardwareErrorCode.RepeatUnlocking]);
30350
+ }
30351
+ const methodParams = this.generateMethodName({
30352
+ network: item.network,
30353
+ payload: item,
30354
+ originalIndex: i,
30355
+ });
30356
+ const singleMethodParams = {
30357
+ bundle: [methodParams.params],
30358
+ };
30359
+ const response = yield this.callMethod(methodParams.methodName, singleMethodParams, rootFingerprint);
30360
+ if ((_b = this.abortController) === null || _b === void 0 ? void 0 : _b.signal.aborted) {
30361
+ throw new Error(hdShared.HardwareErrorCodeMessage[hdShared.HardwareErrorCode.RepeatUnlocking]);
30362
+ }
30363
+ const singleResult = Object.assign(Object.assign({}, item), response[0]);
30364
+ allResults.push(singleResult);
30365
+ this.sendItemCallback(callbackId, singleResult, i);
30366
+ }
30367
+ this.sendFinishCallback({
30368
+ callbackId: callbackIdFinish,
30369
+ data: allResults,
30370
+ });
30371
+ }
30372
+ catch (error) {
30373
+ let errorCode = error.errorCode || error.code;
30374
+ let errorMessage = error.message;
30375
+ if (error instanceof hdShared.HardwareError) {
30376
+ errorCode = error.errorCode;
30377
+ errorMessage = error.message;
30378
+ }
30379
+ else if (error.message === hdShared.HardwareErrorCodeMessage[hdShared.HardwareErrorCode.RepeatUnlocking]) {
30380
+ errorCode = hdShared.HardwareErrorCode.RepeatUnlocking;
30381
+ errorMessage = error.message;
30382
+ }
30383
+ else {
30384
+ const hardwareError = hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.RuntimeError, error.message);
30385
+ errorCode = hardwareError.errorCode;
30386
+ errorMessage = hardwareError.message;
30387
+ }
30388
+ this.sendFinishCallback({
30389
+ callbackId: callbackIdFinish,
30390
+ error: {
30391
+ success: false,
30392
+ payload: {
30393
+ error: errorMessage,
30394
+ code: errorCode,
30395
+ },
30396
+ },
30397
+ });
30398
+ }
30399
+ finally {
30400
+ (_c = this.context) === null || _c === void 0 ? void 0 : _c.cancelCallbackTasks(this.payload.connectId);
30401
+ this.abortController = null;
30402
+ }
30403
+ });
30404
+ }
30405
+ sendFinishCallback({ callbackId, data, error, }) {
30406
+ this.postMessage({
30407
+ event: IFRAME.CALLBACK,
30408
+ type: IFRAME.CALLBACK,
30409
+ payload: {
30410
+ callbackId,
30411
+ data,
30412
+ error,
30413
+ },
30414
+ });
30415
+ }
30416
+ sendItemCallback(callbackId, data, itemIndex) {
30417
+ this.postMessage({
30418
+ event: IFRAME.CALLBACK,
30419
+ type: IFRAME.CALLBACK,
30420
+ payload: {
30421
+ callbackId,
30422
+ data: Object.assign(Object.assign({}, data), { index: itemIndex }),
30423
+ },
30424
+ });
30425
+ }
30426
+ }
30427
+
30227
30428
  var bitcoin = [
30228
30429
  {
30229
30430
  name: "Bitcoin",
@@ -30798,6 +30999,15 @@ class BTCGetPublicKey extends BaseMethod {
30798
30999
  }
30799
31000
  }
30800
31001
  catch (error) {
31002
+ if (error instanceof hdShared.HardwareError) {
31003
+ const { errorCode } = error;
31004
+ if (errorCode === hdShared.HardwareErrorCode.PinCancelled ||
31005
+ errorCode === hdShared.HardwareErrorCode.ActionCancelled ||
31006
+ errorCode === hdShared.HardwareErrorCode.ResponseUnexpectTypeError ||
31007
+ errorCode === hdShared.HardwareErrorCode.PinInvalid) {
31008
+ throw error;
31009
+ }
31010
+ }
30801
31011
  responses = [];
30802
31012
  for (let i = 0; i < this.params.length; i++) {
30803
31013
  const param = this.params[i];
@@ -31637,6 +31847,7 @@ class EVMGetPublicKey extends BaseMethod {
31637
31847
  constructor() {
31638
31848
  super(...arguments);
31639
31849
  this.hasBundle = false;
31850
+ this.confirmShowOnOneKey = false;
31640
31851
  this.useBatch = false;
31641
31852
  }
31642
31853
  init() {
@@ -31644,7 +31855,8 @@ class EVMGetPublicKey extends BaseMethod {
31644
31855
  this.checkDeviceId = true;
31645
31856
  this.allowDeviceMode = [...this.allowDeviceMode, UI_REQUEST.NOT_INITIALIZE];
31646
31857
  this.hasBundle = !!((_a = this.payload) === null || _a === void 0 ? void 0 : _a.bundle);
31647
- this.useBatch = (_c = (_b = this.payload) === null || _b === void 0 ? void 0 : _b.bundle) === null || _c === void 0 ? void 0 : _c.every((item) => item.showOnOneKey !== true);
31858
+ this.confirmShowOnOneKey = (_c = (_b = this.payload) === null || _b === void 0 ? void 0 : _b.bundle) === null || _c === void 0 ? void 0 : _c.some((item) => !!item.showOnOneKey);
31859
+ this.useBatch = !this.confirmShowOnOneKey && this.hasBundle && this.payload.useBatch;
31648
31860
  const payload = this.hasBundle ? this.payload : { bundle: [this.payload] };
31649
31861
  validateParams(payload, [{ name: 'bundle', type: 'array' }]);
31650
31862
  this.params = [];
@@ -31680,7 +31892,7 @@ class EVMGetPublicKey extends BaseMethod {
31680
31892
  var _a;
31681
31893
  return __awaiter(this, void 0, void 0, function* () {
31682
31894
  const responses = [];
31683
- if (this.useBatch && this.hasBundle && supportBatchPublicKey((_a = this.device) === null || _a === void 0 ? void 0 : _a.features)) {
31895
+ if (this.useBatch && supportBatchPublicKey((_a = this.device) === null || _a === void 0 ? void 0 : _a.features)) {
31684
31896
  try {
31685
31897
  const res = yield batchGetPublickeys(this.device, this.params, 'secp256k1', 60, {
31686
31898
  includeNode: false,
@@ -38137,6 +38349,7 @@ var ApiMethods = /*#__PURE__*/Object.freeze({
38137
38349
  promptWebDeviceAccess: PromptWebDeviceAccess,
38138
38350
  cipherKeyValue: CipherKeyValue,
38139
38351
  allNetworkGetAddress: AllNetworkGetAddress,
38352
+ allNetworkGetAddressByLoop: AllNetworkGetAddressByLoop,
38140
38353
  btcGetAddress: BTCGetAddress,
38141
38354
  btcGetPublicKey: BTCGetPublicKey,
38142
38355
  btcSignMessage: BTCSignMessage,
@@ -38349,6 +38562,7 @@ const Log$1 = getLogger(exports.LoggerNames.Core);
38349
38562
  class RequestQueue {
38350
38563
  constructor() {
38351
38564
  this.requestQueue = new Map();
38565
+ this.pendingCallbackTasks = new Map();
38352
38566
  this.generateRequestId = (method) => {
38353
38567
  if (method && method.responseID != null) {
38354
38568
  return method.responseID;
@@ -38425,6 +38639,28 @@ class RequestQueue {
38425
38639
  releaseTask(requestId) {
38426
38640
  this.requestQueue.delete(requestId);
38427
38641
  }
38642
+ registerPendingCallbackTask(connectId, callbackPromise) {
38643
+ this.pendingCallbackTasks.set(connectId, callbackPromise);
38644
+ callbackPromise.promise.finally(() => {
38645
+ Log$1.debug(`Callback task completed for connectId: ${connectId}`);
38646
+ this.pendingCallbackTasks.delete(connectId);
38647
+ });
38648
+ }
38649
+ waitForPendingCallbackTasks(connectId) {
38650
+ return __awaiter(this, void 0, void 0, function* () {
38651
+ const pendingTask = this.pendingCallbackTasks.get(connectId);
38652
+ if (pendingTask) {
38653
+ Log$1.debug(`Waiting for pending callback task to complete for connectId: ${connectId}`);
38654
+ yield pendingTask.promise;
38655
+ }
38656
+ });
38657
+ }
38658
+ cancelCallbackTasks(connectId) {
38659
+ const pendingTask = this.pendingCallbackTasks.get(connectId);
38660
+ if (pendingTask) {
38661
+ pendingTask.resolve();
38662
+ }
38663
+ }
38428
38664
  }
38429
38665
 
38430
38666
  const getMutex = () => {
@@ -38547,6 +38783,9 @@ const onCallDevice = (context, message, method) => __awaiter(void 0, void 0, voi
38547
38783
  Log.debug('passphrase state change, clear device cache');
38548
38784
  DevicePool.clearDeviceCache(method.payload.connectId);
38549
38785
  }
38786
+ if (method.connectId) {
38787
+ yield context.waitForCallbackTasks(method.connectId);
38788
+ }
38550
38789
  yield waitForPendingPromise(getPrePendingCallPromise, setPrePendingCallPromise);
38551
38790
  const task = requestQueue.createTask(method);
38552
38791
  let device;
@@ -38570,6 +38809,7 @@ const onCallDevice = (context, message, method) => __awaiter(void 0, void 0, voi
38570
38809
  }
38571
38810
  Log.debug('Call API - setDevice: ', device.mainId);
38572
38811
  (_b = method.setDevice) === null || _b === void 0 ? void 0 : _b.call(method, device);
38812
+ method.context = context;
38573
38813
  device.on(DEVICE.PIN, onDevicePinHandler);
38574
38814
  device.on(DEVICE.BUTTON, onDeviceButtonHandler);
38575
38815
  device.on(DEVICE.PASSPHRASE, message.payload.useEmptyPassphrase ? onEmptyPassphraseHandler : onDevicePassphraseHandler);
@@ -38577,6 +38817,9 @@ const onCallDevice = (context, message, method) => __awaiter(void 0, void 0, voi
38577
38817
  device.on(DEVICE.FEATURES, onDeviceFeaturesHandler);
38578
38818
  device.on(DEVICE.SELECT_DEVICE_IN_BOOTLOADER_FOR_WEB_DEVICE, onSelectDeviceInBootloaderForWebDeviceHandler);
38579
38819
  try {
38820
+ if (method.connectId) {
38821
+ yield context.waitForCallbackTasks(method.connectId);
38822
+ }
38580
38823
  yield waitForPendingPromise(getPrePendingCallPromise, setPrePendingCallPromise);
38581
38824
  const inner = () => __awaiter(void 0, void 0, void 0, function* () {
38582
38825
  var _c, _d, _e, _f, _g;
@@ -38599,15 +38842,14 @@ const onCallDevice = (context, message, method) => __awaiter(void 0, void 0, voi
38599
38842
  firmware: currentFirmwareVersion,
38600
38843
  ble: currentBleVersion,
38601
38844
  };
38602
- if (newVersionStatus === 'required' && bleVersionStatus === 'required') {
38603
- throw hdShared.createNewFirmwareForceUpdateHardwareError(method.connectId, method.deviceId, 'both', currentVersions);
38604
- }
38605
- else if (newVersionStatus === 'required') {
38606
- throw hdShared.createNewFirmwareForceUpdateHardwareError(method.connectId, method.deviceId, 'firmware', currentVersions);
38845
+ const requiredUpdates = [];
38846
+ if (newVersionStatus === 'required') {
38847
+ requiredUpdates.push('firmware');
38607
38848
  }
38608
- else {
38609
- throw hdShared.createNewFirmwareForceUpdateHardwareError(method.connectId, method.deviceId, 'ble', currentVersions);
38849
+ if (bleVersionStatus === 'required') {
38850
+ requiredUpdates.push('ble');
38610
38851
  }
38852
+ throw hdShared.createNewFirmwareForceUpdateHardwareError(method.connectId, method.deviceId, requiredUpdates, currentVersions);
38611
38853
  }
38612
38854
  if (versionRange) {
38613
38855
  if (semver__default["default"].valid(versionRange.min) &&
@@ -38904,6 +39146,7 @@ const ensureConnected = (_context, method, pollingId, abortSignal) => __awaiter(
38904
39146
  hdShared.HardwareErrorCode.BleWriteCharacteristicError,
38905
39147
  hdShared.HardwareErrorCode.BleAlreadyConnected,
38906
39148
  hdShared.HardwareErrorCode.FirmwareUpdateLimitOneDevice,
39149
+ hdShared.HardwareErrorCode.SelectDevice,
38907
39150
  hdShared.HardwareErrorCode.DeviceDetectInBootloaderMode,
38908
39151
  hdShared.HardwareErrorCode.BleCharacteristicNotifyChangeFailure,
38909
39152
  hdShared.HardwareErrorCode.WebDeviceNotFoundOrNeedsPermission,
@@ -38934,6 +39177,7 @@ const cancel = (context, connectId) => {
38934
39177
  const { requestQueue, setPrePendingCallPromise } = context;
38935
39178
  if (connectId) {
38936
39179
  try {
39180
+ requestQueue.cancelCallbackTasks(connectId);
38937
39181
  const requestIds = requestQueue.getRequestTasksId();
38938
39182
  Log.debug(`Cancel Api connect requestQueues: length:${requestIds.length} requestIds:${requestIds.join(',')}`);
38939
39183
  const canceledDevices = [];
@@ -39114,6 +39358,11 @@ class Core extends events.exports {
39114
39358
  setPrePendingCallPromise: (promise) => {
39115
39359
  this.prePendingCallPromise = promise;
39116
39360
  },
39361
+ registerCallbackTask: (connectId, callbackPromise) => {
39362
+ this.requestQueue.registerPendingCallbackTask(connectId, callbackPromise);
39363
+ },
39364
+ waitForCallbackTasks: (connectId) => this.requestQueue.waitForPendingCallbackTasks(connectId),
39365
+ cancelCallbackTasks: (connectId) => this.requestQueue.cancelCallbackTasks(connectId),
39117
39366
  };
39118
39367
  }
39119
39368
  handleMessage(message) {
@@ -39155,6 +39404,11 @@ class Core extends events.exports {
39155
39404
  cancel(this.getCoreContext(), message.payload.connectId);
39156
39405
  break;
39157
39406
  }
39407
+ case IFRAME.CALLBACK: {
39408
+ Log.log('callback message: ', message);
39409
+ postMessage(message);
39410
+ break;
39411
+ }
39158
39412
  }
39159
39413
  return Promise.resolve(message);
39160
39414
  });
@@ -39253,6 +39507,7 @@ exports.UI_REQUEST = UI_REQUEST;
39253
39507
  exports.UI_RESPONSE = UI_RESPONSE;
39254
39508
  exports.checkNeedUpdateBootForClassicAndMini = checkNeedUpdateBootForClassicAndMini;
39255
39509
  exports.checkNeedUpdateBootForTouch = checkNeedUpdateBootForTouch;
39510
+ exports.cleanupCallback = cleanupCallback;
39256
39511
  exports.corsValidator = corsValidator;
39257
39512
  exports.createDeviceMessage = createDeviceMessage;
39258
39513
  exports.createErrorMessage = createErrorMessage;
@@ -39264,6 +39519,7 @@ exports.createUiMessage = createUiMessage;
39264
39519
  exports.createUiResponse = createUiResponse;
39265
39520
  exports["default"] = HardwareSdk;
39266
39521
  exports.enableLog = enableLog;
39522
+ exports.executeCallback = executeCallback;
39267
39523
  exports.getDeviceBLEFirmwareVersion = getDeviceBLEFirmwareVersion;
39268
39524
  exports.getDeviceBleName = getDeviceBleName;
39269
39525
  exports.getDeviceBoardloaderVersion = getDeviceBoardloaderVersion;