@subwallet/extension-base 1.3.31-0 → 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.
- package/background/KoniTypes.d.ts +70 -3
- package/background/KoniTypes.js +14 -0
- package/background/errors/CardanoProviderError.d.ts +6 -0
- package/background/errors/CardanoProviderError.js +61 -0
- package/background/types.d.ts +2 -2
- package/cjs/background/KoniTypes.js +16 -1
- package/cjs/background/errors/CardanoProviderError.js +67 -0
- package/cjs/constants/index.js +4 -1
- package/cjs/core/logic-validation/request.js +50 -3
- package/cjs/koni/api/contract-handler/evm/web3.js +21 -0
- package/cjs/koni/api/staking/bonding/utils.js +24 -3
- package/cjs/koni/background/handlers/Extension.js +115 -107
- package/cjs/koni/background/handlers/State.js +228 -5
- package/cjs/koni/background/handlers/Tabs.js +277 -55
- package/cjs/packageInfo.js +1 -1
- package/cjs/page/cardano/cips/cip30.js +63 -0
- package/cjs/page/cardano/cips/index.js +20 -0
- package/cjs/page/cardano/index.js +41 -0
- package/cjs/page/{SubWalleEvmProvider.js → evm/index.js} +2 -2
- package/cjs/page/index.js +9 -4
- package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +33 -1
- package/cjs/services/balance-service/transfer/xcm/acrossBridge/index.js +6 -2
- package/cjs/services/balance-service/transfer/xcm/index.js +2 -0
- package/cjs/services/chain-service/handler/CardanoApi.js +33 -0
- package/cjs/services/chain-service/index.js +31 -0
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +3 -3
- package/cjs/services/earning-service/handlers/native-staking/dtao.js +2 -2
- package/cjs/services/earning-service/handlers/native-staking/mythos.js +42 -8
- package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +1 -1
- package/cjs/services/earning-service/handlers/native-staking/tao.js +13 -13
- package/cjs/services/earning-service/handlers/nomination-pool/index.js +1 -1
- package/cjs/services/migration-service/scripts/MigrateAuthUrls.js +1 -1
- package/cjs/services/request-service/constants.js +3 -1
- package/cjs/services/request-service/handler/AuthRequestHandler.js +38 -5
- package/cjs/services/request-service/handler/CardanoRequestHandler.js +45 -3
- package/cjs/services/request-service/helper/index.js +419 -1
- package/cjs/services/swap-service/handler/asset-hub/handler.js +1 -1
- package/cjs/services/swap-service/handler/base-handler.js +81 -21
- package/cjs/services/swap-service/handler/hydradx-handler.js +1 -1
- package/cjs/services/swap-service/handler/uniswap-handler.js +274 -45
- package/cjs/services/swap-service/index.js +33 -11
- package/cjs/services/swap-service/utils.js +15 -2
- package/cjs/utils/auth.js +2 -1
- package/cjs/utils/cardano.js +20 -0
- package/cjs/utils/index.js +4 -4
- package/constants/index.d.ts +1 -0
- package/constants/index.js +1 -0
- package/core/logic-validation/request.d.ts +6 -2
- package/core/logic-validation/request.js +51 -5
- package/koni/api/contract-handler/evm/web3.d.ts +2 -0
- package/koni/api/contract-handler/evm/web3.js +19 -0
- package/koni/api/staking/bonding/utils.d.ts +2 -1
- package/koni/api/staking/bonding/utils.js +23 -3
- package/koni/background/handlers/Extension.js +7 -2
- package/koni/background/handlers/State.d.ts +6 -1
- package/koni/background/handlers/State.js +223 -4
- package/koni/background/handlers/Tabs.d.ts +11 -1
- package/koni/background/handlers/Tabs.js +242 -19
- package/package.json +62 -42
- package/packageInfo.js +1 -1
- package/page/cardano/cips/cip30.d.ts +22 -0
- package/page/cardano/cips/cip30.js +55 -0
- package/page/cardano/cips/index.d.ts +3 -0
- package/page/cardano/cips/index.js +7 -0
- package/page/cardano/index.d.ts +13 -0
- package/page/cardano/index.js +34 -0
- package/page/{SubWalleEvmProvider.d.ts → evm/index.d.ts} +3 -2
- package/page/{SubWalleEvmProvider.js → evm/index.js} +1 -1
- package/page/index.d.ts +3 -2
- package/page/index.js +6 -2
- package/page/{Accounts.d.ts → substrate/Accounts.d.ts} +1 -1
- package/page/{Metadata.d.ts → substrate/Metadata.d.ts} +1 -1
- package/page/{PostMessageProvider.d.ts → substrate/PostMessageProvider.d.ts} +1 -1
- package/page/{Signer.d.ts → substrate/Signer.d.ts} +1 -1
- package/page/{Injected.d.ts → substrate/index.d.ts} +1 -1
- package/services/balance-service/helpers/subscribe/cardano/types.d.ts +14 -0
- package/services/balance-service/helpers/subscribe/substrate/index.js +34 -2
- package/services/balance-service/transfer/xcm/acrossBridge/index.d.ts +4 -0
- package/services/balance-service/transfer/xcm/acrossBridge/index.js +4 -1
- package/services/balance-service/transfer/xcm/index.js +2 -0
- package/services/chain-service/handler/CardanoApi.d.ts +3 -1
- package/services/chain-service/handler/CardanoApi.js +33 -0
- package/services/chain-service/index.d.ts +5 -1
- package/services/chain-service/index.js +32 -1
- package/services/chain-service/utils/patch.js +1 -1
- package/services/earning-service/handlers/liquid-staking/stella-swap.js +3 -3
- package/services/earning-service/handlers/native-staking/dtao.js +2 -2
- package/services/earning-service/handlers/native-staking/mythos.js +42 -8
- package/services/earning-service/handlers/native-staking/relay-chain.js +1 -1
- package/services/earning-service/handlers/native-staking/tao.js +14 -14
- package/services/earning-service/handlers/nomination-pool/index.js +1 -1
- package/services/migration-service/scripts/MigrateAuthUrls.js +1 -1
- package/services/request-service/constants.js +3 -1
- package/services/request-service/handler/AuthRequestHandler.js +40 -7
- package/services/request-service/handler/CardanoRequestHandler.d.ts +2 -0
- package/services/request-service/handler/CardanoRequestHandler.js +45 -3
- package/services/request-service/helper/index.d.ts +54 -0
- package/services/request-service/helper/index.js +406 -1
- package/services/request-service/types.d.ts +3 -1
- package/services/swap-service/handler/asset-hub/handler.js +1 -1
- package/services/swap-service/handler/base-handler.d.ts +3 -1
- package/services/swap-service/handler/base-handler.js +82 -22
- package/services/swap-service/handler/hydradx-handler.js +1 -1
- package/services/swap-service/handler/uniswap-handler.d.ts +5 -0
- package/services/swap-service/handler/uniswap-handler.js +275 -46
- package/services/swap-service/index.js +34 -12
- package/services/swap-service/utils.d.ts +3 -2
- package/services/swap-service/utils.js +13 -1
- package/types/swap/index.d.ts +1 -0
- package/types/transaction/process.d.ts +2 -0
- package/utils/auth.js +3 -2
- package/utils/cardano.d.ts +2 -0
- package/utils/cardano.js +12 -0
- package/utils/index.d.ts +1 -1
- package/utils/index.js +1 -1
- package/cjs/utils/canDerive.js +0 -12
- package/utils/canDerive.d.ts +0 -2
- package/utils/canDerive.js +0 -6
- /package/cjs/page/{Accounts.js → substrate/Accounts.js} +0 -0
- /package/cjs/page/{Metadata.js → substrate/Metadata.js} +0 -0
- /package/cjs/page/{PostMessageProvider.js → substrate/PostMessageProvider.js} +0 -0
- /package/cjs/page/{Signer.js → substrate/Signer.js} +0 -0
- /package/cjs/page/{Injected.js → substrate/index.js} +0 -0
- /package/page/{Accounts.js → substrate/Accounts.js} +0 -0
- /package/page/{Metadata.js → substrate/Metadata.js} +0 -0
- /package/page/{PostMessageProvider.js → substrate/PostMessageProvider.js} +0 -0
- /package/page/{Signer.js → substrate/Signer.js} +0 -0
- /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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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:
|