@subwallet/extension-base 1.1.55-0 → 1.1.56-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 +9 -1
- package/background/KoniTypes.js +5 -0
- package/cjs/background/KoniTypes.js +7 -1
- package/cjs/koni/api/nft/{statemint_nft → assethub_nft}/index.js +5 -3
- package/cjs/koni/api/nft/{statemine_nft → assethub_unique}/index.js +5 -3
- package/cjs/koni/api/nft/index.js +13 -13
- package/cjs/koni/api/nft/nft.js +1 -1
- package/cjs/koni/api/nft/transfer.js +11 -15
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/chain-service/constants.js +17 -3
- package/cjs/services/earning-service/handlers/native-staking/amplitude.js +7 -9
- package/cjs/services/earning-service/handlers/native-staking/para-chain.js +11 -8
- package/cjs/services/earning-service/handlers/nomination-pool/index.js +19 -5
- package/cjs/services/earning-service/service.js +0 -1
- package/koni/api/nft/{statemint_nft → assethub_nft}/index.d.ts +1 -1
- package/koni/api/nft/{statemint_nft → assethub_nft}/index.js +4 -2
- package/koni/api/nft/{statemine_nft → assethub_unique}/index.d.ts +1 -1
- package/koni/api/nft/{statemine_nft → assethub_unique}/index.js +4 -2
- package/koni/api/nft/index.js +13 -13
- package/koni/api/nft/nft.js +1 -1
- package/koni/api/nft/transfer.d.ts +1 -2
- package/koni/api/nft/transfer.js +10 -13
- package/package.json +26 -26
- package/packageInfo.js +1 -1
- package/services/chain-service/constants.js +17 -3
- package/services/earning-service/handlers/native-staking/amplitude.js +7 -9
- package/services/earning-service/handlers/native-staking/para-chain.js +12 -9
- package/services/earning-service/handlers/nomination-pool/index.js +19 -5
- package/services/earning-service/service.js +0 -1
- package/types/yield/info/pallet.d.ts +4 -0
|
@@ -159,7 +159,7 @@ export declare enum CrowdloanParaState {
|
|
|
159
159
|
COMPLETED = "completed",
|
|
160
160
|
FAILED = "failed"
|
|
161
161
|
}
|
|
162
|
-
export interface NftItem {
|
|
162
|
+
export interface NftItem extends NftItemExtraInfo {
|
|
163
163
|
id: string;
|
|
164
164
|
chain: string;
|
|
165
165
|
collectionId: string;
|
|
@@ -171,9 +171,16 @@ export interface NftItem {
|
|
|
171
171
|
rarity?: string;
|
|
172
172
|
description?: string;
|
|
173
173
|
properties?: Record<any, any> | null;
|
|
174
|
+
}
|
|
175
|
+
interface NftItemExtraInfo {
|
|
174
176
|
type?: _AssetType.ERC721 | _AssetType.PSP34 | RMRK_VER;
|
|
175
177
|
rmrk_ver?: RMRK_VER;
|
|
176
178
|
onChainOption?: any;
|
|
179
|
+
assetHubType?: AssetHubNftType;
|
|
180
|
+
}
|
|
181
|
+
export declare enum AssetHubNftType {
|
|
182
|
+
NFTS = "nfts",
|
|
183
|
+
UNIQUES = "uniques"
|
|
177
184
|
}
|
|
178
185
|
export interface NftCollection {
|
|
179
186
|
collectionId: string;
|
|
@@ -1874,3 +1881,4 @@ export interface ApplicationMetadataType {
|
|
|
1874
1881
|
}
|
|
1875
1882
|
export declare type OSType = 'Mac OS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | 'Unknown';
|
|
1876
1883
|
export declare const MobileOS: OSType[];
|
|
1884
|
+
export {};
|
package/background/KoniTypes.js
CHANGED
|
@@ -38,6 +38,11 @@ export let CrowdloanParaState;
|
|
|
38
38
|
CrowdloanParaState["COMPLETED"] = "completed";
|
|
39
39
|
CrowdloanParaState["FAILED"] = "failed";
|
|
40
40
|
})(CrowdloanParaState || (CrowdloanParaState = {}));
|
|
41
|
+
export let AssetHubNftType;
|
|
42
|
+
(function (AssetHubNftType) {
|
|
43
|
+
AssetHubNftType["NFTS"] = "nfts";
|
|
44
|
+
AssetHubNftType["UNIQUES"] = "uniques";
|
|
45
|
+
})(AssetHubNftType || (AssetHubNftType = {}));
|
|
41
46
|
export let ContractType;
|
|
42
47
|
(function (ContractType) {
|
|
43
48
|
ContractType["wasm"] = "wasm";
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.WalletUnlockType = exports.TransferTxErrorType = exports.TransactionDirection = exports.ThemeNames = exports.StakingType = exports.StakingTxErrorType = exports.RuntimeEnvironment = exports.RMRK_VER = exports.ProviderErrorType = exports.NotificationType = exports.NETWORK_STATUS = exports.NETWORK_ERROR = exports.MobileOS = exports.MantaPayEnableMessage = exports.ExtrinsicType = exports.ExtrinsicStatus = exports.ExternalRequestPromiseStatus = exports.EvmProviderErrorType = exports.CrowdloanParaState = exports.ContractType = exports.ChainType = exports.ChainEditStandard = exports.CampaignDataType = exports.BasicTxWarningCode = exports.BasicTxErrorType = exports.BalanceErrorType = exports.AccountExternalErrorCode = exports.APIItemState = void 0;
|
|
6
|
+
exports.WalletUnlockType = exports.TransferTxErrorType = exports.TransactionDirection = exports.ThemeNames = exports.StakingType = exports.StakingTxErrorType = exports.RuntimeEnvironment = exports.RMRK_VER = exports.ProviderErrorType = exports.NotificationType = exports.NETWORK_STATUS = exports.NETWORK_ERROR = exports.MobileOS = exports.MantaPayEnableMessage = exports.ExtrinsicType = exports.ExtrinsicStatus = exports.ExternalRequestPromiseStatus = exports.EvmProviderErrorType = exports.CrowdloanParaState = exports.ContractType = exports.ChainType = exports.ChainEditStandard = exports.CampaignDataType = exports.BasicTxWarningCode = exports.BasicTxErrorType = exports.BalanceErrorType = exports.AssetHubNftType = exports.AccountExternalErrorCode = exports.APIItemState = void 0;
|
|
7
7
|
// Copyright 2019-2022 @polkadot/extension-koni authors & contributors
|
|
8
8
|
// SPDX-License-Identifier: Apache-2.0
|
|
9
9
|
let RuntimeEnvironment;
|
|
@@ -47,6 +47,12 @@ exports.CrowdloanParaState = CrowdloanParaState;
|
|
|
47
47
|
CrowdloanParaState["COMPLETED"] = "completed";
|
|
48
48
|
CrowdloanParaState["FAILED"] = "failed";
|
|
49
49
|
})(CrowdloanParaState || (exports.CrowdloanParaState = CrowdloanParaState = {}));
|
|
50
|
+
let AssetHubNftType;
|
|
51
|
+
exports.AssetHubNftType = AssetHubNftType;
|
|
52
|
+
(function (AssetHubNftType) {
|
|
53
|
+
AssetHubNftType["NFTS"] = "nfts";
|
|
54
|
+
AssetHubNftType["UNIQUES"] = "uniques";
|
|
55
|
+
})(AssetHubNftType || (exports.AssetHubNftType = AssetHubNftType = {}));
|
|
50
56
|
let ContractType;
|
|
51
57
|
exports.ContractType = ContractType;
|
|
52
58
|
(function (ContractType) {
|
|
@@ -5,13 +5,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
|
+
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
8
9
|
var _nft = require("@subwallet/extension-base/koni/api/nft/nft");
|
|
9
10
|
var _utils = require("@subwallet/extension-base/utils");
|
|
10
11
|
var _crossFetch = _interopRequireDefault(require("cross-fetch"));
|
|
11
12
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
12
13
|
// SPDX-License-Identifier: Apache-2.0
|
|
13
14
|
|
|
14
|
-
class
|
|
15
|
+
class AssetHubNftsPalletApi extends _nft.BaseNftApi {
|
|
15
16
|
// eslint-disable-next-line no-useless-constructor
|
|
16
17
|
constructor(api, addresses, chain) {
|
|
17
18
|
super(chain, api, addresses);
|
|
@@ -112,7 +113,8 @@ class StatemintNftApi extends _nft.BaseNftApi {
|
|
|
112
113
|
image: tokenInfo && tokenInfo.image ? this.parseUrl(tokenInfo === null || tokenInfo === void 0 ? void 0 : tokenInfo.image) : undefined,
|
|
113
114
|
collectionId: this.parseTokenId(parsedClassId),
|
|
114
115
|
chain: this.chain,
|
|
115
|
-
owner: address
|
|
116
|
+
owner: address,
|
|
117
|
+
assetHubType: _KoniTypes.AssetHubNftType.NFTS
|
|
116
118
|
};
|
|
117
119
|
params.updateItem(this.chain, parsedNft, address);
|
|
118
120
|
const parsedCollection = {
|
|
@@ -140,4 +142,4 @@ class StatemintNftApi extends _nft.BaseNftApi {
|
|
|
140
142
|
return 1;
|
|
141
143
|
}
|
|
142
144
|
}
|
|
143
|
-
exports.default =
|
|
145
|
+
exports.default = AssetHubNftsPalletApi;
|
|
@@ -5,13 +5,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
|
+
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
8
9
|
var _nft = require("@subwallet/extension-base/koni/api/nft/nft");
|
|
9
10
|
var _utils = require("@subwallet/extension-base/utils");
|
|
10
11
|
var _crossFetch = _interopRequireDefault(require("cross-fetch"));
|
|
11
12
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
12
13
|
// SPDX-License-Identifier: Apache-2.0
|
|
13
14
|
|
|
14
|
-
class
|
|
15
|
+
class AssetHubUniquesPalletApi extends _nft.BaseNftApi {
|
|
15
16
|
// eslint-disable-next-line no-useless-constructor
|
|
16
17
|
constructor(api, addresses, chain) {
|
|
17
18
|
super(chain, api, addresses);
|
|
@@ -112,7 +113,8 @@ class StatemineNftApi extends _nft.BaseNftApi {
|
|
|
112
113
|
image: tokenInfo && tokenInfo.image ? this.parseUrl(tokenInfo === null || tokenInfo === void 0 ? void 0 : tokenInfo.image) : undefined,
|
|
113
114
|
collectionId: this.parseTokenId(parsedClassId),
|
|
114
115
|
chain: this.chain,
|
|
115
|
-
owner: address
|
|
116
|
+
owner: address,
|
|
117
|
+
assetHubType: _KoniTypes.AssetHubNftType.UNIQUES
|
|
116
118
|
};
|
|
117
119
|
params.updateItem(this.chain, parsedNft, address);
|
|
118
120
|
const parsedCollection = {
|
|
@@ -140,4 +142,4 @@ class StatemineNftApi extends _nft.BaseNftApi {
|
|
|
140
142
|
return 1;
|
|
141
143
|
}
|
|
142
144
|
}
|
|
143
|
-
exports.default =
|
|
145
|
+
exports.default = AssetHubUniquesPalletApi;
|
|
@@ -6,19 +6,19 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.NftHandler = void 0;
|
|
8
8
|
var _acala_nft = require("@subwallet/extension-base/koni/api/nft/acala_nft");
|
|
9
|
+
var _assethub_unique = _interopRequireDefault(require("@subwallet/extension-base/koni/api/nft/assethub_unique"));
|
|
9
10
|
var _bit = require("@subwallet/extension-base/koni/api/nft/bit.country");
|
|
10
11
|
var _evm_nft = require("@subwallet/extension-base/koni/api/nft/evm_nft");
|
|
11
12
|
var _karura_nft = require("@subwallet/extension-base/koni/api/nft/karura_nft");
|
|
12
13
|
var _ordinal_nft = _interopRequireDefault(require("@subwallet/extension-base/koni/api/nft/ordinal_nft"));
|
|
13
14
|
var _rmrk_nft = require("@subwallet/extension-base/koni/api/nft/rmrk_nft");
|
|
14
|
-
var _statemine_nft = _interopRequireDefault(require("@subwallet/extension-base/koni/api/nft/statemine_nft"));
|
|
15
15
|
var _unique_network_nft = require("@subwallet/extension-base/koni/api/nft/unique_network_nft");
|
|
16
16
|
var _vara_nft = require("@subwallet/extension-base/koni/api/nft/vara_nft");
|
|
17
17
|
var _wasm_nft = require("@subwallet/extension-base/koni/api/nft/wasm_nft");
|
|
18
18
|
var _constants = require("@subwallet/extension-base/services/chain-service/constants");
|
|
19
19
|
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
20
20
|
var _utils2 = require("@subwallet/extension-base/utils");
|
|
21
|
-
var
|
|
21
|
+
var _assethub_nft = _interopRequireDefault(require("./assethub_nft"));
|
|
22
22
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
23
23
|
// SPDX-License-Identifier: Apache-2.0
|
|
24
24
|
|
|
@@ -27,21 +27,21 @@ var _statemint_nft = _interopRequireDefault(require("./statemint_nft"));
|
|
|
27
27
|
function createSubstrateNftApi(chain, substrateApi, addresses) {
|
|
28
28
|
const [substrateAddresses] = (0, _utils2.categoryAddresses)(addresses);
|
|
29
29
|
if (_constants._NFT_CHAIN_GROUP.acala.includes(chain)) {
|
|
30
|
-
return new _acala_nft.AcalaNftApi(substrateApi, substrateAddresses, chain);
|
|
30
|
+
return [new _acala_nft.AcalaNftApi(substrateApi, substrateAddresses, chain)];
|
|
31
31
|
} else if (_constants._NFT_CHAIN_GROUP.karura.includes(chain)) {
|
|
32
|
-
return new _karura_nft.KaruraNftApi(substrateApi, substrateAddresses, chain);
|
|
32
|
+
return [new _karura_nft.KaruraNftApi(substrateApi, substrateAddresses, chain)];
|
|
33
33
|
} else if (_constants._NFT_CHAIN_GROUP.rmrk.includes(chain)) {
|
|
34
|
-
return new _rmrk_nft.RmrkNftApi(substrateAddresses, chain);
|
|
34
|
+
return [new _rmrk_nft.RmrkNftApi(substrateAddresses, chain)];
|
|
35
35
|
} else if (_constants._NFT_CHAIN_GROUP.statemine.includes(chain)) {
|
|
36
|
-
return new
|
|
36
|
+
return [new _assethub_unique.default(substrateApi, substrateAddresses, chain), new _assethub_nft.default(substrateApi, substrateAddresses, chain)];
|
|
37
37
|
} else if (_constants._NFT_CHAIN_GROUP.statemint.includes(chain)) {
|
|
38
|
-
return new
|
|
38
|
+
return [new _assethub_unique.default(substrateApi, substrateAddresses, chain), new _assethub_nft.default(substrateApi, substrateAddresses, chain)];
|
|
39
39
|
} else if (_constants._NFT_CHAIN_GROUP.unique_network.includes(chain)) {
|
|
40
|
-
return new _unique_network_nft.UniqueNftApi(chain, substrateAddresses);
|
|
40
|
+
return [new _unique_network_nft.UniqueNftApi(chain, substrateAddresses)];
|
|
41
41
|
} else if (_constants._NFT_CHAIN_GROUP.bitcountry.includes(chain)) {
|
|
42
|
-
return new _bit.BitCountryNftApi(substrateApi, substrateAddresses, chain);
|
|
42
|
+
return [new _bit.BitCountryNftApi(substrateApi, substrateAddresses, chain)];
|
|
43
43
|
} else if (_constants._NFT_CHAIN_GROUP.vara.includes(chain)) {
|
|
44
|
-
return new _vara_nft.VaraNftApi(chain, substrateAddresses);
|
|
44
|
+
return [new _vara_nft.VaraNftApi(chain, substrateAddresses)];
|
|
45
45
|
}
|
|
46
46
|
return null;
|
|
47
47
|
}
|
|
@@ -114,9 +114,9 @@ class NftHandler {
|
|
|
114
114
|
let [chain, chainInfo] = _ref;
|
|
115
115
|
if ((0, _utils._isChainSupportNativeNft)(chainInfo)) {
|
|
116
116
|
if (this.substrateApiMap[chain]) {
|
|
117
|
-
const
|
|
118
|
-
if (
|
|
119
|
-
this.handlers.push(
|
|
117
|
+
const handlers = createSubstrateNftApi(chain, this.substrateApiMap[chain], substrateAddresses);
|
|
118
|
+
if (handlers && !!handlers.length) {
|
|
119
|
+
this.handlers.push(...handlers);
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
}
|
package/cjs/koni/api/nft/nft.js
CHANGED
|
@@ -4,12 +4,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.acalaGetExtrinsic = acalaGetExtrinsic;
|
|
7
|
+
exports.assetHubGetExtrinsic = assetHubGetExtrinsic;
|
|
7
8
|
exports.getNftTransferExtrinsic = getNftTransferExtrinsic;
|
|
8
9
|
exports.isRecipientSelf = isRecipientSelf;
|
|
9
10
|
exports.rmrkGetExtrinsic = rmrkGetExtrinsic;
|
|
10
|
-
exports.statemineGetExtrinsic = statemineGetExtrinsic;
|
|
11
|
-
exports.statemintGetExtrinsic = statemintGetExtrinsic;
|
|
12
11
|
exports.uniqueGetExtrinsic = uniqueGetExtrinsic;
|
|
12
|
+
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
13
13
|
var _config = require("@subwallet/extension-base/koni/api/nft/config");
|
|
14
14
|
var _utils = require("@subwallet/extension-base/utils");
|
|
15
15
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
@@ -64,21 +64,17 @@ async function uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress,
|
|
|
64
64
|
return null;
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
function
|
|
67
|
+
function assetHubGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
|
|
68
68
|
try {
|
|
69
69
|
const itemId = params.itemId;
|
|
70
70
|
const collectionId = params.collectionId;
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
const nftType = params.assetHubType;
|
|
72
|
+
if (nftType === _KoniTypes.AssetHubNftType.NFTS) {
|
|
73
|
+
return substrateApi.api.tx.nfts.transfer(collectionId, itemId, recipientAddress);
|
|
74
|
+
} else if (nftType === _KoniTypes.AssetHubNftType.UNIQUES) {
|
|
75
|
+
return substrateApi.api.tx.uniques.transfer(collectionId, itemId, recipientAddress);
|
|
76
|
+
}
|
|
74
77
|
return null;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
function statemintGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
|
|
78
|
-
try {
|
|
79
|
-
const itemId = params.itemId;
|
|
80
|
-
const collectionId = params.collectionId;
|
|
81
|
-
return substrateApi.api.tx.nfts.transfer(collectionId, itemId, recipientAddress);
|
|
82
78
|
} catch (e) {
|
|
83
79
|
console.error(e);
|
|
84
80
|
return null;
|
|
@@ -99,9 +95,9 @@ async function getNftTransferExtrinsic(networkKey, substrateApi, senderAddress,
|
|
|
99
95
|
case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.opal:
|
|
100
96
|
return await uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
101
97
|
case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.statemine:
|
|
102
|
-
return
|
|
98
|
+
return assetHubGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
103
99
|
case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.statemint:
|
|
104
|
-
return
|
|
100
|
+
return assetHubGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
105
101
|
case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.bitcountry:
|
|
106
102
|
return acalaGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
107
103
|
case _config.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.pioneer:
|
package/cjs/packageInfo.js
CHANGED
|
@@ -84,7 +84,8 @@ const _STAKING_ERA_LENGTH_MAP = {
|
|
|
84
84
|
shiden: 24,
|
|
85
85
|
shibuya: 24,
|
|
86
86
|
bifrost_testnet: 0.5,
|
|
87
|
-
bifrost:
|
|
87
|
+
bifrost: 13 * 600 / 3600,
|
|
88
|
+
// real blocktime of bifros ksm = 13s
|
|
88
89
|
bifrost_dot: 24,
|
|
89
90
|
ternoa: 24,
|
|
90
91
|
calamari: 6,
|
|
@@ -101,7 +102,8 @@ const _STAKING_ERA_LENGTH_MAP = {
|
|
|
101
102
|
goldberg_testnet: 24,
|
|
102
103
|
manta_network: 6,
|
|
103
104
|
krest_network: 4,
|
|
104
|
-
polimec: 6
|
|
105
|
+
polimec: 6,
|
|
106
|
+
enjin_relaychain: 24
|
|
105
107
|
};
|
|
106
108
|
exports._STAKING_ERA_LENGTH_MAP = _STAKING_ERA_LENGTH_MAP;
|
|
107
109
|
const _EXPECTED_BLOCK_TIME = {
|
|
@@ -119,7 +121,19 @@ const _EXPECTED_BLOCK_TIME = {
|
|
|
119
121
|
creditcoin: 12,
|
|
120
122
|
vara_network: 3,
|
|
121
123
|
goldberg_testnet: 20,
|
|
122
|
-
polimec: 12
|
|
124
|
+
polimec: 12,
|
|
125
|
+
bifrost: 13,
|
|
126
|
+
// expect 12 but actual 13
|
|
127
|
+
moonbeam: 12,
|
|
128
|
+
moonriver: 12,
|
|
129
|
+
moonbase: 6,
|
|
130
|
+
turing: 12,
|
|
131
|
+
turingStaging: 12,
|
|
132
|
+
bifrost_testnet: 3,
|
|
133
|
+
calamari: 12,
|
|
134
|
+
calamari_test: 12,
|
|
135
|
+
manta_network: 12,
|
|
136
|
+
enjin_relaychain: 6
|
|
123
137
|
};
|
|
124
138
|
exports._EXPECTED_BLOCK_TIME = _EXPECTED_BLOCK_TIME;
|
|
125
139
|
const _PARACHAIN_INFLATION_DISTRIBUTION = {
|
|
@@ -137,27 +137,25 @@ class AmplitudeNativeStakingPoolHandler extends _basePara.default {
|
|
|
137
137
|
});
|
|
138
138
|
}
|
|
139
139
|
if (hasUnstakingInfo) {
|
|
140
|
-
const
|
|
141
|
-
const
|
|
142
|
-
const
|
|
140
|
+
const [_currentBlock, _currentTimestamp] = await Promise.all([substrateApi.api.query.system.number(), substrateApi.api.query.timestamp.now()]);
|
|
141
|
+
const currentBlock = _currentBlock.toPrimitive();
|
|
142
|
+
const currentTimestamp = _currentTimestamp.toPrimitive();
|
|
143
143
|
const _blockPerRound = substrateApi.api.consts.parachainStaking.defaultBlocksPerRound.toString();
|
|
144
144
|
const blockPerRound = parseFloat(_blockPerRound);
|
|
145
145
|
for (const [unstakingBlock, unstakingAmount] of Object.entries(unstakingInfo)) {
|
|
146
146
|
const blockDuration = (_constants._STAKING_ERA_LENGTH_MAP[chainInfo.slug] || _constants._STAKING_ERA_LENGTH_MAP.default) / blockPerRound; // in hours
|
|
147
147
|
|
|
148
|
-
const isClaimable = parseInt(unstakingBlock) -
|
|
149
|
-
const remainingBlock = parseInt(unstakingBlock) -
|
|
148
|
+
const isClaimable = parseInt(unstakingBlock) - currentBlock <= 0;
|
|
149
|
+
const remainingBlock = parseInt(unstakingBlock) - currentBlock;
|
|
150
150
|
const waitingTime = remainingBlock * blockDuration;
|
|
151
|
-
|
|
152
|
-
// const targetTimestampMs = currentTimestampMs + waitingTime * 60 * 60 * 1000;
|
|
153
|
-
|
|
151
|
+
const targetTimestampMs = remainingBlock * blockDuration * 3600 * 1000 + currentTimestamp;
|
|
154
152
|
unstakingBalance = unstakingAmount.toString();
|
|
155
153
|
unstakingList.push({
|
|
156
154
|
chain: chainInfo.slug,
|
|
157
155
|
status: isClaimable ? _types.UnstakingStatus.CLAIMABLE : _types.UnstakingStatus.UNLOCKING,
|
|
158
156
|
claimable: unstakingAmount.toString(),
|
|
159
157
|
waitingTime,
|
|
160
|
-
|
|
158
|
+
targetTimestampMs: targetTimestampMs,
|
|
161
159
|
validatorAddress: undefined
|
|
162
160
|
});
|
|
163
161
|
}
|
|
@@ -144,7 +144,9 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
|
|
|
144
144
|
const roundInfo = _roundInfo.toPrimitive();
|
|
145
145
|
const currentRound = roundInfo.current;
|
|
146
146
|
await Promise.all(delegatorState.delegations.map(async delegation => {
|
|
147
|
-
const [_delegationScheduledRequests, [identity], _collatorInfo] = await Promise.all([substrateApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), (0, _utils2.parseIdentity)(substrateApi, delegation.owner), substrateApi.api.query.parachainStaking.candidateInfo(delegation.owner)]);
|
|
147
|
+
const [_delegationScheduledRequests, [identity], _collatorInfo, _currentBlock, _currentTimestamp] = await Promise.all([substrateApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), (0, _utils2.parseIdentity)(substrateApi, delegation.owner), substrateApi.api.query.parachainStaking.candidateInfo(delegation.owner), substrateApi.api.query.system.number(), substrateApi.api.query.timestamp.now()]);
|
|
148
|
+
const currentBlock = _currentBlock.toPrimitive();
|
|
149
|
+
const currentTimestamp = _currentTimestamp.toPrimitive();
|
|
148
150
|
const collatorInfo = _collatorInfo.toPrimitive();
|
|
149
151
|
const minDelegation = collatorInfo === null || collatorInfo === void 0 ? void 0 : collatorInfo.lowestTopDelegationAmount.toString();
|
|
150
152
|
const delegationScheduledRequests = _delegationScheduledRequests.toPrimitive();
|
|
@@ -156,22 +158,23 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
|
|
|
156
158
|
for (const scheduledRequest of delegationScheduledRequests) {
|
|
157
159
|
if ((0, _utils3.reformatAddress)(scheduledRequest.delegator, 0) === (0, _utils3.reformatAddress)(address, 0)) {
|
|
158
160
|
// add network prefix
|
|
159
|
-
const isClaimable = scheduledRequest.whenExecutable - currentRound <= 0;
|
|
160
|
-
const remainingEra = scheduledRequest.whenExecutable - currentRound;
|
|
161
|
+
const isClaimable = scheduledRequest.whenExecutable - parseInt(currentRound) <= 0;
|
|
162
|
+
const remainingEra = scheduledRequest.whenExecutable - parseInt(currentRound);
|
|
161
163
|
const waitingTime = remainingEra * _constants._STAKING_ERA_LENGTH_MAP[chainInfo.slug];
|
|
162
164
|
const claimable = Object.values(scheduledRequest.action)[0];
|
|
163
|
-
// const currentTimestampMs = Date.now();
|
|
164
|
-
// const targetTimestampMs = currentTimestampMs + waitingTime * 60 * 60 * 1000;
|
|
165
165
|
|
|
166
|
+
// noted: target timestamp in parachainStaking easily volatile if block time volatile
|
|
167
|
+
const targetBlock = remainingEra * parseInt(roundInfo.length) + parseInt(roundInfo.first);
|
|
168
|
+
const remainingBlock = targetBlock - currentBlock;
|
|
169
|
+
const targetTimestampMs = remainingBlock * _constants._EXPECTED_BLOCK_TIME[chainInfo.slug] * 1000 + currentTimestamp;
|
|
166
170
|
unstakingMap[delegation.owner] = {
|
|
167
171
|
chain: chainInfo.slug,
|
|
168
172
|
status: isClaimable ? _types.UnstakingStatus.CLAIMABLE : _types.UnstakingStatus.UNLOCKING,
|
|
169
173
|
validatorAddress: delegation.owner,
|
|
170
174
|
claimable: claimable.toString(),
|
|
171
|
-
waitingTime
|
|
172
|
-
|
|
175
|
+
waitingTime,
|
|
176
|
+
targetTimestampMs: targetTimestampMs
|
|
173
177
|
};
|
|
174
|
-
|
|
175
178
|
hasUnstaking = true;
|
|
176
179
|
break; // only handle 1 scheduledRequest per collator
|
|
177
180
|
}
|
|
@@ -166,11 +166,25 @@ class NominationPoolHandler extends _base.default {
|
|
|
166
166
|
if (nominations) {
|
|
167
167
|
const validatorList = nominations.targets;
|
|
168
168
|
await Promise.all(validatorList.map(async validatorAddress => {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
169
|
+
let sortedNominators = [];
|
|
170
|
+
if (['kusama'].includes(this.chain)) {
|
|
171
|
+
// todo: hot fix for kusama first, we'll review all relaychains later
|
|
172
|
+
const _eraStaker = await substrateApi.api.query.staking.erasStakersPaged.entries(currentEra, validatorAddress);
|
|
173
|
+
const eraStakerOtherList = [];
|
|
174
|
+
_eraStaker.forEach(paged => {
|
|
175
|
+
const pagedExposure = paged[1].toPrimitive();
|
|
176
|
+
eraStakerOtherList.push(...pagedExposure.others);
|
|
177
|
+
});
|
|
178
|
+
sortedNominators = eraStakerOtherList.sort((a, b) => {
|
|
179
|
+
return new _bignumber.default(b.value).minus(a.value).toNumber();
|
|
180
|
+
});
|
|
181
|
+
} else {
|
|
182
|
+
const _eraStaker = await substrateApi.api.query.staking.erasStakers(currentEra, validatorAddress);
|
|
183
|
+
const eraStaker = _eraStaker.toPrimitive();
|
|
184
|
+
sortedNominators = eraStaker.others.sort((a, b) => {
|
|
185
|
+
return new _bignumber.default(b.value).minus(a.value).toNumber();
|
|
186
|
+
});
|
|
187
|
+
}
|
|
174
188
|
const topNominators = sortedNominators.map(nominator => {
|
|
175
189
|
return nominator.who;
|
|
176
190
|
}).slice(0, unlimitedNominatorRewarded ? undefined : maxNominatorRewardedPerValidator);
|
|
@@ -404,7 +404,6 @@ class EarningService {
|
|
|
404
404
|
const removeKeys = [];
|
|
405
405
|
chains && chains.length > 0 && Object.entries(this.yieldPositionSubject.getValue()).forEach(_ref => {
|
|
406
406
|
let [key, value] = _ref;
|
|
407
|
-
console.log('removeYieldPositions', key, value.chain, chains.indexOf(value.chain) > -1);
|
|
408
407
|
if (chains.indexOf(value.chain) > -1 && !removeKeys.includes(key)) {
|
|
409
408
|
removeKeys.push(key);
|
|
410
409
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BaseNftApi, HandleNftParams } from '@subwallet/extension-base/koni/api/nft/nft';
|
|
2
2
|
import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
|
|
3
|
-
export default class
|
|
3
|
+
export default class AssetHubNftsPalletApi extends BaseNftApi {
|
|
4
4
|
constructor(api: _SubstrateApi | null, addresses: string[], chain: string);
|
|
5
5
|
private getMetadata;
|
|
6
6
|
/**
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
+
import { AssetHubNftType } from '@subwallet/extension-base/background/KoniTypes';
|
|
4
5
|
import { BaseNftApi } from '@subwallet/extension-base/koni/api/nft/nft';
|
|
5
6
|
import { isUrl } from '@subwallet/extension-base/utils';
|
|
6
7
|
import fetch from 'cross-fetch';
|
|
7
|
-
export default class
|
|
8
|
+
export default class AssetHubNftsPalletApi extends BaseNftApi {
|
|
8
9
|
// eslint-disable-next-line no-useless-constructor
|
|
9
10
|
constructor(api, addresses, chain) {
|
|
10
11
|
super(chain, api, addresses);
|
|
@@ -105,7 +106,8 @@ export default class StatemintNftApi extends BaseNftApi {
|
|
|
105
106
|
image: tokenInfo && tokenInfo.image ? this.parseUrl(tokenInfo === null || tokenInfo === void 0 ? void 0 : tokenInfo.image) : undefined,
|
|
106
107
|
collectionId: this.parseTokenId(parsedClassId),
|
|
107
108
|
chain: this.chain,
|
|
108
|
-
owner: address
|
|
109
|
+
owner: address,
|
|
110
|
+
assetHubType: AssetHubNftType.NFTS
|
|
109
111
|
};
|
|
110
112
|
params.updateItem(this.chain, parsedNft, address);
|
|
111
113
|
const parsedCollection = {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BaseNftApi, HandleNftParams } from '@subwallet/extension-base/koni/api/nft/nft';
|
|
2
2
|
import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
|
|
3
|
-
export default class
|
|
3
|
+
export default class AssetHubUniquesPalletApi extends BaseNftApi {
|
|
4
4
|
constructor(api: _SubstrateApi | null, addresses: string[], chain: string);
|
|
5
5
|
private getMetadata;
|
|
6
6
|
/**
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
+
import { AssetHubNftType } from '@subwallet/extension-base/background/KoniTypes';
|
|
4
5
|
import { BaseNftApi } from '@subwallet/extension-base/koni/api/nft/nft';
|
|
5
6
|
import { isUrl } from '@subwallet/extension-base/utils';
|
|
6
7
|
import fetch from 'cross-fetch';
|
|
7
|
-
export default class
|
|
8
|
+
export default class AssetHubUniquesPalletApi extends BaseNftApi {
|
|
8
9
|
// eslint-disable-next-line no-useless-constructor
|
|
9
10
|
constructor(api, addresses, chain) {
|
|
10
11
|
super(chain, api, addresses);
|
|
@@ -105,7 +106,8 @@ export default class StatemineNftApi extends BaseNftApi {
|
|
|
105
106
|
image: tokenInfo && tokenInfo.image ? this.parseUrl(tokenInfo === null || tokenInfo === void 0 ? void 0 : tokenInfo.image) : undefined,
|
|
106
107
|
collectionId: this.parseTokenId(parsedClassId),
|
|
107
108
|
chain: this.chain,
|
|
108
|
-
owner: address
|
|
109
|
+
owner: address,
|
|
110
|
+
assetHubType: AssetHubNftType.UNIQUES
|
|
109
111
|
};
|
|
110
112
|
params.updateItem(this.chain, parsedNft, address);
|
|
111
113
|
const parsedCollection = {
|
package/koni/api/nft/index.js
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
import { AcalaNftApi } from '@subwallet/extension-base/koni/api/nft/acala_nft';
|
|
5
|
+
import AssetHubUniquesPalletApi from '@subwallet/extension-base/koni/api/nft/assethub_unique';
|
|
5
6
|
import { BitCountryNftApi } from '@subwallet/extension-base/koni/api/nft/bit.country';
|
|
6
7
|
import { EvmNftApi } from '@subwallet/extension-base/koni/api/nft/evm_nft';
|
|
7
8
|
import { KaruraNftApi } from '@subwallet/extension-base/koni/api/nft/karura_nft';
|
|
8
9
|
import OrdinalNftApi from '@subwallet/extension-base/koni/api/nft/ordinal_nft';
|
|
9
10
|
import { RmrkNftApi } from '@subwallet/extension-base/koni/api/nft/rmrk_nft';
|
|
10
|
-
import StatemineNftApi from '@subwallet/extension-base/koni/api/nft/statemine_nft';
|
|
11
11
|
import { UniqueNftApi } from '@subwallet/extension-base/koni/api/nft/unique_network_nft';
|
|
12
12
|
// import UniqueNftApi from '@subwallet/extension-base/koni/api/nft/unique_nft';
|
|
13
13
|
import { VaraNftApi } from '@subwallet/extension-base/koni/api/nft/vara_nft';
|
|
@@ -15,25 +15,25 @@ import { WasmNftApi } from '@subwallet/extension-base/koni/api/nft/wasm_nft';
|
|
|
15
15
|
import { _NFT_CHAIN_GROUP } from '@subwallet/extension-base/services/chain-service/constants';
|
|
16
16
|
import { _isChainSupportEvmNft, _isChainSupportNativeNft, _isChainSupportWasmNft, _isSupportOrdinal } from '@subwallet/extension-base/services/chain-service/utils';
|
|
17
17
|
import { categoryAddresses, targetIsWeb } from '@subwallet/extension-base/utils';
|
|
18
|
-
import
|
|
18
|
+
import AssetHubNftsPalletApi from "./assethub_nft/index.js";
|
|
19
19
|
function createSubstrateNftApi(chain, substrateApi, addresses) {
|
|
20
20
|
const [substrateAddresses] = categoryAddresses(addresses);
|
|
21
21
|
if (_NFT_CHAIN_GROUP.acala.includes(chain)) {
|
|
22
|
-
return new AcalaNftApi(substrateApi, substrateAddresses, chain);
|
|
22
|
+
return [new AcalaNftApi(substrateApi, substrateAddresses, chain)];
|
|
23
23
|
} else if (_NFT_CHAIN_GROUP.karura.includes(chain)) {
|
|
24
|
-
return new KaruraNftApi(substrateApi, substrateAddresses, chain);
|
|
24
|
+
return [new KaruraNftApi(substrateApi, substrateAddresses, chain)];
|
|
25
25
|
} else if (_NFT_CHAIN_GROUP.rmrk.includes(chain)) {
|
|
26
|
-
return new RmrkNftApi(substrateAddresses, chain);
|
|
26
|
+
return [new RmrkNftApi(substrateAddresses, chain)];
|
|
27
27
|
} else if (_NFT_CHAIN_GROUP.statemine.includes(chain)) {
|
|
28
|
-
return new
|
|
28
|
+
return [new AssetHubUniquesPalletApi(substrateApi, substrateAddresses, chain), new AssetHubNftsPalletApi(substrateApi, substrateAddresses, chain)];
|
|
29
29
|
} else if (_NFT_CHAIN_GROUP.statemint.includes(chain)) {
|
|
30
|
-
return new
|
|
30
|
+
return [new AssetHubUniquesPalletApi(substrateApi, substrateAddresses, chain), new AssetHubNftsPalletApi(substrateApi, substrateAddresses, chain)];
|
|
31
31
|
} else if (_NFT_CHAIN_GROUP.unique_network.includes(chain)) {
|
|
32
|
-
return new UniqueNftApi(chain, substrateAddresses);
|
|
32
|
+
return [new UniqueNftApi(chain, substrateAddresses)];
|
|
33
33
|
} else if (_NFT_CHAIN_GROUP.bitcountry.includes(chain)) {
|
|
34
|
-
return new BitCountryNftApi(substrateApi, substrateAddresses, chain);
|
|
34
|
+
return [new BitCountryNftApi(substrateApi, substrateAddresses, chain)];
|
|
35
35
|
} else if (_NFT_CHAIN_GROUP.vara.includes(chain)) {
|
|
36
|
-
return new VaraNftApi(chain, substrateAddresses);
|
|
36
|
+
return [new VaraNftApi(chain, substrateAddresses)];
|
|
37
37
|
}
|
|
38
38
|
return null;
|
|
39
39
|
}
|
|
@@ -105,9 +105,9 @@ export class NftHandler {
|
|
|
105
105
|
Object.entries(this.chainInfoMap).forEach(([chain, chainInfo]) => {
|
|
106
106
|
if (_isChainSupportNativeNft(chainInfo)) {
|
|
107
107
|
if (this.substrateApiMap[chain]) {
|
|
108
|
-
const
|
|
109
|
-
if (
|
|
110
|
-
this.handlers.push(
|
|
108
|
+
const handlers = createSubstrateNftApi(chain, this.substrateApiMap[chain], substrateAddresses);
|
|
109
|
+
if (handlers && !!handlers.length) {
|
|
110
|
+
this.handlers.push(...handlers);
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
}
|
package/koni/api/nft/nft.js
CHANGED
|
@@ -3,6 +3,5 @@ export declare function isRecipientSelf(currentAddress: string, recipientAddress
|
|
|
3
3
|
export declare function acalaGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
|
4
4
|
export declare function rmrkGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
|
5
5
|
export declare function uniqueGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): Promise<import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null>;
|
|
6
|
-
export declare function
|
|
7
|
-
export declare function statemintGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
|
6
|
+
export declare function assetHubGetExtrinsic(substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null;
|
|
8
7
|
export declare function getNftTransferExtrinsic(networkKey: string, substrateApi: _SubstrateApi, senderAddress: string, recipientAddress: string, params: Record<string, any>): Promise<import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult> | null>;
|
package/koni/api/nft/transfer.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
+
import { AssetHubNftType } from '@subwallet/extension-base/background/KoniTypes';
|
|
4
5
|
import { SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME } from '@subwallet/extension-base/koni/api/nft/config';
|
|
5
6
|
import { reformatAddress } from '@subwallet/extension-base/utils';
|
|
6
7
|
export function isRecipientSelf(currentAddress, recipientAddress) {
|
|
@@ -52,21 +53,17 @@ export async function uniqueGetExtrinsic(substrateApi, senderAddress, recipientA
|
|
|
52
53
|
return null;
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
|
-
export function
|
|
56
|
+
export function assetHubGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
|
|
56
57
|
try {
|
|
57
58
|
const itemId = params.itemId;
|
|
58
59
|
const collectionId = params.collectionId;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
const nftType = params.assetHubType;
|
|
61
|
+
if (nftType === AssetHubNftType.NFTS) {
|
|
62
|
+
return substrateApi.api.tx.nfts.transfer(collectionId, itemId, recipientAddress);
|
|
63
|
+
} else if (nftType === AssetHubNftType.UNIQUES) {
|
|
64
|
+
return substrateApi.api.tx.uniques.transfer(collectionId, itemId, recipientAddress);
|
|
65
|
+
}
|
|
62
66
|
return null;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
export function statemintGetExtrinsic(substrateApi, senderAddress, recipientAddress, params) {
|
|
66
|
-
try {
|
|
67
|
-
const itemId = params.itemId;
|
|
68
|
-
const collectionId = params.collectionId;
|
|
69
|
-
return substrateApi.api.tx.nfts.transfer(collectionId, itemId, recipientAddress);
|
|
70
67
|
} catch (e) {
|
|
71
68
|
console.error(e);
|
|
72
69
|
return null;
|
|
@@ -87,9 +84,9 @@ export async function getNftTransferExtrinsic(networkKey, substrateApi, senderAd
|
|
|
87
84
|
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.opal:
|
|
88
85
|
return await uniqueGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
89
86
|
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.statemine:
|
|
90
|
-
return
|
|
87
|
+
return assetHubGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
91
88
|
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.statemint:
|
|
92
|
-
return
|
|
89
|
+
return assetHubGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
93
90
|
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.bitcountry:
|
|
94
91
|
return acalaGetExtrinsic(substrateApi, senderAddress, recipientAddress, params);
|
|
95
92
|
case SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME.pioneer:
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"./cjs/detectPackage.js"
|
|
18
18
|
],
|
|
19
19
|
"type": "module",
|
|
20
|
-
"version": "1.1.
|
|
20
|
+
"version": "1.1.56-0",
|
|
21
21
|
"main": "./cjs/index.js",
|
|
22
22
|
"module": "./index.js",
|
|
23
23
|
"types": "./index.d.ts",
|
|
@@ -204,6 +204,16 @@
|
|
|
204
204
|
"require": "./cjs/koni/api/nft/acala_nft/index.js",
|
|
205
205
|
"default": "./koni/api/nft/acala_nft/index.js"
|
|
206
206
|
},
|
|
207
|
+
"./koni/api/nft/assethub_nft": {
|
|
208
|
+
"types": "./koni/api/nft/assethub_nft/index.d.ts",
|
|
209
|
+
"require": "./cjs/koni/api/nft/assethub_nft/index.js",
|
|
210
|
+
"default": "./koni/api/nft/assethub_nft/index.js"
|
|
211
|
+
},
|
|
212
|
+
"./koni/api/nft/assethub_unique": {
|
|
213
|
+
"types": "./koni/api/nft/assethub_unique/index.d.ts",
|
|
214
|
+
"require": "./cjs/koni/api/nft/assethub_unique/index.js",
|
|
215
|
+
"default": "./koni/api/nft/assethub_unique/index.js"
|
|
216
|
+
},
|
|
207
217
|
"./koni/api/nft/bit.country": {
|
|
208
218
|
"types": "./koni/api/nft/bit.country/index.d.ts",
|
|
209
219
|
"require": "./cjs/koni/api/nft/bit.country/index.js",
|
|
@@ -254,16 +264,6 @@
|
|
|
254
264
|
"require": "./cjs/koni/api/nft/rmrk_nft/index.js",
|
|
255
265
|
"default": "./koni/api/nft/rmrk_nft/index.js"
|
|
256
266
|
},
|
|
257
|
-
"./koni/api/nft/statemine_nft": {
|
|
258
|
-
"types": "./koni/api/nft/statemine_nft/index.d.ts",
|
|
259
|
-
"require": "./cjs/koni/api/nft/statemine_nft/index.js",
|
|
260
|
-
"default": "./koni/api/nft/statemine_nft/index.js"
|
|
261
|
-
},
|
|
262
|
-
"./koni/api/nft/statemint_nft": {
|
|
263
|
-
"types": "./koni/api/nft/statemint_nft/index.d.ts",
|
|
264
|
-
"require": "./cjs/koni/api/nft/statemint_nft/index.js",
|
|
265
|
-
"default": "./koni/api/nft/statemint_nft/index.js"
|
|
266
|
-
},
|
|
267
267
|
"./koni/api/nft/transfer": {
|
|
268
268
|
"types": "./koni/api/nft/transfer.d.ts",
|
|
269
269
|
"require": "./cjs/koni/api/nft/transfer.js",
|
|
@@ -1856,28 +1856,28 @@
|
|
|
1856
1856
|
"@metamask/safe-event-emitter": "^2.0.0",
|
|
1857
1857
|
"@metaverse-network-sdk/type-definitions": "^0.0.1-13",
|
|
1858
1858
|
"@oak-foundation/types": "^0.0.23",
|
|
1859
|
-
"@polkadot/api": "^10.
|
|
1859
|
+
"@polkadot/api": "^10.12.4",
|
|
1860
1860
|
"@polkadot/api-base": "^10.11.2",
|
|
1861
|
-
"@polkadot/api-contract": "^10.
|
|
1862
|
-
"@polkadot/api-derive": "^10.
|
|
1863
|
-
"@polkadot/apps-config": "^0.
|
|
1861
|
+
"@polkadot/api-contract": "^10.12.4",
|
|
1862
|
+
"@polkadot/api-derive": "^10.12.4",
|
|
1863
|
+
"@polkadot/apps-config": "^0.135.1",
|
|
1864
1864
|
"@polkadot/hw-ledger": "^12.6.2",
|
|
1865
1865
|
"@polkadot/networks": "^12.6.2",
|
|
1866
|
-
"@polkadot/phishing": "^0.22.
|
|
1867
|
-
"@polkadot/rpc-provider": "^10.
|
|
1868
|
-
"@polkadot/types": "^10.
|
|
1869
|
-
"@polkadot/types-augment": "^10.
|
|
1870
|
-
"@polkadot/ui-settings": "^3.6.
|
|
1866
|
+
"@polkadot/phishing": "^0.22.4",
|
|
1867
|
+
"@polkadot/rpc-provider": "^10.12.4",
|
|
1868
|
+
"@polkadot/types": "^10.12.4",
|
|
1869
|
+
"@polkadot/types-augment": "^10.12.4",
|
|
1870
|
+
"@polkadot/ui-settings": "^3.6.5",
|
|
1871
1871
|
"@polkadot/util": "^12.6.2",
|
|
1872
1872
|
"@polkadot/util-crypto": "^12.6.2",
|
|
1873
1873
|
"@reduxjs/toolkit": "^1.9.1",
|
|
1874
1874
|
"@sora-substrate/type-definitions": "^1.17.7",
|
|
1875
|
-
"@substrate/connect": "^0.
|
|
1876
|
-
"@subwallet/chain-list": "0.2.
|
|
1877
|
-
"@subwallet/extension-base": "^1.1.
|
|
1878
|
-
"@subwallet/extension-chains": "^1.1.
|
|
1879
|
-
"@subwallet/extension-dapp": "^1.1.
|
|
1880
|
-
"@subwallet/extension-inject": "^1.1.
|
|
1875
|
+
"@substrate/connect": "^0.8.9",
|
|
1876
|
+
"@subwallet/chain-list": "0.2.56",
|
|
1877
|
+
"@subwallet/extension-base": "^1.1.56-0",
|
|
1878
|
+
"@subwallet/extension-chains": "^1.1.56-0",
|
|
1879
|
+
"@subwallet/extension-dapp": "^1.1.56-0",
|
|
1880
|
+
"@subwallet/extension-inject": "^1.1.56-0",
|
|
1881
1881
|
"@subwallet/keyring": "^0.1.5",
|
|
1882
1882
|
"@subwallet/ui-keyring": "^0.1.5",
|
|
1883
1883
|
"@walletconnect/sign-client": "^2.8.4",
|
package/packageInfo.js
CHANGED
|
@@ -7,5 +7,5 @@ export const packageInfo = {
|
|
|
7
7
|
name: '@subwallet/extension-base',
|
|
8
8
|
path: (import.meta && import.meta.url) ? new URL(import.meta.url).pathname.substring(0, new URL(import.meta.url).pathname.lastIndexOf('/') + 1) : 'auto',
|
|
9
9
|
type: 'esm',
|
|
10
|
-
version: '1.1.
|
|
10
|
+
version: '1.1.56-0'
|
|
11
11
|
};
|
|
@@ -71,7 +71,8 @@ export const _STAKING_ERA_LENGTH_MAP = {
|
|
|
71
71
|
shiden: 24,
|
|
72
72
|
shibuya: 24,
|
|
73
73
|
bifrost_testnet: 0.5,
|
|
74
|
-
bifrost:
|
|
74
|
+
bifrost: 13 * 600 / 3600,
|
|
75
|
+
// real blocktime of bifros ksm = 13s
|
|
75
76
|
bifrost_dot: 24,
|
|
76
77
|
ternoa: 24,
|
|
77
78
|
calamari: 6,
|
|
@@ -88,7 +89,8 @@ export const _STAKING_ERA_LENGTH_MAP = {
|
|
|
88
89
|
goldberg_testnet: 24,
|
|
89
90
|
manta_network: 6,
|
|
90
91
|
krest_network: 4,
|
|
91
|
-
polimec: 6
|
|
92
|
+
polimec: 6,
|
|
93
|
+
enjin_relaychain: 24
|
|
92
94
|
};
|
|
93
95
|
export const _EXPECTED_BLOCK_TIME = {
|
|
94
96
|
// in seconds
|
|
@@ -105,7 +107,19 @@ export const _EXPECTED_BLOCK_TIME = {
|
|
|
105
107
|
creditcoin: 12,
|
|
106
108
|
vara_network: 3,
|
|
107
109
|
goldberg_testnet: 20,
|
|
108
|
-
polimec: 12
|
|
110
|
+
polimec: 12,
|
|
111
|
+
bifrost: 13,
|
|
112
|
+
// expect 12 but actual 13
|
|
113
|
+
moonbeam: 12,
|
|
114
|
+
moonriver: 12,
|
|
115
|
+
moonbase: 6,
|
|
116
|
+
turing: 12,
|
|
117
|
+
turingStaging: 12,
|
|
118
|
+
bifrost_testnet: 3,
|
|
119
|
+
calamari: 12,
|
|
120
|
+
calamari_test: 12,
|
|
121
|
+
manta_network: 12,
|
|
122
|
+
enjin_relaychain: 6
|
|
109
123
|
};
|
|
110
124
|
export const _PARACHAIN_INFLATION_DISTRIBUTION = {
|
|
111
125
|
moonbeam: {
|
|
@@ -130,27 +130,25 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
|
|
|
130
130
|
});
|
|
131
131
|
}
|
|
132
132
|
if (hasUnstakingInfo) {
|
|
133
|
-
const
|
|
134
|
-
const
|
|
135
|
-
const
|
|
133
|
+
const [_currentBlock, _currentTimestamp] = await Promise.all([substrateApi.api.query.system.number(), substrateApi.api.query.timestamp.now()]);
|
|
134
|
+
const currentBlock = _currentBlock.toPrimitive();
|
|
135
|
+
const currentTimestamp = _currentTimestamp.toPrimitive();
|
|
136
136
|
const _blockPerRound = substrateApi.api.consts.parachainStaking.defaultBlocksPerRound.toString();
|
|
137
137
|
const blockPerRound = parseFloat(_blockPerRound);
|
|
138
138
|
for (const [unstakingBlock, unstakingAmount] of Object.entries(unstakingInfo)) {
|
|
139
139
|
const blockDuration = (_STAKING_ERA_LENGTH_MAP[chainInfo.slug] || _STAKING_ERA_LENGTH_MAP.default) / blockPerRound; // in hours
|
|
140
140
|
|
|
141
|
-
const isClaimable = parseInt(unstakingBlock) -
|
|
142
|
-
const remainingBlock = parseInt(unstakingBlock) -
|
|
141
|
+
const isClaimable = parseInt(unstakingBlock) - currentBlock <= 0;
|
|
142
|
+
const remainingBlock = parseInt(unstakingBlock) - currentBlock;
|
|
143
143
|
const waitingTime = remainingBlock * blockDuration;
|
|
144
|
-
|
|
145
|
-
// const targetTimestampMs = currentTimestampMs + waitingTime * 60 * 60 * 1000;
|
|
146
|
-
|
|
144
|
+
const targetTimestampMs = remainingBlock * blockDuration * 3600 * 1000 + currentTimestamp;
|
|
147
145
|
unstakingBalance = unstakingAmount.toString();
|
|
148
146
|
unstakingList.push({
|
|
149
147
|
chain: chainInfo.slug,
|
|
150
148
|
status: isClaimable ? UnstakingStatus.CLAIMABLE : UnstakingStatus.UNLOCKING,
|
|
151
149
|
claimable: unstakingAmount.toString(),
|
|
152
150
|
waitingTime,
|
|
153
|
-
|
|
151
|
+
targetTimestampMs: targetTimestampMs,
|
|
154
152
|
validatorAddress: undefined
|
|
155
153
|
});
|
|
156
154
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
|
|
5
5
|
import { BasicTxErrorType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
6
6
|
import { getBondedValidators, getEarningStatusByNominations, getParaCurrentInflation, isUnstakeAll } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
|
|
7
|
-
import { _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
|
|
7
|
+
import { _EXPECTED_BLOCK_TIME, _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
|
|
8
8
|
import { _STAKING_CHAIN_GROUP, MANTA_MIN_DELEGATION, MANTA_VALIDATOR_POINTS_PER_BLOCK } from '@subwallet/extension-base/services/earning-service/constants';
|
|
9
9
|
import { parseIdentity } from '@subwallet/extension-base/services/earning-service/utils';
|
|
10
10
|
import { EarningStatus, UnstakingStatus } from '@subwallet/extension-base/types';
|
|
@@ -137,7 +137,9 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
|
|
|
137
137
|
const roundInfo = _roundInfo.toPrimitive();
|
|
138
138
|
const currentRound = roundInfo.current;
|
|
139
139
|
await Promise.all(delegatorState.delegations.map(async delegation => {
|
|
140
|
-
const [_delegationScheduledRequests, [identity], _collatorInfo] = await Promise.all([substrateApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), parseIdentity(substrateApi, delegation.owner), substrateApi.api.query.parachainStaking.candidateInfo(delegation.owner)]);
|
|
140
|
+
const [_delegationScheduledRequests, [identity], _collatorInfo, _currentBlock, _currentTimestamp] = await Promise.all([substrateApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), parseIdentity(substrateApi, delegation.owner), substrateApi.api.query.parachainStaking.candidateInfo(delegation.owner), substrateApi.api.query.system.number(), substrateApi.api.query.timestamp.now()]);
|
|
141
|
+
const currentBlock = _currentBlock.toPrimitive();
|
|
142
|
+
const currentTimestamp = _currentTimestamp.toPrimitive();
|
|
141
143
|
const collatorInfo = _collatorInfo.toPrimitive();
|
|
142
144
|
const minDelegation = collatorInfo === null || collatorInfo === void 0 ? void 0 : collatorInfo.lowestTopDelegationAmount.toString();
|
|
143
145
|
const delegationScheduledRequests = _delegationScheduledRequests.toPrimitive();
|
|
@@ -149,22 +151,23 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
|
|
|
149
151
|
for (const scheduledRequest of delegationScheduledRequests) {
|
|
150
152
|
if (reformatAddress(scheduledRequest.delegator, 0) === reformatAddress(address, 0)) {
|
|
151
153
|
// add network prefix
|
|
152
|
-
const isClaimable = scheduledRequest.whenExecutable - currentRound <= 0;
|
|
153
|
-
const remainingEra = scheduledRequest.whenExecutable - currentRound;
|
|
154
|
+
const isClaimable = scheduledRequest.whenExecutable - parseInt(currentRound) <= 0;
|
|
155
|
+
const remainingEra = scheduledRequest.whenExecutable - parseInt(currentRound);
|
|
154
156
|
const waitingTime = remainingEra * _STAKING_ERA_LENGTH_MAP[chainInfo.slug];
|
|
155
157
|
const claimable = Object.values(scheduledRequest.action)[0];
|
|
156
|
-
// const currentTimestampMs = Date.now();
|
|
157
|
-
// const targetTimestampMs = currentTimestampMs + waitingTime * 60 * 60 * 1000;
|
|
158
158
|
|
|
159
|
+
// noted: target timestamp in parachainStaking easily volatile if block time volatile
|
|
160
|
+
const targetBlock = remainingEra * parseInt(roundInfo.length) + parseInt(roundInfo.first);
|
|
161
|
+
const remainingBlock = targetBlock - currentBlock;
|
|
162
|
+
const targetTimestampMs = remainingBlock * _EXPECTED_BLOCK_TIME[chainInfo.slug] * 1000 + currentTimestamp;
|
|
159
163
|
unstakingMap[delegation.owner] = {
|
|
160
164
|
chain: chainInfo.slug,
|
|
161
165
|
status: isClaimable ? UnstakingStatus.CLAIMABLE : UnstakingStatus.UNLOCKING,
|
|
162
166
|
validatorAddress: delegation.owner,
|
|
163
167
|
claimable: claimable.toString(),
|
|
164
|
-
waitingTime
|
|
165
|
-
|
|
168
|
+
waitingTime,
|
|
169
|
+
targetTimestampMs: targetTimestampMs
|
|
166
170
|
};
|
|
167
|
-
|
|
168
171
|
hasUnstaking = true;
|
|
169
172
|
break; // only handle 1 scheduledRequest per collator
|
|
170
173
|
}
|
|
@@ -158,11 +158,25 @@ export default class NominationPoolHandler extends BasePoolHandler {
|
|
|
158
158
|
if (nominations) {
|
|
159
159
|
const validatorList = nominations.targets;
|
|
160
160
|
await Promise.all(validatorList.map(async validatorAddress => {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
161
|
+
let sortedNominators = [];
|
|
162
|
+
if (['kusama'].includes(this.chain)) {
|
|
163
|
+
// todo: hot fix for kusama first, we'll review all relaychains later
|
|
164
|
+
const _eraStaker = await substrateApi.api.query.staking.erasStakersPaged.entries(currentEra, validatorAddress);
|
|
165
|
+
const eraStakerOtherList = [];
|
|
166
|
+
_eraStaker.forEach(paged => {
|
|
167
|
+
const pagedExposure = paged[1].toPrimitive();
|
|
168
|
+
eraStakerOtherList.push(...pagedExposure.others);
|
|
169
|
+
});
|
|
170
|
+
sortedNominators = eraStakerOtherList.sort((a, b) => {
|
|
171
|
+
return new BigN(b.value).minus(a.value).toNumber();
|
|
172
|
+
});
|
|
173
|
+
} else {
|
|
174
|
+
const _eraStaker = await substrateApi.api.query.staking.erasStakers(currentEra, validatorAddress);
|
|
175
|
+
const eraStaker = _eraStaker.toPrimitive();
|
|
176
|
+
sortedNominators = eraStaker.others.sort((a, b) => {
|
|
177
|
+
return new BigN(b.value).minus(a.value).toNumber();
|
|
178
|
+
});
|
|
179
|
+
}
|
|
166
180
|
const topNominators = sortedNominators.map(nominator => {
|
|
167
181
|
return nominator.who;
|
|
168
182
|
}).slice(0, unlimitedNominatorRewarded ? undefined : maxNominatorRewardedPerValidator);
|
|
@@ -396,7 +396,6 @@ export default class EarningService {
|
|
|
396
396
|
async removeYieldPositions(chains, addresses) {
|
|
397
397
|
const removeKeys = [];
|
|
398
398
|
chains && chains.length > 0 && Object.entries(this.yieldPositionSubject.getValue()).forEach(([key, value]) => {
|
|
399
|
-
console.log('removeYieldPositions', key, value.chain, chains.indexOf(value.chain) > -1);
|
|
400
399
|
if (chains.indexOf(value.chain) > -1 && !removeKeys.includes(key)) {
|
|
401
400
|
removeKeys.push(key);
|
|
402
401
|
}
|
|
@@ -9,6 +9,10 @@ export interface PalletStakingExposureItem {
|
|
|
9
9
|
who: string;
|
|
10
10
|
value: number;
|
|
11
11
|
}
|
|
12
|
+
export interface SpStakingExposurePage {
|
|
13
|
+
pageTotal: number;
|
|
14
|
+
others: PalletStakingExposureItem[];
|
|
15
|
+
}
|
|
12
16
|
export interface PalletStakingExposure {
|
|
13
17
|
total: number;
|
|
14
18
|
own: number;
|