@subwallet/extension-base 1.0.2-2 → 1.0.2-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/background/KoniTypes.d.ts +46 -38
  2. package/background/KoniTypes.js +8 -8
  3. package/background/errors/TransactionError.js +25 -1
  4. package/background/types.d.ts +10 -5
  5. package/cjs/background/KoniTypes.js +8 -8
  6. package/cjs/background/errors/TransactionError.js +24 -0
  7. package/cjs/constants/index.js +8 -26
  8. package/cjs/koni/api/dotsama/balance.js +49 -224
  9. package/cjs/koni/api/dotsama/transfer.js +34 -39
  10. package/cjs/koni/api/nft/acala_nft/index.js +7 -7
  11. package/cjs/koni/api/nft/bit.country/index.js +7 -6
  12. package/cjs/koni/api/nft/evm_nft/index.js +8 -3
  13. package/cjs/koni/api/nft/index.js +3 -6
  14. package/cjs/koni/api/nft/karura_nft/index.js +7 -6
  15. package/cjs/koni/api/nft/rmrk_nft/index.js +11 -1
  16. package/cjs/koni/api/nft/statemine_nft/index.js +7 -6
  17. package/cjs/koni/api/nft/unique_nft/index.js +5 -1
  18. package/cjs/koni/api/nft/wasm_nft/index.js +170 -111
  19. package/cjs/koni/api/nft/wasm_nft/utils.js +11 -7
  20. package/cjs/koni/api/staking/bonding/amplitude.js +13 -9
  21. package/cjs/koni/api/staking/bonding/astar.js +15 -13
  22. package/cjs/koni/api/staking/bonding/index.js +22 -10
  23. package/cjs/koni/api/staking/bonding/paraChain.js +85 -2
  24. package/cjs/koni/api/staking/bonding/relayChain.js +122 -16
  25. package/cjs/koni/api/staking/bonding/utils.js +27 -8
  26. package/cjs/koni/api/tokens/wasm/index.js +5 -4
  27. package/cjs/koni/api/tokens/wasm/utils.js +63 -0
  28. package/cjs/koni/api/xcm/polkadotXcm.js +1 -1
  29. package/cjs/koni/api/xcm/utils.js +18 -13
  30. package/cjs/koni/api/xcm/xTokens.js +1 -1
  31. package/cjs/koni/api/xcm/xcmPallet.js +9 -6
  32. package/cjs/koni/background/cron.js +171 -61
  33. package/cjs/koni/background/handlers/Extension.js +382 -207
  34. package/cjs/koni/background/handlers/State.js +41 -33
  35. package/cjs/koni/background/handlers/Tabs.js +50 -17
  36. package/cjs/koni/background/subscription.js +32 -29
  37. package/cjs/packageInfo.js +1 -1
  38. package/cjs/services/chain-service/handler/SubstrateChainHandler.js +13 -8
  39. package/cjs/services/chain-service/index.js +59 -45
  40. package/cjs/services/event-service/index.js +5 -1
  41. package/cjs/services/event-service/types.js +11 -1
  42. package/cjs/services/history-service/index.js +19 -13
  43. package/cjs/services/history-service/subsquid-multi-chain-history.js +13 -10
  44. package/cjs/services/keyring-service/index.js +11 -13
  45. package/cjs/services/price-service/coingecko.js +0 -1
  46. package/cjs/services/price-service/index.js +2 -3
  47. package/cjs/services/request-service/handler/AuthRequestHandler.js +13 -7
  48. package/cjs/services/request-service/handler/EvmRequestHandler.js +8 -12
  49. package/cjs/services/request-service/index.js +14 -5
  50. package/cjs/services/storage-service/DatabaseService.js +56 -34
  51. package/cjs/services/storage-service/db-stores/Nft.js +7 -15
  52. package/cjs/services/transaction-service/event-parser/index.js +20 -48
  53. package/cjs/services/transaction-service/index.js +26 -15
  54. package/cjs/utils/address.js +10 -1
  55. package/cjs/utils/index.js +9 -15
  56. package/constants/index.d.ts +7 -13
  57. package/constants/index.js +7 -13
  58. package/koni/api/dotsama/balance.d.ts +0 -1
  59. package/koni/api/dotsama/balance.js +22 -197
  60. package/koni/api/dotsama/transfer.js +11 -16
  61. package/koni/api/nft/acala_nft/index.js +7 -7
  62. package/koni/api/nft/bit.country/index.js +7 -6
  63. package/koni/api/nft/evm_nft/index.js +7 -3
  64. package/koni/api/nft/index.d.ts +1 -2
  65. package/koni/api/nft/index.js +3 -6
  66. package/koni/api/nft/karura_nft/index.js +7 -6
  67. package/koni/api/nft/nft.d.ts +1 -0
  68. package/koni/api/nft/rmrk_nft/index.js +11 -1
  69. package/koni/api/nft/statemine_nft/index.js +7 -6
  70. package/koni/api/nft/unique_nft/index.js +5 -1
  71. package/koni/api/nft/wasm_nft/index.d.ts +0 -2
  72. package/koni/api/nft/wasm_nft/index.js +168 -109
  73. package/koni/api/nft/wasm_nft/utils.d.ts +7 -5
  74. package/koni/api/nft/wasm_nft/utils.js +7 -5
  75. package/koni/api/staking/bonding/amplitude.d.ts +0 -1
  76. package/koni/api/staking/bonding/amplitude.js +15 -10
  77. package/koni/api/staking/bonding/astar.js +8 -6
  78. package/koni/api/staking/bonding/index.d.ts +4 -1
  79. package/koni/api/staking/bonding/index.js +23 -13
  80. package/koni/api/staking/bonding/paraChain.d.ts +3 -0
  81. package/koni/api/staking/bonding/paraChain.js +86 -5
  82. package/koni/api/staking/bonding/relayChain.d.ts +5 -1
  83. package/koni/api/staking/bonding/relayChain.js +121 -18
  84. package/koni/api/staking/bonding/utils.d.ts +3 -2
  85. package/koni/api/staking/bonding/utils.js +27 -9
  86. package/koni/api/tokens/wasm/index.js +5 -4
  87. package/koni/api/tokens/wasm/utils.d.ts +6 -0
  88. package/koni/api/tokens/wasm/utils.js +54 -0
  89. package/koni/api/xcm/polkadotXcm.js +2 -2
  90. package/koni/api/xcm/utils.d.ts +5 -6
  91. package/koni/api/xcm/utils.js +15 -10
  92. package/koni/api/xcm/xTokens.js +2 -2
  93. package/koni/api/xcm/xcmPallet.js +10 -9
  94. package/koni/background/cron.d.ts +6 -1
  95. package/koni/background/cron.js +172 -62
  96. package/koni/background/handlers/Extension.d.ts +8 -3
  97. package/koni/background/handlers/Extension.js +297 -126
  98. package/koni/background/handlers/State.d.ts +5 -6
  99. package/koni/background/handlers/State.js +43 -33
  100. package/koni/background/handlers/Tabs.js +50 -17
  101. package/koni/background/subscription.js +31 -30
  102. package/package.json +18 -13
  103. package/packageInfo.js +1 -1
  104. package/services/chain-service/handler/SubstrateChainHandler.js +14 -9
  105. package/services/chain-service/helper/psp22_abi.json +1041 -881
  106. package/services/chain-service/helper/psp34_abi.json +2963 -1807
  107. package/services/chain-service/index.d.ts +3 -2
  108. package/services/chain-service/index.js +53 -40
  109. package/services/chain-service/types.d.ts +1 -0
  110. package/services/event-service/index.js +5 -1
  111. package/services/event-service/types.d.ts +5 -9
  112. package/services/event-service/types.js +4 -1
  113. package/services/history-service/index.d.ts +4 -2
  114. package/services/history-service/index.js +19 -13
  115. package/services/history-service/subsquid-multi-chain-history.js +16 -12
  116. package/services/keyring-service/index.d.ts +4 -2
  117. package/services/keyring-service/index.js +11 -13
  118. package/services/price-service/coingecko.js +0 -1
  119. package/services/price-service/index.js +2 -3
  120. package/services/request-service/handler/AuthRequestHandler.d.ts +3 -1
  121. package/services/request-service/handler/AuthRequestHandler.js +13 -7
  122. package/services/request-service/handler/EvmRequestHandler.js +8 -12
  123. package/services/request-service/index.d.ts +3 -1
  124. package/services/request-service/index.js +14 -5
  125. package/services/storage-service/DatabaseService.d.ts +1 -0
  126. package/services/storage-service/DatabaseService.js +56 -34
  127. package/services/storage-service/db-stores/Nft.d.ts +2 -2
  128. package/services/storage-service/db-stores/Nft.js +7 -14
  129. package/services/transaction-service/event-parser/index.js +21 -49
  130. package/services/transaction-service/index.js +26 -15
  131. package/utils/address.d.ts +3 -0
  132. package/utils/address.js +8 -1
  133. package/utils/index.d.ts +2 -2
  134. package/utils/index.js +7 -13
@@ -3,11 +3,44 @@
3
3
 
4
4
  import { _AssetType } from '@subwallet/chain-list/types';
5
5
  import { BaseNftApi } from '@subwallet/extension-base/koni/api/nft/nft';
6
- import { ART_ZERO_COLLECTION_API, ART_ZERO_CONTRACTS, ART_ZERO_EXTERNAL_URL, ART_ZERO_IMAGE_API, ART_ZERO_IPFS_API } from '@subwallet/extension-base/koni/api/nft/wasm_nft/utils';
6
+ import { ART_ZERO_COLLECTION_API, ART_ZERO_EXTERNAL_URL, ART_ZERO_IMAGE_API, ART_ZERO_IPFS_API, ART_ZERO_TESTNET_COLLECTION_API, ART_ZERO_TESTNET_IMAGE_API, ART_ZERO_TESTNET_IPFS_API } from '@subwallet/extension-base/koni/api/nft/wasm_nft/utils';
7
7
  import { getPSP34ContractPromise } from '@subwallet/extension-base/koni/api/tokens/wasm';
8
+ import { getDefaultWeightV2 } from '@subwallet/extension-base/koni/api/tokens/wasm/utils';
8
9
  import { _getContractAddressOfToken } from '@subwallet/extension-base/services/chain-service/utils';
10
+ import axios from 'axios';
9
11
  import fetch from 'cross-fetch';
10
12
  import { isEthereumAddress } from '@polkadot/util-crypto';
13
+
14
+ // interface CollectionAttributes {
15
+ // storedOnChain: boolean,
16
+ // attributeList: string[] // list of attribute names
17
+ // }
18
+
19
+ async function isArtZeroFeaturedCollection(networkKey, contractAddress) {
20
+ const timeout = new Promise(resolve => {
21
+ const id = setTimeout(() => {
22
+ clearTimeout(id);
23
+ resolve(null);
24
+ }, 3000);
25
+ });
26
+ const urlencoded = new URLSearchParams();
27
+ urlencoded.append('collection_address', contractAddress);
28
+ const collectionInfoPromise = new Promise(function (resolve) {
29
+ fetch(`${networkKey === 'alephTest' ? ART_ZERO_TESTNET_COLLECTION_API : ART_ZERO_COLLECTION_API}`, {
30
+ method: 'POST',
31
+ headers: {
32
+ 'Content-Type': 'application/x-www-form-urlencoded'
33
+ },
34
+ body: urlencoded
35
+ }).then(resp => {
36
+ resolve(resp.json());
37
+ }).catch(console.error);
38
+ });
39
+ const collectionInfo = await Promise.race([timeout, collectionInfoPromise]);
40
+
41
+ // @ts-ignore
42
+ return collectionInfo !== null && (collectionInfo === null || collectionInfo === void 0 ? void 0 : collectionInfo.status) !== 'FAILED';
43
+ }
11
44
  export class WasmNftApi extends BaseNftApi {
12
45
  wasmContracts = [];
13
46
  constructor(api, addresses, chain) {
@@ -20,31 +53,40 @@ export class WasmNftApi extends BaseNftApi {
20
53
  if (!tokenUri || tokenUri.length === 0) {
21
54
  return undefined;
22
55
  }
56
+ if (tokenUri.startsWith('/ipfs/')) {
57
+ return tokenUri;
58
+ }
59
+ if (tokenUri.startsWith('ipfs://')) {
60
+ return `/ipfs/${tokenUri.split('ipfs://')[1]}`;
61
+ }
23
62
  if (!tokenUri.includes('ipfs://') && !tokenUri.includes('ipfs://ipfs/')) {
24
- return `ipfs://${tokenUri}`;
63
+ return `/ipfs/${tokenUri}`;
25
64
  }
26
65
  if (tokenUri.includes('ipfs://ipfs/')) {
27
- return `ipfs://${tokenUri}`;
66
+ return `/ipfs/${tokenUri.split('ipfs://ipfs/')[1]}`;
28
67
  }
29
68
  return tokenUri;
30
69
  }
31
- parseFeaturedNftImage(tokenUri) {
70
+ async parseFeaturedNftImage(tokenUri) {
32
71
  const parsedTokenUri = this.parseFeaturedTokenUri(tokenUri);
33
72
  if (!parsedTokenUri) {
34
73
  return undefined;
35
74
  }
36
- return `${ART_ZERO_IMAGE_API}?input=${parsedTokenUri}&size=500`;
75
+ const nftItemImageSrc = `${this.chain === 'alephTest' ? ART_ZERO_TESTNET_IMAGE_API : ART_ZERO_IMAGE_API}?input=${parsedTokenUri}&size=500`;
76
+ const collectionImageUrl = await axios(nftItemImageSrc, {
77
+ method: 'GET'
78
+ });
79
+ return collectionImageUrl.data;
37
80
  }
38
81
  async parseFeaturedCollectionImage(smartContract) {
39
- const resp = await fetch(ART_ZERO_COLLECTION_API, {
82
+ const urlencoded = new URLSearchParams();
83
+ urlencoded.append('collection_address', smartContract);
84
+ const resp = await fetch(this.chain === 'alephTest' ? ART_ZERO_TESTNET_COLLECTION_API : ART_ZERO_COLLECTION_API, {
40
85
  method: 'POST',
41
86
  headers: {
42
- Accept: 'application/json',
43
- 'Content-Type': 'application/json'
87
+ 'Content-Type': 'application/x-www-form-urlencoded'
44
88
  },
45
- body: JSON.stringify({
46
- collection_address: smartContract
47
- })
89
+ body: urlencoded
48
90
  });
49
91
  const result = resp && resp.ok && (await resp.json());
50
92
  if (!result) {
@@ -58,82 +100,91 @@ export class WasmNftApi extends BaseNftApi {
58
100
  if (!parsedCollectionImage) {
59
101
  return;
60
102
  }
61
- return `${ART_ZERO_IMAGE_API}?input=${parsedCollectionImage}`;
62
- }
63
- async getCollectionAttributes(contractPromise) {
64
- const _onChainAttributeCount = await contractPromise.query['psp34Traits::getAttributeCount'](this.addresses[0], {
65
- gasLimit: -1
103
+ const collectionImageSrc = `${this.chain === 'alephTest' ? ART_ZERO_TESTNET_IMAGE_API : ART_ZERO_IMAGE_API}?input=${parsedCollectionImage}&size=500`;
104
+ const collectionImageUrl = await axios(collectionImageSrc, {
105
+ method: 'GET'
66
106
  });
67
- const onChainAttributeCount = _onChainAttributeCount.output ? _onChainAttributeCount.output.toString() : '0';
68
- if (parseInt(onChainAttributeCount) === 0) {
69
- return {
70
- storedOnChain: false,
71
- attributeList: []
72
- };
73
- }
74
- const attributeList = [];
75
- const attributeIndexes = [];
76
- for (let i = 0; i < parseInt(onChainAttributeCount); i++) {
77
- attributeIndexes.push(i);
78
- }
79
- await Promise.all(attributeIndexes.map(async i => {
80
- const _attributeByIndex = await contractPromise.query['psp34Traits::getAttributeName'](this.addresses[0], {
81
- gasLimit: -1
82
- }, i);
83
- if (_attributeByIndex.output) {
84
- const attributeName = _attributeByIndex.output.toString();
85
- if (attributeName !== '') {
86
- attributeList.push(attributeName);
87
- }
88
- }
89
- }));
90
- return {
91
- storedOnChain: true,
92
- attributeList
93
- };
94
- }
95
- async processOnChainMetadata(contractPromise, address, tokenIdObj, collectionAttributes, isFeatured) {
96
- const nftItem = {
97
- chain: '',
98
- collectionId: '',
99
- id: '',
100
- owner: ''
101
- };
102
- const _attributeValues = await contractPromise.query['psp34Traits::getAttributes'](address, {
103
- gasLimit: -1
104
- }, tokenIdObj, collectionAttributes);
105
- if (_attributeValues.output) {
106
- const attributeValues = _attributeValues.output.toHuman();
107
- const attributeDict = {};
108
- for (let i = 0; i < collectionAttributes.length; i++) {
109
- const attributeName = collectionAttributes[i];
110
- const attributeValue = attributeValues[i] ? attributeValues[i] : '';
111
- if (attributeName.toLowerCase() === 'nft_name') {
112
- nftItem.name = attributeValue;
113
- } else if (attributeName.toLowerCase() === 'description') {
114
- nftItem.description = attributeValue;
115
- } else if (attributeName.toLowerCase() === 'avatar') {
116
- if (isFeatured) {
117
- nftItem.image = this.parseFeaturedNftImage(attributeValue);
118
- } else {
119
- nftItem.image = this.parseUrl(attributeValue);
120
- }
121
- } else {
122
- if (attributeValue !== '') {
123
- attributeDict[attributeName] = {
124
- value: attributeValue
125
- };
126
- }
127
- }
128
- }
129
- nftItem.properties = attributeDict;
130
- }
131
- if (isFeatured) {
132
- nftItem.externalUrl = ART_ZERO_EXTERNAL_URL;
133
- }
134
- return nftItem;
107
+ return collectionImageUrl.data;
135
108
  }
109
+
110
+ // private async getCollectionAttributes (contractPromise: ContractPromise): Promise<CollectionAttributes> {
111
+ // const _onChainAttributeCount = await contractPromise.query['psp34Traits::getAttributeCount'](this.addresses[0], { gasLimit: getDefaultWeightV2(this.substrateApi?.api as ApiPromise) });
112
+ // const onChainAttributeCount = _onChainAttributeCount.output ? _onChainAttributeCount.output.toString() : '0';
113
+ //
114
+ // if (parseInt(onChainAttributeCount) === 0) {
115
+ // return {
116
+ // storedOnChain: false,
117
+ // attributeList: []
118
+ // };
119
+ // }
120
+ //
121
+ // const attributeList: string[] = [];
122
+ // const attributeIndexes: number[] = [];
123
+ //
124
+ // for (let i = 0; i < parseInt(onChainAttributeCount); i++) {
125
+ // attributeIndexes.push(i);
126
+ // }
127
+ //
128
+ // await Promise.all(attributeIndexes.map(async (i) => {
129
+ // const _attributeByIndex = await contractPromise.query['psp34Traits::getAttributeName'](this.addresses[0], { gasLimit: getDefaultWeightV2(this.substrateApi?.api as ApiPromise) }, i);
130
+ //
131
+ // if (_attributeByIndex.output) {
132
+ // const attributeName = _attributeByIndex.output.toString();
133
+ //
134
+ // if (attributeName !== '') {
135
+ // attributeList.push(attributeName);
136
+ // }
137
+ // }
138
+ // }));
139
+ //
140
+ // return {
141
+ // storedOnChain: true,
142
+ // attributeList
143
+ // };
144
+ // }
145
+
146
+ // private async processOnChainMetadata (contractPromise: ContractPromise, address: string, tokenIdObj: Record<string, string>, collectionAttributes: string[], isFeatured: boolean): Promise<NftItem> {
147
+ // const nftItem: NftItem = { chain: '', collectionId: '', id: '', owner: '' };
148
+ // const _attributeValues = await contractPromise.query['psp34Traits::getAttributes'](address, { gasLimit: getDefaultWeightV2(this.substrateApi?.api as ApiPromise) }, tokenIdObj, collectionAttributes);
149
+ //
150
+ // if (_attributeValues.output) {
151
+ // const attributeValues = _attributeValues.output.toHuman() as string[];
152
+ //
153
+ // const attributeDict: Record<string, any> = {};
154
+ //
155
+ // for (let i = 0; i < collectionAttributes.length; i++) {
156
+ // const attributeName = collectionAttributes[i];
157
+ // const attributeValue = attributeValues[i] ? attributeValues[i] : '';
158
+ //
159
+ // if (attributeName.toLowerCase() === 'nft_name') {
160
+ // nftItem.name = attributeValue;
161
+ // } else if (attributeName.toLowerCase() === 'description') {
162
+ // nftItem.description = attributeValue;
163
+ // } else if (attributeName.toLowerCase() === 'avatar') {
164
+ // if (isFeatured) {
165
+ // nftItem.image = await this.parseFeaturedNftImage(attributeValue);
166
+ // } else {
167
+ // nftItem.image = this.parseUrl(attributeValue);
168
+ // }
169
+ // } else {
170
+ // if (attributeValue !== '') {
171
+ // attributeDict[attributeName] = { value: attributeValue };
172
+ // }
173
+ // }
174
+ // }
175
+ //
176
+ // nftItem.properties = attributeDict;
177
+ // }
178
+ //
179
+ // if (isFeatured) {
180
+ // nftItem.externalUrl = ART_ZERO_EXTERNAL_URL;
181
+ // }
182
+ //
183
+ // return nftItem;
184
+ // }
185
+
136
186
  async processOffChainMetadata(contractPromise, address, tokenId, isFeatured) {
187
+ var _this$substrateApi;
137
188
  const nftItem = {
138
189
  chain: '',
139
190
  collectionId: '',
@@ -142,19 +193,23 @@ export class WasmNftApi extends BaseNftApi {
142
193
  name: tokenId
143
194
  };
144
195
  const _tokenUri = await contractPromise.query['psp34Traits::tokenUri'](address, {
145
- gasLimit: -1
196
+ gasLimit: getDefaultWeightV2((_this$substrateApi = this.substrateApi) === null || _this$substrateApi === void 0 ? void 0 : _this$substrateApi.api)
146
197
  }, tokenId);
147
198
  if (_tokenUri.output) {
148
199
  let itemDetail = false;
149
- const tokenUri = _tokenUri.output.toString();
200
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
201
+ const _tokenUriObj = _tokenUri.output.toJSON();
202
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
203
+ const tokenUri = _tokenUriObj.Ok || _tokenUriObj.ok;
150
204
  if (isFeatured) {
151
205
  const parsedTokenUri = this.parseFeaturedTokenUri(tokenUri);
152
206
  if (parsedTokenUri) {
153
- const resp = await fetch(`${ART_ZERO_IPFS_API}?input=${parsedTokenUri}`);
207
+ const resp = await fetch(`${this.chain === 'alephTest' ? ART_ZERO_TESTNET_IPFS_API : ART_ZERO_IPFS_API}?input=${parsedTokenUri}`);
154
208
  itemDetail = resp && resp.ok && (await resp.json());
155
209
  }
156
210
  } else {
157
- const detailUrl = this.parseUrl(tokenUri);
211
+ const parsedTokenUri = this.parseFeaturedTokenUri(tokenUri);
212
+ const detailUrl = this.parseUrl(parsedTokenUri);
158
213
  if (detailUrl) {
159
214
  const resp = await fetch(detailUrl);
160
215
  itemDetail = resp && resp.ok && (await resp.json());
@@ -169,7 +224,7 @@ export class WasmNftApi extends BaseNftApi {
169
224
  nftItem.externalUrl = itemDetail.external_url;
170
225
  const rawImageSrc = itemDetail.image ? itemDetail.image : itemDetail.image_url;
171
226
  if (isFeatured) {
172
- nftItem.image = this.parseFeaturedNftImage(rawImageSrc);
227
+ nftItem.image = await this.parseFeaturedNftImage(rawImageSrc);
173
228
  nftItem.externalUrl = ART_ZERO_EXTERNAL_URL;
174
229
  } else {
175
230
  nftItem.image = this.parseUrl(rawImageSrc);
@@ -187,21 +242,26 @@ export class WasmNftApi extends BaseNftApi {
187
242
  }
188
243
  return nftItem;
189
244
  }
190
- async getItemsByCollection(contractPromise, collectionAttributes, isMetadataOnchain, tokenInfo, collectionName, nftParams) {
245
+ async getItemsByCollection(contractPromise, tokenInfo, collectionName, nftParams, isFeatured) {
191
246
  let ownItem = false;
192
247
  let collectionImage;
193
248
  const smartContract = _getContractAddressOfToken(tokenInfo);
194
- const isFeatured = ART_ZERO_CONTRACTS.includes(smartContract);
249
+ const nftOwnerMap = {};
195
250
  await Promise.all(this.addresses.map(async address => {
251
+ var _this$substrateApi2, _balance$output;
196
252
  if (isEthereumAddress(address)) {
197
253
  return;
198
254
  }
199
255
  const nftIds = [];
200
256
  const _balance = await contractPromise.query['psp34::balanceOf'](address, {
201
- gasLimit: -1
257
+ gasLimit: getDefaultWeightV2((_this$substrateApi2 = this.substrateApi) === null || _this$substrateApi2 === void 0 ? void 0 : _this$substrateApi2.api)
202
258
  }, address);
203
- const balance = _balance.output ? _balance.output.toString() : '0';
259
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
260
+ const balanceJson = _balance === null || _balance === void 0 ? void 0 : (_balance$output = _balance.output) === null || _balance$output === void 0 ? void 0 : _balance$output.toJSON();
261
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
262
+ const balance = _balance.output ? balanceJson.ok || balanceJson.Ok : '0';
204
263
  if (parseInt(balance) === 0) {
264
+ nftParams.cleanUpNfts(this.chain, address, [smartContract], []);
205
265
  return;
206
266
  }
207
267
  const itemIndexes = [];
@@ -210,20 +270,17 @@ export class WasmNftApi extends BaseNftApi {
210
270
  }
211
271
  try {
212
272
  await Promise.all(itemIndexes.map(async i => {
273
+ var _this$substrateApi3;
213
274
  const _tokenByIndexResp = await contractPromise.query['psp34Enumerable::ownersTokenByIndex'](address, {
214
- gasLimit: -1
275
+ gasLimit: getDefaultWeightV2((_this$substrateApi3 = this.substrateApi) === null || _this$substrateApi3 === void 0 ? void 0 : _this$substrateApi3.api)
215
276
  }, address, i);
216
277
  if (_tokenByIndexResp.output) {
217
278
  const rawTokenId = _tokenByIndexResp.output.toHuman();
218
- const tokenIdObj = rawTokenId.Ok;
219
- const tokenId = Object.values(tokenIdObj)[0];
279
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
280
+ const tokenIdObj = rawTokenId.Ok.Ok || rawTokenId.ok.ok; // capital O, not normal o
281
+ const tokenId = Object.values(tokenIdObj)[0].replaceAll(',', '');
220
282
  nftIds.push(tokenId);
221
- let nftItem;
222
- if (isMetadataOnchain) {
223
- nftItem = await this.processOnChainMetadata(contractPromise, address, tokenIdObj, collectionAttributes, isFeatured);
224
- } else {
225
- nftItem = await this.processOffChainMetadata(contractPromise, address, tokenId, isFeatured);
226
- }
283
+ const nftItem = await this.processOffChainMetadata(contractPromise, address, tokenId, isFeatured);
227
284
  nftItem.collectionId = smartContract;
228
285
  nftItem.chain = this.chain;
229
286
  nftItem.type = _AssetType.PSP34;
@@ -238,6 +295,8 @@ export class WasmNftApi extends BaseNftApi {
238
295
  }
239
296
  }
240
297
  }));
298
+
299
+ nftOwnerMap[address] = nftIds;
241
300
  } catch (e) {
242
301
  console.error(`error parsing item for ${this.chain} nft`, e);
243
302
  }
@@ -257,6 +316,9 @@ export class WasmNftApi extends BaseNftApi {
257
316
  originAsset: tokenInfo.slug
258
317
  };
259
318
  nftParams.updateCollection(this.chain, nftCollection);
319
+ Object.entries(nftOwnerMap).forEach(([owner, nftIds]) => {
320
+ nftParams.cleanUpNfts(this.chain, owner, [smartContract], nftIds);
321
+ });
260
322
  }
261
323
  }
262
324
  async fetchNfts(params) {
@@ -268,20 +330,17 @@ export class WasmNftApi extends BaseNftApi {
268
330
  return 1;
269
331
  }
270
332
  async handleNfts(params) {
271
- var _this$substrateApi;
333
+ var _this$substrateApi4;
272
334
  if (!this.wasmContracts || this.wasmContracts.length === 0) {
273
335
  return;
274
336
  }
275
337
  await this.connect(); // might not be necessary
276
338
 
277
- const apiPromise = (_this$substrateApi = this.substrateApi) === null || _this$substrateApi === void 0 ? void 0 : _this$substrateApi.api;
339
+ const apiPromise = (_this$substrateApi4 = this.substrateApi) === null || _this$substrateApi4 === void 0 ? void 0 : _this$substrateApi4.api;
278
340
  await Promise.all(this.wasmContracts.map(async tokenInfo => {
279
341
  const contractPromise = getPSP34ContractPromise(apiPromise, _getContractAddressOfToken(tokenInfo));
280
- const {
281
- attributeList,
282
- storedOnChain
283
- } = await this.getCollectionAttributes(contractPromise);
284
- return await this.getItemsByCollection(contractPromise, attributeList, storedOnChain, tokenInfo, tokenInfo.name, params);
342
+ const isCollectionFeatured = await isArtZeroFeaturedCollection(this.chain, _getContractAddressOfToken(tokenInfo));
343
+ return await this.getItemsByCollection(contractPromise, tokenInfo, tokenInfo.name, params, isCollectionFeatured);
285
344
  }));
286
345
  }
287
346
  }
@@ -1,5 +1,7 @@
1
- export declare const ART_ZERO_CONTRACTS: string[];
2
- export declare const ART_ZERO_IMAGE_API = "https://api.artzero.io/getImage";
3
- export declare const ART_ZERO_IPFS_API = "https://api.artzero.io/getJSON";
4
- export declare const ART_ZERO_COLLECTION_API = "https://api.artzero.io/getCollectionByAddress";
5
- export declare const ART_ZERO_EXTERNAL_URL = "https://artzero.io/demotestnet/#/marketplace";
1
+ export declare const ART_ZERO_TESTNET_IMAGE_API = "https://a0-test-api.artzero.io/getImage";
2
+ export declare const ART_ZERO_TESTNET_IPFS_API = "https://a0-test-api.artzero.io/getJSON";
3
+ export declare const ART_ZERO_TESTNET_COLLECTION_API = "https://a0-test-api.artzero.io/getCollectionByAddress";
4
+ export declare const ART_ZERO_IMAGE_API = "https://a0-api.artzero.io/getImage";
5
+ export declare const ART_ZERO_IPFS_API = "https://a0-api.artzero.io/getJSON";
6
+ export declare const ART_ZERO_COLLECTION_API = "https://a0-api.artzero.io/getCollectionByAddress";
7
+ export declare const ART_ZERO_EXTERNAL_URL = "https://a0.artzero.io/#/marketplace";
@@ -1,8 +1,10 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- export const ART_ZERO_CONTRACTS = ['5Hg1xe6JAGZj92wxtj1ykAfQpwwRNqzAnvhZ3TuXZEmLU1Vw'];
5
- export const ART_ZERO_IMAGE_API = 'https://api.artzero.io/getImage';
6
- export const ART_ZERO_IPFS_API = 'https://api.artzero.io/getJSON';
7
- export const ART_ZERO_COLLECTION_API = 'https://api.artzero.io/getCollectionByAddress';
8
- export const ART_ZERO_EXTERNAL_URL = 'https://artzero.io/demotestnet/#/marketplace';
4
+ export const ART_ZERO_TESTNET_IMAGE_API = 'https://a0-test-api.artzero.io/getImage';
5
+ export const ART_ZERO_TESTNET_IPFS_API = 'https://a0-test-api.artzero.io/getJSON';
6
+ export const ART_ZERO_TESTNET_COLLECTION_API = 'https://a0-test-api.artzero.io/getCollectionByAddress';
7
+ export const ART_ZERO_IMAGE_API = 'https://a0-api.artzero.io/getImage';
8
+ export const ART_ZERO_IPFS_API = 'https://a0-api.artzero.io/getJSON';
9
+ export const ART_ZERO_COLLECTION_API = 'https://a0-api.artzero.io/getCollectionByAddress';
10
+ export const ART_ZERO_EXTERNAL_URL = 'https://a0.artzero.io/#/marketplace';
@@ -8,4 +8,3 @@ export declare function getAmplitudeBondingExtrinsic(substrateApi: _SubstrateApi
8
8
  export declare function getAmplitudeUnbondingExtrinsic(substrateApi: _SubstrateApi, amount: string, nominatorMetadata: NominatorMetadata, collatorAddress: string): Promise<import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult>>;
9
9
  export declare function getAmplitudeWithdrawalExtrinsic(substrateApi: _SubstrateApi, address: string): Promise<import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult>>;
10
10
  export declare function getAmplitudeClaimRewardExtrinsic(substrateApi: _SubstrateApi): Promise<import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult>>;
11
- export declare function getAmplitudeCancelWithdrawalExtrinsic(substrateApi: _SubstrateApi): Promise<import("@polkadot/api-base/types").SubmittableExtrinsic<"promise", import("@polkadot/types/types").ISubmittableResult>>;
@@ -2,10 +2,10 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import { StakingStatus, StakingType, UnstakingStatus } from '@subwallet/extension-base/background/KoniTypes';
5
- import { getBondedValidators, isUnstakeAll, parseIdentity } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
5
+ import { getBondedValidators, getStakingStatusByNominations, isUnstakeAll, parseIdentity } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
6
6
  import { _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
7
7
  import { parseRawNumber, reformatAddress } from '@subwallet/extension-base/utils';
8
- import { BN } from '@polkadot/util';
8
+ import { BN, BN_ZERO } from '@polkadot/util';
9
9
  import { isEthereumAddress } from '@polkadot/util-crypto';
10
10
  export async function getAmplitudeStakingMetadata(chain, substrateApi) {
11
11
  const chainApi = await substrateApi.isReady;
@@ -39,24 +39,31 @@ export async function getAmplitudeNominatorMetadata(chainInfo, address, substrat
39
39
  const nominationList = [];
40
40
  const unstakingList = [];
41
41
  const [_delegatorState, _unstakingInfo] = await Promise.all([chainApi.api.query.parachainStaking.delegatorState(address), chainApi.api.query.parachainStaking.unstaking(address)]);
42
+ const minDelegatorStake = chainApi.api.consts.parachainStaking.minDelegatorStake.toString();
42
43
  const delegatorState = _delegatorState.toPrimitive();
43
44
  const unstakingInfo = _unstakingInfo.toPrimitive();
45
+ console.log('unstakingInfo ampe', unstakingInfo, !!unstakingInfo);
44
46
  if (!delegatorState && !unstakingInfo) {
45
47
  return;
46
48
  }
47
49
  let activeStake = '0';
48
50
  if (delegatorState) {
49
51
  // delegatorState can be null while unstaking all
50
- const identityInfo = (await chainApi.api.query.identity.identityOf(delegatorState.owner)).toPrimitive();
51
- const identity = parseIdentity(identityInfo);
52
+ const identityInfo = chainApi.api.query.identity ? (await chainApi.api.query.identity.identityOf(delegatorState.owner)).toPrimitive() : undefined;
53
+ const identity = identityInfo ? parseIdentity(identityInfo) : undefined;
52
54
  activeStake = delegatorState.amount.toString();
55
+ const bnActiveStake = new BN(activeStake);
56
+ let delegationStatus = StakingStatus.NOT_EARNING;
57
+ if (bnActiveStake.gt(BN_ZERO) && bnActiveStake.gte(new BN(minDelegatorStake))) {
58
+ delegationStatus = StakingStatus.EARNING_REWARD;
59
+ }
53
60
  nominationList.push({
54
- status: StakingStatus.NOT_EARNING,
61
+ status: delegationStatus,
55
62
  chain,
56
63
  validatorAddress: delegatorState.owner,
57
64
  activeStake: delegatorState.amount.toString(),
58
65
  validatorMinStake: '0',
59
- hasUnstaking: !!unstakingInfo,
66
+ hasUnstaking: !!unstakingInfo && Object.values(unstakingInfo).length > 0,
60
67
  validatorIdentity: identity
61
68
  });
62
69
  }
@@ -84,9 +91,11 @@ export async function getAmplitudeNominatorMetadata(chainInfo, address, substrat
84
91
  if (nominationList.length === 0 && unstakingList.length === 0) {
85
92
  return;
86
93
  }
94
+ const stakingStatus = getStakingStatusByNominations(new BN(activeStake), nominationList);
87
95
  return {
88
96
  chain,
89
97
  type: StakingType.NOMINATED,
98
+ status: stakingStatus,
90
99
  address: address,
91
100
  activeStake: activeStake,
92
101
  nominations: nominationList,
@@ -167,8 +176,4 @@ export async function getAmplitudeWithdrawalExtrinsic(substrateApi, address) {
167
176
  export async function getAmplitudeClaimRewardExtrinsic(substrateApi) {
168
177
  const chainApi = await substrateApi.isReady;
169
178
  return chainApi.api.tx.utility.batch([chainApi.api.tx.parachainStaking.incrementDelegatorRewards(), chainApi.api.tx.parachainStaking.claimRewards()]);
170
- }
171
- export async function getAmplitudeCancelWithdrawalExtrinsic(substrateApi) {
172
- const chainApi = await substrateApi.isReady;
173
- return chainApi.api.tx.parachainStaking.cancelLeaveCandidates();
174
179
  }
@@ -2,6 +2,7 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import { StakingStatus, StakingType, UnstakingStatus } from '@subwallet/extension-base/background/KoniTypes';
5
+ import { getStakingStatusByNominations } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
5
6
  import { _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
6
7
  import { isUrl, parseRawNumber } from '@subwallet/extension-base/utils';
7
8
  import fetch from 'cross-fetch';
@@ -60,6 +61,7 @@ export async function getAstarNominatorMetadata(chainInfo, address, substrateApi
60
61
  const [_ledger, _era, _stakerInfo] = await Promise.all([chainApi.api.query.dappsStaking.ledger(address), chainApi.api.query.dappsStaking.currentEra(), chainApi.api.query.dappsStaking.generalStakerInfo.entries(address)]);
61
62
  const ledger = _ledger.toPrimitive();
62
63
  const currentEra = _era.toString();
64
+ const minDelegatorStake = chainApi.api.consts.dappsStaking.minimumStakingAmount.toString();
63
65
  let bnTotalActiveStake = BN_ZERO;
64
66
  if (_stakerInfo.length > 0) {
65
67
  const dAppInfoMap = {};
@@ -76,13 +78,13 @@ export async function getAstarNominatorMetadata(chainInfo, address, substrateApi
76
78
  const currentStake = stakeList.slice(-1)[0].staked.toString() || '0';
77
79
  const bnCurrentStake = new BN(currentStake);
78
80
  if (bnCurrentStake.gt(BN_ZERO)) {
81
+ const dappStakingStatus = bnCurrentStake.gt(BN_ZERO) && bnCurrentStake.gte(new BN(minDelegatorStake)) ? StakingStatus.EARNING_REWARD : StakingStatus.NOT_EARNING;
79
82
  bnTotalActiveStake = bnTotalActiveStake.add(bnCurrentStake);
80
83
  const dappInfo = dAppInfoMap[dappAddress];
81
84
  nominationList.push({
82
- status: StakingStatus.NOT_EARNING,
83
- // TODO
85
+ status: dappStakingStatus,
84
86
  chain,
85
- validatorAddress: dappAddress,
87
+ validatorAddress: dappAddress.toLowerCase(),
86
88
  activeStake: currentStake,
87
89
  validatorMinStake: '0',
88
90
  validatorIdentity: dappInfo === null || dappInfo === void 0 ? void 0 : dappInfo.name,
@@ -109,6 +111,7 @@ export async function getAstarNominatorMetadata(chainInfo, address, substrateApi
109
111
  if (nominationList.length === 0 && unstakingList.length === 0) {
110
112
  return;
111
113
  }
114
+ const stakingStatus = getStakingStatusByNominations(bnTotalActiveStake, nominationList);
112
115
  return {
113
116
  chain,
114
117
  type: StakingType.NOMINATED,
@@ -116,10 +119,9 @@ export async function getAstarNominatorMetadata(chainInfo, address, substrateApi
116
119
  activeStake: bnTotalActiveStake.toString(),
117
120
  nominations: nominationList,
118
121
  unstakings: unstakingList,
119
- status: StakingStatus.NOT_EARNING // TODO
122
+ status: stakingStatus
120
123
  };
121
124
  }
122
-
123
125
  export async function getAstarDappsInfo(networkKey, substrateApi) {
124
126
  const chainApi = await substrateApi.isReady;
125
127
  const rawMaxStakerPerContract = chainApi.api.consts.dappsStaking.maxNumberOfStakersPerContract.toHuman();
@@ -157,7 +159,7 @@ export async function getAstarDappsInfo(networkKey, substrateApi) {
157
159
  allDappsInfo.push({
158
160
  commission: 0,
159
161
  expectedReturn: 0,
160
- address: dappAddress,
162
+ address: dappAddress.toLowerCase(),
161
163
  totalStake: totalStake,
162
164
  ownStake: '0',
163
165
  otherStake: totalStake.toString(),
@@ -1,7 +1,10 @@
1
1
  import { _ChainInfo } from '@subwallet/chain-list/types';
2
+ import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
2
3
  import { ChainStakingMetadata, NominatorMetadata, StakingType, UnstakingInfo, ValidatorInfo } from '@subwallet/extension-base/background/KoniTypes';
3
4
  import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
4
- export declare function getChainStakingMetadata(chain: string, substrateApi: _SubstrateApi): Promise<ChainStakingMetadata>;
5
+ export declare function validateUnbondingCondition(nominatorMetadata: NominatorMetadata, amount: string, chain: string, chainStakingMetadata: ChainStakingMetadata, selectedValidator?: string): TransactionError[];
6
+ export declare function validateBondingCondition(chainInfo: _ChainInfo, amount: string, selectedValidators: ValidatorInfo[], address: string, chainStakingMetadata: ChainStakingMetadata, nominatorMetadata?: NominatorMetadata): TransactionError[];
7
+ export declare function getChainStakingMetadata(chainInfo: _ChainInfo, substrateApi: _SubstrateApi): Promise<ChainStakingMetadata>;
5
8
  export declare function getNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi): Promise<NominatorMetadata | undefined>;
6
9
  export declare function getValidatorsInfo(networkKey: string, substrateApi: _SubstrateApi, decimals: number, chainStakingMetadata: ChainStakingMetadata): Promise<ValidatorInfo[]>;
7
10
  export declare function getNominationPoolsInfo(chain: string, substrateApi: _SubstrateApi): Promise<import("@subwallet/extension-base/background/KoniTypes").NominationPoolInfo[]>;
@@ -2,22 +2,34 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import { StakingType } from '@subwallet/extension-base/background/KoniTypes';
5
- import { getAmplitudeBondingExtrinsic, getAmplitudeCancelWithdrawalExtrinsic, getAmplitudeClaimRewardExtrinsic, getAmplitudeCollatorsInfo, getAmplitudeNominatorMetadata, getAmplitudeStakingMetadata, getAmplitudeUnbondingExtrinsic, getAmplitudeWithdrawalExtrinsic } from '@subwallet/extension-base/koni/api/staking/bonding/amplitude';
5
+ import { getAmplitudeBondingExtrinsic, getAmplitudeClaimRewardExtrinsic, getAmplitudeCollatorsInfo, getAmplitudeNominatorMetadata, getAmplitudeStakingMetadata, getAmplitudeUnbondingExtrinsic, getAmplitudeWithdrawalExtrinsic } from '@subwallet/extension-base/koni/api/staking/bonding/amplitude';
6
6
  import { getAstarBondingExtrinsic, getAstarClaimRewardExtrinsic, getAstarDappsInfo, getAstarNominatorMetadata, getAstarStakingMetadata, getAstarUnbondingExtrinsic, getAstarWithdrawalExtrinsic } from '@subwallet/extension-base/koni/api/staking/bonding/astar';
7
- import { getParaBondingExtrinsic, getParaCancelWithdrawalExtrinsic, getParachainCollatorsInfo, getParaChainNominatorMetadata, getParaChainStakingMetadata, getParaUnbondingExtrinsic, getParaWithdrawalExtrinsic } from '@subwallet/extension-base/koni/api/staking/bonding/paraChain';
8
- import { getPoolingClaimRewardExtrinsic, getPoolingWithdrawalExtrinsic, getRelayBondingExtrinsic, getRelayCancelWithdrawalExtrinsic, getRelayChainNominatorMetadata, getRelayChainStakingMetadata, getRelayPoolsInfo, getRelayUnbondingExtrinsic, getRelayValidatorsInfo, getRelayWithdrawalExtrinsic } from '@subwallet/extension-base/koni/api/staking/bonding/relayChain';
7
+ import { getParaBondingExtrinsic, getParaCancelWithdrawalExtrinsic, getParachainCollatorsInfo, getParaChainNominatorMetadata, getParaChainStakingMetadata, getParaUnbondingExtrinsic, getParaWithdrawalExtrinsic, validateParaChainBondingCondition, validateParaChainUnbondingCondition } from '@subwallet/extension-base/koni/api/staking/bonding/paraChain';
8
+ import { getPoolingClaimRewardExtrinsic, getPoolingWithdrawalExtrinsic, getRelayBondingExtrinsic, getRelayCancelWithdrawalExtrinsic, getRelayChainNominatorMetadata, getRelayChainStakingMetadata, getRelayPoolsInfo, getRelayUnbondingExtrinsic, getRelayValidatorsInfo, getRelayWithdrawalExtrinsic, validateRelayBondingCondition, validateRelayUnbondingCondition } from '@subwallet/extension-base/koni/api/staking/bonding/relayChain';
9
9
  import { _STAKING_CHAIN_GROUP } from '@subwallet/extension-base/services/chain-service/constants';
10
10
  // all addresses must be converted to its chain format
11
11
 
12
- export async function getChainStakingMetadata(chain, substrateApi) {
13
- if (_STAKING_CHAIN_GROUP.astar.includes(chain)) {
14
- return getAstarStakingMetadata(chain, substrateApi);
15
- } else if (_STAKING_CHAIN_GROUP.para.includes(chain)) {
16
- return getParaChainStakingMetadata(chain, substrateApi);
17
- } else if (_STAKING_CHAIN_GROUP.amplitude.includes(chain)) {
18
- return getAmplitudeStakingMetadata(chain, substrateApi);
12
+ export function validateUnbondingCondition(nominatorMetadata, amount, chain, chainStakingMetadata, selectedValidator) {
13
+ if (_STAKING_CHAIN_GROUP.relay.includes(chain)) {
14
+ return validateRelayUnbondingCondition(amount, chainStakingMetadata, nominatorMetadata);
15
+ }
16
+ return validateParaChainUnbondingCondition(amount, nominatorMetadata, chainStakingMetadata, selectedValidator);
17
+ }
18
+ export function validateBondingCondition(chainInfo, amount, selectedValidators, address, chainStakingMetadata, nominatorMetadata) {
19
+ if (_STAKING_CHAIN_GROUP.relay.includes(chainInfo.slug)) {
20
+ return validateRelayBondingCondition(chainInfo, amount, selectedValidators, address, chainStakingMetadata, nominatorMetadata);
19
21
  }
20
- return getRelayChainStakingMetadata(chain, substrateApi);
22
+ return validateParaChainBondingCondition(chainInfo, amount, selectedValidators, address, chainStakingMetadata, nominatorMetadata);
23
+ }
24
+ export async function getChainStakingMetadata(chainInfo, substrateApi) {
25
+ if (_STAKING_CHAIN_GROUP.astar.includes(chainInfo.slug)) {
26
+ return getAstarStakingMetadata(chainInfo.slug, substrateApi);
27
+ } else if (_STAKING_CHAIN_GROUP.para.includes(chainInfo.slug)) {
28
+ return getParaChainStakingMetadata(chainInfo.slug, substrateApi);
29
+ } else if (_STAKING_CHAIN_GROUP.amplitude.includes(chainInfo.slug)) {
30
+ return getAmplitudeStakingMetadata(chainInfo.slug, substrateApi);
31
+ }
32
+ return getRelayChainStakingMetadata(chainInfo, substrateApi);
21
33
  }
22
34
  export async function getNominatorMetadata(chainInfo, address, substrateApi) {
23
35
  if (_STAKING_CHAIN_GROUP.astar.includes(chainInfo.slug)) {
@@ -86,8 +98,6 @@ export async function getClaimRewardExtrinsic(substrateApi, chain, address, stak
86
98
  export async function getCancelWithdrawalExtrinsic(substrateApi, chain, selectedUnstaking) {
87
99
  if (_STAKING_CHAIN_GROUP.para.includes(chain)) {
88
100
  return getParaCancelWithdrawalExtrinsic(substrateApi, selectedUnstaking);
89
- } else if (_STAKING_CHAIN_GROUP.amplitude.includes(chain)) {
90
- return getAmplitudeCancelWithdrawalExtrinsic(substrateApi);
91
101
  }
92
102
  return getRelayCancelWithdrawalExtrinsic(substrateApi, selectedUnstaking);
93
103
  }
@@ -1,6 +1,9 @@
1
1
  import { _ChainInfo } from '@subwallet/chain-list/types';
2
+ import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
2
3
  import { ChainStakingMetadata, NominatorMetadata, UnstakingInfo, ValidatorInfo } from '@subwallet/extension-base/background/KoniTypes';
3
4
  import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
5
+ export declare function validateParaChainUnbondingCondition(amount: string, nominatorMetadata: NominatorMetadata, chainStakingMetadata: ChainStakingMetadata, selectedCollator: string): TransactionError[];
6
+ export declare function validateParaChainBondingCondition(chainInfo: _ChainInfo, amount: string, selectedCollators: ValidatorInfo[], address: string, chainStakingMetadata: ChainStakingMetadata, nominatorMetadata?: NominatorMetadata): TransactionError[];
4
7
  export declare function getParaChainStakingMetadata(chain: string, substrateApi: _SubstrateApi): Promise<ChainStakingMetadata>;
5
8
  export declare function getParaChainNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi): Promise<NominatorMetadata | undefined>;
6
9
  export declare function getParachainCollatorsInfo(chain: string, substrateApi: _SubstrateApi): Promise<ValidatorInfo[]>;