@subwallet/extension-base 1.3.69-0 → 1.3.70-2

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 (48) hide show
  1. package/background/KoniTypes.d.ts +11 -0
  2. package/background/KoniTypes.js +3 -0
  3. package/cjs/background/KoniTypes.js +3 -0
  4. package/cjs/koni/background/handlers/Extension.js +62 -0
  5. package/cjs/koni/background/handlers/State.js +5 -2
  6. package/cjs/packageInfo.js +1 -1
  7. package/cjs/services/chain-service/constants.js +15 -4
  8. package/cjs/services/chain-service/utils/index.js +13 -5
  9. package/cjs/services/event-service/index.js +1 -0
  10. package/cjs/services/open-gov/handler.js +563 -0
  11. package/cjs/services/open-gov/index.js +273 -0
  12. package/cjs/services/open-gov/interface.js +28 -0
  13. package/cjs/services/open-gov/utils.js +66 -0
  14. package/cjs/services/storage-service/DatabaseService.js +19 -1
  15. package/cjs/services/storage-service/databases/index.js +3 -0
  16. package/cjs/services/storage-service/db-stores/GovLockedInfoStore.js +35 -0
  17. package/cjs/services/transaction-service/helpers/index.js +6 -0
  18. package/cjs/services/transaction-service/index.js +43 -0
  19. package/cjs/utils/account/transform.js +5 -4
  20. package/koni/background/handlers/Extension.d.ts +4 -0
  21. package/koni/background/handlers/Extension.js +62 -0
  22. package/koni/background/handlers/State.d.ts +2 -0
  23. package/koni/background/handlers/State.js +5 -2
  24. package/package.json +30 -5
  25. package/packageInfo.js +1 -1
  26. package/services/chain-service/constants.d.ts +8 -0
  27. package/services/chain-service/constants.js +12 -2
  28. package/services/chain-service/utils/index.js +13 -5
  29. package/services/event-service/index.d.ts +1 -0
  30. package/services/event-service/index.js +1 -0
  31. package/services/event-service/types.d.ts +1 -0
  32. package/services/open-gov/handler.d.ts +27 -0
  33. package/services/open-gov/handler.js +547 -0
  34. package/services/open-gov/index.d.ts +45 -0
  35. package/services/open-gov/index.js +265 -0
  36. package/services/open-gov/interface.d.ts +141 -0
  37. package/services/open-gov/interface.js +21 -0
  38. package/services/open-gov/utils.d.ts +14 -0
  39. package/services/open-gov/utils.js +52 -0
  40. package/services/storage-service/DatabaseService.d.ts +7 -0
  41. package/services/storage-service/DatabaseService.js +19 -1
  42. package/services/storage-service/databases/index.d.ts +2 -0
  43. package/services/storage-service/databases/index.js +3 -0
  44. package/services/storage-service/db-stores/GovLockedInfoStore.d.ts +10 -0
  45. package/services/storage-service/db-stores/GovLockedInfoStore.js +27 -0
  46. package/services/transaction-service/helpers/index.js +6 -0
  47. package/services/transaction-service/index.js +43 -0
  48. package/utils/account/transform.js +5 -4
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
9
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
+ var _types = require("@subwallet/extension-base/types");
11
+ var _utils = require("@subwallet/extension-base/utils");
12
+ var _rxjs = require("rxjs");
13
+ var _types2 = require("../base/types");
14
+ var _constants = require("../chain-service/constants");
15
+ var _utils2 = require("../chain-service/utils");
16
+ var _handler = _interopRequireDefault(require("./handler"));
17
+ // Copyright 2019-2022 @subwallet/extension-base
18
+ // SPDX-License-Identifier: Apache-2.0
19
+
20
+ class OpenGovChainHandler extends _handler.default {
21
+ constructor(state, chain) {
22
+ super(state, chain);
23
+ this.slug = chain;
24
+ }
25
+ }
26
+ class OpenGovService {
27
+ handlers = {};
28
+
29
+ // subjects
30
+ govLockedInfoSubject = new _rxjs.BehaviorSubject({});
31
+ govLockedInfoListSubject = new _rxjs.BehaviorSubject([]);
32
+ govLockedInfoPersistQueue = [];
33
+ status = _types2.ServiceStatus.NOT_INITIALIZED;
34
+ startPromiseHandler = (0, _utils.createPromiseHandler)();
35
+ stopPromiseHandler = (0, _utils.createPromiseHandler)();
36
+ constructor(state) {
37
+ this.state = state;
38
+ this.eventService = state.eventService;
39
+ this.dbService = state.dbService;
40
+ }
41
+ async init() {
42
+ this.status = _types2.ServiceStatus.INITIALIZING;
43
+ this.eventService.emit('open-gov.ready', true);
44
+ await this.initHandlers();
45
+ await this.getGovLockedInfoFromDB();
46
+ this.status = _types2.ServiceStatus.INITIALIZED;
47
+ this.govLockedInfoListSubject.next(Object.values(this.govLockedInfoSubject.getValue()));
48
+ this.handleActions();
49
+ }
50
+ handleActions() {
51
+ this.eventService.onLazy((events, eventTypes) => {
52
+ let delayReload = false;
53
+ const removedAddresses = [];
54
+ const removeChains = [];
55
+ (async () => {
56
+ for (const event of events) {
57
+ if (event.type === 'account.remove') {
58
+ removedAddresses.push(event.data[0]);
59
+ }
60
+ if (event.type === 'account.add' || event.type === 'account.updateCurrent') {
61
+ delayReload = true;
62
+ }
63
+ if (event.type === 'chain.updateState') {
64
+ const chainKey = event.data[0];
65
+ const chainState = this.state.getChainStateByKey(chainKey);
66
+ if (chainState && !(0, _utils2._isChainEnabled)(chainState)) {
67
+ removeChains.push(chainKey);
68
+ }
69
+ delayReload = true;
70
+ }
71
+ if (event.type === 'transaction.done') {
72
+ const tx = event.data[0];
73
+ const govRelatedTypes = [_KoniTypes.ExtrinsicType.GOV_VOTE, _KoniTypes.ExtrinsicType.GOV_UNVOTE, _KoniTypes.ExtrinsicType.GOV_UNLOCK_VOTE];
74
+ if (govRelatedTypes.includes(tx.extrinsicType)) {
75
+ delayReload = true;
76
+ }
77
+ }
78
+ }
79
+ if (removeChains.length || removedAddresses.length) {
80
+ await this.removeGovLockedInfos(removeChains, removedAddresses);
81
+ }
82
+ if (eventTypes.includes('account.updateCurrent') || eventTypes.includes('account.remove') || eventTypes.includes('chain.updateState') || delayReload) {
83
+ if (delayReload) {
84
+ this.delayReloadTimeout = setTimeout(() => {
85
+ this.resetGovLockedInfo().then(() => this.runSubscribeGovLockedInfo()).catch(console.error);
86
+ }, 3000);
87
+ } else {
88
+ this.delayReloadTimeout && clearTimeout(this.delayReloadTimeout);
89
+ this.delayReloadTimeout = undefined;
90
+ await this.resetGovLockedInfo();
91
+ await this.runSubscribeGovLockedInfo();
92
+ }
93
+ }
94
+ })().catch(console.error);
95
+ });
96
+ }
97
+ async removeGovLockedInfos(chains, addresses) {
98
+ const current = this.govLockedInfoSubject.getValue();
99
+ const removeKeys = [];
100
+ if (chains && chains.length > 0) {
101
+ for (const [key, value] of Object.entries(current)) {
102
+ if (chains.includes(value.chain)) {
103
+ removeKeys.push(key);
104
+ }
105
+ }
106
+ }
107
+ if (addresses && addresses.length > 0) {
108
+ for (const [key, value] of Object.entries(current)) {
109
+ if (addresses.includes(value.address)) {
110
+ removeKeys.push(key);
111
+ }
112
+ }
113
+ }
114
+ for (const key of removeKeys) {
115
+ delete current[key];
116
+ }
117
+ this.govLockedInfoSubject.next(current);
118
+ this.govLockedInfoListSubject.next(Object.values(current));
119
+ if (addresses && addresses.length > 0) {
120
+ await this.dbService.removeGovLockedInfosByAddresses(addresses);
121
+ }
122
+ if (chains && chains.length > 0) {
123
+ await this.dbService.removeGovLockedInfosByChains(chains);
124
+ }
125
+ }
126
+ async initHandlers() {
127
+ await this.eventService.waitChainReady;
128
+ const chains = [];
129
+ const supportedSlugs = Object.values(_constants._GOVERNANCE_CHAIN_GROUP).flat();
130
+ for (const chain of Object.values(this.state.getChainInfoMap())) {
131
+ if (chain.chainStatus === 'ACTIVE' && supportedSlugs.includes(chain.slug)) {
132
+ chains.push(chain.slug);
133
+ }
134
+ }
135
+ for (const chain of chains) {
136
+ this.handlers[chain] = new OpenGovChainHandler(this.state, chain);
137
+ }
138
+ }
139
+ async handleVote(request) {
140
+ const handler = this.handlers[request.chain];
141
+ if (!handler) {
142
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
143
+ }
144
+ return handler.handleVote(request);
145
+ }
146
+ async handleRemoveVote(request) {
147
+ const handler = this.handlers[request.chain];
148
+ if (!handler) {
149
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
150
+ }
151
+ return handler.handleRemoveVote(request);
152
+ }
153
+ async handleUnlockVote(request) {
154
+ const handler = this.handlers[request.chain];
155
+ if (!handler) {
156
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
157
+ }
158
+ return handler.handleUnlockVote(request);
159
+ }
160
+
161
+ /* Gov Locked Info */
162
+
163
+ async runSubscribeGovLockedInfo() {
164
+ await this.eventService.waitKeyringReady;
165
+ this.runUnsubscribeGovLockedInfo();
166
+ const addresses = this.state.keyringService.context.getDecodedAddresses();
167
+ this.subscribeGovLockedInfos(addresses, data => {
168
+ this.updateGovLockedInfo(data);
169
+ }).then(rs => {
170
+ this.govLockedInfoUnsub = rs;
171
+ }).catch(console.error);
172
+ }
173
+ runUnsubscribeGovLockedInfo() {
174
+ var _this$govLockedInfoUn;
175
+ (_this$govLockedInfoUn = this.govLockedInfoUnsub) === null || _this$govLockedInfoUn === void 0 ? void 0 : _this$govLockedInfoUn.call(this);
176
+ this.govLockedInfoUnsub = undefined;
177
+ this.govLockedInfoPersistQueue = [];
178
+ }
179
+ async subscribeGovLockedInfos(addresses, cb) {
180
+ let cancel = false;
181
+ await this.eventService.waitChainReady;
182
+ const activeChains = this.state.activeChainSlugs;
183
+ const unsubList = [];
184
+ for (const handler of Object.values(this.handlers)) {
185
+ if (activeChains.includes(handler.chain)) {
186
+ const [useAddresses] = (0, _utils.filterAddressByChainInfo)(addresses, handler.chainInfo);
187
+ handler.subscribeGovLockedInfo(useAddresses, cb).then(unsub => {
188
+ if (cancel) {
189
+ unsub();
190
+ } else {
191
+ unsubList.push(unsub);
192
+ }
193
+ }).catch(console.error);
194
+ }
195
+ }
196
+ return () => {
197
+ cancel = true;
198
+ unsubList.forEach(unsub => unsub === null || unsub === void 0 ? void 0 : unsub());
199
+ };
200
+ }
201
+ updateGovLockedInfo(data) {
202
+ this.govLockedInfoPersistQueue.push(data);
203
+ (0, _utils.addLazy)('persistGovLockedInfo', () => {
204
+ const govInfo = this.govLockedInfoSubject.getValue();
205
+ const queue = [...this.govLockedInfoPersistQueue];
206
+ this.govLockedInfoPersistQueue = [];
207
+
208
+ // Update info in memory
209
+ queue.forEach(item => {
210
+ const key = `${item.chain}---${item.address}`;
211
+ govInfo[key] = item;
212
+ });
213
+ this.govLockedInfoSubject.next(govInfo);
214
+ this.govLockedInfoListSubject.next(Object.values(govInfo));
215
+
216
+ // Persist data
217
+ this.dbService.updateGovLockedInfos(queue).catch(console.warn);
218
+ }, 300, 900);
219
+ }
220
+ async resetGovLockedInfo() {
221
+ this.govLockedInfoPersistQueue = [];
222
+ await this.dbService.stores.govLockedInfo.clear();
223
+ }
224
+ async getGovLockedInfoFromDB() {
225
+ await this.eventService.waitChainReady;
226
+ await this.eventService.waitKeyringReady;
227
+ const addresses = this.state.keyringService.context.getDecodedAddresses();
228
+ const existedInfos = await this.dbService.getGovLockedInfos(addresses, this.state.activeChainSlugs);
229
+ const govInfo = this.govLockedInfoSubject.getValue();
230
+ existedInfos.forEach(item => {
231
+ govInfo[`${item.chain}---${item.address}`] = item;
232
+ });
233
+ this.govLockedInfoSubject.next(govInfo);
234
+ this.govLockedInfoListSubject.next(Object.values(govInfo));
235
+ }
236
+ subscribeGovLockedInfoSubject() {
237
+ return this.govLockedInfoListSubject;
238
+ }
239
+ async getGovLockedInfoInfo() {
240
+ await this.eventService.waitEarningReady;
241
+ return Promise.resolve(this.govLockedInfoListSubject.getValue());
242
+ }
243
+
244
+ /* --------- Start/Stop ---------- */
245
+ async start() {
246
+ if (this.status === _types2.ServiceStatus.STARTING || this.status === _types2.ServiceStatus.STARTED) {
247
+ return this.waitForStarted();
248
+ }
249
+ this.status = _types2.ServiceStatus.STARTING;
250
+ this.startPromiseHandler.resolve();
251
+ this.stopPromiseHandler = (0, _utils.createPromiseHandler)();
252
+ this.status = _types2.ServiceStatus.STARTED;
253
+ }
254
+ async stop() {
255
+ if (this.status === _types2.ServiceStatus.STOPPING || this.status === _types2.ServiceStatus.STOPPED) {
256
+ return this.waitForStopped();
257
+ }
258
+ this.status = _types2.ServiceStatus.STOPPING;
259
+ this.runUnsubscribeGovLockedInfo();
260
+ this.stopPromiseHandler.resolve();
261
+ this.startPromiseHandler = (0, _utils.createPromiseHandler)();
262
+ this.status = _types2.ServiceStatus.STOPPED;
263
+ }
264
+ waitForStarted() {
265
+ return this.startPromiseHandler.promise;
266
+ }
267
+ waitForStopped() {
268
+ return this.stopPromiseHandler.promise;
269
+ }
270
+
271
+ /* Gov Locked Info */
272
+ }
273
+ exports.default = OpenGovService;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.GovVoteType = exports.Conviction = void 0;
7
+ // Copyright 2019-2022 @subwallet/extension-base
8
+ // SPDX-License-Identifier: Apache-2.0
9
+ let GovVoteType;
10
+ exports.GovVoteType = GovVoteType;
11
+ (function (GovVoteType) {
12
+ GovVoteType["AYE"] = "aye";
13
+ GovVoteType["NAY"] = "nay";
14
+ GovVoteType["SPLIT"] = "split";
15
+ GovVoteType["ABSTAIN"] = "abstain";
16
+ })(GovVoteType || (exports.GovVoteType = GovVoteType = {}));
17
+ /* Lock inteface */
18
+ let Conviction;
19
+ exports.Conviction = Conviction;
20
+ (function (Conviction) {
21
+ Conviction["None"] = "None";
22
+ Conviction["Locked1x"] = "Locked1x";
23
+ Conviction["Locked2x"] = "Locked2x";
24
+ Conviction["Locked3x"] = "Locked3x";
25
+ Conviction["Locked4x"] = "Locked4x";
26
+ Conviction["Locked5x"] = "Locked5x";
27
+ Conviction["Locked6x"] = "Locked6x";
28
+ })(Conviction || (exports.Conviction = Conviction = {}));
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.defaultConvictionDays = exports.MIGRATED_CHAINS = void 0;
7
+ exports.getConvictionDays = getConvictionDays;
8
+ exports.getGovConvictionOptions = getGovConvictionOptions;
9
+ exports.specialChainLockConfig = exports.numberToConviction = void 0;
10
+ var _interface = require("./interface");
11
+ // Copyright 2019-2022 @subwallet/extension-base
12
+ // SPDX-License-Identifier: Apache-2.0
13
+
14
+ const numberToConviction = {
15
+ 0: _interface.Conviction.None,
16
+ 1: _interface.Conviction.Locked1x,
17
+ 2: _interface.Conviction.Locked2x,
18
+ 3: _interface.Conviction.Locked3x,
19
+ 4: _interface.Conviction.Locked4x,
20
+ 5: _interface.Conviction.Locked5x,
21
+ 6: _interface.Conviction.Locked6x
22
+ };
23
+ exports.numberToConviction = numberToConviction;
24
+ const defaultConvictionDays = {
25
+ [_interface.Conviction.None]: 0,
26
+ [_interface.Conviction.Locked1x]: 7,
27
+ [_interface.Conviction.Locked2x]: 14,
28
+ [_interface.Conviction.Locked3x]: 28,
29
+ [_interface.Conviction.Locked4x]: 56,
30
+ [_interface.Conviction.Locked5x]: 112,
31
+ [_interface.Conviction.Locked6x]: 224
32
+ };
33
+ exports.defaultConvictionDays = defaultConvictionDays;
34
+ const specialChainLockConfig = [{
35
+ chains: ['bifrost_dot', 'bifrost'],
36
+ daysMap: {
37
+ [_interface.Conviction.None]: 0,
38
+ [_interface.Conviction.Locked1x]: 1,
39
+ [_interface.Conviction.Locked2x]: 2,
40
+ [_interface.Conviction.Locked3x]: 4,
41
+ [_interface.Conviction.Locked4x]: 8,
42
+ [_interface.Conviction.Locked5x]: 16,
43
+ [_interface.Conviction.Locked6x]: 32
44
+ }
45
+ }];
46
+ exports.specialChainLockConfig = specialChainLockConfig;
47
+ function getConvictionDays(chain, conviction) {
48
+ var _group$daysMap, _daysMap$conviction;
49
+ const lowerChain = chain.toLowerCase();
50
+ const group = specialChainLockConfig.find(g => g.chains.includes(lowerChain));
51
+ const daysMap = (_group$daysMap = group === null || group === void 0 ? void 0 : group.daysMap) !== null && _group$daysMap !== void 0 ? _group$daysMap : defaultConvictionDays;
52
+ return (_daysMap$conviction = daysMap[conviction]) !== null && _daysMap$conviction !== void 0 ? _daysMap$conviction : 0;
53
+ }
54
+ function getGovConvictionOptions(chain) {
55
+ return Object.entries(numberToConviction).map(_ref => {
56
+ let [value, conviction] = _ref;
57
+ const days = getConvictionDays(chain, conviction);
58
+ return {
59
+ value: Number(value),
60
+ label: value === '0' ? '0.1x' : `${value}x`,
61
+ description: days === 0 ? 'No lockup' : `~${days}d`
62
+ };
63
+ });
64
+ }
65
+ const MIGRATED_CHAINS = ['statemine', 'statemint', 'paseo_assethub', 'westend_assethub'];
66
+ exports.MIGRATED_CHAINS = MIGRATED_CHAINS;
@@ -21,6 +21,7 @@ var _uiKeyring = _interopRequireDefault(require("@subwallet/ui-keyring"));
21
21
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
22
22
  var _dexieExportImport = require("dexie-export-import");
23
23
  var _util = require("@polkadot/util");
24
+ var _GovLockedInfoStore = _interopRequireDefault(require("./db-stores/GovLockedInfoStore"));
24
25
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
25
26
  // SPDX-License-Identifier: Apache-2.0
26
27
 
@@ -62,7 +63,9 @@ class DatabaseService {
62
63
  // inapp notification
63
64
  inappNotification: new _InappNotification.default(this._db.inappNotification),
64
65
  // process transaction
65
- processTransactions: new _dbStores.ProcessTransactionStore(this._db.processTransactions)
66
+ processTransactions: new _dbStores.ProcessTransactionStore(this._db.processTransactions),
67
+ // gov
68
+ govLockedInfo: new _GovLockedInfoStore.default(this._db.govLockedInfos)
66
69
  };
67
70
  }
68
71
  async updatePriceStore(priceData) {
@@ -610,6 +613,21 @@ class DatabaseService {
610
613
  updateNotificationProxyId(proxyIds, newProxyId, newName) {
611
614
  return this.stores.inappNotification.updateNotificationProxyId(proxyIds, newProxyId, newName);
612
615
  }
616
+
617
+ /* Gov */
618
+
619
+ async getGovLockedInfos(addresses, chains) {
620
+ return this.stores.govLockedInfo.getByAddressesAndChains(addresses, chains);
621
+ }
622
+ async updateGovLockedInfos(infos) {
623
+ return this.stores.govLockedInfo.upsertMany(infos);
624
+ }
625
+ removeGovLockedInfosByAddresses(addresses) {
626
+ return this.stores.govLockedInfo.removeByAddresses(addresses);
627
+ }
628
+ removeGovLockedInfosByChains(chains) {
629
+ return this.stores.govLockedInfo.removeByChains(chains);
630
+ }
613
631
  async exportDB() {
614
632
  const blob = await (0, _dexieExportImport.exportDB)(this._db, {
615
633
  filter: (table, value, key) => {
@@ -59,6 +59,9 @@ class KoniDatabase extends _dexie.default {
59
59
  this.conditionalVersion(9, {
60
60
  processTransactions: 'id, address'
61
61
  });
62
+ this.conditionalVersion(10, {
63
+ govLockedInfos: '[chain+address], chain, address'
64
+ });
62
65
  }
63
66
  conditionalVersion(version, schema, upgrade) {
64
67
  if (this.schemaVersion != null && this.schemaVersion < version) {
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _BaseStore = _interopRequireDefault(require("./BaseStore"));
9
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
10
+ // SPDX-License-Identifier: Apache-2.0
11
+
12
+ class GovLockedInfoStore extends _BaseStore.default {
13
+ async getAll() {
14
+ return this.table.toArray();
15
+ }
16
+ async getByAddresses(addresses) {
17
+ if (addresses.length === 0) {
18
+ return this.getAll();
19
+ }
20
+ return this.table.where('address').anyOfIgnoreCase(addresses).toArray();
21
+ }
22
+ async getByAddressesAndChains(addresses, chains) {
23
+ return this.table.where('address').anyOfIgnoreCase(addresses).filter(item => chains.includes(item.chain)).toArray();
24
+ }
25
+ async upsertMany(infos) {
26
+ return this.table.bulkPut(infos);
27
+ }
28
+ removeByAddresses(addresses) {
29
+ return this.table.where('address').anyOf(addresses).delete();
30
+ }
31
+ removeByChains(chains) {
32
+ return this.table.where('chain').anyOf(chains).delete();
33
+ }
34
+ }
35
+ exports.default = GovLockedInfoStore;
@@ -74,6 +74,12 @@ const typeName = type => {
74
74
  return 'Withdraw pool';
75
75
  case _KoniTypes.ExtrinsicType.JOIN_YIELD_POOL:
76
76
  return 'Start earning';
77
+ case _KoniTypes.ExtrinsicType.GOV_VOTE:
78
+ return 'Vote';
79
+ case _KoniTypes.ExtrinsicType.GOV_UNVOTE:
80
+ return 'Remove vote';
81
+ case _KoniTypes.ExtrinsicType.GOV_UNLOCK_VOTE:
82
+ return 'Unlock votes';
77
83
  case _KoniTypes.ExtrinsicType.CHANGE_EARNING_VALIDATOR:
78
84
  return 'Change validator';
79
85
  case _KoniTypes.ExtrinsicType.UNKNOWN:
@@ -32,6 +32,7 @@ var _eventemitter = _interopRequireDefault(require("eventemitter3"));
32
32
  var _i18next = require("i18next");
33
33
  var _rxjs = require("rxjs");
34
34
  var _util = require("@polkadot/util");
35
+ var _interface = require("../open-gov/interface");
35
36
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
36
37
  // SPDX-License-Identifier: Apache-2.0
37
38
 
@@ -1078,6 +1079,48 @@ class TransactionService {
1078
1079
  historyItem.additionalInfo = data;
1079
1080
  break;
1080
1081
  }
1082
+ case _KoniTypes.ExtrinsicType.GOV_VOTE:
1083
+ {
1084
+ const data = (0, _utils3.parseTransactionData)(transaction.data);
1085
+ let totalAmount = new _bignumber.default(0);
1086
+ switch (data.type) {
1087
+ case _interface.GovVoteType.AYE:
1088
+ case _interface.GovVoteType.NAY:
1089
+ totalAmount = new _bignumber.default(data.amount || '0');
1090
+ break;
1091
+ case _interface.GovVoteType.SPLIT:
1092
+ totalAmount = new _bignumber.default(data.ayeAmount || '0').plus(data.nayAmount || '0');
1093
+ break;
1094
+ case _interface.GovVoteType.ABSTAIN:
1095
+ totalAmount = new _bignumber.default(data.ayeAmount || '0').plus(data.nayAmount || '0').plus(data.abstainAmount || '0');
1096
+ break;
1097
+ }
1098
+ historyItem.amount = {
1099
+ ...baseNativeAmount,
1100
+ value: totalAmount.toString()
1101
+ };
1102
+ historyItem.additionalInfo = data;
1103
+ break;
1104
+ }
1105
+ case _KoniTypes.ExtrinsicType.GOV_UNVOTE:
1106
+ {
1107
+ const data = (0, _utils3.parseTransactionData)(transaction.data);
1108
+ historyItem.amount = {
1109
+ ...baseNativeAmount,
1110
+ value: new _bignumber.default(data.ayeAmount || '0').plus(data.nayAmount || '0').plus(data.abstainAmount || '0').plus(data.amount || 0).toString()
1111
+ };
1112
+ historyItem.additionalInfo = data;
1113
+ break;
1114
+ }
1115
+ case _KoniTypes.ExtrinsicType.GOV_UNLOCK_VOTE:
1116
+ {
1117
+ const data = (0, _utils3.parseTransactionData)(transaction.data);
1118
+ historyItem.amount = {
1119
+ ...baseNativeAmount,
1120
+ value: data.amount
1121
+ };
1122
+ break;
1123
+ }
1081
1124
  case _KoniTypes.ExtrinsicType.UNKNOWN:
1082
1125
  break;
1083
1126
  }
@@ -164,12 +164,13 @@ const EARN_STDOT_ACTIONS = [_KoniTypes.ExtrinsicType.MINT_STDOT, _KoniTypes.Extr
164
164
  const EARN_VMANTA_ACTIONS = [_KoniTypes.ExtrinsicType.MINT_VMANTA, _KoniTypes.ExtrinsicType.REDEEM_VMANTA, _KoniTypes.ExtrinsicType.UNSTAKE_VMANTA];
165
165
  const EVM_ACTIONS = [_KoniTypes.ExtrinsicType.TOKEN_SPENDING_APPROVAL, _KoniTypes.ExtrinsicType.EVM_EXECUTE];
166
166
  const CLAIM_AVAIL_BRIDGE = [_KoniTypes.ExtrinsicType.CLAIM_BRIDGE];
167
+ const OPEN_GOV_ACTIONS = [_KoniTypes.ExtrinsicType.GOV_VOTE, _KoniTypes.ExtrinsicType.GOV_UNVOTE, _KoniTypes.ExtrinsicType.GOV_UNLOCK_VOTE];
167
168
  const OTHER_ACTIONS = [_KoniTypes.ExtrinsicType.TRANSFER_XCM, _KoniTypes.ExtrinsicType.SEND_NFT, _KoniTypes.ExtrinsicType.SWAP, _KoniTypes.ExtrinsicType.CROWDLOAN];
168
169
  const getAccountTransactionActions = (signMode, networkType, type, _meta, _specialNetwork) => {
169
170
  if ([_types2.AccountSignMode.PASSWORD, _types2.AccountSignMode.INJECTED].includes(signMode)) {
170
171
  switch (networkType) {
171
172
  case _types2.AccountChainType.SUBSTRATE:
172
- return [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...EARN_VDOT_ACTIONS, ...EARN_LDOT_ACTIONS, ...EARN_SDOT_ACTIONS, ...EARN_QDOT_ACTIONS, ...EARN_VMANTA_ACTIONS, ...CLAIM_AVAIL_BRIDGE, ...OTHER_ACTIONS];
173
+ return [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...EARN_VDOT_ACTIONS, ...EARN_LDOT_ACTIONS, ...EARN_SDOT_ACTIONS, ...EARN_QDOT_ACTIONS, ...EARN_VMANTA_ACTIONS, ...CLAIM_AVAIL_BRIDGE, ...OPEN_GOV_ACTIONS, ...OTHER_ACTIONS];
173
174
  case _types2.AccountChainType.ETHEREUM:
174
175
  return [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...EARN_STDOT_ACTIONS, ...OTHER_ACTIONS, ...CLAIM_AVAIL_BRIDGE, ...EVM_ACTIONS];
175
176
  case _types2.AccountChainType.TON:
@@ -182,7 +183,7 @@ const getAccountTransactionActions = (signMode, networkType, type, _meta, _speci
182
183
  } else if (signMode === _types2.AccountSignMode.QR) {
183
184
  switch (networkType) {
184
185
  case _types2.AccountChainType.SUBSTRATE:
185
- return [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...EARN_VDOT_ACTIONS, ...EARN_LDOT_ACTIONS, ...EARN_SDOT_ACTIONS, ...EARN_QDOT_ACTIONS, ...EARN_VMANTA_ACTIONS, ...CLAIM_AVAIL_BRIDGE, ...OTHER_ACTIONS];
186
+ return [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...EARN_VDOT_ACTIONS, ...EARN_LDOT_ACTIONS, ...EARN_SDOT_ACTIONS, ...EARN_QDOT_ACTIONS, ...EARN_VMANTA_ACTIONS, ...CLAIM_AVAIL_BRIDGE, ...OPEN_GOV_ACTIONS, ...OTHER_ACTIONS];
186
187
  case _types2.AccountChainType.ETHEREUM:
187
188
  return [...(_constants.isProductionMode ? [] : [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...EARN_STDOT_ACTIONS, ...CLAIM_AVAIL_BRIDGE, ...OTHER_ACTIONS, ...EVM_ACTIONS])];
188
189
  case _types2.AccountChainType.TON:
@@ -197,7 +198,7 @@ const getAccountTransactionActions = (signMode, networkType, type, _meta, _speci
197
198
  case _types2.AccountChainType.SUBSTRATE:
198
199
  return [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...EARN_VDOT_ACTIONS, ...EARN_VMANTA_ACTIONS, ...EARN_LDOT_ACTIONS, ...EARN_SDOT_ACTIONS,
199
200
  // ...EARN_QDOT_ACTIONS,
200
- ...OTHER_ACTIONS];
201
+ ...OPEN_GOV_ACTIONS, ...OTHER_ACTIONS];
201
202
  case _types2.AccountChainType.ETHEREUM:
202
203
  return [...BASE_TRANSFER_ACTIONS, ...EARN_STDOT_ACTIONS, ...EVM_ACTIONS, ...CLAIM_AVAIL_BRIDGE, _KoniTypes.ExtrinsicType.STAKING_WITHDRAW,
203
204
  // For liquid staking
@@ -246,7 +247,7 @@ const getAccountTransactionActions = (signMode, networkType, type, _meta, _speci
246
247
  } else if (signMode === _types2.AccountSignMode.ECDSA_SUBSTRATE_LEDGER) {
247
248
  // Only for account substrate with ECDSA scheme format
248
249
  const result = [];
249
- result.push(...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, _KoniTypes.ExtrinsicType.TRANSFER_XCM, _KoniTypes.ExtrinsicType.SWAP, _KoniTypes.ExtrinsicType.CROWDLOAN);
250
+ result.push(...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...OPEN_GOV_ACTIONS, _KoniTypes.ExtrinsicType.TRANSFER_XCM, _KoniTypes.ExtrinsicType.SWAP, _KoniTypes.ExtrinsicType.CROWDLOAN);
250
251
  return result;
251
252
  }
252
253
  return [];
@@ -291,5 +291,9 @@ export default class KoniExtension {
291
291
  private migrateUnifiedAndFetchEligibleSoloAccounts;
292
292
  private migrateSoloAccount;
293
293
  private pingSession;
294
+ private handleVote;
295
+ private handleRemoveVote;
296
+ private handleUnlockVote;
297
+ private subscribeGovLockedInfo;
294
298
  handle<TMessageType extends MessageTypes>(id: string, type: TMessageType, request: RequestTypes[TMessageType], port: chrome.runtime.Port): Promise<ResponseType<TMessageType>>;
295
299
  }
@@ -4744,6 +4744,58 @@ export default class KoniExtension {
4744
4744
  }
4745
4745
  /* Migrate Unified Account */
4746
4746
 
4747
+ /* Open Gov */
4748
+
4749
+ async handleVote(request) {
4750
+ const extrinsic = await this.#koniState.openGovService.handleVote(request);
4751
+ return await this.#koniState.transactionService.handleTransaction({
4752
+ address: request.address,
4753
+ chain: request.chain,
4754
+ transaction: extrinsic,
4755
+ data: request,
4756
+ extrinsicType: ExtrinsicType.GOV_VOTE,
4757
+ chainType: ChainType.SUBSTRATE
4758
+ });
4759
+ }
4760
+ async handleRemoveVote(request) {
4761
+ const extrinsic = await this.#koniState.openGovService.handleRemoveVote(request);
4762
+ return await this.#koniState.transactionService.handleTransaction({
4763
+ address: request.address,
4764
+ chain: request.chain,
4765
+ transaction: extrinsic,
4766
+ data: request,
4767
+ extrinsicType: ExtrinsicType.GOV_UNVOTE,
4768
+ chainType: ChainType.SUBSTRATE
4769
+ });
4770
+ }
4771
+ async handleUnlockVote(request) {
4772
+ const extrinsic = await this.#koniState.openGovService.handleUnlockVote(request);
4773
+ return await this.#koniState.transactionService.handleTransaction({
4774
+ address: request.address,
4775
+ chain: request.chain,
4776
+ transaction: extrinsic,
4777
+ data: request,
4778
+ extrinsicType: ExtrinsicType.GOV_UNLOCK_VOTE,
4779
+ chainType: ChainType.SUBSTRATE
4780
+ });
4781
+ }
4782
+ async subscribeGovLockedInfo(id, port) {
4783
+ const cb = createSubscription(id, port);
4784
+ await this.#koniState.openGovService.waitForStarted();
4785
+ const govLockedInfoSubscription = this.#koniState.openGovService.subscribeGovLockedInfoSubject().subscribe({
4786
+ next: rs => {
4787
+ cb(rs);
4788
+ }
4789
+ });
4790
+ this.createUnsubscriptionHandle(id, govLockedInfoSubscription.unsubscribe);
4791
+ port.onDisconnect.addListener(() => {
4792
+ this.cancelSubscription(id);
4793
+ });
4794
+ return await this.#koniState.openGovService.getGovLockedInfoInfo();
4795
+ }
4796
+
4797
+ /* Open Gov */
4798
+
4747
4799
  // --------------------------------------------------------------
4748
4800
  // eslint-disable-next-line @typescript-eslint/require-await
4749
4801
  async handle(id, type, request, port) {
@@ -5402,6 +5454,16 @@ export default class KoniExtension {
5402
5454
  return this.migrateSoloAccount(request);
5403
5455
  case 'pri(migrate.pingSession)':
5404
5456
  return this.pingSession(request);
5457
+
5458
+ /* Gov */
5459
+ case 'pri(openGov.vote)':
5460
+ return this.handleVote(request);
5461
+ case 'pri(openGov.unvote)':
5462
+ return this.handleRemoveVote(request);
5463
+ case 'pri(openGov.unlockVote)':
5464
+ return this.handleUnlockVote(request);
5465
+ case 'pri(openGov.subscribeGovLockedInfo)':
5466
+ return this.subscribeGovLockedInfo(id, port);
5405
5467
  // Default
5406
5468
  default:
5407
5469
  throw new Error(`Unable to handle message of type ${type}`);
@@ -21,6 +21,7 @@ import MintCampaignService from '@subwallet/extension-base/services/mint-campaig
21
21
  import MktCampaignService from '@subwallet/extension-base/services/mkt-campaign-service';
22
22
  import NftService from '@subwallet/extension-base/services/nft-service';
23
23
  import NotificationService from '@subwallet/extension-base/services/notification-service/NotificationService';
24
+ import OpenGovService from '@subwallet/extension-base/services/open-gov';
24
25
  import { PriceService } from '@subwallet/extension-base/services/price-service';
25
26
  import RequestService from '@subwallet/extension-base/services/request-service';
26
27
  import { AuthUrls, MetaRequest, SignRequest } from '@subwallet/extension-base/services/request-service/types';
@@ -81,6 +82,7 @@ export default class KoniState {
81
82
  readonly swapService: SwapService;
82
83
  readonly inappNotificationService: InappNotificationService;
83
84
  readonly chainOnlineService: ChainOnlineService;
85
+ readonly openGovService: OpenGovService;
84
86
  private generalStatus;
85
87
  private waitSleeping;
86
88
  private waitStarting;