@subwallet/extension-base 1.3.31-1 → 1.3.32-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.
Files changed (127) hide show
  1. package/background/KoniTypes.d.ts +70 -3
  2. package/background/KoniTypes.js +14 -0
  3. package/background/errors/CardanoProviderError.d.ts +6 -0
  4. package/background/errors/CardanoProviderError.js +61 -0
  5. package/background/types.d.ts +2 -2
  6. package/cjs/background/KoniTypes.js +16 -1
  7. package/cjs/background/errors/CardanoProviderError.js +67 -0
  8. package/cjs/constants/index.js +4 -1
  9. package/cjs/core/logic-validation/request.js +50 -3
  10. package/cjs/koni/api/contract-handler/evm/web3.js +21 -0
  11. package/cjs/koni/api/staking/bonding/utils.js +24 -3
  12. package/cjs/koni/background/handlers/Extension.js +115 -107
  13. package/cjs/koni/background/handlers/State.js +228 -5
  14. package/cjs/koni/background/handlers/Tabs.js +277 -55
  15. package/cjs/packageInfo.js +1 -1
  16. package/cjs/page/cardano/cips/cip30.js +63 -0
  17. package/cjs/page/cardano/cips/index.js +20 -0
  18. package/cjs/page/cardano/index.js +41 -0
  19. package/cjs/page/{SubWalleEvmProvider.js → evm/index.js} +2 -2
  20. package/cjs/page/index.js +9 -4
  21. package/cjs/services/balance-service/transfer/xcm/acrossBridge/index.js +6 -2
  22. package/cjs/services/balance-service/transfer/xcm/index.js +2 -0
  23. package/cjs/services/chain-service/handler/CardanoApi.js +33 -0
  24. package/cjs/services/chain-service/index.js +31 -0
  25. package/cjs/services/chain-service/utils/patch.js +1 -1
  26. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +3 -3
  27. package/cjs/services/earning-service/handlers/native-staking/dtao.js +2 -2
  28. package/cjs/services/earning-service/handlers/native-staking/mythos.js +42 -8
  29. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +1 -1
  30. package/cjs/services/earning-service/handlers/native-staking/tao.js +13 -13
  31. package/cjs/services/earning-service/handlers/nomination-pool/index.js +1 -1
  32. package/cjs/services/migration-service/scripts/MigrateAuthUrls.js +1 -1
  33. package/cjs/services/request-service/constants.js +3 -1
  34. package/cjs/services/request-service/handler/AuthRequestHandler.js +38 -5
  35. package/cjs/services/request-service/handler/CardanoRequestHandler.js +45 -3
  36. package/cjs/services/request-service/helper/index.js +419 -1
  37. package/cjs/services/swap-service/handler/asset-hub/handler.js +1 -1
  38. package/cjs/services/swap-service/handler/base-handler.js +81 -21
  39. package/cjs/services/swap-service/handler/hydradx-handler.js +1 -1
  40. package/cjs/services/swap-service/handler/uniswap-handler.js +274 -45
  41. package/cjs/services/swap-service/index.js +33 -11
  42. package/cjs/services/swap-service/utils.js +15 -2
  43. package/cjs/utils/auth.js +2 -1
  44. package/cjs/utils/cardano.js +20 -0
  45. package/cjs/utils/index.js +4 -4
  46. package/constants/index.d.ts +1 -0
  47. package/constants/index.js +1 -0
  48. package/core/logic-validation/request.d.ts +6 -2
  49. package/core/logic-validation/request.js +51 -5
  50. package/koni/api/contract-handler/evm/web3.d.ts +2 -0
  51. package/koni/api/contract-handler/evm/web3.js +19 -0
  52. package/koni/api/staking/bonding/utils.d.ts +2 -1
  53. package/koni/api/staking/bonding/utils.js +23 -3
  54. package/koni/background/handlers/Extension.js +7 -2
  55. package/koni/background/handlers/State.d.ts +6 -1
  56. package/koni/background/handlers/State.js +223 -4
  57. package/koni/background/handlers/Tabs.d.ts +11 -1
  58. package/koni/background/handlers/Tabs.js +242 -19
  59. package/package.json +62 -42
  60. package/packageInfo.js +1 -1
  61. package/page/cardano/cips/cip30.d.ts +22 -0
  62. package/page/cardano/cips/cip30.js +55 -0
  63. package/page/cardano/cips/index.d.ts +3 -0
  64. package/page/cardano/cips/index.js +7 -0
  65. package/page/cardano/index.d.ts +13 -0
  66. package/page/cardano/index.js +34 -0
  67. package/page/{SubWalleEvmProvider.d.ts → evm/index.d.ts} +3 -2
  68. package/page/{SubWalleEvmProvider.js → evm/index.js} +1 -1
  69. package/page/index.d.ts +3 -2
  70. package/page/index.js +6 -2
  71. package/page/{Accounts.d.ts → substrate/Accounts.d.ts} +1 -1
  72. package/page/{Metadata.d.ts → substrate/Metadata.d.ts} +1 -1
  73. package/page/{PostMessageProvider.d.ts → substrate/PostMessageProvider.d.ts} +1 -1
  74. package/page/{Signer.d.ts → substrate/Signer.d.ts} +1 -1
  75. package/page/{Injected.d.ts → substrate/index.d.ts} +1 -1
  76. package/services/balance-service/helpers/subscribe/cardano/types.d.ts +14 -0
  77. package/services/balance-service/transfer/xcm/acrossBridge/index.d.ts +4 -0
  78. package/services/balance-service/transfer/xcm/acrossBridge/index.js +4 -1
  79. package/services/balance-service/transfer/xcm/index.js +2 -0
  80. package/services/chain-service/handler/CardanoApi.d.ts +3 -1
  81. package/services/chain-service/handler/CardanoApi.js +33 -0
  82. package/services/chain-service/index.d.ts +5 -1
  83. package/services/chain-service/index.js +32 -1
  84. package/services/chain-service/utils/patch.js +1 -1
  85. package/services/earning-service/handlers/liquid-staking/stella-swap.js +3 -3
  86. package/services/earning-service/handlers/native-staking/dtao.js +2 -2
  87. package/services/earning-service/handlers/native-staking/mythos.js +42 -8
  88. package/services/earning-service/handlers/native-staking/relay-chain.js +1 -1
  89. package/services/earning-service/handlers/native-staking/tao.js +14 -14
  90. package/services/earning-service/handlers/nomination-pool/index.js +1 -1
  91. package/services/migration-service/scripts/MigrateAuthUrls.js +1 -1
  92. package/services/request-service/constants.js +3 -1
  93. package/services/request-service/handler/AuthRequestHandler.js +40 -7
  94. package/services/request-service/handler/CardanoRequestHandler.d.ts +2 -0
  95. package/services/request-service/handler/CardanoRequestHandler.js +45 -3
  96. package/services/request-service/helper/index.d.ts +54 -0
  97. package/services/request-service/helper/index.js +406 -1
  98. package/services/request-service/types.d.ts +3 -1
  99. package/services/swap-service/handler/asset-hub/handler.js +1 -1
  100. package/services/swap-service/handler/base-handler.d.ts +3 -1
  101. package/services/swap-service/handler/base-handler.js +82 -22
  102. package/services/swap-service/handler/hydradx-handler.js +1 -1
  103. package/services/swap-service/handler/uniswap-handler.d.ts +5 -0
  104. package/services/swap-service/handler/uniswap-handler.js +275 -46
  105. package/services/swap-service/index.js +34 -12
  106. package/services/swap-service/utils.d.ts +3 -2
  107. package/services/swap-service/utils.js +13 -1
  108. package/types/swap/index.d.ts +1 -0
  109. package/types/transaction/process.d.ts +2 -0
  110. package/utils/auth.js +3 -2
  111. package/utils/cardano.d.ts +2 -0
  112. package/utils/cardano.js +12 -0
  113. package/utils/index.d.ts +1 -1
  114. package/utils/index.js +1 -1
  115. package/cjs/utils/canDerive.js +0 -12
  116. package/utils/canDerive.d.ts +0 -2
  117. package/utils/canDerive.js +0 -6
  118. /package/cjs/page/{Accounts.js → substrate/Accounts.js} +0 -0
  119. /package/cjs/page/{Metadata.js → substrate/Metadata.js} +0 -0
  120. /package/cjs/page/{PostMessageProvider.js → substrate/PostMessageProvider.js} +0 -0
  121. /package/cjs/page/{Signer.js → substrate/Signer.js} +0 -0
  122. /package/cjs/page/{Injected.js → substrate/index.js} +0 -0
  123. /package/page/{Accounts.js → substrate/Accounts.js} +0 -0
  124. /package/page/{Metadata.js → substrate/Metadata.js} +0 -0
  125. /package/page/{PostMessageProvider.js → substrate/PostMessageProvider.js} +0 -0
  126. /package/page/{Signer.js → substrate/Signer.js} +0 -0
  127. /package/page/{Injected.js → substrate/index.js} +0 -0
@@ -45,6 +45,13 @@ class AuthRequestHandler {
45
45
  value.accountAuthTypes = ['evm', 'substrate'];
46
46
  needUpdateAuthList = true;
47
47
  }
48
+ const existKeyEvmNetworkConnect = value.currentEvmNetworkKey;
49
+ if (existKeyEvmNetworkConnect) {
50
+ value.currentNetworkMap = {
51
+ evm: existKeyEvmNetworkConnect
52
+ };
53
+ needUpdateAuthList = true;
54
+ }
48
55
  acc[key] = {
49
56
  ...value
50
57
  };
@@ -158,6 +165,18 @@ class AuthRequestHandler {
158
165
  }
159
166
  }
160
167
  }
168
+ if (options.accessType === 'cardano') {
169
+ const cardanoChains = Object.values(chainInfoMaps).filter(_utils._isChainCardanoCompatible);
170
+ chainInfo = (defaultChain ? chainInfoMaps[defaultChain] : chainInfoMaps.cardano) || cardanoChains[0]; // auto active cardano mainnet chain, because dont support switch network yet
171
+
172
+ if (options.autoActive) {
173
+ var _chainInfo3;
174
+ if (!needEnableChains.includes((_chainInfo3 = chainInfo) === null || _chainInfo3 === void 0 ? void 0 : _chainInfo3.slug)) {
175
+ var _chainInfo4;
176
+ needEnableChains.push((_chainInfo4 = chainInfo) === null || _chainInfo4 === void 0 ? void 0 : _chainInfo4.slug);
177
+ }
178
+ }
179
+ }
161
180
  needEnableChains = needEnableChains.filter(slug => {
162
181
  var _chainStateMap$slug;
163
182
  return !((_chainStateMap$slug = chainStateMap[slug]) !== null && _chainStateMap$slug !== void 0 && _chainStateMap$slug.active);
@@ -206,20 +225,31 @@ class AuthRequestHandler {
206
225
  if ((0, _keyring.isTonAddress)(a) && !accountAuthTypes.includes('ton')) {
207
226
  return true;
208
227
  }
228
+ if ((0, _keyring.isCardanoAddress)(a) && !accountAuthTypes.includes('cardano')) {
229
+ return true;
230
+ }
209
231
  return false;
210
232
  });
211
233
  backupAllowed.forEach(acc => {
212
234
  isAllowedMap[acc] = true;
213
235
  });
214
236
  }
215
- let defaultEvmNetworkKey;
237
+ const defaultNetworkMap = {};
216
238
  if (accountAuthTypes.includes('evm')) {
217
239
  const chainInfo = this.getDAppChainInfo({
218
240
  accessType: 'evm',
219
241
  autoActive: true,
220
242
  url
221
243
  });
222
- defaultEvmNetworkKey = chainInfo === null || chainInfo === void 0 ? void 0 : chainInfo.slug;
244
+ defaultNetworkMap.evm = chainInfo === null || chainInfo === void 0 ? void 0 : chainInfo.slug;
245
+ }
246
+ if (accountAuthTypes.includes('cardano')) {
247
+ const chainInfo = this.getDAppChainInfo({
248
+ accessType: 'cardano',
249
+ autoActive: true,
250
+ url
251
+ });
252
+ defaultNetworkMap.cardano = chainInfo === null || chainInfo === void 0 ? void 0 : chainInfo.slug;
223
253
  }
224
254
  this.getAuthorize(value => {
225
255
  let authorizeList = {};
@@ -243,7 +273,7 @@ class AuthRequestHandler {
243
273
  origin,
244
274
  url,
245
275
  accountAuthTypes: [...new Set([...accountAuthTypes, ...((existed === null || existed === void 0 ? void 0 : existed.accountAuthTypes) || [])])],
246
- currentEvmNetworkKey: existed ? existed.currentEvmNetworkKey : defaultEvmNetworkKey
276
+ currentNetworkMap: existed ? existed.currentNetworkMap : defaultNetworkMap
247
277
  };
248
278
  this.setAuthorize(authorizeList, () => {
249
279
  cb();
@@ -347,12 +377,14 @@ class AuthRequestHandler {
347
377
  list.push(...allowedListByRequestType.filter(a => (0, _keyring.isSubstrateAddress)(a)));
348
378
  } else if (accountAuthType === 'ton') {
349
379
  list.push(...allowedListByRequestType.filter(a => (0, _keyring.isTonAddress)(a)));
380
+ } else if (accountAuthType === 'cardano') {
381
+ list.push(...allowedListByRequestType.filter(a => (0, _keyring.isCardanoAddress)(a)));
350
382
  }
351
383
  return list;
352
384
  }, []);
353
385
  if (!confirmAnotherType && !request.reConfirm && allowedListByRequestType.length !== 0) {
354
386
  // Prevent appear confirmation popup
355
- return false;
387
+ return true;
356
388
  }
357
389
  } else {
358
390
  // Auto auth for web app
@@ -368,7 +400,8 @@ class AuthRequestHandler {
368
400
  isAllowedMap,
369
401
  origin,
370
402
  url,
371
- accountAuthTypes: _constants.ALL_ACCOUNT_AUTH_TYPES
403
+ accountAuthTypes: _constants.ALL_ACCOUNT_AUTH_TYPES,
404
+ currentNetworkMap: {}
372
405
  };
373
406
  this.setAuthorize(authList);
374
407
  return true;
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+ var _cardanoSerializationLibNodejs = require("@emurgo/cardano-serialization-lib-nodejs");
7
8
  var _request = require("@subwallet/extension-base/utils/request");
8
9
  var _uiKeyring = require("@subwallet/ui-keyring");
9
10
  var _i18next = require("i18next");
@@ -18,7 +19,8 @@ class CardanoRequestHandler {
18
19
  confirmationsQueueSubjectCardano = new _rxjs.BehaviorSubject({
19
20
  cardanoSignatureRequest: {},
20
21
  cardanoSendTransactionRequest: {},
21
- cardanoWatchTransactionRequest: {}
22
+ cardanoWatchTransactionRequest: {},
23
+ cardanoSignTransactionRequest: {}
22
24
  });
23
25
  confirmationsPromiseMap = {};
24
26
  constructor(requestService) {
@@ -122,9 +124,11 @@ class CardanoRequestHandler {
122
124
  async decorateResult(t, request, result) {
123
125
  if (result.payload === '') {
124
126
  if (t === 'cardanoSignatureRequest') {
125
- // result.payload = await this.signMessage(request as ConfirmationDefinitions['evmSignatureRequest'][0]);
127
+ result.payload = this.signMessage(request);
126
128
  } else if (t === 'cardanoSendTransactionRequest') {
127
129
  result.payload = this.signTransactionCardano(request);
130
+ } else if (t === 'cardanoSignTransactionRequest') {
131
+ result.payload = this.signDappTransactionCardano(request);
128
132
  }
129
133
  if (t === 'cardanoSignatureRequest' || t === 'cardanoSendTransactionRequest') {
130
134
  const isAlwaysRequired = await this.#requestService.settingService.isAlwaysRequired;
@@ -134,6 +138,17 @@ class CardanoRequestHandler {
134
138
  }
135
139
  }
136
140
  }
141
+ signMessage(confirmation) {
142
+ const {
143
+ address,
144
+ payload
145
+ } = confirmation.payload;
146
+ const pair = _uiKeyring.keyring.getPair(address);
147
+ if (pair.isLocked) {
148
+ _uiKeyring.keyring.unlockPair(pair.address);
149
+ }
150
+ return pair.cardano.signMessage(payload, true);
151
+ }
137
152
  signTransactionCardano(confirmation) {
138
153
  // alibaba
139
154
  const transaction = confirmation.payload;
@@ -145,7 +160,34 @@ class CardanoRequestHandler {
145
160
  if (pair.isLocked) {
146
161
  _uiKeyring.keyring.unlockPair(pair.address);
147
162
  }
148
- return pair.cardano.sign(cardanoPayload);
163
+ return pair.cardano.signTransaction(cardanoPayload);
164
+ }
165
+ signDappTransactionCardano(confirmation) {
166
+ var _FixedTransaction$fro;
167
+ // alibaba
168
+ const transaction = confirmation.payload;
169
+ const {
170
+ addressRequireKeyTypes,
171
+ cardanoPayload,
172
+ from
173
+ } = transaction;
174
+ const vkeyWitnessesFinal = _cardanoSerializationLibNodejs.Vkeywitnesses.new();
175
+ const txWitnessSet = (_FixedTransaction$fro = _cardanoSerializationLibNodejs.FixedTransaction.from_hex(cardanoPayload).witness_set()) !== null && _FixedTransaction$fro !== void 0 ? _FixedTransaction$fro : _cardanoSerializationLibNodejs.TransactionWitnessSet.new();
176
+ const pair = _uiKeyring.keyring.getPair(from);
177
+ if (pair.isLocked) {
178
+ _uiKeyring.keyring.unlockPair(pair.address);
179
+ }
180
+ const keyTypes = [...new Set(addressRequireKeyTypes)];
181
+ const vKeyWitnessesHex = pair.cardano.signTransaction(cardanoPayload, {
182
+ needVkeywitness: true,
183
+ keyTypes
184
+ });
185
+ const vKeyWitnesses = _cardanoSerializationLibNodejs.Vkeywitnesses.from_hex(vKeyWitnessesHex);
186
+ for (let i = 0; i < vKeyWitnesses.len(); i++) {
187
+ vkeyWitnessesFinal.add(vKeyWitnesses.get(i));
188
+ }
189
+ txWitnessSet.set_vkeys(vkeyWitnessesFinal);
190
+ return txWitnessSet.to_hex();
149
191
  }
150
192
  resetWallet() {
151
193
  const confirmations = this.confirmationsQueueSubjectCardano.getValue();
@@ -3,9 +3,20 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.convertValueToAsset = exports.convertUtxoRawToUtxo = exports.convertAssetToValue = void 0;
7
+ exports.extractKeyHashFromCertificate = extractKeyHashFromCertificate;
8
+ exports.extractKeyHashesFromCollaterals = extractKeyHashesFromCollaterals;
9
+ exports.extractKeyHashesFromRequiredSigners = extractKeyHashesFromRequiredSigners;
10
+ exports.extractKeyHashesFromScripts = extractKeyHashesFromScripts;
11
+ exports.extractKeyHashesFromWithdrawals = extractKeyHashesFromWithdrawals;
6
12
  exports.extractMetadata = void 0;
13
+ exports.getBalanceAddressMap = getBalanceAddressMap;
14
+ exports.hasSufficientCardanoValue = hasSufficientCardanoValue;
15
+ var CardanoWasm = _interopRequireWildcard(require("@emurgo/cardano-serialization-lib-nodejs"));
7
16
  var _extensionChains = require("@subwallet/extension-chains");
8
17
  var _defaults = require("@polkadot/networks/defaults");
18
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
9
20
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
10
21
  // SPDX-License-Identifier: Apache-2.0
11
22
 
@@ -55,4 +66,411 @@ const extractMetadata = store => {
55
66
  });
56
67
  });
57
68
  };
58
- exports.extractMetadata = extractMetadata;
69
+ exports.extractMetadata = extractMetadata;
70
+ const convertAssetToValue = amount => {
71
+ const value = CardanoWasm.Value.new(CardanoWasm.BigNum.from_str('0'));
72
+ const multiAsset = CardanoWasm.MultiAsset.new();
73
+ for (const item of amount) {
74
+ if (item.unit === 'lovelace') {
75
+ value.set_coin(CardanoWasm.BigNum.from_str(item.quantity));
76
+ } else {
77
+ const policyIdHex = item.unit.slice(0, 56);
78
+ const assetNameHex = item.unit.slice(56);
79
+ const scriptHash = CardanoWasm.ScriptHash.from_bytes(Buffer.from(policyIdHex, 'hex'));
80
+ const assetName = CardanoWasm.AssetName.new(Buffer.from(assetNameHex, 'hex'));
81
+ const quantity = CardanoWasm.BigNum.from_str(item.quantity);
82
+ let assets = multiAsset.get(scriptHash);
83
+ if (!assets) {
84
+ assets = CardanoWasm.Assets.new();
85
+ }
86
+ assets.insert(assetName, quantity);
87
+ multiAsset.insert(scriptHash, assets);
88
+ }
89
+ }
90
+ if (multiAsset.len() > 0) {
91
+ value.set_multiasset(multiAsset);
92
+ }
93
+ return value;
94
+ };
95
+ exports.convertAssetToValue = convertAssetToValue;
96
+ const convertValueToAsset = value => {
97
+ var _value$multiasset;
98
+ const assets = [];
99
+ assets.push({
100
+ unit: 'lovelace',
101
+ quantity: value.coin().to_js_value()
102
+ });
103
+ const multiAssets = (_value$multiasset = value.multiasset()) === null || _value$multiasset === void 0 ? void 0 : _value$multiasset.keys();
104
+ if (multiAssets) {
105
+ for (let j = 0; j < multiAssets.len(); j++) {
106
+ var _value$multiasset2;
107
+ const policy = multiAssets.get(j);
108
+ const policyAssets = (_value$multiasset2 = value.multiasset()) === null || _value$multiasset2 === void 0 ? void 0 : _value$multiasset2.get(policy);
109
+ if (!policyAssets) {
110
+ continue;
111
+ }
112
+ const assetNames = policyAssets.keys();
113
+ for (let k = 0; k < assetNames.len(); k++) {
114
+ var _quantity$to_js_value;
115
+ const assetName = assetNames.get(k);
116
+ const quantity = policyAssets.get(assetName);
117
+ const assetUnit = `${policy.to_hex()}${assetName.to_hex()}`;
118
+ assets.push({
119
+ unit: assetUnit,
120
+ quantity: (_quantity$to_js_value = quantity === null || quantity === void 0 ? void 0 : quantity.to_js_value()) !== null && _quantity$to_js_value !== void 0 ? _quantity$to_js_value : '0',
121
+ policy: policy.to_hex(),
122
+ name: Buffer.from(assetName.to_hex(), 'hex').toString(),
123
+ fingerprint: `${policy.to_hex()}${assetName.to_hex()}`
124
+ });
125
+ }
126
+ }
127
+ }
128
+ return assets;
129
+ };
130
+ exports.convertValueToAsset = convertValueToAsset;
131
+ const convertUtxoRawToUtxo = utxos => {
132
+ return utxos.map(utxo => {
133
+ const txHash = CardanoWasm.TransactionHash.from_bytes(Buffer.from(utxo.tx_hash, 'hex'));
134
+ const txIndex = utxo.output_index;
135
+ const input = CardanoWasm.TransactionInput.new(txHash, txIndex);
136
+ const value = convertAssetToValue(utxo.amount);
137
+ const txOutput = CardanoWasm.TransactionOutput.new(CardanoWasm.Address.from_bech32(utxo.address), value);
138
+ return CardanoWasm.TransactionUnspentOutput.new(input, txOutput);
139
+ });
140
+ };
141
+ exports.convertUtxoRawToUtxo = convertUtxoRawToUtxo;
142
+ function getBalanceAddressMap(outputs) {
143
+ const acc = {};
144
+ for (let i = 0; i < outputs.len(); i++) {
145
+ const item = outputs.get(i);
146
+ const address = item.address().to_bech32();
147
+ if (!acc[address]) {
148
+ acc[address] = item.amount();
149
+ } else {
150
+ acc[address] = acc[address].checked_add(item.amount());
151
+ }
152
+ }
153
+ return acc;
154
+ }
155
+
156
+ /**
157
+ * Extracts all required key hashes from a list of certificates.
158
+ * Handles different certificate kinds: stake deregistration, delegation,
159
+ * pool registration, pool retirement, and MIR (move instantaneous rewards).
160
+ *
161
+ * Only processes key hash credentials (ignores script credentials).
162
+ *
163
+ * @param {Certificates} certificates - List of certificate objects from a transaction body.
164
+ * @returns {string[]} - An array of required key hashes in hex format.
165
+ */
166
+
167
+ function extractKeyHashFromCertificate(certificates) {
168
+ if (!certificates) {
169
+ return [];
170
+ }
171
+ const requiredKeyHashes = [];
172
+
173
+ // Helper: Extract key hash from stake credential (only if it's a public key)
174
+ const extractKeyHash = credential => {
175
+ if (credential.kind() === 0) {
176
+ var _credential$to_keyhas;
177
+ // kind === 0 => StakeCredential is a public key
178
+ return (_credential$to_keyhas = credential.to_keyhash()) === null || _credential$to_keyhas === void 0 ? void 0 : _credential$to_keyhas.to_hex();
179
+ }
180
+ return null;
181
+ };
182
+ for (let i = 0; i < certificates.len(); i++) {
183
+ const cert = certificates.get(i);
184
+ switch (cert.kind()) {
185
+ case 0:
186
+ {
187
+ // Stake Registration Certificate
188
+ // No key hash required here, just registration action
189
+ break;
190
+ }
191
+ case 1:
192
+ {
193
+ var _cert$as_stake_deregi;
194
+ // Stake Deregistration Certificate
195
+ const credential = (_cert$as_stake_deregi = cert.as_stake_deregistration()) === null || _cert$as_stake_deregi === void 0 ? void 0 : _cert$as_stake_deregi.stake_credential();
196
+ if (!credential) {
197
+ break;
198
+ }
199
+ const hash = extractKeyHash(credential);
200
+ if (hash) {
201
+ requiredKeyHashes.push(hash);
202
+ }
203
+ break;
204
+ }
205
+ case 2:
206
+ {
207
+ var _cert$as_stake_delega;
208
+ // Stake Delegation Certificate
209
+ const credential = (_cert$as_stake_delega = cert.as_stake_delegation()) === null || _cert$as_stake_delega === void 0 ? void 0 : _cert$as_stake_delega.stake_credential();
210
+ if (!credential) {
211
+ break;
212
+ }
213
+ const hash = extractKeyHash(credential);
214
+ if (hash) {
215
+ requiredKeyHashes.push(hash);
216
+ }
217
+ break;
218
+ }
219
+ case 3:
220
+ {
221
+ var _cert$as_pool_registr;
222
+ // Pool Registration Certificate
223
+ // Collect all pool owner key hashes
224
+ const owners = (_cert$as_pool_registr = cert.as_pool_registration()) === null || _cert$as_pool_registr === void 0 ? void 0 : _cert$as_pool_registr.pool_params().pool_owners();
225
+ if (!owners) {
226
+ break;
227
+ }
228
+ for (let j = 0; j < owners.len(); j++) {
229
+ const ownerKeyHash = owners.get(j).to_hex();
230
+ requiredKeyHashes.push(ownerKeyHash);
231
+ }
232
+ break;
233
+ }
234
+ case 4:
235
+ {
236
+ var _cert$as_pool_retirem;
237
+ // Pool Retirement Certificate
238
+ // The operator key hash is required to authorize retirement
239
+ const operator = (_cert$as_pool_retirem = cert.as_pool_retirement()) === null || _cert$as_pool_retirem === void 0 ? void 0 : _cert$as_pool_retirem.pool_keyhash().to_hex();
240
+ if (!operator) {
241
+ break;
242
+ }
243
+ requiredKeyHashes.push(operator);
244
+ break;
245
+ }
246
+ case 6:
247
+ {
248
+ var _cert$as_move_instant, _cert$as_move_instant2;
249
+ // Move Instantaneous Rewards Certificate
250
+ // Extract key hashes from reward receivers
251
+ const rewards = (_cert$as_move_instant = cert.as_move_instantaneous_rewards_cert()) === null || _cert$as_move_instant === void 0 ? void 0 : (_cert$as_move_instant2 = _cert$as_move_instant.move_instantaneous_reward().as_to_stake_creds()) === null || _cert$as_move_instant2 === void 0 ? void 0 : _cert$as_move_instant2.keys();
252
+ if (!rewards) {
253
+ break;
254
+ }
255
+ for (let j = 0; j < rewards.len(); j++) {
256
+ const hash = extractKeyHash(rewards.get(j));
257
+ if (hash) {
258
+ requiredKeyHashes.push(hash);
259
+ }
260
+ }
261
+ break;
262
+ }
263
+ default:
264
+ {
265
+ // Unknown or unsupported certificate kind — skip
266
+ break;
267
+ }
268
+ }
269
+ }
270
+ return requiredKeyHashes;
271
+ }
272
+
273
+ /**
274
+ * Extracts required key hashes from withdrawal entries.
275
+ * It processes only credentials of kind 0 (key hash based).
276
+ *
277
+ * @param {Withdrawals} withdrawals - The withdrawal map from a transaction body.
278
+ * @returns {string[]} - An array of required key hashes in hex format.
279
+ */
280
+
281
+ function extractKeyHashesFromWithdrawals(withdrawals) {
282
+ if (!withdrawals) {
283
+ return [];
284
+ }
285
+ const requiredKeyHashes = [];
286
+ const rewardAccounts = withdrawals.keys();
287
+ for (let i = 0; i < rewardAccounts.len(); i++) {
288
+ const stakeCred = rewardAccounts.get(i).payment_cred();
289
+
290
+ // Check if the credential is a key hash (not a script)
291
+ const keyHash = stakeCred.to_keyhash();
292
+ if (stakeCred.kind() === 0 && keyHash) {
293
+ const hexHash = Buffer.from(keyHash.to_bytes()).toString('hex');
294
+ requiredKeyHashes.push(hexHash);
295
+ }
296
+ }
297
+ return requiredKeyHashes;
298
+ }
299
+
300
+ /**
301
+ * Recursively extract all Ed25519 key hashes from a NativeScripts collection.
302
+ * Only processes `ScriptPubkey` entries (kind = 0), and traverses through nested scripts.
303
+ *
304
+ * @param {NativeScripts} scripts - A collection of native scripts.
305
+ * @returns {string[]} - An array of key hashes (hex-encoded) from all script_pubkey entries.
306
+ */
307
+
308
+ function extractKeyHashesFromScripts(scripts) {
309
+ if (!scripts) {
310
+ return [];
311
+ }
312
+ const keyHashes = [];
313
+ for (let i = 0; i < scripts.len(); i++) {
314
+ const script = scripts.get(i);
315
+ switch (script.kind()) {
316
+ case 0:
317
+ {
318
+ var _script$as_script_pub;
319
+ // ScriptPubkey
320
+ const pubkeyHash = (_script$as_script_pub = script.as_script_pubkey()) === null || _script$as_script_pub === void 0 ? void 0 : _script$as_script_pub.addr_keyhash();
321
+ if (!pubkeyHash) {
322
+ break;
323
+ }
324
+ const hexHash = pubkeyHash.to_hex();
325
+ keyHashes.push(hexHash);
326
+ break;
327
+ }
328
+ case 1:
329
+ {
330
+ var _script$as_script_all;
331
+ // ScriptAll
332
+ const nestedScripts = (_script$as_script_all = script.as_script_all()) === null || _script$as_script_all === void 0 ? void 0 : _script$as_script_all.native_scripts();
333
+ keyHashes.push(...extractKeyHashesFromScripts(nestedScripts));
334
+ break;
335
+ }
336
+ case 2:
337
+ {
338
+ var _script$as_script_any;
339
+ // ScriptAny
340
+ const nestedScripts = (_script$as_script_any = script.as_script_any()) === null || _script$as_script_any === void 0 ? void 0 : _script$as_script_any.native_scripts();
341
+ keyHashes.push(...extractKeyHashesFromScripts(nestedScripts));
342
+ break;
343
+ }
344
+ case 3:
345
+ {
346
+ var _script$as_script_n_o;
347
+ // ScriptNOfK
348
+ const nestedScripts = (_script$as_script_n_o = script.as_script_n_of_k()) === null || _script$as_script_n_o === void 0 ? void 0 : _script$as_script_n_o.native_scripts();
349
+ keyHashes.push(...extractKeyHashesFromScripts(nestedScripts));
350
+ break;
351
+ }
352
+ default:
353
+ // Unknown kind, skip
354
+ break;
355
+ }
356
+ }
357
+ return keyHashes;
358
+ }
359
+
360
+ /**
361
+ * Extract required key hashes from the RequiredSigners field in the transaction body.
362
+ * Each entry is an Ed25519 key hash that must sign the transaction.
363
+ *
364
+ * @param {Ed25519KeyHashes} requiredSigners - A list of required signer key hashes.
365
+ * @returns {string[]} - Array of hex-encoded Ed25519 key hashes.
366
+ */
367
+ function extractKeyHashesFromRequiredSigners(requiredSigners) {
368
+ if (!requiredSigners) {
369
+ return [];
370
+ }
371
+ const result = [];
372
+ for (let i = 0; i < requiredSigners.len(); i++) {
373
+ result.push(requiredSigners.get(i).to_hex());
374
+ }
375
+ return result;
376
+ }
377
+
378
+ /**
379
+ * Extract required key hashes from collateral inputs in a linear and readable flow.
380
+ *
381
+ * This function resolves UTXOs of each collateral input,
382
+ * attempts to extract the payment key hash from various supported address types,
383
+ * and returns an array of required signer key hashes in hex format.
384
+ *
385
+ * @param {TransactionInputs} collaterals - Collateral inputs used for script validation
386
+ * @param getSpecificUtxo
387
+ * @returns {Promise<string[]>} - Hex-encoded key hashes required to sign the transaction
388
+ */
389
+ async function extractKeyHashesFromCollaterals(collaterals, getSpecificUtxo) {
390
+ if (!collaterals || !getSpecificUtxo) {
391
+ return [];
392
+ }
393
+ const keyHashes = [];
394
+ for (let i = 0; i < collaterals.len(); i++) {
395
+ const collateral = collaterals.get(i);
396
+
397
+ // Resolve UTXO from tx_id + index
398
+ const txId = collateral.transaction_id().to_hex();
399
+ const utxo = await getSpecificUtxo(txId, collateral.index());
400
+ if (!utxo) {
401
+ continue;
402
+ }
403
+
404
+ // Load address object from UTXO
405
+ const address = CardanoWasm.Address.from_bech32(utxo.address);
406
+
407
+ // Try extracting payment key hash from different address types
408
+ const types = [CardanoWasm.BaseAddress, CardanoWasm.EnterpriseAddress, CardanoWasm.PointerAddress];
409
+ let extracted = false;
410
+ for (const Type of types) {
411
+ try {
412
+ var _Type$from_address;
413
+ const paymentCred = (_Type$from_address = Type.from_address(address)) === null || _Type$from_address === void 0 ? void 0 : _Type$from_address.payment_cred();
414
+ const keyHash = paymentCred === null || paymentCred === void 0 ? void 0 : paymentCred.to_keyhash();
415
+ if (keyHash) {
416
+ keyHashes.push(keyHash.to_hex());
417
+ extracted = true;
418
+ break;
419
+ }
420
+ } catch (_) {
421
+ // Skip to next type
422
+ }
423
+ }
424
+ if (!extracted) {
425
+ throw new Error('Unsupported collateral address type');
426
+ }
427
+ }
428
+ return keyHashes;
429
+ }
430
+
431
+ /// Check if valueA has sufficient value to cover valueB
432
+ function hasSufficientCardanoValue(valueA, valueB) {
433
+ const coinA = BigInt(valueA.coin().to_str());
434
+ const coinB = BigInt(valueB.coin().to_str());
435
+
436
+ // Check if ADA amount in valueA is less than required in valueB
437
+ if (coinA < coinB) {
438
+ return false;
439
+ }
440
+ const multiAssetB = valueB.multiasset();
441
+ if (!multiAssetB) {
442
+ return true;
443
+ } // No assets required in valueB
444
+
445
+ const multiAssetA = valueA.multiasset();
446
+ if (!multiAssetA) {
447
+ return false;
448
+ } // valueA has no assets but valueB requires them
449
+
450
+ const policyIds = multiAssetB.keys();
451
+ for (let i = 0; i < policyIds.len(); i++) {
452
+ const policyId = policyIds.get(i);
453
+ const assetsB = multiAssetB.get(policyId);
454
+ const assetsA = multiAssetA.get(policyId);
455
+ if (!assetsB) {
456
+ continue;
457
+ }
458
+ if (!assetsA) {
459
+ return false;
460
+ } // Required policy ID is missing in valueA
461
+
462
+ const assetNames = assetsB.keys();
463
+ for (let j = 0; j < assetNames.len(); j++) {
464
+ var _assetsB$get$to_str, _assetsB$get, _assetsA$get$to_str, _assetsA$get;
465
+ const assetName = assetNames.get(j);
466
+ const quantityB = BigInt((_assetsB$get$to_str = (_assetsB$get = assetsB.get(assetName)) === null || _assetsB$get === void 0 ? void 0 : _assetsB$get.to_str()) !== null && _assetsB$get$to_str !== void 0 ? _assetsB$get$to_str : '0');
467
+ const quantityA = BigInt((_assetsA$get$to_str = (_assetsA$get = assetsA.get(assetName)) === null || _assetsA$get === void 0 ? void 0 : _assetsA$get.to_str()) !== null && _assetsA$get$to_str !== void 0 ? _assetsA$get$to_str : '0');
468
+
469
+ // Check if asset quantity in valueA is less than required
470
+ if (quantityA < quantityB) {
471
+ return false;
472
+ }
473
+ }
474
+ }
475
+ return true;
476
+ }
@@ -166,7 +166,7 @@ class AssetHubSwapHandler {
166
166
  const type = process.steps[currentStep].type;
167
167
  switch (type) {
168
168
  case _types.CommonStepType.XCM:
169
- return this.swapBaseHandler.handleBridgeStep(params);
169
+ return this.swapBaseHandler.handleBridgeStep(params, 'xcm');
170
170
  case _types.SwapStepType.SWAP:
171
171
  return this.handleSubmitStep(params);
172
172
  default: