@subwallet/extension-base 1.3.22-0 → 1.3.23-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 (193) hide show
  1. package/background/KoniTypes.d.ts +75 -2
  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/signing.js +6 -2
  6. package/cjs/core/logic-validation/recipientAddress.js +9 -1
  7. package/cjs/core/logic-validation/transfer.js +35 -29
  8. package/cjs/core/types.js +1 -0
  9. package/cjs/core/utils.js +12 -1
  10. package/cjs/defaults.js +1 -1
  11. package/cjs/koni/api/dotsama/crowdloan.js +1 -1
  12. package/cjs/koni/api/nft/index.js +9 -16
  13. package/cjs/koni/api/staking/index.js +3 -4
  14. package/cjs/koni/background/handlers/Extension.js +234 -96
  15. package/cjs/koni/background/handlers/State.js +15 -0
  16. package/cjs/packageInfo.js +1 -1
  17. package/cjs/services/balance-service/helpers/subscribe/cardano/consts.js +11 -0
  18. package/cjs/services/balance-service/helpers/subscribe/cardano/index.js +63 -0
  19. package/cjs/services/balance-service/helpers/subscribe/cardano/types.js +1 -0
  20. package/cjs/services/balance-service/helpers/subscribe/cardano/utils.js +74 -0
  21. package/cjs/services/balance-service/helpers/subscribe/index.js +21 -7
  22. package/cjs/services/balance-service/helpers/subscribe/ton/utils.js +2 -2
  23. package/cjs/services/balance-service/index.js +4 -2
  24. package/cjs/services/balance-service/transfer/cardano-transfer.js +122 -0
  25. package/cjs/services/balance-service/transfer/token.js +4 -4
  26. package/cjs/services/chain-service/handler/CardanoApi.js +176 -0
  27. package/cjs/services/chain-service/handler/CardanoChainHandler.js +83 -0
  28. package/cjs/services/chain-service/handler/TonApi.js +2 -5
  29. package/cjs/services/chain-service/index.js +29 -7
  30. package/cjs/services/chain-service/utils/index.js +40 -11
  31. package/cjs/services/chain-service/utils/patch.js +1 -1
  32. package/cjs/services/earning-service/handlers/liquid-staking/bifrost-manta.js +1 -1
  33. package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +1 -1
  34. package/cjs/services/earning-service/service.js +6 -12
  35. package/cjs/services/fee-service/service.js +19 -8
  36. package/cjs/services/history-service/index.js +4 -6
  37. package/cjs/services/inapp-notification-service/index.js +12 -4
  38. package/cjs/services/keyring-service/context/account-context.js +17 -2
  39. package/cjs/services/keyring-service/context/handlers/Derive.js +10 -7
  40. package/cjs/services/keyring-service/context/handlers/Migration.js +268 -0
  41. package/cjs/services/keyring-service/context/handlers/Mnemonic.js +2 -2
  42. package/cjs/services/keyring-service/context/handlers/Secret.js +1 -1
  43. package/cjs/services/keyring-service/utils.js +18 -0
  44. package/cjs/services/request-service/handler/CardanoRequestHandler.js +172 -0
  45. package/cjs/services/request-service/handler/EvmRequestHandler.js +1 -1
  46. package/cjs/services/request-service/index.js +20 -2
  47. package/cjs/services/setting-service/constants.js +10 -1
  48. package/cjs/services/storage-service/DatabaseService.js +3 -0
  49. package/cjs/services/storage-service/db-stores/InappNotification.js +6 -0
  50. package/cjs/services/swap-service/handler/asset-hub/handler.js +0 -59
  51. package/cjs/services/swap-service/handler/chainflip-handler.js +33 -281
  52. package/cjs/services/swap-service/handler/hydradx-handler.js +23 -190
  53. package/cjs/services/swap-service/handler/simpleswap-handler.js +1 -222
  54. package/cjs/services/swap-service/handler/uniswap-handler.js +331 -0
  55. package/cjs/services/swap-service/index.js +31 -22
  56. package/cjs/services/swap-service/utils.js +21 -38
  57. package/cjs/services/transaction-service/helpers/index.js +6 -1
  58. package/cjs/services/transaction-service/index.js +278 -21
  59. package/cjs/services/transaction-service/utils.js +5 -1
  60. package/cjs/types/account/info/keyring.js +12 -1
  61. package/cjs/types/fee/cardano.js +1 -0
  62. package/cjs/types/swap/index.js +7 -2
  63. package/cjs/utils/account/analyze.js +2 -1
  64. package/cjs/utils/account/common.js +29 -20
  65. package/cjs/utils/account/derive/info/solo.js +9 -4
  66. package/cjs/utils/account/derive/validate.js +36 -2
  67. package/cjs/utils/account/transform.js +38 -13
  68. package/cjs/utils/fee/transfer.js +40 -7
  69. package/cjs/utils/index.js +2 -2
  70. package/cjs/utils/staticData/index.js +7 -2
  71. package/constants/environment.d.ts +1 -0
  72. package/constants/environment.js +2 -1
  73. package/constants/signing.js +6 -2
  74. package/core/logic-validation/recipientAddress.js +11 -3
  75. package/core/logic-validation/transfer.js +9 -3
  76. package/core/substrate/xcm-parser.d.ts +1 -1
  77. package/core/types.d.ts +1 -0
  78. package/core/types.js +1 -0
  79. package/core/utils.d.ts +1 -0
  80. package/core/utils.js +13 -3
  81. package/defaults.d.ts +1 -1
  82. package/defaults.js +1 -1
  83. package/koni/api/dotsama/crowdloan.js +3 -3
  84. package/koni/api/nft/index.js +10 -16
  85. package/koni/api/nft/story_odyssey_nft/index.d.ts +1 -1
  86. package/koni/api/staking/index.js +4 -5
  87. package/koni/background/handlers/Extension.d.ts +9 -0
  88. package/koni/background/handlers/Extension.js +144 -8
  89. package/koni/background/handlers/State.d.ts +5 -1
  90. package/koni/background/handlers/State.js +16 -1
  91. package/package.json +71 -9
  92. package/packageInfo.js +1 -1
  93. package/services/balance-service/helpers/subscribe/cardano/consts.d.ts +1 -0
  94. package/services/balance-service/helpers/subscribe/cardano/consts.js +4 -0
  95. package/services/balance-service/helpers/subscribe/cardano/index.d.ts +2 -0
  96. package/services/balance-service/helpers/subscribe/cardano/index.js +57 -0
  97. package/services/balance-service/helpers/subscribe/cardano/types.d.ts +34 -0
  98. package/services/balance-service/helpers/subscribe/cardano/types.js +1 -0
  99. package/services/balance-service/helpers/subscribe/cardano/utils.d.ts +15 -0
  100. package/services/balance-service/helpers/subscribe/cardano/utils.js +62 -0
  101. package/services/balance-service/helpers/subscribe/index.d.ts +2 -2
  102. package/services/balance-service/helpers/subscribe/index.js +23 -9
  103. package/services/balance-service/helpers/subscribe/ton/utils.d.ts +1 -1
  104. package/services/balance-service/helpers/subscribe/ton/utils.js +1 -1
  105. package/services/balance-service/index.js +4 -2
  106. package/services/balance-service/transfer/cardano-transfer.d.ts +24 -0
  107. package/services/balance-service/transfer/cardano-transfer.js +114 -0
  108. package/services/balance-service/transfer/token.d.ts +1 -1
  109. package/services/balance-service/transfer/token.js +2 -2
  110. package/services/chain-service/handler/CardanoApi.d.ts +38 -0
  111. package/services/chain-service/handler/CardanoApi.js +167 -0
  112. package/services/chain-service/handler/CardanoChainHandler.d.ts +17 -0
  113. package/services/chain-service/handler/CardanoChainHandler.js +75 -0
  114. package/services/chain-service/handler/TonApi.js +3 -6
  115. package/services/chain-service/handler/types.d.ts +1 -0
  116. package/services/chain-service/index.d.ts +3 -1
  117. package/services/chain-service/index.js +29 -7
  118. package/services/chain-service/types.d.ts +9 -1
  119. package/services/chain-service/utils/index.d.ts +4 -0
  120. package/services/chain-service/utils/index.js +32 -11
  121. package/services/chain-service/utils/patch.js +1 -1
  122. package/services/earning-service/handlers/liquid-staking/bifrost-manta.js +1 -1
  123. package/services/earning-service/handlers/liquid-staking/bifrost.js +1 -1
  124. package/services/earning-service/service.js +8 -14
  125. package/services/fee-service/service.js +19 -8
  126. package/services/history-service/index.js +6 -8
  127. package/services/inapp-notification-service/index.d.ts +3 -4
  128. package/services/inapp-notification-service/index.js +14 -6
  129. package/services/keyring-service/context/account-context.d.ts +6 -2
  130. package/services/keyring-service/context/account-context.js +17 -2
  131. package/services/keyring-service/context/handlers/Derive.d.ts +1 -1
  132. package/services/keyring-service/context/handlers/Derive.js +10 -8
  133. package/services/keyring-service/context/handlers/Migration.d.ts +17 -0
  134. package/services/keyring-service/context/handlers/Migration.js +258 -0
  135. package/services/keyring-service/context/handlers/Mnemonic.js +2 -2
  136. package/services/keyring-service/context/handlers/Secret.js +2 -2
  137. package/services/keyring-service/utils.d.ts +2 -0
  138. package/services/keyring-service/utils.js +11 -0
  139. package/services/request-service/handler/CardanoRequestHandler.d.ts +16 -0
  140. package/services/request-service/handler/CardanoRequestHandler.js +163 -0
  141. package/services/request-service/handler/EvmRequestHandler.js +1 -1
  142. package/services/request-service/index.d.ts +6 -3
  143. package/services/request-service/index.js +19 -5
  144. package/services/setting-service/constants.d.ts +3 -0
  145. package/services/setting-service/constants.js +6 -0
  146. package/services/storage-service/DatabaseService.d.ts +1 -0
  147. package/services/storage-service/DatabaseService.js +3 -0
  148. package/services/storage-service/db-stores/InappNotification.d.ts +1 -0
  149. package/services/storage-service/db-stores/InappNotification.js +6 -0
  150. package/services/swap-service/handler/asset-hub/handler.d.ts +1 -4
  151. package/services/swap-service/handler/asset-hub/handler.js +2 -61
  152. package/services/swap-service/handler/base-handler.d.ts +1 -4
  153. package/services/swap-service/handler/chainflip-handler.d.ts +2 -9
  154. package/services/swap-service/handler/chainflip-handler.js +31 -280
  155. package/services/swap-service/handler/hydradx-handler.d.ts +1 -6
  156. package/services/swap-service/handler/hydradx-handler.js +13 -180
  157. package/services/swap-service/handler/simpleswap-handler.d.ts +1 -4
  158. package/services/swap-service/handler/simpleswap-handler.js +5 -226
  159. package/services/swap-service/handler/uniswap-handler.d.ts +41 -0
  160. package/services/swap-service/handler/uniswap-handler.js +323 -0
  161. package/services/swap-service/index.js +30 -22
  162. package/services/swap-service/utils.d.ts +1 -5
  163. package/services/swap-service/utils.js +7 -21
  164. package/services/transaction-service/helpers/index.d.ts +2 -0
  165. package/services/transaction-service/helpers/index.js +4 -0
  166. package/services/transaction-service/index.d.ts +8 -2
  167. package/services/transaction-service/index.js +263 -10
  168. package/services/transaction-service/types.d.ts +7 -0
  169. package/services/transaction-service/utils.js +7 -2
  170. package/types/account/info/keyring.d.ts +4 -1
  171. package/types/account/info/keyring.js +9 -0
  172. package/types/account/info/proxy.d.ts +2 -0
  173. package/types/balance/index.d.ts +4 -1
  174. package/types/fee/base.d.ts +1 -1
  175. package/types/fee/cardano.d.ts +18 -0
  176. package/types/fee/cardano.js +1 -0
  177. package/types/fee/subscription.d.ts +4 -3
  178. package/types/swap/index.d.ts +11 -3
  179. package/types/swap/index.js +7 -2
  180. package/utils/account/analyze.js +2 -1
  181. package/utils/account/common.d.ts +11 -6
  182. package/utils/account/common.js +28 -19
  183. package/utils/account/derive/info/solo.js +10 -5
  184. package/utils/account/derive/validate.d.ts +1 -0
  185. package/utils/account/derive/validate.js +34 -1
  186. package/utils/account/transform.d.ts +2 -1
  187. package/utils/account/transform.js +37 -13
  188. package/utils/fee/transfer.d.ts +2 -1
  189. package/utils/fee/transfer.js +44 -11
  190. package/utils/index.js +4 -4
  191. package/utils/staticData/index.d.ts +4 -1
  192. package/utils/staticData/index.js +5 -1
  193. package/utils/staticData/oldChainPrefix.json +1 -0
@@ -0,0 +1,57 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { _AssetType } from '@subwallet/chain-list/types';
5
+ import { APIItemState } from '@subwallet/extension-base/background/KoniTypes';
6
+ import { ASTAR_REFRESH_BALANCE_INTERVAL } from '@subwallet/extension-base/constants';
7
+ import { getCardanoAssetId } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/cardano/utils';
8
+ import { filterAssetsByChainAndType, reformatAddress } from '@subwallet/extension-base/utils';
9
+ async function getBalanceMap(addresses, cardanoApi, isTestnet) {
10
+ const addressBalanceMap = {};
11
+ for (const address of addresses) {
12
+ addressBalanceMap[address] = await cardanoApi.getBalanceMap(isTestnet ? reformatAddress(address, 0) : address);
13
+ }
14
+ return addressBalanceMap;
15
+ }
16
+ export function subscribeCardanoBalance(params) {
17
+ const {
18
+ addresses,
19
+ assetMap,
20
+ callback,
21
+ cardanoApi,
22
+ chainInfo
23
+ } = params;
24
+ const chain = chainInfo.slug;
25
+ const isTestnet = chainInfo.isTestnet;
26
+ const tokens = filterAssetsByChainAndType(assetMap, chain, [_AssetType.NATIVE, _AssetType.CIP26]);
27
+ function getBalance() {
28
+ getBalanceMap(addresses, cardanoApi, isTestnet).then(addressBalanceMap => {
29
+ Object.values(tokens).forEach(tokenInfo => {
30
+ const id = getCardanoAssetId(tokenInfo);
31
+ const balances = addresses.map(address => {
32
+ var _addressBalanceMap$ad;
33
+ if (!addressBalanceMap[address]) {
34
+ return '0';
35
+ }
36
+ return ((_addressBalanceMap$ad = addressBalanceMap[address].find(asset => asset.unit === id)) === null || _addressBalanceMap$ad === void 0 ? void 0 : _addressBalanceMap$ad.quantity) || '0';
37
+ });
38
+ const items = balances.map((balance, index) => {
39
+ return {
40
+ address: addresses[index],
41
+ tokenSlug: tokenInfo.slug,
42
+ free: balance,
43
+ locked: '0',
44
+ // todo: research cardano lock balance
45
+ state: APIItemState.READY
46
+ };
47
+ });
48
+ callback(items);
49
+ });
50
+ }).catch(e => console.error('Error while fetching cardano balance', e));
51
+ }
52
+ const interval = setInterval(getBalance, ASTAR_REFRESH_BALANCE_INTERVAL);
53
+ getBalance();
54
+ return () => {
55
+ clearInterval(interval);
56
+ };
57
+ }
@@ -0,0 +1,34 @@
1
+ export interface CardanoAddressBalance {
2
+ address: string;
3
+ amount: CardanoBalanceItem[];
4
+ stake_address: string;
5
+ type: string;
6
+ script: boolean;
7
+ }
8
+ export interface CardanoBalanceItem {
9
+ unit: string;
10
+ quantity: string;
11
+ }
12
+ export interface CardanoTxJson {
13
+ body: {
14
+ inputs: CardanoTxInput[];
15
+ outputs: CardanoTxOutput[];
16
+ fee: string;
17
+ ttl: string;
18
+ };
19
+ witness_set: any;
20
+ is_valid: any;
21
+ auxiliary_data: any;
22
+ }
23
+ export interface CardanoTxOutput {
24
+ address: string;
25
+ amount: {
26
+ coin: string;
27
+ multiasset: Record<string, Record<string, string>>;
28
+ };
29
+ }
30
+ interface CardanoTxInput {
31
+ transaction_id: string;
32
+ index: number;
33
+ }
34
+ export {};
@@ -0,0 +1,15 @@
1
+ import { _ChainAsset } from '@subwallet/chain-list/types';
2
+ export declare function getCardanoAssetId(chainAsset: _ChainAsset): string;
3
+ export declare function getCardanoTxFee(payload: string): bigint;
4
+ export declare function getAdaBelongUtxo(payload: string, receiverAddress: string): bigint;
5
+ export declare const cborToBytes: (hex: string) => Uint8Array;
6
+ export declare function retryCardanoTxStatus(fn: () => Promise<boolean>, options: {
7
+ retries: number;
8
+ delay: number;
9
+ }): Promise<boolean>;
10
+ export interface CardanoAssetMetadata {
11
+ cardanoId: string;
12
+ policyId: string;
13
+ nameHex: string;
14
+ }
15
+ export declare function splitCardanoId(id: string): CardanoAssetMetadata;
@@ -0,0 +1,62 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { Transaction } from '@emurgo/cardano-serialization-lib-nodejs';
5
+ export function getCardanoAssetId(chainAsset) {
6
+ var _chainAsset$metadata;
7
+ return (_chainAsset$metadata = chainAsset.metadata) === null || _chainAsset$metadata === void 0 ? void 0 : _chainAsset$metadata.cardanoId;
8
+ }
9
+ export function getCardanoTxFee(payload) {
10
+ return BigInt(Transaction.from_hex(payload).body().fee().to_str());
11
+ }
12
+ export function getAdaBelongUtxo(payload, receiverAddress) {
13
+ const txOutputsRaw = Transaction.from_hex(payload).body().outputs().to_json();
14
+ const txOutputs = JSON.parse(txOutputsRaw);
15
+ const receiverUtxo = txOutputs.find(utxo => utxo.address === receiverAddress); // must has utxo to receiver
16
+
17
+ // @ts-ignore
18
+ return BigInt(receiverUtxo.amount.coin);
19
+ }
20
+ export const cborToBytes = hex => {
21
+ if (hex.length % 2 === 0 && /^[0-9A-F]*$/i.test(hex)) {
22
+ return Buffer.from(hex, 'hex');
23
+ }
24
+ return Buffer.from(hex, 'utf-8');
25
+ };
26
+ export async function retryCardanoTxStatus(fn, options) {
27
+ let lastError;
28
+ for (let i = 0; i < options.retries; i++) {
29
+ try {
30
+ return await fn();
31
+ } catch (e) {
32
+ if (e instanceof Error) {
33
+ lastError = e;
34
+ }
35
+
36
+ // todo: improve the timeout tx
37
+ await new Promise(resolve => setTimeout(resolve, options.delay)); // wait for delay period, then recall the fn()
38
+ }
39
+ }
40
+
41
+ console.error('Cardano transaction timeout', lastError); // throw only last error, in case no successful result from fn()
42
+
43
+ return false;
44
+ }
45
+ export function splitCardanoId(id) {
46
+ if (id === 'lovelace') {
47
+ return {
48
+ cardanoId: id,
49
+ policyId: '',
50
+ nameHex: ''
51
+ };
52
+ }
53
+ if (!id || id.length < 56) {
54
+ throw new Error('The cardano native asset policy id must has 28 bytes in length.');
55
+ } else {
56
+ return {
57
+ cardanoId: id,
58
+ policyId: id.slice(0, 56),
59
+ nameHex: id.slice(56)
60
+ };
61
+ }
62
+ }
@@ -1,6 +1,6 @@
1
1
  import { _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types';
2
2
  import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
3
- import { _EvmApi, _SubstrateApi, _TonApi } from '@subwallet/extension-base/services/chain-service/types';
3
+ import { _CardanoApi, _EvmApi, _SubstrateApi, _TonApi } from '@subwallet/extension-base/services/chain-service/types';
4
4
  import { AccountJson, BalanceItem } from '@subwallet/extension-base/types';
5
5
  /**
6
6
  * @function getAccountJsonByAddress
@@ -12,4 +12,4 @@ import { AccountJson, BalanceItem } from '@subwallet/extension-base/types';
12
12
  * @returns {AccountJson|null} - Account info or null if not found
13
13
  */
14
14
  export declare const getAccountJsonByAddress: (address: string) => AccountJson | null;
15
- export declare function subscribeBalance(addresses: string[], chains: string[], tokens: string[], _chainAssetMap: Record<string, _ChainAsset>, _chainInfoMap: Record<string, _ChainInfo>, substrateApiMap: Record<string, _SubstrateApi>, evmApiMap: Record<string, _EvmApi>, tonApiMap: Record<string, _TonApi>, callback: (rs: BalanceItem[]) => void, extrinsicType?: ExtrinsicType): () => void;
15
+ export declare function subscribeBalance(addresses: string[], chains: string[], tokens: string[], _chainAssetMap: Record<string, _ChainAsset>, _chainInfoMap: Record<string, _ChainInfo>, substrateApiMap: Record<string, _SubstrateApi>, evmApiMap: Record<string, _EvmApi>, tonApiMap: Record<string, _TonApi>, cardanoApiMap: Record<string, _CardanoApi>, callback: (rs: BalanceItem[]) => void, extrinsicType?: ExtrinsicType): () => void;
@@ -3,8 +3,9 @@
3
3
 
4
4
  import { _AssetType } from '@subwallet/chain-list/types';
5
5
  import { APIItemState } from '@subwallet/extension-base/background/KoniTypes';
6
- import { _getSubstrateGenesisHash, _isChainBitcoinCompatible, _isChainEvmCompatible, _isChainTonCompatible, _isPureEvmChain, _isPureTonChain } from '@subwallet/extension-base/services/chain-service/utils';
7
- import { categoryAddresses, filterAssetsByChainAndType, pairToAccount } from '@subwallet/extension-base/utils';
6
+ import { subscribeCardanoBalance } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/cardano';
7
+ import { _getSubstrateGenesisHash, _isChainBitcoinCompatible, _isChainCardanoCompatible, _isChainEvmCompatible, _isChainTonCompatible, _isPureCardanoChain, _isPureEvmChain, _isPureTonChain } from '@subwallet/extension-base/services/chain-service/utils';
8
+ import { filterAssetsByChainAndType, getAddressesByChainTypeMap, pairToAccount } from '@subwallet/extension-base/utils';
8
9
  import keyring from '@subwallet/ui-keyring';
9
10
  import { subscribeTonBalance } from "./ton/ton.js";
10
11
  import { subscribeEVMBalance } from "./evm.js";
@@ -37,16 +38,19 @@ export const getAccountJsonByAddress = address => {
37
38
  const filterAddress = (addresses, chainInfo) => {
38
39
  const {
39
40
  bitcoin,
41
+ cardano,
40
42
  evm,
41
43
  substrate,
42
44
  ton
43
- } = categoryAddresses(addresses);
45
+ } = getAddressesByChainTypeMap(addresses);
44
46
  if (_isChainEvmCompatible(chainInfo)) {
45
- return [evm, [...bitcoin, ...substrate, ...ton]];
47
+ return [evm, [...bitcoin, ...substrate, ...ton, ...cardano]];
46
48
  } else if (_isChainBitcoinCompatible(chainInfo)) {
47
- return [bitcoin, [...evm, ...substrate, ...ton]];
49
+ return [bitcoin, [...evm, ...substrate, ...ton, ...cardano]];
48
50
  } else if (_isChainTonCompatible(chainInfo)) {
49
- return [ton, [...bitcoin, ...evm, ...substrate]];
51
+ return [ton, [...bitcoin, ...evm, ...substrate, ...cardano]];
52
+ } else if (_isChainCardanoCompatible(chainInfo)) {
53
+ return [cardano, [...bitcoin, ...evm, ...substrate, ...ton]];
50
54
  } else {
51
55
  const fetchList = [];
52
56
  const unfetchList = [];
@@ -72,11 +76,11 @@ const filterAddress = (addresses, chainInfo) => {
72
76
  fetchList.push(address);
73
77
  }
74
78
  });
75
- return [fetchList, [...unfetchList, ...bitcoin, ...evm, ...ton]];
79
+ return [fetchList, [...unfetchList, ...bitcoin, ...evm, ...ton, ...cardano]];
76
80
  }
77
81
  };
78
82
  const handleUnsupportedOrPendingAddresses = (addresses, chainSlug, chainAssetMap, state, callback) => {
79
- const tokens = filterAssetsByChainAndType(chainAssetMap, chainSlug, [_AssetType.NATIVE, _AssetType.ERC20, _AssetType.PSP22, _AssetType.LOCAL, _AssetType.GRC20, _AssetType.VFT]);
83
+ const tokens = filterAssetsByChainAndType(chainAssetMap, chainSlug, [_AssetType.NATIVE, _AssetType.ERC20, _AssetType.PSP22, _AssetType.LOCAL, _AssetType.GRC20, _AssetType.VFT, _AssetType.TEP74, _AssetType.CIP26]);
80
84
  const now = new Date().getTime();
81
85
  Object.values(tokens).forEach(token => {
82
86
  const items = addresses.map(address => ({
@@ -92,7 +96,7 @@ const handleUnsupportedOrPendingAddresses = (addresses, chainSlug, chainAssetMap
92
96
  };
93
97
 
94
98
  // main subscription, use for multiple chains, multiple addresses and multiple tokens
95
- export function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, callback, extrinsicType) {
99
+ export function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, callback, extrinsicType) {
96
100
  // Filter chain and token
97
101
  const chainAssetMap = Object.fromEntries(Object.entries(_chainAssetMap).filter(([token]) => tokens.includes(token)));
98
102
  const chainInfoMap = Object.fromEntries(Object.entries(_chainInfoMap).filter(([chain]) => chains.includes(chain)));
@@ -124,6 +128,16 @@ export function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _cha
124
128
  tonApi
125
129
  });
126
130
  }
131
+ const cardanoApi = cardanoApiMap[chainSlug];
132
+ if (_isPureCardanoChain(chainInfo)) {
133
+ return subscribeCardanoBalance({
134
+ addresses: useAddresses,
135
+ assetMap: chainAssetMap,
136
+ callback,
137
+ chainInfo,
138
+ cardanoApi
139
+ });
140
+ }
127
141
 
128
142
  // If the chain is not ready, return pending state
129
143
  if (!substrateApiMap[chainSlug].isApiReady) {
@@ -10,7 +10,7 @@ import { Buffer } from 'buffer';
10
10
  export declare function getJettonMasterContract(tonApi: _TonApi, contractAddress: string): OpenedContract<JettonMaster>;
11
11
  export declare function getJettonWalletContract(jettonMasterContract: OpenedContract<JettonMaster>, tonApi: _TonApi, ownerAddress: string): Promise<OpenedContract<JettonWallet>>;
12
12
  export declare function externalMessage(contract: TonWalletContract, seqno: number, body: Cell): Cell;
13
- export declare function retry<T>(fn: () => Promise<T>, options: {
13
+ export declare function retryTonTxStatus<T>(fn: () => Promise<T>, options: {
14
14
  retries: number;
15
15
  delay: number;
16
16
  }): Promise<T>;
@@ -23,7 +23,7 @@ export function externalMessage(contract, seqno, body) {
23
23
  body: body
24
24
  }))).endCell();
25
25
  }
26
- export async function retry(fn, options) {
26
+ export async function retryTonTxStatus(fn, options) {
27
27
  let lastError;
28
28
  for (let i = 0; i < options.retries; i++) {
29
29
  try {
@@ -191,8 +191,9 @@ export class BalanceService {
191
191
  const evmApiMap = this.state.chainService.getEvmApiMap();
192
192
  const substrateApiMap = this.state.chainService.getSubstrateApiMap();
193
193
  const tonApiMap = this.state.chainService.getTonApiMap();
194
+ const cardanoApiMap = this.state.chainService.getCardanoApiMap();
194
195
  let unsub = noop;
195
- unsub = subscribeBalance([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, result => {
196
+ unsub = subscribeBalance([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, result => {
196
197
  const rs = result[0];
197
198
  let value;
198
199
  switch (balanceType) {
@@ -362,13 +363,14 @@ export class BalanceService {
362
363
  const evmApiMap = this.state.chainService.getEvmApiMap();
363
364
  const substrateApiMap = this.state.chainService.getSubstrateApiMap();
364
365
  const tonApiMap = this.state.chainService.getTonApiMap();
366
+ const cardanoApiMap = this.state.chainService.getCardanoApiMap();
365
367
  const activeChainSlugs = Object.keys(this.state.getActiveChainInfoMap());
366
368
  const assetState = this.state.chainService.subscribeAssetSettings().value;
367
369
  const assets = Object.values(assetMap).filter(asset => {
368
370
  var _assetState$asset$slu;
369
371
  return activeChainSlugs.includes(asset.originChain) && ((_assetState$asset$slu = assetState[asset.slug]) === null || _assetState$asset$slu === void 0 ? void 0 : _assetState$asset$slu.visible);
370
372
  }).map(asset => asset.slug);
371
- const unsub = subscribeBalance(addresses, activeChainSlugs, assets, assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, result => {
373
+ const unsub = subscribeBalance(addresses, activeChainSlugs, assets, assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, result => {
372
374
  !cancel && this.setBalanceItem(result);
373
375
  }, ExtrinsicType.TRANSFER_BALANCE);
374
376
  const unsub2 = this.state.subscribeMantaPayBalance();
@@ -0,0 +1,24 @@
1
+ import { _ChainAsset } from '@subwallet/chain-list/types';
2
+ import { _CardanoApi } from '@subwallet/extension-base/services/chain-service/types';
3
+ export interface CardanoTransactionConfigProps {
4
+ tokenInfo: _ChainAsset;
5
+ nativeTokenInfo: _ChainAsset;
6
+ from: string;
7
+ to: string;
8
+ networkKey: string;
9
+ value: string;
10
+ transferAll: boolean;
11
+ cardanoTtlOffset: number;
12
+ cardanoApi: _CardanoApi;
13
+ }
14
+ export interface CardanoTransactionConfig {
15
+ from: string;
16
+ to: string;
17
+ networkKey: string;
18
+ value: string;
19
+ transferAll: boolean;
20
+ cardanoTtlOffset: number;
21
+ estimateCardanoFee: string;
22
+ cardanoPayload: string;
23
+ }
24
+ export declare function createCardanoTransaction(params: CardanoTransactionConfigProps): Promise<[CardanoTransactionConfig | null, string]>;
@@ -0,0 +1,114 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import * as csl from '@emurgo/cardano-serialization-lib-nodejs';
5
+ import { _AssetType } from '@subwallet/chain-list/types';
6
+ import { getAdaBelongUtxo, getCardanoTxFee, splitCardanoId } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/cardano/utils';
7
+ import { subwalletApiSdk } from '@subwallet/subwallet-api-sdk';
8
+ export async function createCardanoTransaction(params) {
9
+ var _tokenInfo$metadata;
10
+ const {
11
+ cardanoTtlOffset,
12
+ from,
13
+ networkKey,
14
+ to,
15
+ tokenInfo,
16
+ transferAll,
17
+ value
18
+ } = params;
19
+ const cardanoId = (_tokenInfo$metadata = tokenInfo.metadata) === null || _tokenInfo$metadata === void 0 ? void 0 : _tokenInfo$metadata.cardanoId;
20
+ const isNativeTransfer = tokenInfo.assetType === _AssetType.NATIVE;
21
+ const isSelfTransfer = from === to;
22
+ if (!cardanoId) {
23
+ throw new Error('Missing token policy id metadata');
24
+ }
25
+ const payload = await subwalletApiSdk.fetchUnsignedPayload({
26
+ tokenDecimals: params.tokenInfo.decimals || 0,
27
+ nativeTokenSymbol: params.nativeTokenInfo.symbol,
28
+ cardanoId,
29
+ from: params.from,
30
+ to: params.to,
31
+ value: params.value,
32
+ cardanoTtlOffset: params.cardanoTtlOffset
33
+ });
34
+ console.log('Build cardano payload successfully!', payload);
35
+ validatePayload(payload, params);
36
+ const fee = getCardanoTxFee(payload);
37
+ const adaBelongToCnaUtxo = isNativeTransfer || isSelfTransfer ? BigInt(0) : getAdaBelongUtxo(payload, to);
38
+ const tx = {
39
+ from,
40
+ to,
41
+ networkKey,
42
+ value,
43
+ transferAll,
44
+ cardanoTtlOffset,
45
+ estimateCardanoFee: (fee + adaBelongToCnaUtxo).toString(),
46
+ cardanoPayload: payload
47
+ };
48
+ return [tx, value];
49
+ }
50
+ function validatePayload(payload, params) {
51
+ var _params$tokenInfo$met;
52
+ const txInfo = JSON.parse(csl.Transaction.from_hex(payload).to_json());
53
+ const outputs = txInfo.body.outputs;
54
+ const cardanoId = (_params$tokenInfo$met = params.tokenInfo.metadata) === null || _params$tokenInfo$met === void 0 ? void 0 : _params$tokenInfo$met.cardanoId;
55
+ const assetType = params.tokenInfo.assetType;
56
+ const isSendSameAddress = params.from === params.to;
57
+ if (!cardanoId) {
58
+ throw new Error('Missing cardano id metadata');
59
+ }
60
+ const cardanoAssetMetadata = splitCardanoId(cardanoId);
61
+ if (isSendSameAddress) {
62
+ validateAllOutputsBelongToAddress(params.from, outputs);
63
+ validateExistOutputWithAmountSend(params.value, outputs, assetType, cardanoAssetMetadata);
64
+ } else {
65
+ const [outputsBelongToReceiver, outputsNotBelongToReceiver] = [outputs.filter(output => output.address === params.to), outputs.filter(output => output.address !== params.to)];
66
+ validateReceiverOutputsWithAmountSend(params.value, outputsBelongToReceiver, assetType, cardanoAssetMetadata);
67
+ validateAllOutputsBelongToAddress(params.from, outputsNotBelongToReceiver);
68
+ }
69
+ }
70
+ function validateAllOutputsBelongToAddress(address, outputs) {
71
+ const found = outputs.find(output => output.address !== address);
72
+ if (found) {
73
+ throw new Error('Transaction has invalid address information');
74
+ }
75
+ }
76
+ function validateExistOutputWithAmountSend(amount, outputs, assetType, cardanoAssetMetadata) {
77
+ if (assetType === _AssetType.NATIVE) {
78
+ const found = outputs.find(output => output.amount.coin === amount);
79
+ if (found) {
80
+ return;
81
+ }
82
+ throw new Error('Transaction has invalid transfer amount information');
83
+ }
84
+ if (assetType === _AssetType.CIP26) {
85
+ const found = outputs.find(output => {
86
+ var _output$amount$multia;
87
+ return amount === ((_output$amount$multia = output.amount.multiasset[cardanoAssetMetadata.policyId]) === null || _output$amount$multia === void 0 ? void 0 : _output$amount$multia[cardanoAssetMetadata.nameHex]);
88
+ });
89
+ if (found) {
90
+ return;
91
+ }
92
+ throw new Error('Transaction has invalid transfer amount information');
93
+ }
94
+ throw new Error('Invalid asset type!');
95
+ }
96
+ function validateReceiverOutputsWithAmountSend(amount, outputs, assetType, cardanoAssetMetadata) {
97
+ if (outputs.length !== 1) {
98
+ throw new Error('Transaction has invalid transfer amount information');
99
+ }
100
+ const receiverOutput = outputs[0];
101
+ if (assetType === _AssetType.NATIVE) {
102
+ if (receiverOutput.amount.coin === amount) {
103
+ return;
104
+ }
105
+ throw new Error('Transaction has invalid transfer amount information');
106
+ }
107
+ if (assetType === _AssetType.CIP26) {
108
+ if (receiverOutput.amount.multiasset[cardanoAssetMetadata.policyId][cardanoAssetMetadata.nameHex] === amount) {
109
+ return;
110
+ }
111
+ throw new Error('Transaction has invalid transfer amount information');
112
+ }
113
+ throw new Error('Invalid asset type!');
114
+ }
@@ -11,6 +11,6 @@ interface CreateTransferExtrinsicProps {
11
11
  transferAll: boolean;
12
12
  tokenInfo: _ChainAsset;
13
13
  }
14
- export declare const createTransferExtrinsic: ({ from, networkKey, substrateApi, to, tokenInfo, transferAll, value }: CreateTransferExtrinsicProps) => Promise<[SubmittableExtrinsic | null, string]>;
14
+ export declare const createSubstrateExtrinsic: ({ from, networkKey, substrateApi, to, tokenInfo, transferAll, value }: CreateTransferExtrinsicProps) => Promise<[SubmittableExtrinsic | null, string]>;
15
15
  export declare const getTransferMockTxFee: (address: string, chainInfo: _ChainInfo, tokenInfo: _ChainAsset, api: _SubstrateApi | _EvmApi | _TonApi) => Promise<BigN>;
16
16
  export {};
@@ -16,7 +16,7 @@ import { Address } from '@ton/ton';
16
16
  import BigN from 'bignumber.js';
17
17
  import { BN, u8aToHex } from '@polkadot/util';
18
18
  import { decodeAddress } from '@polkadot/util-crypto';
19
- export const createTransferExtrinsic = async ({
19
+ export const createSubstrateExtrinsic = async ({
20
20
  from,
21
21
  networkKey,
22
22
  substrateApi,
@@ -148,7 +148,7 @@ export const getTransferMockTxFee = async (address, chainInfo, tokenInfo, api) =
148
148
  var _paymentInfo$partialF;
149
149
  const substrateApi = api;
150
150
  const chainApi = await substrateApi.isReady;
151
- const [mockTx] = await createTransferExtrinsic({
151
+ const [mockTx] = await createSubstrateExtrinsic({
152
152
  from: address,
153
153
  networkKey: chainInfo.slug,
154
154
  substrateApi: chainApi,
@@ -0,0 +1,38 @@
1
+ import { CardanoBalanceItem } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/cardano/types';
2
+ import { _ApiOptions } from '@subwallet/extension-base/services/chain-service/handler/types';
3
+ import { _CardanoApi, _ChainConnectionStatus } from '@subwallet/extension-base/services/chain-service/types';
4
+ import { PromiseHandler } from '@subwallet/extension-base/utils';
5
+ import { BehaviorSubject } from 'rxjs';
6
+ export declare const API_KEY: {
7
+ mainnet: string;
8
+ testnet: string;
9
+ };
10
+ export declare class CardanoApi implements _CardanoApi {
11
+ chainSlug: string;
12
+ apiUrl: string;
13
+ apiError?: string;
14
+ apiRetry: number;
15
+ readonly isApiConnectedSubject: BehaviorSubject<boolean>;
16
+ readonly connectionStatusSubject: BehaviorSubject<_ChainConnectionStatus>;
17
+ isApiReady: boolean;
18
+ isApiReadyOnce: boolean;
19
+ isReadyHandler: PromiseHandler<_CardanoApi>;
20
+ isTestnet: boolean;
21
+ private projectId;
22
+ providerName: string;
23
+ constructor(chainSlug: string, apiUrl: string, { isTestnet, providerName }: _ApiOptions);
24
+ get isApiConnected(): boolean;
25
+ get connectionStatus(): _ChainConnectionStatus;
26
+ private updateConnectionStatus;
27
+ get isReady(): Promise<_CardanoApi>;
28
+ updateApiUrl(apiUrl: string): Promise<void>;
29
+ recoverConnect(): Promise<void>;
30
+ connect(): void;
31
+ disconnect(): Promise<void>;
32
+ destroy(): Promise<void>;
33
+ onConnect(): void;
34
+ onDisconnect(): void;
35
+ getBalanceMap(address: string): Promise<CardanoBalanceItem[]>;
36
+ sendCardanoTxReturnHash(tx: string): Promise<string>;
37
+ getStatusByTxHash(txHash: string, ttl: number): Promise<boolean>;
38
+ }