@subwallet/extension-base 1.2.15-0 → 1.2.17-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 +6 -1
- package/cjs/constants/staking.js +2 -1
- package/cjs/koni/api/staking/bonding/utils.js +15 -0
- package/cjs/koni/background/handlers/Extension.js +33 -7
- package/cjs/koni/background/handlers/State.js +11 -1
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/index.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/substrate/gear.js +135 -0
- package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +9 -62
- package/cjs/services/balance-service/transfer/token.js +4 -3
- package/cjs/services/chain-service/handler/SubstrateApi.js +3 -1
- package/cjs/services/chain-service/handler/SubstrateChainHandler.js +21 -26
- package/cjs/services/chain-service/index.js +48 -3
- package/cjs/services/chain-service/types.js +1 -1
- package/cjs/services/chain-service/utils/index.js +18 -12
- package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +38 -4
- package/cjs/services/earning-service/service.js +3 -0
- package/cjs/services/migration-service/scripts/databases/ClearMetadataDatabase.js +16 -0
- package/cjs/services/migration-service/scripts/index.js +7 -7
- package/cjs/services/transaction-service/index.js +12 -7
- package/cjs/utils/gear/combine.js +28 -0
- package/cjs/utils/gear/grc20.js +56 -49
- package/cjs/utils/gear/index.js +22 -0
- package/cjs/utils/gear/vft.js +173 -0
- package/cjs/utils/metadata.js +45 -34
- package/constants/staking.js +2 -1
- package/koni/api/staking/bonding/utils.d.ts +1 -0
- package/koni/api/staking/bonding/utils.js +14 -0
- package/koni/background/handlers/Extension.d.ts +2 -0
- package/koni/background/handlers/Extension.js +25 -1
- package/koni/background/handlers/State.d.ts +2 -0
- package/koni/background/handlers/State.js +11 -1
- package/package.json +24 -8
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/subscribe/index.js +1 -1
- package/services/balance-service/helpers/subscribe/substrate/gear.d.ts +4 -0
- package/services/balance-service/helpers/subscribe/substrate/gear.js +123 -0
- package/services/balance-service/helpers/subscribe/substrate/index.js +10 -61
- package/services/balance-service/transfer/token.js +5 -4
- package/services/chain-service/handler/SubstrateApi.d.ts +1 -1
- package/services/chain-service/handler/SubstrateApi.js +3 -1
- package/services/chain-service/handler/SubstrateChainHandler.d.ts +1 -0
- package/services/chain-service/handler/SubstrateChainHandler.js +22 -27
- package/services/chain-service/index.d.ts +4 -0
- package/services/chain-service/index.js +49 -4
- package/services/chain-service/types.d.ts +1 -0
- package/services/chain-service/types.js +1 -1
- package/services/chain-service/utils/index.d.ts +1 -0
- package/services/chain-service/utils/index.js +16 -12
- package/services/earning-service/handlers/native-staking/relay-chain.js +39 -5
- package/services/earning-service/service.js +3 -0
- package/services/migration-service/scripts/databases/ClearMetadataDatabase.js +16 -0
- package/services/migration-service/scripts/index.js +7 -7
- package/services/transaction-service/index.js +13 -8
- package/types/metadata.d.ts +9 -2
- package/utils/gear/combine.d.ts +10 -0
- package/utils/gear/combine.js +18 -0
- package/utils/gear/grc20.d.ts +18 -20
- package/utils/gear/grc20.js +53 -45
- package/utils/gear/index.d.ts +2 -0
- package/utils/gear/index.js +3 -1
- package/utils/gear/vft.d.ts +36 -0
- package/utils/gear/vft.js +162 -0
- package/utils/metadata.d.ts +7 -2
- package/utils/metadata.js +41 -31
|
@@ -8,7 +8,7 @@ import { _ChainState, _EvmApi, _NetworkUpsertParams, _SubstrateApi, _ValidateCus
|
|
|
8
8
|
import { CrowdloanContributionsResponse } from '@subwallet/extension-base/services/subscan-service/types';
|
|
9
9
|
import { SWTransactionResponse, SWTransactionResult } from '@subwallet/extension-base/services/transaction-service/types';
|
|
10
10
|
import { WalletConnectNotSupportRequest, WalletConnectSessionRequest } from '@subwallet/extension-base/services/wallet-connect-service/types';
|
|
11
|
-
import { BalanceJson, BuyServiceInfo, BuyTokenInfo, EarningRewardHistoryItem, EarningRewardJson, EarningStatus, HandleYieldStepParams, LeavePoolAdditionalData, NominationPoolInfo, OptimalYieldPath, OptimalYieldPathParams, RequestEarlyValidateYield, RequestGetYieldPoolTargets, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseEarlyValidateYield, ResponseGetYieldPoolTargets, StorageDataInterface, SubmitYieldStepData, TokenSpendingApprovalParams, UnlockDotTransactionNft, UnstakingStatus, ValidateYieldProcessParams, YieldPoolInfo, YieldPositionInfo, YieldValidationStatus } from '@subwallet/extension-base/types';
|
|
11
|
+
import { BalanceJson, BuyServiceInfo, BuyTokenInfo, EarningRewardHistoryItem, EarningRewardJson, EarningStatus, HandleYieldStepParams, LeavePoolAdditionalData, NominationPoolInfo, OptimalYieldPath, OptimalYieldPathParams, RequestEarlyValidateYield, RequestGetYieldPoolTargets, RequestMetadataHash, RequestShortenMetadata, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseEarlyValidateYield, ResponseGetYieldPoolTargets, ResponseMetadataHash, ResponseShortenMetadata, StorageDataInterface, SubmitYieldStepData, TokenSpendingApprovalParams, UnlockDotTransactionNft, UnstakingStatus, ValidateYieldProcessParams, YieldPoolInfo, YieldPositionInfo, YieldValidationStatus } from '@subwallet/extension-base/types';
|
|
12
12
|
import { CommonOptimalPath } from '@subwallet/extension-base/types/service-base';
|
|
13
13
|
import { SwapErrorType, SwapPair, SwapQuoteResponse, SwapRequest, SwapRequestResult, SwapSubmitParams, SwapTxData, ValidateSwapProcessParams } from '@subwallet/extension-base/types/swap';
|
|
14
14
|
import { InjectedAccount, InjectedAccountWithMeta, MetadataDefBase } from '@subwallet/extension-inject/types';
|
|
@@ -201,10 +201,12 @@ export interface NftCollectionJson {
|
|
|
201
201
|
}
|
|
202
202
|
export interface MetadataItem {
|
|
203
203
|
genesisHash: string;
|
|
204
|
+
specName: string;
|
|
204
205
|
specVersion: string;
|
|
205
206
|
hexValue: HexString;
|
|
206
207
|
types: Record<string, Record<string, string> | string>;
|
|
207
208
|
userExtensions?: ExtDef;
|
|
209
|
+
hexV15?: HexString;
|
|
208
210
|
}
|
|
209
211
|
export interface CrowdloanItem {
|
|
210
212
|
state: APIItemState;
|
|
@@ -998,6 +1000,7 @@ export interface AddNetworkRequestExternal {
|
|
|
998
1000
|
decimals: number;
|
|
999
1001
|
};
|
|
1000
1002
|
}
|
|
1003
|
+
export declare type AddNetworkToRequestConnect = AddNetworkRequestExternal;
|
|
1001
1004
|
export interface AddTokenRequestExternal {
|
|
1002
1005
|
slug?: string;
|
|
1003
1006
|
contractAddress: string;
|
|
@@ -1756,6 +1759,8 @@ export interface KoniRequestSignatures {
|
|
|
1756
1759
|
'pri(walletConnect.notSupport.approve)': [RequestApproveWalletConnectNotSupport, boolean];
|
|
1757
1760
|
'pri(walletConnect.notSupport.reject)': [RequestRejectWalletConnectNotSupport, boolean];
|
|
1758
1761
|
'pri(metadata.find)': [RequestFindRawMetadata, ResponseFindRawMetadata];
|
|
1762
|
+
'pri(metadata.hash)': [RequestMetadataHash, ResponseMetadataHash];
|
|
1763
|
+
'pri(metadata.transaction.shorten)': [RequestShortenMetadata, ResponseShortenMetadata];
|
|
1759
1764
|
'pri(campaign.unlockDot.canMint)': [RequestUnlockDotCheckCanMint, boolean];
|
|
1760
1765
|
'pri(campaign.unlockDot.subscribe)': [RequestUnlockDotSubscribeMintedData, UnlockDotTransactionNft, UnlockDotTransactionNft];
|
|
1761
1766
|
'pri(campaign.banner.subscribe)': [null, CampaignBanner[], CampaignBanner[]];
|
package/cjs/constants/staking.js
CHANGED
|
@@ -20,7 +20,8 @@ const PREDEFINED_EARNING_POOL = {
|
|
|
20
20
|
kusama: [80],
|
|
21
21
|
vara_network: [62, 29, 50],
|
|
22
22
|
aleph: [82],
|
|
23
|
-
availTuringTest: [11]
|
|
23
|
+
availTuringTest: [11],
|
|
24
|
+
avail_mainnet: [4]
|
|
24
25
|
};
|
|
25
26
|
exports.PREDEFINED_EARNING_POOL = PREDEFINED_EARNING_POOL;
|
|
26
27
|
const MAX_NOMINATIONS = '16';
|
|
@@ -26,6 +26,7 @@ exports.getRelayEraRewardMap = getRelayEraRewardMap;
|
|
|
26
26
|
exports.getRelayMaxNominations = getRelayMaxNominations;
|
|
27
27
|
exports.getRelayTopValidatorByPoints = getRelayTopValidatorByPoints;
|
|
28
28
|
exports.getRelayValidatorPointsMap = getRelayValidatorPointsMap;
|
|
29
|
+
exports.getRelayWaitingValidatorList = getRelayWaitingValidatorList;
|
|
29
30
|
exports.getStakingAvailableActionsByChain = getStakingAvailableActionsByChain;
|
|
30
31
|
exports.getStakingAvailableActionsByNominator = getStakingAvailableActionsByNominator;
|
|
31
32
|
exports.getSupportedDaysByHistoryDepth = getSupportedDaysByHistoryDepth;
|
|
@@ -436,6 +437,20 @@ function getRelayBlockedValidatorList(validators) {
|
|
|
436
437
|
}
|
|
437
438
|
return blockValidatorList;
|
|
438
439
|
}
|
|
440
|
+
function getRelayWaitingValidatorList(validators) {
|
|
441
|
+
const waitingValidators = [];
|
|
442
|
+
for (const validator of validators) {
|
|
443
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
444
|
+
const validatorAddress = validator[0].toHuman()[0];
|
|
445
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
446
|
+
const validatorPrefs = validator[1].toHuman();
|
|
447
|
+
const isBlocked = validatorPrefs.blocked;
|
|
448
|
+
if (!isBlocked) {
|
|
449
|
+
waitingValidators.push(validatorAddress);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
return waitingValidators;
|
|
453
|
+
}
|
|
439
454
|
function getRelayEraRewardMap(eraRewardPointArray, startEraForPoints) {
|
|
440
455
|
const eraRewardMap = {};
|
|
441
456
|
for (const item of eraRewardPointArray) {
|
|
@@ -3734,7 +3734,7 @@ class KoniExtension {
|
|
|
3734
3734
|
};
|
|
3735
3735
|
}
|
|
3736
3736
|
|
|
3737
|
-
|
|
3737
|
+
/* Metadata */
|
|
3738
3738
|
|
|
3739
3739
|
async findRawMetadata(_ref90) {
|
|
3740
3740
|
let {
|
|
@@ -3753,6 +3753,28 @@ class KoniExtension {
|
|
|
3753
3753
|
userExtensions
|
|
3754
3754
|
};
|
|
3755
3755
|
}
|
|
3756
|
+
async calculateMetadataHash(_ref91) {
|
|
3757
|
+
let {
|
|
3758
|
+
chain
|
|
3759
|
+
} = _ref91;
|
|
3760
|
+
const hash = await this.#koniState.calculateMetadataHash(chain);
|
|
3761
|
+
return {
|
|
3762
|
+
metadataHash: hash || ''
|
|
3763
|
+
};
|
|
3764
|
+
}
|
|
3765
|
+
async shortenMetadata(_ref92) {
|
|
3766
|
+
let {
|
|
3767
|
+
chain,
|
|
3768
|
+
txBlob
|
|
3769
|
+
} = _ref92;
|
|
3770
|
+
const shorten = await this.#koniState.shortenMetadata(chain, txBlob);
|
|
3771
|
+
return {
|
|
3772
|
+
txMetadata: shorten || ''
|
|
3773
|
+
};
|
|
3774
|
+
}
|
|
3775
|
+
|
|
3776
|
+
/* Metadata */
|
|
3777
|
+
|
|
3756
3778
|
async resolveDomainByAddress(request) {
|
|
3757
3779
|
const chainApi = this.#koniState.getSubstrateApi(request.chain);
|
|
3758
3780
|
return await (0, _domain.resolveAzeroDomainToAddress)(request.domain, request.chain, chainApi.api);
|
|
@@ -3990,18 +4012,18 @@ class KoniExtension {
|
|
|
3990
4012
|
|
|
3991
4013
|
/* Campaign */
|
|
3992
4014
|
|
|
3993
|
-
unlockDotCheckCanMint(
|
|
4015
|
+
unlockDotCheckCanMint(_ref93) {
|
|
3994
4016
|
let {
|
|
3995
4017
|
address,
|
|
3996
4018
|
network,
|
|
3997
4019
|
slug
|
|
3998
|
-
} =
|
|
4020
|
+
} = _ref93;
|
|
3999
4021
|
return this.#koniState.mintCampaignService.unlockDotCampaign.canMint(address, slug, network);
|
|
4000
4022
|
}
|
|
4001
|
-
unlockDotSubscribeMintedData(id, port,
|
|
4023
|
+
unlockDotSubscribeMintedData(id, port, _ref94) {
|
|
4002
4024
|
let {
|
|
4003
4025
|
transactionId
|
|
4004
|
-
} =
|
|
4026
|
+
} = _ref94;
|
|
4005
4027
|
const cb = (0, _subscriptions.createSubscription)(id, port);
|
|
4006
4028
|
const subscription = this.#koniState.mintCampaignService.unlockDotCampaign.subscribeMintedNft(transactionId, cb);
|
|
4007
4029
|
this.createUnsubscriptionHandle(id, subscription.unsubscribe);
|
|
@@ -4033,10 +4055,10 @@ class KoniExtension {
|
|
|
4033
4055
|
});
|
|
4034
4056
|
return filterBanner(await this.#koniState.campaignService.getProcessingCampaign());
|
|
4035
4057
|
}
|
|
4036
|
-
async completeCampaignBanner(
|
|
4058
|
+
async completeCampaignBanner(_ref95) {
|
|
4037
4059
|
let {
|
|
4038
4060
|
slug
|
|
4039
|
-
} =
|
|
4061
|
+
} = _ref95;
|
|
4040
4062
|
const campaign = await this.#koniState.dbService.getCampaign(slug);
|
|
4041
4063
|
if (campaign) {
|
|
4042
4064
|
await this.#koniState.dbService.upsertCampaign({
|
|
@@ -4693,6 +4715,10 @@ class KoniExtension {
|
|
|
4693
4715
|
// Metadata
|
|
4694
4716
|
case 'pri(metadata.find)':
|
|
4695
4717
|
return this.findRawMetadata(request);
|
|
4718
|
+
case 'pri(metadata.hash)':
|
|
4719
|
+
return this.calculateMetadataHash(request);
|
|
4720
|
+
case 'pri(metadata.transaction.shorten)':
|
|
4721
|
+
return this.shortenMetadata(request);
|
|
4696
4722
|
|
|
4697
4723
|
/* Campaign */
|
|
4698
4724
|
case 'pri(campaign.banner.subscribe)':
|
|
@@ -1813,7 +1813,8 @@ class KoniState {
|
|
|
1813
1813
|
return (_this$chainService34 = this.chainService) === null || _this$chainService34 === void 0 ? void 0 : (_this$chainService34$ = _this$chainService34.mantaPay) === null || _this$chainService34$ === void 0 ? void 0 : _this$chainService34$.subscribeSyncState();
|
|
1814
1814
|
}
|
|
1815
1815
|
|
|
1816
|
-
|
|
1816
|
+
/* Metadata */
|
|
1817
|
+
|
|
1817
1818
|
async findMetadata(hash) {
|
|
1818
1819
|
const metadata = await this.chainService.getMetadataByHash(hash);
|
|
1819
1820
|
return {
|
|
@@ -1823,6 +1824,15 @@ class KoniState {
|
|
|
1823
1824
|
userExtensions: metadata === null || metadata === void 0 ? void 0 : metadata.userExtensions
|
|
1824
1825
|
};
|
|
1825
1826
|
}
|
|
1827
|
+
async calculateMetadataHash(chain) {
|
|
1828
|
+
return this.chainService.calculateMetadataHash(chain);
|
|
1829
|
+
}
|
|
1830
|
+
async shortenMetadata(chain, txBlob) {
|
|
1831
|
+
return this.chainService.shortenMetadata(chain, txBlob);
|
|
1832
|
+
}
|
|
1833
|
+
|
|
1834
|
+
/* Metadata */
|
|
1835
|
+
|
|
1826
1836
|
getCrowdloanContributions(_ref11) {
|
|
1827
1837
|
let {
|
|
1828
1838
|
address,
|
package/cjs/packageInfo.js
CHANGED
|
@@ -96,7 +96,7 @@ function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoM
|
|
|
96
96
|
const chainSlug = chainInfo.slug;
|
|
97
97
|
const [useAddresses, notSupportAddresses] = filterAddress(addresses, chainInfo);
|
|
98
98
|
if (notSupportAddresses.length) {
|
|
99
|
-
const tokens = (0, _utils2.filterAssetsByChainAndType)(chainAssetMap, chainSlug, [_types._AssetType.NATIVE, _types._AssetType.ERC20, _types._AssetType.PSP22, _types._AssetType.LOCAL, _types._AssetType.GRC20]);
|
|
99
|
+
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]);
|
|
100
100
|
const now = new Date().getTime();
|
|
101
101
|
Object.values(tokens).forEach(token => {
|
|
102
102
|
const items = notSupportAddresses.map(address => ({
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.subscribeVftBalance = exports.subscribeGRC20Balance = void 0;
|
|
7
|
+
var _api = require("@gear-js/api");
|
|
8
|
+
var _types = require("@subwallet/chain-list/types");
|
|
9
|
+
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
10
|
+
var _constants = require("@subwallet/extension-base/constants");
|
|
11
|
+
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
12
|
+
var _utils2 = require("@subwallet/extension-base/utils");
|
|
13
|
+
var _util = require("@polkadot/util");
|
|
14
|
+
var _utilCrypto = require("@polkadot/util-crypto");
|
|
15
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
16
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
17
|
+
|
|
18
|
+
const subscribeGRC20Balance = _ref => {
|
|
19
|
+
let {
|
|
20
|
+
addresses,
|
|
21
|
+
assetMap,
|
|
22
|
+
callback,
|
|
23
|
+
chainInfo,
|
|
24
|
+
substrateApi
|
|
25
|
+
} = _ref;
|
|
26
|
+
if (!(substrateApi instanceof _api.GearApi)) {
|
|
27
|
+
console.warn('Cannot subscribe GRC20 balance without GearApi instance');
|
|
28
|
+
return _util.noop;
|
|
29
|
+
}
|
|
30
|
+
const chain = chainInfo.slug;
|
|
31
|
+
const grc20ContractMap = {};
|
|
32
|
+
const tokenList = (0, _utils2.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.GRC20]);
|
|
33
|
+
Object.entries(tokenList).forEach(_ref2 => {
|
|
34
|
+
let [slug, tokenInfo] = _ref2;
|
|
35
|
+
grc20ContractMap[slug] = (0, _utils2.getGRC20ContractPromise)(substrateApi, (0, _utils._getContractAddressOfToken)(tokenInfo));
|
|
36
|
+
});
|
|
37
|
+
const getTokenBalances = () => {
|
|
38
|
+
Object.values(tokenList).map(async tokenInfo => {
|
|
39
|
+
try {
|
|
40
|
+
const contract = grc20ContractMap[tokenInfo.slug];
|
|
41
|
+
const balances = await Promise.all(addresses.map(async address => {
|
|
42
|
+
try {
|
|
43
|
+
const actor = (0, _util.u8aToHex)((0, _utilCrypto.decodeAddress)(address));
|
|
44
|
+
const _balanceOf = await contract.service.balanceOf(actor, address);
|
|
45
|
+
return {
|
|
46
|
+
address: address,
|
|
47
|
+
tokenSlug: tokenInfo.slug,
|
|
48
|
+
free: _balanceOf.toString(10),
|
|
49
|
+
locked: '0',
|
|
50
|
+
state: _KoniTypes.APIItemState.READY
|
|
51
|
+
};
|
|
52
|
+
} catch (err) {
|
|
53
|
+
console.error(`Error on get balance of account ${address} for token ${tokenInfo.slug}`, err);
|
|
54
|
+
return {
|
|
55
|
+
address: address,
|
|
56
|
+
tokenSlug: tokenInfo.slug,
|
|
57
|
+
free: '0',
|
|
58
|
+
locked: '0',
|
|
59
|
+
state: _KoniTypes.APIItemState.READY
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}));
|
|
63
|
+
callback(balances);
|
|
64
|
+
} catch (err) {
|
|
65
|
+
console.warn(tokenInfo.slug, err); // TODO: error createType
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
getTokenBalances();
|
|
71
|
+
const interval = setInterval(getTokenBalances, _constants.SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
|
|
72
|
+
return () => {
|
|
73
|
+
clearInterval(interval);
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
exports.subscribeGRC20Balance = subscribeGRC20Balance;
|
|
77
|
+
const subscribeVftBalance = _ref3 => {
|
|
78
|
+
let {
|
|
79
|
+
addresses,
|
|
80
|
+
assetMap,
|
|
81
|
+
callback,
|
|
82
|
+
chainInfo,
|
|
83
|
+
substrateApi
|
|
84
|
+
} = _ref3;
|
|
85
|
+
if (!(substrateApi instanceof _api.GearApi)) {
|
|
86
|
+
console.warn('Cannot subscribe VFT balance without GearApi instance');
|
|
87
|
+
return _util.noop;
|
|
88
|
+
}
|
|
89
|
+
const chain = chainInfo.slug;
|
|
90
|
+
const vftContractMap = {};
|
|
91
|
+
const tokenList = (0, _utils2.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.VFT]);
|
|
92
|
+
Object.entries(tokenList).forEach(_ref4 => {
|
|
93
|
+
let [slug, tokenInfo] = _ref4;
|
|
94
|
+
vftContractMap[slug] = (0, _utils2.getVFTContractPromise)(substrateApi, (0, _utils._getContractAddressOfToken)(tokenInfo));
|
|
95
|
+
});
|
|
96
|
+
const getTokenBalances = () => {
|
|
97
|
+
Object.values(tokenList).map(async tokenInfo => {
|
|
98
|
+
try {
|
|
99
|
+
const contract = vftContractMap[tokenInfo.slug];
|
|
100
|
+
const balances = await Promise.all(addresses.map(async address => {
|
|
101
|
+
try {
|
|
102
|
+
const actor = (0, _util.u8aToHex)((0, _utilCrypto.decodeAddress)(address));
|
|
103
|
+
const _balanceOf = await contract.service.balanceOf(actor, address);
|
|
104
|
+
return {
|
|
105
|
+
address: address,
|
|
106
|
+
tokenSlug: tokenInfo.slug,
|
|
107
|
+
free: _balanceOf.toString(10),
|
|
108
|
+
locked: '0',
|
|
109
|
+
state: _KoniTypes.APIItemState.READY
|
|
110
|
+
};
|
|
111
|
+
} catch (err) {
|
|
112
|
+
console.error(`Error on get balance of account ${address} for token ${tokenInfo.slug}`, err);
|
|
113
|
+
return {
|
|
114
|
+
address: address,
|
|
115
|
+
tokenSlug: tokenInfo.slug,
|
|
116
|
+
free: '0',
|
|
117
|
+
locked: '0',
|
|
118
|
+
state: _KoniTypes.APIItemState.READY
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}));
|
|
122
|
+
callback(balances);
|
|
123
|
+
} catch (err) {
|
|
124
|
+
console.warn(tokenInfo.slug, err); // TODO: error createType
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
getTokenBalances();
|
|
130
|
+
const interval = setInterval(getTokenBalances, _constants.SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
|
|
131
|
+
return () => {
|
|
132
|
+
clearInterval(interval);
|
|
133
|
+
};
|
|
134
|
+
};
|
|
135
|
+
exports.subscribeVftBalance = subscribeVftBalance;
|
|
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.subscribeSubstrateBalance = void 0;
|
|
8
|
-
var _api = require("@gear-js/api");
|
|
9
8
|
var _types = require("@subwallet/chain-list/types");
|
|
10
9
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
11
10
|
var _constants = require("@subwallet/extension-base/constants");
|
|
@@ -20,9 +19,9 @@ var _utils3 = require("@subwallet/extension-base/utils");
|
|
|
20
19
|
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
21
20
|
var _rxjs = require("rxjs");
|
|
22
21
|
var _util = require("@polkadot/util");
|
|
23
|
-
var _utilCrypto = require("@polkadot/util-crypto");
|
|
24
22
|
var _evm = require("../evm");
|
|
25
23
|
var _equilibrium = require("./equilibrium");
|
|
24
|
+
var _gear = require("./gear");
|
|
26
25
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
27
26
|
// SPDX-License-Identifier: Apache-2.0
|
|
28
27
|
|
|
@@ -33,6 +32,7 @@ const subscribeSubstrateBalance = async (addresses, chainInfo, assetMap, substra
|
|
|
33
32
|
let unsubWasmContractToken;
|
|
34
33
|
let unsubBridgedToken;
|
|
35
34
|
let unsubGrcToken;
|
|
35
|
+
let unsubVftToken;
|
|
36
36
|
const chain = chainInfo.slug;
|
|
37
37
|
const baseParams = {
|
|
38
38
|
addresses,
|
|
@@ -87,19 +87,24 @@ const subscribeSubstrateBalance = async (addresses, chainInfo, assetMap, substra
|
|
|
87
87
|
}
|
|
88
88
|
if ((0, _utils2._checkSmartContractSupportByChain)(chainInfo, _types._AssetType.GRC20)) {
|
|
89
89
|
// Get sub-token for substrate-based chains
|
|
90
|
-
unsubGrcToken = subscribeGRC20Balance(substrateParams);
|
|
90
|
+
unsubGrcToken = (0, _gear.subscribeGRC20Balance)(substrateParams);
|
|
91
|
+
}
|
|
92
|
+
if ((0, _utils2._checkSmartContractSupportByChain)(chainInfo, _types._AssetType.VFT)) {
|
|
93
|
+
// Get sub-token for substrate-based chains
|
|
94
|
+
unsubVftToken = (0, _gear.subscribeVftBalance)(substrateParams);
|
|
91
95
|
}
|
|
92
96
|
} catch (err) {
|
|
93
97
|
console.warn(err);
|
|
94
98
|
}
|
|
95
99
|
return () => {
|
|
96
|
-
var _unsubGrcToken;
|
|
100
|
+
var _unsubGrcToken, _unsubVftToken;
|
|
97
101
|
unsubNativeToken && unsubNativeToken();
|
|
98
102
|
unsubLocalToken && unsubLocalToken();
|
|
99
103
|
unsubEvmContractToken && unsubEvmContractToken();
|
|
100
104
|
unsubWasmContractToken && unsubWasmContractToken();
|
|
101
105
|
unsubBridgedToken && unsubBridgedToken();
|
|
102
106
|
(_unsubGrcToken = unsubGrcToken) === null || _unsubGrcToken === void 0 ? void 0 : _unsubGrcToken();
|
|
107
|
+
(_unsubVftToken = unsubVftToken) === null || _unsubVftToken === void 0 ? void 0 : _unsubVftToken();
|
|
103
108
|
};
|
|
104
109
|
};
|
|
105
110
|
|
|
@@ -437,62 +442,4 @@ const subscribeOrmlTokensPallet = async _ref8 => {
|
|
|
437
442
|
}).catch(console.error);
|
|
438
443
|
});
|
|
439
444
|
};
|
|
440
|
-
};
|
|
441
|
-
const subscribeGRC20Balance = _ref9 => {
|
|
442
|
-
let {
|
|
443
|
-
addresses,
|
|
444
|
-
assetMap,
|
|
445
|
-
callback,
|
|
446
|
-
chainInfo,
|
|
447
|
-
substrateApi
|
|
448
|
-
} = _ref9;
|
|
449
|
-
if (!(substrateApi instanceof _api.GearApi)) {
|
|
450
|
-
console.warn('Cannot subscribe VFT balance without GearApi instance');
|
|
451
|
-
return _util.noop;
|
|
452
|
-
}
|
|
453
|
-
const chain = chainInfo.slug;
|
|
454
|
-
const psp22ContractMap = {};
|
|
455
|
-
const tokenList = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.GRC20]);
|
|
456
|
-
Object.entries(tokenList).forEach(_ref10 => {
|
|
457
|
-
let [slug, tokenInfo] = _ref10;
|
|
458
|
-
psp22ContractMap[slug] = (0, _utils3.getGRC20ContractPromise)(substrateApi, (0, _utils2._getContractAddressOfToken)(tokenInfo));
|
|
459
|
-
});
|
|
460
|
-
const getTokenBalances = () => {
|
|
461
|
-
Object.values(tokenList).map(async tokenInfo => {
|
|
462
|
-
try {
|
|
463
|
-
const contract = psp22ContractMap[tokenInfo.slug];
|
|
464
|
-
const balances = await Promise.all(addresses.map(async address => {
|
|
465
|
-
try {
|
|
466
|
-
const actor = (0, _util.u8aToHex)((0, _utilCrypto.decodeAddress)(address));
|
|
467
|
-
const _balanceOf = await contract.balanceOf(actor, address);
|
|
468
|
-
return {
|
|
469
|
-
address: address,
|
|
470
|
-
tokenSlug: tokenInfo.slug,
|
|
471
|
-
free: _balanceOf.toString(10),
|
|
472
|
-
locked: '0',
|
|
473
|
-
state: _KoniTypes.APIItemState.READY
|
|
474
|
-
};
|
|
475
|
-
} catch (err) {
|
|
476
|
-
console.error(`Error on get balance of account ${address} for token ${tokenInfo.slug}`, err);
|
|
477
|
-
return {
|
|
478
|
-
address: address,
|
|
479
|
-
tokenSlug: tokenInfo.slug,
|
|
480
|
-
free: '0',
|
|
481
|
-
locked: '0',
|
|
482
|
-
state: _KoniTypes.APIItemState.READY
|
|
483
|
-
};
|
|
484
|
-
}
|
|
485
|
-
}));
|
|
486
|
-
callback(balances);
|
|
487
|
-
} catch (err) {
|
|
488
|
-
console.warn(tokenInfo.slug, err); // TODO: error createType
|
|
489
|
-
}
|
|
490
|
-
});
|
|
491
|
-
};
|
|
492
|
-
|
|
493
|
-
getTokenBalances();
|
|
494
|
-
const interval = setInterval(getTokenBalances, _constants.SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
|
|
495
|
-
return () => {
|
|
496
|
-
clearInterval(interval);
|
|
497
|
-
};
|
|
498
445
|
};
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.getTransferMockTxFee = exports.createTransferExtrinsic = void 0;
|
|
8
8
|
var _api = require("@gear-js/api");
|
|
9
|
+
var _types = require("@subwallet/chain-list/types");
|
|
9
10
|
var _wasm = require("@subwallet/extension-base/koni/api/contract-handler/wasm");
|
|
10
11
|
var _utils = require("@subwallet/extension-base/koni/api/contract-handler/wasm/utils");
|
|
11
12
|
var _constants = require("@subwallet/extension-base/services/chain-service/constants");
|
|
@@ -61,12 +62,12 @@ const createTransferExtrinsic = async _ref => {
|
|
|
61
62
|
}, to, value, {});
|
|
62
63
|
transferAmount = value;
|
|
63
64
|
} else if ((0, _utils2._isTokenGearSmartContract)(tokenInfo) && api instanceof _api.GearApi) {
|
|
64
|
-
const contractPromise = (0, _utils4.getGRC20ContractPromise)(api, (0, _utils2._getContractAddressOfToken)(tokenInfo));
|
|
65
|
-
const transaction = await contractPromise.transfer((0, _util.u8aToHex)((0, _utilCrypto.decodeAddress)(to)),
|
|
65
|
+
const contractPromise = tokenInfo.assetType === _types._AssetType.GRC20 ? (0, _utils4.getGRC20ContractPromise)(api, (0, _utils2._getContractAddressOfToken)(tokenInfo)) : (0, _utils4.getVFTContractPromise)(api, (0, _utils2._getContractAddressOfToken)(tokenInfo));
|
|
66
|
+
const transaction = await contractPromise.service.transfer((0, _util.u8aToHex)((0, _utilCrypto.decodeAddress)(to)), value) // Create transfer transaction
|
|
66
67
|
.withAccount(from) // Set sender account
|
|
67
68
|
.calculateGas(); // Add account arg to extrinsic
|
|
68
69
|
|
|
69
|
-
transfer = transaction.
|
|
70
|
+
transfer = transaction.extrinsic;
|
|
70
71
|
transferAmount = value;
|
|
71
72
|
} else if (_constants._TRANSFER_CHAIN_GROUP.acala.includes(networkKey)) {
|
|
72
73
|
if (!(0, _utils2._isNativeToken)(tokenInfo)) {
|
|
@@ -166,14 +166,16 @@ class SubstrateApi {
|
|
|
166
166
|
this.provider = this.createProvider(apiUrl);
|
|
167
167
|
this.api = this.createApi(this.provider);
|
|
168
168
|
}
|
|
169
|
-
connect() {
|
|
169
|
+
connect(_callbackUpdateMetadata) {
|
|
170
170
|
if (this.api.isConnected) {
|
|
171
171
|
this.updateConnectionStatus(_types2._ChainConnectionStatus.CONNECTED);
|
|
172
|
+
_callbackUpdateMetadata === null || _callbackUpdateMetadata === void 0 ? void 0 : _callbackUpdateMetadata(this);
|
|
172
173
|
} else {
|
|
173
174
|
this.updateConnectionStatus(_types2._ChainConnectionStatus.CONNECTING);
|
|
174
175
|
this.api.connect().then(() => {
|
|
175
176
|
this.api.isReady.then(() => {
|
|
176
177
|
this.updateConnectionStatus(_types2._ChainConnectionStatus.CONNECTED);
|
|
178
|
+
_callbackUpdateMetadata === null || _callbackUpdateMetadata === void 0 ? void 0 : _callbackUpdateMetadata(this);
|
|
177
179
|
}).catch(console.error);
|
|
178
180
|
}).catch(console.error);
|
|
179
181
|
}
|
|
@@ -11,7 +11,6 @@ var _AbstractChainHandler = require("@subwallet/extension-base/services/chain-se
|
|
|
11
11
|
var _SubstrateApi2 = require("@subwallet/extension-base/services/chain-service/handler/SubstrateApi");
|
|
12
12
|
var _utils2 = require("@subwallet/extension-base/utils");
|
|
13
13
|
var _apiContract = require("@polkadot/api-contract");
|
|
14
|
-
var _typesKnown = require("@polkadot/types-known");
|
|
15
14
|
var _util = require("@polkadot/util");
|
|
16
15
|
var _logger = require("@polkadot/util/logger");
|
|
17
16
|
var _utils3 = require("../../../koni/api/contract-handler/utils");
|
|
@@ -144,12 +143,26 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
|
|
|
144
143
|
}
|
|
145
144
|
async getGrc20TokenInfo(apiPromise, contractAddress) {
|
|
146
145
|
if (!(apiPromise instanceof _api.GearApi)) {
|
|
147
|
-
console.warn('Cannot subscribe
|
|
146
|
+
console.warn('Cannot subscribe GRC20 balance without GearApi instance');
|
|
148
147
|
return ['', -1, '', true];
|
|
149
148
|
}
|
|
150
149
|
let contractError = false;
|
|
151
150
|
const tokenContract = (0, _utils2.getGRC20ContractPromise)(apiPromise, contractAddress);
|
|
152
|
-
const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.name(_utils2.
|
|
151
|
+
const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.service.name(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.symbol(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.decimals(_utils2.GEAR_DEFAULT_ADDRESS)]);
|
|
152
|
+
const decimals = typeof decimalsRes === 'string' ? parseInt(decimalsRes) : decimalsRes;
|
|
153
|
+
if (!nameRes || !symbolRes) {
|
|
154
|
+
contractError = true;
|
|
155
|
+
}
|
|
156
|
+
return [nameRes, decimals, symbolRes, contractError];
|
|
157
|
+
}
|
|
158
|
+
async getVftTokenInfo(apiPromise, contractAddress) {
|
|
159
|
+
if (!(apiPromise instanceof _api.GearApi)) {
|
|
160
|
+
console.warn('Cannot subscribe VFT balance without GearApi instance');
|
|
161
|
+
return ['', -1, '', true];
|
|
162
|
+
}
|
|
163
|
+
let contractError = false;
|
|
164
|
+
const tokenContract = (0, _utils2.getVFTContractPromise)(apiPromise, contractAddress);
|
|
165
|
+
const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.service.name(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.symbol(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.decimals(_utils2.GEAR_DEFAULT_ADDRESS)]);
|
|
153
166
|
const decimals = typeof decimalsRes === 'string' ? parseInt(decimalsRes) : decimalsRes;
|
|
154
167
|
if (!nameRes || !symbolRes) {
|
|
155
168
|
contractError = true;
|
|
@@ -175,6 +188,9 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
|
|
|
175
188
|
case _types._AssetType.GRC20:
|
|
176
189
|
[name, decimals, symbol, contractError] = await this.getGrc20TokenInfo(apiPromise, contractAddress);
|
|
177
190
|
break;
|
|
191
|
+
case _types._AssetType.VFT:
|
|
192
|
+
[name, decimals, symbol, contractError] = await this.getVftTokenInfo(apiPromise, contractAddress);
|
|
193
|
+
break;
|
|
178
194
|
}
|
|
179
195
|
return {
|
|
180
196
|
name,
|
|
@@ -207,31 +223,9 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
|
|
|
207
223
|
providerName
|
|
208
224
|
} = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
209
225
|
const existed = this.substrateApiMap[chainSlug];
|
|
210
|
-
const metadata = await ((_this$parent2 = this.parent) === null || _this$parent2 === void 0 ? void 0 : _this$parent2.getMetadata(chainSlug));
|
|
211
226
|
const updateMetadata = substrateApi => {
|
|
212
227
|
// Update metadata to database with async methods
|
|
213
|
-
|
|
214
|
-
var _this$parent3;
|
|
215
|
-
const currentSpecVersion = api.runtimeVersion.specVersion.toString();
|
|
216
|
-
const genesisHash = api.genesisHash.toHex();
|
|
217
|
-
|
|
218
|
-
// Avoid date existed metadata
|
|
219
|
-
if (metadata && metadata.specVersion === currentSpecVersion && metadata.genesisHash === genesisHash) {
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
const systemChain = await api.rpc.system.chain();
|
|
223
|
-
// const _metadata: Option<OpaqueMetadata> = await api.call.metadata.metadataAtVersion(15);
|
|
224
|
-
// const metadataHex = _metadata.isSome ? _metadata.unwrap().toHex().slice(2) : ''; // Need unwrap to create metadata object
|
|
225
|
-
|
|
226
|
-
(_this$parent3 = this.parent) === null || _this$parent3 === void 0 ? void 0 : _this$parent3.upsertMetadata(chainSlug, {
|
|
227
|
-
chain: chainSlug,
|
|
228
|
-
genesisHash: genesisHash,
|
|
229
|
-
specVersion: currentSpecVersion,
|
|
230
|
-
hexValue: api.runtimeMetadata.toHex(),
|
|
231
|
-
types: (0, _typesKnown.getSpecTypes)(api.registry, systemChain, api.runtimeVersion.specName, api.runtimeVersion.specVersion),
|
|
232
|
-
userExtensions: (0, _typesKnown.getSpecExtensions)(api.registry, systemChain, api.runtimeVersion.specName)
|
|
233
|
-
}).catch(console.error);
|
|
234
|
-
}).catch(console.error);
|
|
228
|
+
(0, _utils2.cacheMetadata)(chainSlug, substrateApi, this.parent);
|
|
235
229
|
};
|
|
236
230
|
|
|
237
231
|
// Return existed to avoid re-init metadata
|
|
@@ -245,6 +239,7 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
|
|
|
245
239
|
updateMetadata(existed);
|
|
246
240
|
return existed;
|
|
247
241
|
}
|
|
242
|
+
const metadata = await ((_this$parent2 = this.parent) === null || _this$parent2 === void 0 ? void 0 : _this$parent2.getMetadata(chainSlug));
|
|
248
243
|
const apiObject = new _SubstrateApi2.SubstrateApi(chainSlug, apiUrl, {
|
|
249
244
|
providerName,
|
|
250
245
|
metadata,
|