@subwallet/extension-base 1.3.22-0 → 1.3.24-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 (210) hide show
  1. package/background/KoniTypes.d.ts +77 -4
  2. package/background/KoniTypes.js +2 -0
  3. package/cjs/background/KoniTypes.js +2 -0
  4. package/cjs/constants/environment.js +4 -2
  5. package/cjs/constants/index.js +21 -4
  6. package/cjs/constants/signing.js +6 -2
  7. package/cjs/core/logic-validation/recipientAddress.js +9 -1
  8. package/cjs/core/logic-validation/transfer.js +57 -36
  9. package/cjs/core/types.js +1 -0
  10. package/cjs/core/utils.js +12 -1
  11. package/cjs/defaults.js +1 -1
  12. package/cjs/koni/api/dotsama/crowdloan.js +1 -1
  13. package/cjs/koni/api/nft/index.js +9 -16
  14. package/cjs/koni/api/staking/index.js +3 -4
  15. package/cjs/koni/background/handlers/Extension.js +343 -185
  16. package/cjs/koni/background/handlers/State.js +17 -2
  17. package/cjs/koni/background/handlers/Tabs.js +1 -1
  18. package/cjs/packageInfo.js +1 -1
  19. package/cjs/services/balance-service/helpers/subscribe/cardano/consts.js +11 -0
  20. package/cjs/services/balance-service/helpers/subscribe/cardano/index.js +63 -0
  21. package/cjs/services/balance-service/helpers/subscribe/cardano/types.js +1 -0
  22. package/cjs/services/balance-service/helpers/subscribe/cardano/utils.js +74 -0
  23. package/cjs/services/balance-service/helpers/subscribe/index.js +21 -7
  24. package/cjs/services/balance-service/helpers/subscribe/ton/utils.js +2 -2
  25. package/cjs/services/balance-service/index.js +4 -2
  26. package/cjs/services/balance-service/transfer/cardano-transfer.js +122 -0
  27. package/cjs/services/balance-service/transfer/smart-contract.js +24 -3
  28. package/cjs/services/balance-service/transfer/token.js +4 -4
  29. package/cjs/services/chain-service/handler/CardanoApi.js +176 -0
  30. package/cjs/services/chain-service/handler/CardanoChainHandler.js +83 -0
  31. package/cjs/services/chain-service/handler/TonApi.js +2 -5
  32. package/cjs/services/chain-service/index.js +40 -7
  33. package/cjs/services/chain-service/utils/index.js +40 -11
  34. package/cjs/services/chain-service/utils/patch.js +1 -1
  35. package/cjs/services/earning-service/handlers/liquid-staking/bifrost-manta.js +1 -1
  36. package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +1 -1
  37. package/cjs/services/earning-service/service.js +6 -12
  38. package/cjs/services/fee-service/service.js +19 -8
  39. package/cjs/services/fee-service/utils/tokenPayFee.js +151 -0
  40. package/cjs/services/history-service/index.js +4 -6
  41. package/cjs/services/inapp-notification-service/index.js +12 -4
  42. package/cjs/services/keyring-service/context/account-context.js +17 -2
  43. package/cjs/services/keyring-service/context/handlers/Derive.js +10 -7
  44. package/cjs/services/keyring-service/context/handlers/Migration.js +268 -0
  45. package/cjs/services/keyring-service/context/handlers/Mnemonic.js +2 -2
  46. package/cjs/services/keyring-service/context/handlers/Secret.js +1 -1
  47. package/cjs/services/keyring-service/utils.js +18 -0
  48. package/cjs/services/request-service/handler/CardanoRequestHandler.js +172 -0
  49. package/cjs/services/request-service/handler/EvmRequestHandler.js +1 -1
  50. package/cjs/services/request-service/handler/MetadataRequestHandler.js +5 -13
  51. package/cjs/services/request-service/index.js +22 -4
  52. package/cjs/services/setting-service/constants.js +10 -1
  53. package/cjs/services/storage-service/DatabaseService.js +3 -0
  54. package/cjs/services/storage-service/db-stores/InappNotification.js +6 -0
  55. package/cjs/services/swap-service/handler/asset-hub/handler.js +0 -59
  56. package/cjs/services/swap-service/handler/chainflip-handler.js +33 -281
  57. package/cjs/services/swap-service/handler/hydradx-handler.js +23 -190
  58. package/cjs/services/swap-service/handler/simpleswap-handler.js +1 -222
  59. package/cjs/services/swap-service/handler/uniswap-handler.js +331 -0
  60. package/cjs/services/swap-service/index.js +31 -22
  61. package/cjs/services/swap-service/utils.js +21 -38
  62. package/cjs/services/transaction-service/helpers/index.js +6 -1
  63. package/cjs/services/transaction-service/index.js +286 -26
  64. package/cjs/services/transaction-service/utils.js +5 -1
  65. package/cjs/types/account/info/keyring.js +12 -1
  66. package/cjs/types/fee/cardano.js +1 -0
  67. package/cjs/types/swap/index.js +7 -2
  68. package/cjs/utils/account/analyze.js +2 -1
  69. package/cjs/utils/account/common.js +29 -20
  70. package/cjs/utils/account/derive/info/solo.js +9 -4
  71. package/cjs/utils/account/derive/validate.js +36 -2
  72. package/cjs/utils/account/transform.js +38 -13
  73. package/cjs/utils/fee/transfer.js +87 -21
  74. package/cjs/utils/index.js +2 -2
  75. package/cjs/utils/staticData/index.js +7 -2
  76. package/constants/environment.d.ts +1 -0
  77. package/constants/environment.js +2 -1
  78. package/constants/index.d.ts +6 -1
  79. package/constants/index.js +14 -1
  80. package/constants/signing.js +6 -2
  81. package/core/logic-validation/recipientAddress.js +11 -3
  82. package/core/logic-validation/transfer.d.ts +1 -1
  83. package/core/logic-validation/transfer.js +33 -12
  84. package/core/substrate/xcm-parser.d.ts +1 -1
  85. package/core/types.d.ts +1 -0
  86. package/core/types.js +1 -0
  87. package/core/utils.d.ts +1 -0
  88. package/core/utils.js +13 -3
  89. package/defaults.d.ts +1 -1
  90. package/defaults.js +1 -1
  91. package/koni/api/dotsama/crowdloan.js +3 -3
  92. package/koni/api/nft/index.js +10 -16
  93. package/koni/api/nft/story_odyssey_nft/index.d.ts +1 -1
  94. package/koni/api/staking/index.js +4 -5
  95. package/koni/background/handlers/Extension.d.ts +9 -0
  96. package/koni/background/handlers/Extension.js +225 -69
  97. package/koni/background/handlers/State.d.ts +6 -2
  98. package/koni/background/handlers/State.js +18 -3
  99. package/koni/background/handlers/Tabs.js +1 -1
  100. package/package.json +76 -9
  101. package/packageInfo.js +1 -1
  102. package/services/balance-service/helpers/subscribe/cardano/consts.d.ts +1 -0
  103. package/services/balance-service/helpers/subscribe/cardano/consts.js +4 -0
  104. package/services/balance-service/helpers/subscribe/cardano/index.d.ts +2 -0
  105. package/services/balance-service/helpers/subscribe/cardano/index.js +57 -0
  106. package/services/balance-service/helpers/subscribe/cardano/types.d.ts +34 -0
  107. package/services/balance-service/helpers/subscribe/cardano/types.js +1 -0
  108. package/services/balance-service/helpers/subscribe/cardano/utils.d.ts +15 -0
  109. package/services/balance-service/helpers/subscribe/cardano/utils.js +62 -0
  110. package/services/balance-service/helpers/subscribe/index.d.ts +2 -2
  111. package/services/balance-service/helpers/subscribe/index.js +23 -9
  112. package/services/balance-service/helpers/subscribe/ton/utils.d.ts +1 -1
  113. package/services/balance-service/helpers/subscribe/ton/utils.js +1 -1
  114. package/services/balance-service/index.js +4 -2
  115. package/services/balance-service/transfer/cardano-transfer.d.ts +24 -0
  116. package/services/balance-service/transfer/cardano-transfer.js +114 -0
  117. package/services/balance-service/transfer/smart-contract.d.ts +4 -2
  118. package/services/balance-service/transfer/smart-contract.js +24 -3
  119. package/services/balance-service/transfer/token.d.ts +1 -1
  120. package/services/balance-service/transfer/token.js +2 -2
  121. package/services/chain-service/handler/CardanoApi.d.ts +38 -0
  122. package/services/chain-service/handler/CardanoApi.js +167 -0
  123. package/services/chain-service/handler/CardanoChainHandler.d.ts +17 -0
  124. package/services/chain-service/handler/CardanoChainHandler.js +75 -0
  125. package/services/chain-service/handler/TonApi.js +3 -6
  126. package/services/chain-service/handler/types.d.ts +1 -0
  127. package/services/chain-service/index.d.ts +4 -1
  128. package/services/chain-service/index.js +41 -8
  129. package/services/chain-service/types.d.ts +9 -1
  130. package/services/chain-service/utils/index.d.ts +4 -0
  131. package/services/chain-service/utils/index.js +32 -11
  132. package/services/chain-service/utils/patch.js +1 -1
  133. package/services/earning-service/handlers/liquid-staking/bifrost-manta.js +1 -1
  134. package/services/earning-service/handlers/liquid-staking/bifrost.js +1 -1
  135. package/services/earning-service/service.js +8 -14
  136. package/services/fee-service/interfaces.d.ts +25 -0
  137. package/services/fee-service/service.js +19 -8
  138. package/services/fee-service/utils/tokenPayFee.d.ts +8 -0
  139. package/services/fee-service/utils/tokenPayFee.js +141 -0
  140. package/services/history-service/index.js +6 -8
  141. package/services/inapp-notification-service/index.d.ts +3 -4
  142. package/services/inapp-notification-service/index.js +14 -6
  143. package/services/keyring-service/context/account-context.d.ts +6 -2
  144. package/services/keyring-service/context/account-context.js +17 -2
  145. package/services/keyring-service/context/handlers/Derive.d.ts +1 -1
  146. package/services/keyring-service/context/handlers/Derive.js +10 -8
  147. package/services/keyring-service/context/handlers/Migration.d.ts +17 -0
  148. package/services/keyring-service/context/handlers/Migration.js +258 -0
  149. package/services/keyring-service/context/handlers/Mnemonic.js +2 -2
  150. package/services/keyring-service/context/handlers/Secret.js +2 -2
  151. package/services/keyring-service/utils.d.ts +2 -0
  152. package/services/keyring-service/utils.js +11 -0
  153. package/services/request-service/handler/CardanoRequestHandler.d.ts +16 -0
  154. package/services/request-service/handler/CardanoRequestHandler.js +163 -0
  155. package/services/request-service/handler/EvmRequestHandler.js +1 -1
  156. package/services/request-service/handler/MetadataRequestHandler.d.ts +1 -1
  157. package/services/request-service/handler/MetadataRequestHandler.js +5 -13
  158. package/services/request-service/index.d.ts +7 -4
  159. package/services/request-service/index.js +21 -7
  160. package/services/setting-service/constants.d.ts +3 -0
  161. package/services/setting-service/constants.js +6 -0
  162. package/services/storage-service/DatabaseService.d.ts +1 -0
  163. package/services/storage-service/DatabaseService.js +3 -0
  164. package/services/storage-service/db-stores/InappNotification.d.ts +1 -0
  165. package/services/storage-service/db-stores/InappNotification.js +6 -0
  166. package/services/swap-service/handler/asset-hub/handler.d.ts +1 -4
  167. package/services/swap-service/handler/asset-hub/handler.js +2 -61
  168. package/services/swap-service/handler/base-handler.d.ts +1 -4
  169. package/services/swap-service/handler/chainflip-handler.d.ts +2 -9
  170. package/services/swap-service/handler/chainflip-handler.js +31 -280
  171. package/services/swap-service/handler/hydradx-handler.d.ts +1 -6
  172. package/services/swap-service/handler/hydradx-handler.js +13 -180
  173. package/services/swap-service/handler/simpleswap-handler.d.ts +1 -4
  174. package/services/swap-service/handler/simpleswap-handler.js +5 -226
  175. package/services/swap-service/handler/uniswap-handler.d.ts +41 -0
  176. package/services/swap-service/handler/uniswap-handler.js +323 -0
  177. package/services/swap-service/index.js +30 -22
  178. package/services/swap-service/utils.d.ts +1 -5
  179. package/services/swap-service/utils.js +7 -21
  180. package/services/transaction-service/helpers/index.d.ts +2 -0
  181. package/services/transaction-service/helpers/index.js +4 -0
  182. package/services/transaction-service/index.d.ts +8 -2
  183. package/services/transaction-service/index.js +273 -17
  184. package/services/transaction-service/types.d.ts +7 -0
  185. package/services/transaction-service/utils.js +7 -2
  186. package/types/account/info/keyring.d.ts +4 -1
  187. package/types/account/info/keyring.js +9 -0
  188. package/types/account/info/proxy.d.ts +2 -0
  189. package/types/balance/index.d.ts +4 -1
  190. package/types/fee/base.d.ts +1 -1
  191. package/types/fee/cardano.d.ts +18 -0
  192. package/types/fee/cardano.js +1 -0
  193. package/types/fee/option.d.ts +1 -1
  194. package/types/fee/subscription.d.ts +4 -3
  195. package/types/swap/index.d.ts +11 -3
  196. package/types/swap/index.js +7 -2
  197. package/utils/account/analyze.js +2 -1
  198. package/utils/account/common.d.ts +11 -6
  199. package/utils/account/common.js +28 -19
  200. package/utils/account/derive/info/solo.js +10 -5
  201. package/utils/account/derive/validate.d.ts +1 -0
  202. package/utils/account/derive/validate.js +34 -1
  203. package/utils/account/transform.d.ts +2 -1
  204. package/utils/account/transform.js +37 -13
  205. package/utils/fee/transfer.d.ts +3 -2
  206. package/utils/fee/transfer.js +90 -24
  207. package/utils/index.js +4 -4
  208. package/utils/staticData/index.d.ts +4 -1
  209. package/utils/staticData/index.js +5 -1
  210. package/utils/staticData/oldChainPrefix.json +1 -0
@@ -43,6 +43,7 @@ var _storage = require("@subwallet/extension-base/storage");
43
43
  var _types2 = require("@subwallet/extension-base/types");
44
44
  var _utils3 = require("@subwallet/extension-base/utils");
45
45
  var _promise = require("@subwallet/extension-base/utils/promise");
46
+ var _subwalletApiSdk = _interopRequireDefault(require("@subwallet/subwallet-api-sdk"));
46
47
  var _uiKeyring = require("@subwallet/ui-keyring");
47
48
  var _bn = _interopRequireDefault(require("bn.js"));
48
49
  var _i18next = require("i18next");
@@ -90,6 +91,8 @@ class KoniState {
90
91
  waitStarting = null;
91
92
  constructor() {
92
93
  let providers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
94
+ // Init subwallet api sdk
95
+ _subwalletApiSdk.default.init(_constants.BACKEND_API_URL);
93
96
  this.providers = providers;
94
97
  this.eventService = new _eventService.EventService();
95
98
  this.dbService = new _DatabaseService.default(this.eventService);
@@ -128,8 +131,8 @@ class KoniState {
128
131
  get knownMetadata() {
129
132
  return this.requestService.knownMetadata;
130
133
  }
131
- injectMetadata(url, request) {
132
- return this.requestService.injectMetadata(url, request);
134
+ injectMetadata(request) {
135
+ return this.requestService.injectMetadata(request);
133
136
  }
134
137
  getMetaRequest(id) {
135
138
  return this.requestService.getMetaRequest(id);
@@ -731,6 +734,12 @@ class KoniState {
731
734
  getTonApi(networkKey) {
732
735
  return this.chainService.getTonApi(networkKey);
733
736
  }
737
+ getCardanoApiMap() {
738
+ return this.chainService.getCardanoApiMap();
739
+ }
740
+ getCardanoApi(networkKey) {
741
+ return this.chainService.getCardanoApi(networkKey);
742
+ }
734
743
  getApiMap() {
735
744
  return {
736
745
  substrate: this.chainService.getSubstrateApiMap(),
@@ -1017,12 +1026,18 @@ class KoniState {
1017
1026
  getConfirmationsQueueSubjectTon() {
1018
1027
  return this.requestService.confirmationsQueueSubjectTon;
1019
1028
  }
1029
+ getConfirmationsQueueSubjectCardano() {
1030
+ return this.requestService.confirmationsQueueSubjectCardano;
1031
+ }
1020
1032
  async completeConfirmation(request) {
1021
1033
  return await this.requestService.completeConfirmation(request);
1022
1034
  }
1023
1035
  async completeConfirmationTon(request) {
1024
1036
  return await this.requestService.completeConfirmationTon(request);
1025
1037
  }
1038
+ async completeConfirmationCardano(request) {
1039
+ return await this.requestService.completeConfirmationCardano(request);
1040
+ }
1026
1041
  async onMV3Update() {
1027
1042
  const migrationStatus = await _storage.SWStorage.instance.getItem('mv3_migration');
1028
1043
  if (!migrationStatus || migrationStatus !== 'done') {
@@ -171,7 +171,7 @@ class KoniTabs {
171
171
  }
172
172
  }
173
173
  metadataProvide(url, request) {
174
- return this.#koniState.injectMetadata(url, request);
174
+ return this.#koniState.injectMetadata(request);
175
175
  }
176
176
 
177
177
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.3.22-0'
16
+ version: '1.3.24-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DEFAULT_CARDANO_TTL_OFFSET = void 0;
7
+ // Copyright 2019-2022 @subwallet/extension-base
8
+ // SPDX-License-Identifier: Apache-2.0
9
+
10
+ const DEFAULT_CARDANO_TTL_OFFSET = 2 * 60 * 60 * 1000; // 2 hours
11
+ exports.DEFAULT_CARDANO_TTL_OFFSET = DEFAULT_CARDANO_TTL_OFFSET;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.subscribeCardanoBalance = subscribeCardanoBalance;
7
+ var _types = require("@subwallet/chain-list/types");
8
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
9
+ var _constants = require("@subwallet/extension-base/constants");
10
+ var _utils = require("@subwallet/extension-base/services/balance-service/helpers/subscribe/cardano/utils");
11
+ var _utils2 = require("@subwallet/extension-base/utils");
12
+ // Copyright 2019-2022 @subwallet/extension-base
13
+ // SPDX-License-Identifier: Apache-2.0
14
+
15
+ async function getBalanceMap(addresses, cardanoApi, isTestnet) {
16
+ const addressBalanceMap = {};
17
+ for (const address of addresses) {
18
+ addressBalanceMap[address] = await cardanoApi.getBalanceMap(isTestnet ? (0, _utils2.reformatAddress)(address, 0) : address);
19
+ }
20
+ return addressBalanceMap;
21
+ }
22
+ function subscribeCardanoBalance(params) {
23
+ const {
24
+ addresses,
25
+ assetMap,
26
+ callback,
27
+ cardanoApi,
28
+ chainInfo
29
+ } = params;
30
+ const chain = chainInfo.slug;
31
+ const isTestnet = chainInfo.isTestnet;
32
+ const tokens = (0, _utils2.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.NATIVE, _types._AssetType.CIP26]);
33
+ function getBalance() {
34
+ getBalanceMap(addresses, cardanoApi, isTestnet).then(addressBalanceMap => {
35
+ Object.values(tokens).forEach(tokenInfo => {
36
+ const id = (0, _utils.getCardanoAssetId)(tokenInfo);
37
+ const balances = addresses.map(address => {
38
+ var _addressBalanceMap$ad;
39
+ if (!addressBalanceMap[address]) {
40
+ return '0';
41
+ }
42
+ return ((_addressBalanceMap$ad = addressBalanceMap[address].find(asset => asset.unit === id)) === null || _addressBalanceMap$ad === void 0 ? void 0 : _addressBalanceMap$ad.quantity) || '0';
43
+ });
44
+ const items = balances.map((balance, index) => {
45
+ return {
46
+ address: addresses[index],
47
+ tokenSlug: tokenInfo.slug,
48
+ free: balance,
49
+ locked: '0',
50
+ // todo: research cardano lock balance
51
+ state: _KoniTypes.APIItemState.READY
52
+ };
53
+ });
54
+ callback(items);
55
+ });
56
+ }).catch(e => console.error('Error while fetching cardano balance', e));
57
+ }
58
+ const interval = setInterval(getBalance, _constants.ASTAR_REFRESH_BALANCE_INTERVAL);
59
+ getBalance();
60
+ return () => {
61
+ clearInterval(interval);
62
+ };
63
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.cborToBytes = void 0;
7
+ exports.getAdaBelongUtxo = getAdaBelongUtxo;
8
+ exports.getCardanoAssetId = getCardanoAssetId;
9
+ exports.getCardanoTxFee = getCardanoTxFee;
10
+ exports.retryCardanoTxStatus = retryCardanoTxStatus;
11
+ exports.splitCardanoId = splitCardanoId;
12
+ var _cardanoSerializationLibNodejs = require("@emurgo/cardano-serialization-lib-nodejs");
13
+ // Copyright 2019-2022 @subwallet/extension-base
14
+ // SPDX-License-Identifier: Apache-2.0
15
+
16
+ function getCardanoAssetId(chainAsset) {
17
+ var _chainAsset$metadata;
18
+ return (_chainAsset$metadata = chainAsset.metadata) === null || _chainAsset$metadata === void 0 ? void 0 : _chainAsset$metadata.cardanoId;
19
+ }
20
+ function getCardanoTxFee(payload) {
21
+ return BigInt(_cardanoSerializationLibNodejs.Transaction.from_hex(payload).body().fee().to_str());
22
+ }
23
+ function getAdaBelongUtxo(payload, receiverAddress) {
24
+ const txOutputsRaw = _cardanoSerializationLibNodejs.Transaction.from_hex(payload).body().outputs().to_json();
25
+ const txOutputs = JSON.parse(txOutputsRaw);
26
+ const receiverUtxo = txOutputs.find(utxo => utxo.address === receiverAddress); // must has utxo to receiver
27
+
28
+ // @ts-ignore
29
+ return BigInt(receiverUtxo.amount.coin);
30
+ }
31
+ const cborToBytes = hex => {
32
+ if (hex.length % 2 === 0 && /^[0-9A-F]*$/i.test(hex)) {
33
+ return Buffer.from(hex, 'hex');
34
+ }
35
+ return Buffer.from(hex, 'utf-8');
36
+ };
37
+ exports.cborToBytes = cborToBytes;
38
+ async function retryCardanoTxStatus(fn, options) {
39
+ let lastError;
40
+ for (let i = 0; i < options.retries; i++) {
41
+ try {
42
+ return await fn();
43
+ } catch (e) {
44
+ if (e instanceof Error) {
45
+ lastError = e;
46
+ }
47
+
48
+ // todo: improve the timeout tx
49
+ await new Promise(resolve => setTimeout(resolve, options.delay)); // wait for delay period, then recall the fn()
50
+ }
51
+ }
52
+
53
+ console.error('Cardano transaction timeout', lastError); // throw only last error, in case no successful result from fn()
54
+
55
+ return false;
56
+ }
57
+ function splitCardanoId(id) {
58
+ if (id === 'lovelace') {
59
+ return {
60
+ cardanoId: id,
61
+ policyId: '',
62
+ nameHex: ''
63
+ };
64
+ }
65
+ if (!id || id.length < 56) {
66
+ throw new Error('The cardano native asset policy id must has 28 bytes in length.');
67
+ } else {
68
+ return {
69
+ cardanoId: id,
70
+ policyId: id.slice(0, 56),
71
+ nameHex: id.slice(56)
72
+ };
73
+ }
74
+ }
@@ -8,6 +8,7 @@ exports.getAccountJsonByAddress = void 0;
8
8
  exports.subscribeBalance = subscribeBalance;
9
9
  var _types = require("@subwallet/chain-list/types");
10
10
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
11
+ var _cardano = require("@subwallet/extension-base/services/balance-service/helpers/subscribe/cardano");
11
12
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
12
13
  var _utils2 = require("@subwallet/extension-base/utils");
13
14
  var _uiKeyring = _interopRequireDefault(require("@subwallet/ui-keyring"));
@@ -45,16 +46,19 @@ exports.getAccountJsonByAddress = getAccountJsonByAddress;
45
46
  const filterAddress = (addresses, chainInfo) => {
46
47
  const {
47
48
  bitcoin,
49
+ cardano,
48
50
  evm,
49
51
  substrate,
50
52
  ton
51
- } = (0, _utils2.categoryAddresses)(addresses);
53
+ } = (0, _utils2.getAddressesByChainTypeMap)(addresses);
52
54
  if ((0, _utils._isChainEvmCompatible)(chainInfo)) {
53
- return [evm, [...bitcoin, ...substrate, ...ton]];
55
+ return [evm, [...bitcoin, ...substrate, ...ton, ...cardano]];
54
56
  } else if ((0, _utils._isChainBitcoinCompatible)(chainInfo)) {
55
- return [bitcoin, [...evm, ...substrate, ...ton]];
57
+ return [bitcoin, [...evm, ...substrate, ...ton, ...cardano]];
56
58
  } else if ((0, _utils._isChainTonCompatible)(chainInfo)) {
57
- return [ton, [...bitcoin, ...evm, ...substrate]];
59
+ return [ton, [...bitcoin, ...evm, ...substrate, ...cardano]];
60
+ } else if ((0, _utils._isChainCardanoCompatible)(chainInfo)) {
61
+ return [cardano, [...bitcoin, ...evm, ...substrate, ...ton]];
58
62
  } else {
59
63
  const fetchList = [];
60
64
  const unfetchList = [];
@@ -80,11 +84,11 @@ const filterAddress = (addresses, chainInfo) => {
80
84
  fetchList.push(address);
81
85
  }
82
86
  });
83
- return [fetchList, [...unfetchList, ...bitcoin, ...evm, ...ton]];
87
+ return [fetchList, [...unfetchList, ...bitcoin, ...evm, ...ton, ...cardano]];
84
88
  }
85
89
  };
86
90
  const handleUnsupportedOrPendingAddresses = (addresses, chainSlug, chainAssetMap, state, callback) => {
87
- const tokens = (0, _utils2.filterAssetsByChainAndType)(chainAssetMap, chainSlug, [_types._AssetType.NATIVE, _types._AssetType.ERC20, _types._AssetType.PSP22, _types._AssetType.LOCAL, _types._AssetType.GRC20, _types._AssetType.VFT]);
91
+ const tokens = (0, _utils2.filterAssetsByChainAndType)(chainAssetMap, chainSlug, [_types._AssetType.NATIVE, _types._AssetType.ERC20, _types._AssetType.PSP22, _types._AssetType.LOCAL, _types._AssetType.GRC20, _types._AssetType.VFT, _types._AssetType.TEP74, _types._AssetType.CIP26]);
88
92
  const now = new Date().getTime();
89
93
  Object.values(tokens).forEach(token => {
90
94
  const items = addresses.map(address => ({
@@ -100,7 +104,7 @@ const handleUnsupportedOrPendingAddresses = (addresses, chainSlug, chainAssetMap
100
104
  };
101
105
 
102
106
  // main subscription, use for multiple chains, multiple addresses and multiple tokens
103
- function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, callback, extrinsicType) {
107
+ function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, callback, extrinsicType) {
104
108
  // Filter chain and token
105
109
  const chainAssetMap = Object.fromEntries(Object.entries(_chainAssetMap).filter(_ref => {
106
110
  let [token] = _ref;
@@ -138,6 +142,16 @@ function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoM
138
142
  tonApi
139
143
  });
140
144
  }
145
+ const cardanoApi = cardanoApiMap[chainSlug];
146
+ if ((0, _utils._isPureCardanoChain)(chainInfo)) {
147
+ return (0, _cardano.subscribeCardanoBalance)({
148
+ addresses: useAddresses,
149
+ assetMap: chainAssetMap,
150
+ callback,
151
+ chainInfo,
152
+ cardanoApi
153
+ });
154
+ }
141
155
 
142
156
  // If the chain is not ready, return pending state
143
157
  if (!substrateApiMap[chainSlug].isApiReady) {
@@ -18,7 +18,7 @@ exports.getTransferCellPromise = getTransferCellPromise;
18
18
  exports.getWalletQueryId = getWalletQueryId;
19
19
  exports.isBounceableAddress = isBounceableAddress;
20
20
  exports.messageRelaxedToCell = messageRelaxedToCell;
21
- exports.retry = retry;
21
+ exports.retryTonTxStatus = retryTonTxStatus;
22
22
  exports.tonAddressInfo = tonAddressInfo;
23
23
  var _consts = require("@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/consts");
24
24
  var _core = require("@ton/core");
@@ -45,7 +45,7 @@ function externalMessage(contract, seqno, body) {
45
45
  body: body
46
46
  }))).endCell();
47
47
  }
48
- async function retry(fn, options) {
48
+ async function retryTonTxStatus(fn, options) {
49
49
  let lastError;
50
50
  for (let i = 0; i < options.retries; i++) {
51
51
  try {
@@ -200,8 +200,9 @@ class BalanceService {
200
200
  const evmApiMap = this.state.chainService.getEvmApiMap();
201
201
  const substrateApiMap = this.state.chainService.getSubstrateApiMap();
202
202
  const tonApiMap = this.state.chainService.getTonApiMap();
203
+ const cardanoApiMap = this.state.chainService.getCardanoApiMap();
203
204
  let unsub = _util.noop;
204
- unsub = (0, _helpers.subscribeBalance)([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, result => {
205
+ unsub = (0, _helpers.subscribeBalance)([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, result => {
205
206
  const rs = result[0];
206
207
  let value;
207
208
  switch (balanceType) {
@@ -371,13 +372,14 @@ class BalanceService {
371
372
  const evmApiMap = this.state.chainService.getEvmApiMap();
372
373
  const substrateApiMap = this.state.chainService.getSubstrateApiMap();
373
374
  const tonApiMap = this.state.chainService.getTonApiMap();
375
+ const cardanoApiMap = this.state.chainService.getCardanoApiMap();
374
376
  const activeChainSlugs = Object.keys(this.state.getActiveChainInfoMap());
375
377
  const assetState = this.state.chainService.subscribeAssetSettings().value;
376
378
  const assets = Object.values(assetMap).filter(asset => {
377
379
  var _assetState$asset$slu;
378
380
  return activeChainSlugs.includes(asset.originChain) && ((_assetState$asset$slu = assetState[asset.slug]) === null || _assetState$asset$slu === void 0 ? void 0 : _assetState$asset$slu.visible);
379
381
  }).map(asset => asset.slug);
380
- const unsub = (0, _helpers.subscribeBalance)(addresses, activeChainSlugs, assets, assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, result => {
382
+ const unsub = (0, _helpers.subscribeBalance)(addresses, activeChainSlugs, assets, assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, result => {
381
383
  !cancel && this.setBalanceItem(result);
382
384
  }, _KoniTypes.ExtrinsicType.TRANSFER_BALANCE);
383
385
  const unsub2 = this.state.subscribeMantaPayBalance();
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createCardanoTransaction = createCardanoTransaction;
7
+ var csl = _interopRequireWildcard(require("@emurgo/cardano-serialization-lib-nodejs"));
8
+ var _types = require("@subwallet/chain-list/types");
9
+ var _utils = require("@subwallet/extension-base/services/balance-service/helpers/subscribe/cardano/utils");
10
+ var _subwalletApiSdk = require("@subwallet/subwallet-api-sdk");
11
+ 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); }
12
+ 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; }
13
+ // Copyright 2019-2022 @subwallet/extension-base
14
+ // SPDX-License-Identifier: Apache-2.0
15
+
16
+ async function createCardanoTransaction(params) {
17
+ var _tokenInfo$metadata;
18
+ const {
19
+ cardanoTtlOffset,
20
+ from,
21
+ networkKey,
22
+ to,
23
+ tokenInfo,
24
+ transferAll,
25
+ value
26
+ } = params;
27
+ const cardanoId = (_tokenInfo$metadata = tokenInfo.metadata) === null || _tokenInfo$metadata === void 0 ? void 0 : _tokenInfo$metadata.cardanoId;
28
+ const isNativeTransfer = tokenInfo.assetType === _types._AssetType.NATIVE;
29
+ const isSelfTransfer = from === to;
30
+ if (!cardanoId) {
31
+ throw new Error('Missing token policy id metadata');
32
+ }
33
+ const payload = await _subwalletApiSdk.subwalletApiSdk.fetchUnsignedPayload({
34
+ tokenDecimals: params.tokenInfo.decimals || 0,
35
+ nativeTokenSymbol: params.nativeTokenInfo.symbol,
36
+ cardanoId,
37
+ from: params.from,
38
+ to: params.to,
39
+ value: params.value,
40
+ cardanoTtlOffset: params.cardanoTtlOffset
41
+ });
42
+ console.log('Build cardano payload successfully!', payload);
43
+ validatePayload(payload, params);
44
+ const fee = (0, _utils.getCardanoTxFee)(payload);
45
+ const adaBelongToCnaUtxo = isNativeTransfer || isSelfTransfer ? BigInt(0) : (0, _utils.getAdaBelongUtxo)(payload, to);
46
+ const tx = {
47
+ from,
48
+ to,
49
+ networkKey,
50
+ value,
51
+ transferAll,
52
+ cardanoTtlOffset,
53
+ estimateCardanoFee: (fee + adaBelongToCnaUtxo).toString(),
54
+ cardanoPayload: payload
55
+ };
56
+ return [tx, value];
57
+ }
58
+ function validatePayload(payload, params) {
59
+ var _params$tokenInfo$met;
60
+ const txInfo = JSON.parse(csl.Transaction.from_hex(payload).to_json());
61
+ const outputs = txInfo.body.outputs;
62
+ const cardanoId = (_params$tokenInfo$met = params.tokenInfo.metadata) === null || _params$tokenInfo$met === void 0 ? void 0 : _params$tokenInfo$met.cardanoId;
63
+ const assetType = params.tokenInfo.assetType;
64
+ const isSendSameAddress = params.from === params.to;
65
+ if (!cardanoId) {
66
+ throw new Error('Missing cardano id metadata');
67
+ }
68
+ const cardanoAssetMetadata = (0, _utils.splitCardanoId)(cardanoId);
69
+ if (isSendSameAddress) {
70
+ validateAllOutputsBelongToAddress(params.from, outputs);
71
+ validateExistOutputWithAmountSend(params.value, outputs, assetType, cardanoAssetMetadata);
72
+ } else {
73
+ const [outputsBelongToReceiver, outputsNotBelongToReceiver] = [outputs.filter(output => output.address === params.to), outputs.filter(output => output.address !== params.to)];
74
+ validateReceiverOutputsWithAmountSend(params.value, outputsBelongToReceiver, assetType, cardanoAssetMetadata);
75
+ validateAllOutputsBelongToAddress(params.from, outputsNotBelongToReceiver);
76
+ }
77
+ }
78
+ function validateAllOutputsBelongToAddress(address, outputs) {
79
+ const found = outputs.find(output => output.address !== address);
80
+ if (found) {
81
+ throw new Error('Transaction has invalid address information');
82
+ }
83
+ }
84
+ function validateExistOutputWithAmountSend(amount, outputs, assetType, cardanoAssetMetadata) {
85
+ if (assetType === _types._AssetType.NATIVE) {
86
+ const found = outputs.find(output => output.amount.coin === amount);
87
+ if (found) {
88
+ return;
89
+ }
90
+ throw new Error('Transaction has invalid transfer amount information');
91
+ }
92
+ if (assetType === _types._AssetType.CIP26) {
93
+ const found = outputs.find(output => {
94
+ var _output$amount$multia;
95
+ return amount === ((_output$amount$multia = output.amount.multiasset[cardanoAssetMetadata.policyId]) === null || _output$amount$multia === void 0 ? void 0 : _output$amount$multia[cardanoAssetMetadata.nameHex]);
96
+ });
97
+ if (found) {
98
+ return;
99
+ }
100
+ throw new Error('Transaction has invalid transfer amount information');
101
+ }
102
+ throw new Error('Invalid asset type!');
103
+ }
104
+ function validateReceiverOutputsWithAmountSend(amount, outputs, assetType, cardanoAssetMetadata) {
105
+ if (outputs.length !== 1) {
106
+ throw new Error('Transaction has invalid transfer amount information');
107
+ }
108
+ const receiverOutput = outputs[0];
109
+ if (assetType === _types._AssetType.NATIVE) {
110
+ if (receiverOutput.amount.coin === amount) {
111
+ return;
112
+ }
113
+ throw new Error('Transaction has invalid transfer amount information');
114
+ }
115
+ if (assetType === _types._AssetType.CIP26) {
116
+ if (receiverOutput.amount.multiasset[cardanoAssetMetadata.policyId][cardanoAssetMetadata.nameHex] === amount) {
117
+ return;
118
+ }
119
+ throw new Error('Transaction has invalid transfer amount information');
120
+ }
121
+ throw new Error('Invalid asset type!');
122
+ }
@@ -23,6 +23,7 @@ async function getEVMTransactionObject(_ref) {
23
23
  let {
24
24
  chain,
25
25
  evmApi,
26
+ fallbackFee,
26
27
  feeCustom: _feeCustom,
27
28
  feeInfo: _feeInfo,
28
29
  feeOption,
@@ -34,13 +35,22 @@ async function getEVMTransactionObject(_ref) {
34
35
  const feeCustom = _feeCustom;
35
36
  const feeInfo = _feeInfo;
36
37
  const feeCombine = (0, _utils3.combineEthFee)(feeInfo, feeOption, feeCustom);
38
+ let errorOnEstimateFee = '';
37
39
  const transactionObject = {
38
40
  to: to,
39
41
  value: value,
40
42
  from: from,
41
43
  ...feeCombine
42
44
  };
43
- const gasLimit = await evmApi.api.eth.estimateGas(transactionObject);
45
+ const gasLimit = await evmApi.api.eth.estimateGas(transactionObject).catch(e => {
46
+ console.log('Cannot estimate fee with native transfer on', chain, e);
47
+ if (fallbackFee) {
48
+ errorOnEstimateFee = e.message;
49
+ return 21000;
50
+ } else {
51
+ throw Error('Unable to estimate fee for this transaction. Edit fee and try again.');
52
+ }
53
+ });
44
54
  transactionObject.gas = gasLimit;
45
55
  let estimateFee;
46
56
  if (feeCombine.maxFeePerGas) {
@@ -54,12 +64,14 @@ async function getEVMTransactionObject(_ref) {
54
64
  const numberReplace = 18 - 12;
55
65
  transactionObject.value = transactionObject.value.substring(0, transactionObject.value.length - 6) + new Array(numberReplace).fill('0').join('');
56
66
  }
57
- return [transactionObject, transactionObject.value.toString()];
67
+ return [transactionObject, transactionObject.value.toString(), errorOnEstimateFee];
58
68
  }
59
69
  async function getERC20TransactionObject(_ref2) {
60
70
  let {
61
71
  assetAddress,
72
+ chain,
62
73
  evmApi,
74
+ fallbackFee,
63
75
  feeCustom: _feeCustom,
64
76
  feeInfo: _feeInfo,
65
77
  feeOption,
@@ -72,6 +84,7 @@ async function getERC20TransactionObject(_ref2) {
72
84
  const feeCustom = _feeCustom;
73
85
  let freeAmount = new _bignumber.default(0);
74
86
  let transferValue = value;
87
+ let errorOnEstimateFee = '';
75
88
  if (transferAll) {
76
89
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
77
90
  const bal = await erc20Contract.methods.balanceOf(from).call();
@@ -86,6 +99,14 @@ async function getERC20TransactionObject(_ref2) {
86
99
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
87
100
  const gasLimit = await erc20Contract.methods.transfer(to, transferValue).estimateGas({
88
101
  from
102
+ }).catch(e => {
103
+ console.log('Cannot estimate fee with token contract', assetAddress, chain, e);
104
+ if (fallbackFee) {
105
+ errorOnEstimateFee = e.message;
106
+ return 70000;
107
+ } else {
108
+ throw Error('Unable to estimate fee for this transaction. Edit fee and try again.');
109
+ }
89
110
  });
90
111
  const feeInfo = _feeInfo;
91
112
  const feeCombine = (0, _utils3.combineEthFee)(feeInfo, feeOption, feeCustom);
@@ -101,7 +122,7 @@ async function getERC20TransactionObject(_ref2) {
101
122
  transferValue = freeAmount.toFixed(0);
102
123
  transactionObject.data = generateTransferData(to, transferValue);
103
124
  }
104
- return [transactionObject, transferValue];
125
+ return [transactionObject, transferValue, errorOnEstimateFee];
105
126
  }
106
127
  async function getERC721Transaction(web3Api, chain, contractAddress, senderAddress, recipientAddress, tokenId, _feeInfo) {
107
128
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.getTransferMockTxFee = exports.createTransferExtrinsic = void 0;
7
+ exports.getTransferMockTxFee = exports.createSubstrateExtrinsic = void 0;
8
8
  var _api = require("@gear-js/api");
9
9
  var _types = require("@subwallet/chain-list/types");
10
10
  var _wasm = require("@subwallet/extension-base/koni/api/contract-handler/wasm");
@@ -23,7 +23,7 @@ var _utilCrypto = require("@polkadot/util-crypto");
23
23
  // Copyright 2019-2022 @subwallet/extension-base
24
24
  // SPDX-License-Identifier: Apache-2.0
25
25
 
26
- const createTransferExtrinsic = async _ref => {
26
+ const createSubstrateExtrinsic = async _ref => {
27
27
  var _tokenInfo$metadata;
28
28
  let {
29
29
  from,
@@ -119,7 +119,7 @@ const createTransferExtrinsic = async _ref => {
119
119
  }
120
120
  return [transfer, transferAmount || value];
121
121
  };
122
- exports.createTransferExtrinsic = createTransferExtrinsic;
122
+ exports.createSubstrateExtrinsic = createSubstrateExtrinsic;
123
123
  const getTransferMockTxFee = async (address, chainInfo, tokenInfo, api) => {
124
124
  try {
125
125
  let estimatedFee;
@@ -157,7 +157,7 @@ const getTransferMockTxFee = async (address, chainInfo, tokenInfo, api) => {
157
157
  var _paymentInfo$partialF;
158
158
  const substrateApi = api;
159
159
  const chainApi = await substrateApi.isReady;
160
- const [mockTx] = await createTransferExtrinsic({
160
+ const [mockTx] = await createSubstrateExtrinsic({
161
161
  from: address,
162
162
  networkKey: chainInfo.slug,
163
163
  substrateApi: chainApi,