@subwallet/extension-base 1.3.68-1 → 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.
- package/background/KoniTypes.d.ts +11 -0
- package/background/KoniTypes.js +3 -0
- package/cjs/background/KoniTypes.js +3 -0
- package/cjs/koni/background/handlers/Extension.js +62 -0
- package/cjs/koni/background/handlers/State.js +5 -2
- package/cjs/koni/background/handlers/Tabs.js +11 -4
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/transfer/token.js +34 -3
- package/cjs/services/chain-service/constants.js +17 -5
- package/cjs/services/chain-service/utils/index.js +13 -5
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/event-service/index.js +1 -0
- package/cjs/services/open-gov/handler.js +563 -0
- package/cjs/services/open-gov/index.js +273 -0
- package/cjs/services/open-gov/interface.js +28 -0
- package/cjs/services/open-gov/utils.js +66 -0
- package/cjs/services/storage-service/DatabaseService.js +19 -1
- package/cjs/services/storage-service/databases/index.js +3 -0
- package/cjs/services/storage-service/db-stores/GovLockedInfoStore.js +35 -0
- package/cjs/services/transaction-service/helpers/index.js +6 -0
- package/cjs/services/transaction-service/index.js +43 -0
- package/cjs/services/transaction-service/utils.js +3 -3
- package/cjs/utils/account/transform.js +5 -4
- package/koni/background/handlers/Extension.d.ts +4 -0
- package/koni/background/handlers/Extension.js +62 -0
- package/koni/background/handlers/State.d.ts +2 -0
- package/koni/background/handlers/State.js +5 -2
- package/koni/background/handlers/Tabs.js +11 -4
- package/package.json +31 -6
- package/packageInfo.js +1 -1
- package/services/balance-service/transfer/token.d.ts +4 -0
- package/services/balance-service/transfer/token.js +31 -1
- package/services/chain-service/constants.d.ts +9 -0
- package/services/chain-service/constants.js +14 -3
- package/services/chain-service/utils/index.js +13 -5
- package/services/chain-service/utils/patch.d.ts +1 -1
- package/services/chain-service/utils/patch.js +1 -1
- package/services/event-service/index.d.ts +1 -0
- package/services/event-service/index.js +1 -0
- package/services/event-service/types.d.ts +1 -0
- package/services/open-gov/handler.d.ts +27 -0
- package/services/open-gov/handler.js +547 -0
- package/services/open-gov/index.d.ts +45 -0
- package/services/open-gov/index.js +265 -0
- package/services/open-gov/interface.d.ts +141 -0
- package/services/open-gov/interface.js +21 -0
- package/services/open-gov/utils.d.ts +14 -0
- package/services/open-gov/utils.js +52 -0
- package/services/storage-service/DatabaseService.d.ts +7 -0
- package/services/storage-service/DatabaseService.js +19 -1
- package/services/storage-service/databases/index.d.ts +2 -0
- package/services/storage-service/databases/index.js +3 -0
- package/services/storage-service/db-stores/GovLockedInfoStore.d.ts +10 -0
- package/services/storage-service/db-stores/GovLockedInfoStore.js +27 -0
- package/services/transaction-service/helpers/index.js +6 -0
- package/services/transaction-service/index.js +43 -0
- package/services/transaction-service/utils.js +3 -3
- 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
|
}
|
|
@@ -54,7 +54,7 @@ function getBlockExplorerAccountRoute(explorerLink) {
|
|
|
54
54
|
if (explorerLink.includes('main.dentnet.io')) {
|
|
55
55
|
return 'account';
|
|
56
56
|
}
|
|
57
|
-
if (explorerLink.includes('taostats.io')) {
|
|
57
|
+
if (explorerLink.includes('/taostats.io')) {
|
|
58
58
|
return 'account';
|
|
59
59
|
}
|
|
60
60
|
if (explorerLink.includes('uniquescan.io')) {
|
|
@@ -123,7 +123,7 @@ function getExplorerLink(chainInfo, value, type) {
|
|
|
123
123
|
const explorerLink = (0, _utils._getBlockExplorerFromChain)(chainInfo);
|
|
124
124
|
if (explorerLink && type === 'account') {
|
|
125
125
|
const route = getBlockExplorerAccountRoute(explorerLink);
|
|
126
|
-
if (chainInfo.slug
|
|
126
|
+
if (['truth_network', 'aventus'].includes(chainInfo.slug)) {
|
|
127
127
|
const address = (0, _util.u8aToHex)((0, _utilCrypto.decodeAddress)(value));
|
|
128
128
|
return `${explorerLink}${explorerLink.endsWith('/') ? '' : '/'}${route}/${address}`;
|
|
129
129
|
}
|
|
@@ -137,7 +137,7 @@ function getExplorerLink(chainInfo, value, type) {
|
|
|
137
137
|
if (chainInfo.slug === 'xode') {
|
|
138
138
|
return `${explorerLink}${explorerLink.endsWith('/') ? '' : '/'}polkadot-chain-transaction?search=${value}`;
|
|
139
139
|
}
|
|
140
|
-
if (chainInfo.slug
|
|
140
|
+
if (['truth_network', 'aventus'].includes(chainInfo.slug)) {
|
|
141
141
|
// getTransactionId(value)
|
|
142
142
|
// .then((transactionId) => {
|
|
143
143
|
// return (`${explorerLink}${explorerLink.endsWith('/') ? '' : '/'}${route}/${transactionId}`);
|
|
@@ -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
|
}
|