@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.
- package/background/KoniTypes.d.ts +75 -2
- package/background/KoniTypes.js +2 -0
- package/cjs/background/KoniTypes.js +2 -0
- package/cjs/constants/environment.js +4 -2
- package/cjs/constants/signing.js +6 -2
- package/cjs/core/logic-validation/recipientAddress.js +9 -1
- package/cjs/core/logic-validation/transfer.js +35 -29
- package/cjs/core/types.js +1 -0
- package/cjs/core/utils.js +12 -1
- package/cjs/defaults.js +1 -1
- package/cjs/koni/api/dotsama/crowdloan.js +1 -1
- package/cjs/koni/api/nft/index.js +9 -16
- package/cjs/koni/api/staking/index.js +3 -4
- package/cjs/koni/background/handlers/Extension.js +234 -96
- package/cjs/koni/background/handlers/State.js +15 -0
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/cardano/consts.js +11 -0
- package/cjs/services/balance-service/helpers/subscribe/cardano/index.js +63 -0
- package/cjs/services/balance-service/helpers/subscribe/cardano/types.js +1 -0
- package/cjs/services/balance-service/helpers/subscribe/cardano/utils.js +74 -0
- package/cjs/services/balance-service/helpers/subscribe/index.js +21 -7
- package/cjs/services/balance-service/helpers/subscribe/ton/utils.js +2 -2
- package/cjs/services/balance-service/index.js +4 -2
- package/cjs/services/balance-service/transfer/cardano-transfer.js +122 -0
- package/cjs/services/balance-service/transfer/token.js +4 -4
- package/cjs/services/chain-service/handler/CardanoApi.js +176 -0
- package/cjs/services/chain-service/handler/CardanoChainHandler.js +83 -0
- package/cjs/services/chain-service/handler/TonApi.js +2 -5
- package/cjs/services/chain-service/index.js +29 -7
- package/cjs/services/chain-service/utils/index.js +40 -11
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/earning-service/handlers/liquid-staking/bifrost-manta.js +1 -1
- package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +1 -1
- package/cjs/services/earning-service/service.js +6 -12
- package/cjs/services/fee-service/service.js +19 -8
- package/cjs/services/history-service/index.js +4 -6
- package/cjs/services/inapp-notification-service/index.js +12 -4
- package/cjs/services/keyring-service/context/account-context.js +17 -2
- package/cjs/services/keyring-service/context/handlers/Derive.js +10 -7
- package/cjs/services/keyring-service/context/handlers/Migration.js +268 -0
- package/cjs/services/keyring-service/context/handlers/Mnemonic.js +2 -2
- package/cjs/services/keyring-service/context/handlers/Secret.js +1 -1
- package/cjs/services/keyring-service/utils.js +18 -0
- package/cjs/services/request-service/handler/CardanoRequestHandler.js +172 -0
- package/cjs/services/request-service/handler/EvmRequestHandler.js +1 -1
- package/cjs/services/request-service/index.js +20 -2
- package/cjs/services/setting-service/constants.js +10 -1
- package/cjs/services/storage-service/DatabaseService.js +3 -0
- package/cjs/services/storage-service/db-stores/InappNotification.js +6 -0
- package/cjs/services/swap-service/handler/asset-hub/handler.js +0 -59
- package/cjs/services/swap-service/handler/chainflip-handler.js +33 -281
- package/cjs/services/swap-service/handler/hydradx-handler.js +23 -190
- package/cjs/services/swap-service/handler/simpleswap-handler.js +1 -222
- package/cjs/services/swap-service/handler/uniswap-handler.js +331 -0
- package/cjs/services/swap-service/index.js +31 -22
- package/cjs/services/swap-service/utils.js +21 -38
- package/cjs/services/transaction-service/helpers/index.js +6 -1
- package/cjs/services/transaction-service/index.js +278 -21
- package/cjs/services/transaction-service/utils.js +5 -1
- package/cjs/types/account/info/keyring.js +12 -1
- package/cjs/types/fee/cardano.js +1 -0
- package/cjs/types/swap/index.js +7 -2
- package/cjs/utils/account/analyze.js +2 -1
- package/cjs/utils/account/common.js +29 -20
- package/cjs/utils/account/derive/info/solo.js +9 -4
- package/cjs/utils/account/derive/validate.js +36 -2
- package/cjs/utils/account/transform.js +38 -13
- package/cjs/utils/fee/transfer.js +40 -7
- package/cjs/utils/index.js +2 -2
- package/cjs/utils/staticData/index.js +7 -2
- package/constants/environment.d.ts +1 -0
- package/constants/environment.js +2 -1
- package/constants/signing.js +6 -2
- package/core/logic-validation/recipientAddress.js +11 -3
- package/core/logic-validation/transfer.js +9 -3
- package/core/substrate/xcm-parser.d.ts +1 -1
- package/core/types.d.ts +1 -0
- package/core/types.js +1 -0
- package/core/utils.d.ts +1 -0
- package/core/utils.js +13 -3
- package/defaults.d.ts +1 -1
- package/defaults.js +1 -1
- package/koni/api/dotsama/crowdloan.js +3 -3
- package/koni/api/nft/index.js +10 -16
- package/koni/api/nft/story_odyssey_nft/index.d.ts +1 -1
- package/koni/api/staking/index.js +4 -5
- package/koni/background/handlers/Extension.d.ts +9 -0
- package/koni/background/handlers/Extension.js +144 -8
- package/koni/background/handlers/State.d.ts +5 -1
- package/koni/background/handlers/State.js +16 -1
- package/package.json +71 -9
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/subscribe/cardano/consts.d.ts +1 -0
- package/services/balance-service/helpers/subscribe/cardano/consts.js +4 -0
- package/services/balance-service/helpers/subscribe/cardano/index.d.ts +2 -0
- package/services/balance-service/helpers/subscribe/cardano/index.js +57 -0
- package/services/balance-service/helpers/subscribe/cardano/types.d.ts +34 -0
- package/services/balance-service/helpers/subscribe/cardano/types.js +1 -0
- package/services/balance-service/helpers/subscribe/cardano/utils.d.ts +15 -0
- package/services/balance-service/helpers/subscribe/cardano/utils.js +62 -0
- package/services/balance-service/helpers/subscribe/index.d.ts +2 -2
- package/services/balance-service/helpers/subscribe/index.js +23 -9
- package/services/balance-service/helpers/subscribe/ton/utils.d.ts +1 -1
- package/services/balance-service/helpers/subscribe/ton/utils.js +1 -1
- package/services/balance-service/index.js +4 -2
- package/services/balance-service/transfer/cardano-transfer.d.ts +24 -0
- package/services/balance-service/transfer/cardano-transfer.js +114 -0
- package/services/balance-service/transfer/token.d.ts +1 -1
- package/services/balance-service/transfer/token.js +2 -2
- package/services/chain-service/handler/CardanoApi.d.ts +38 -0
- package/services/chain-service/handler/CardanoApi.js +167 -0
- package/services/chain-service/handler/CardanoChainHandler.d.ts +17 -0
- package/services/chain-service/handler/CardanoChainHandler.js +75 -0
- package/services/chain-service/handler/TonApi.js +3 -6
- package/services/chain-service/handler/types.d.ts +1 -0
- package/services/chain-service/index.d.ts +3 -1
- package/services/chain-service/index.js +29 -7
- package/services/chain-service/types.d.ts +9 -1
- package/services/chain-service/utils/index.d.ts +4 -0
- package/services/chain-service/utils/index.js +32 -11
- package/services/chain-service/utils/patch.js +1 -1
- package/services/earning-service/handlers/liquid-staking/bifrost-manta.js +1 -1
- package/services/earning-service/handlers/liquid-staking/bifrost.js +1 -1
- package/services/earning-service/service.js +8 -14
- package/services/fee-service/service.js +19 -8
- package/services/history-service/index.js +6 -8
- package/services/inapp-notification-service/index.d.ts +3 -4
- package/services/inapp-notification-service/index.js +14 -6
- package/services/keyring-service/context/account-context.d.ts +6 -2
- package/services/keyring-service/context/account-context.js +17 -2
- package/services/keyring-service/context/handlers/Derive.d.ts +1 -1
- package/services/keyring-service/context/handlers/Derive.js +10 -8
- package/services/keyring-service/context/handlers/Migration.d.ts +17 -0
- package/services/keyring-service/context/handlers/Migration.js +258 -0
- package/services/keyring-service/context/handlers/Mnemonic.js +2 -2
- package/services/keyring-service/context/handlers/Secret.js +2 -2
- package/services/keyring-service/utils.d.ts +2 -0
- package/services/keyring-service/utils.js +11 -0
- package/services/request-service/handler/CardanoRequestHandler.d.ts +16 -0
- package/services/request-service/handler/CardanoRequestHandler.js +163 -0
- package/services/request-service/handler/EvmRequestHandler.js +1 -1
- package/services/request-service/index.d.ts +6 -3
- package/services/request-service/index.js +19 -5
- package/services/setting-service/constants.d.ts +3 -0
- package/services/setting-service/constants.js +6 -0
- package/services/storage-service/DatabaseService.d.ts +1 -0
- package/services/storage-service/DatabaseService.js +3 -0
- package/services/storage-service/db-stores/InappNotification.d.ts +1 -0
- package/services/storage-service/db-stores/InappNotification.js +6 -0
- package/services/swap-service/handler/asset-hub/handler.d.ts +1 -4
- package/services/swap-service/handler/asset-hub/handler.js +2 -61
- package/services/swap-service/handler/base-handler.d.ts +1 -4
- package/services/swap-service/handler/chainflip-handler.d.ts +2 -9
- package/services/swap-service/handler/chainflip-handler.js +31 -280
- package/services/swap-service/handler/hydradx-handler.d.ts +1 -6
- package/services/swap-service/handler/hydradx-handler.js +13 -180
- package/services/swap-service/handler/simpleswap-handler.d.ts +1 -4
- package/services/swap-service/handler/simpleswap-handler.js +5 -226
- package/services/swap-service/handler/uniswap-handler.d.ts +41 -0
- package/services/swap-service/handler/uniswap-handler.js +323 -0
- package/services/swap-service/index.js +30 -22
- package/services/swap-service/utils.d.ts +1 -5
- package/services/swap-service/utils.js +7 -21
- package/services/transaction-service/helpers/index.d.ts +2 -0
- package/services/transaction-service/helpers/index.js +4 -0
- package/services/transaction-service/index.d.ts +8 -2
- package/services/transaction-service/index.js +263 -10
- package/services/transaction-service/types.d.ts +7 -0
- package/services/transaction-service/utils.js +7 -2
- package/types/account/info/keyring.d.ts +4 -1
- package/types/account/info/keyring.js +9 -0
- package/types/account/info/proxy.d.ts +2 -0
- package/types/balance/index.d.ts +4 -1
- package/types/fee/base.d.ts +1 -1
- package/types/fee/cardano.d.ts +18 -0
- package/types/fee/cardano.js +1 -0
- package/types/fee/subscription.d.ts +4 -3
- package/types/swap/index.d.ts +11 -3
- package/types/swap/index.js +7 -2
- package/utils/account/analyze.js +2 -1
- package/utils/account/common.d.ts +11 -6
- package/utils/account/common.js +28 -19
- package/utils/account/derive/info/solo.js +10 -5
- package/utils/account/derive/validate.d.ts +1 -0
- package/utils/account/derive/validate.js +34 -1
- package/utils/account/transform.d.ts +2 -1
- package/utils/account/transform.js +37 -13
- package/utils/fee/transfer.d.ts +2 -1
- package/utils/fee/transfer.js +44 -11
- package/utils/index.js +4 -4
- package/utils/staticData/index.d.ts +4 -1
- package/utils/staticData/index.js +5 -1
- 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 @@
|
|
|
1
|
+
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 {
|
|
7
|
-
import {
|
|
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
|
-
} =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
+
}
|