@subwallet/extension-base 1.3.19-0 → 1.3.21-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/background/KoniTypes.d.ts +8 -1
- package/cjs/core/logic-validation/request.js +4 -1
- package/cjs/defaults.js +1 -1
- package/cjs/koni/background/handlers/Extension.js +519 -90
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/chain-service/constants.js +1 -1
- package/cjs/services/chain-service/handler/EvmApi.js +1 -3
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +19 -8
- package/cjs/services/earning-service/handlers/special.js +16 -10
- package/cjs/services/history-service/helpers/recoverHistoryStatus.js +14 -5
- package/cjs/services/history-service/index.js +15 -3
- package/cjs/services/inapp-notification-service/index.js +78 -0
- package/cjs/services/inapp-notification-service/interfaces.js +2 -0
- package/cjs/services/keyring-service/context/state.js +2 -1
- package/cjs/services/request-service/handler/EvmRequestHandler.js +10 -0
- package/cjs/services/request-service/handler/SubstrateRequestHandler.js +4 -3
- package/cjs/services/request-service/index.js +2 -2
- package/cjs/services/setting-service/constants.js +5 -2
- package/cjs/services/storage-service/DatabaseService.js +98 -2
- package/cjs/services/storage-service/databases/index.js +3 -0
- package/cjs/services/storage-service/db-stores/ProcessTransaction.js +47 -0
- package/cjs/services/storage-service/db-stores/Transaction.js +2 -0
- package/cjs/services/storage-service/db-stores/index.js +8 -1
- package/cjs/services/swap-service/handler/asset-hub/handler.js +30 -11
- package/cjs/services/swap-service/handler/hydradx-handler.js +18 -10
- package/cjs/services/swap-service/index.js +3 -0
- package/cjs/services/swap-service/utils.js +1 -0
- package/cjs/services/transaction-service/index.js +218 -9
- package/cjs/types/index.js +11 -0
- package/cjs/types/setting.js +1 -0
- package/cjs/types/swap/index.js +4 -1
- package/cjs/types/transaction/index.js +11 -0
- package/cjs/types/transaction/process.js +28 -0
- package/cjs/types/yield/actions/join/submit.js +16 -1
- package/core/logic-validation/request.js +4 -1
- package/defaults.d.ts +1 -1
- package/defaults.js +1 -1
- package/koni/background/handlers/Extension.d.ts +5 -0
- package/koni/background/handlers/Extension.js +437 -12
- package/package.json +21 -6
- package/packageInfo.js +1 -1
- package/services/chain-service/constants.js +1 -1
- package/services/chain-service/handler/EvmApi.js +1 -3
- package/services/chain-service/utils/patch.js +1 -1
- package/services/earning-service/handlers/liquid-staking/stella-swap.js +19 -8
- package/services/earning-service/handlers/special.js +18 -12
- package/services/history-service/helpers/recoverHistoryStatus.js +14 -5
- package/services/history-service/index.d.ts +6 -5
- package/services/history-service/index.js +16 -5
- package/services/inapp-notification-service/index.d.ts +2 -0
- package/services/inapp-notification-service/index.js +79 -1
- package/services/inapp-notification-service/interfaces.d.ts +8 -1
- package/services/inapp-notification-service/interfaces.js +2 -0
- package/services/keyring-service/context/state.d.ts +1 -1
- package/services/keyring-service/context/state.js +3 -2
- package/services/request-service/handler/EvmRequestHandler.js +10 -0
- package/services/request-service/handler/SubstrateRequestHandler.d.ts +1 -1
- package/services/request-service/handler/SubstrateRequestHandler.js +4 -3
- package/services/request-service/index.d.ts +1 -1
- package/services/request-service/index.js +2 -2
- package/services/setting-service/constants.d.ts +1 -0
- package/services/setting-service/constants.js +3 -1
- package/services/storage-service/DatabaseService.d.ts +12 -3
- package/services/storage-service/DatabaseService.js +100 -4
- package/services/storage-service/databases/index.d.ts +2 -1
- package/services/storage-service/databases/index.js +3 -0
- package/services/storage-service/db-stores/ProcessTransaction.d.ts +14 -0
- package/services/storage-service/db-stores/ProcessTransaction.js +39 -0
- package/services/storage-service/db-stores/Transaction.js +2 -0
- package/services/storage-service/db-stores/index.d.ts +1 -0
- package/services/storage-service/db-stores/index.js +2 -1
- package/services/swap-service/handler/asset-hub/handler.js +30 -11
- package/services/swap-service/handler/hydradx-handler.js +18 -10
- package/services/swap-service/index.js +3 -0
- package/services/swap-service/utils.js +1 -0
- package/services/transaction-service/index.d.ts +19 -1
- package/services/transaction-service/index.js +220 -11
- package/services/transaction-service/types.d.ts +13 -4
- package/types/index.d.ts +1 -0
- package/types/index.js +1 -0
- package/types/setting.d.ts +3 -0
- package/types/setting.js +1 -0
- package/types/swap/index.d.ts +3 -2
- package/types/swap/index.js +4 -1
- package/types/transaction/index.d.ts +1 -0
- package/types/transaction/index.js +1 -0
- package/types/transaction/process.d.ts +84 -0
- package/types/transaction/process.js +20 -0
- package/types/transaction/request.d.ts +3 -1
- package/types/yield/actions/join/submit.d.ts +18 -3
- package/types/yield/actions/join/submit.js +11 -1
|
@@ -14,7 +14,7 @@ import { parseLiquidStakingEvents, parseLiquidStakingFastUnstakeEvents, parseTra
|
|
|
14
14
|
import { getBaseTransactionInfo, getTransactionId, isSubstrateTransaction, isTonTransaction } from '@subwallet/extension-base/services/transaction-service/helpers';
|
|
15
15
|
import { getExplorerLink, parseTransactionData } from '@subwallet/extension-base/services/transaction-service/utils';
|
|
16
16
|
import { isWalletConnectRequest } from '@subwallet/extension-base/services/wallet-connect-service/helpers';
|
|
17
|
-
import { BasicTxErrorType, YieldPoolType } from '@subwallet/extension-base/types';
|
|
17
|
+
import { BasicTxErrorType, StepStatus, YieldPoolType } from '@subwallet/extension-base/types';
|
|
18
18
|
import { anyNumberToBN, pairToAccount, reformatAddress } from '@subwallet/extension-base/utils';
|
|
19
19
|
import { mergeTransactionAndSignature } from '@subwallet/extension-base/utils/eth/mergeTransactionAndSignature';
|
|
20
20
|
import { isContractAddress, parseContractInput } from '@subwallet/extension-base/utils/eth/parseTransaction';
|
|
@@ -26,11 +26,13 @@ import { addHexPrefix } from 'ethereumjs-util';
|
|
|
26
26
|
import { ethers } from 'ethers';
|
|
27
27
|
import EventEmitter from 'eventemitter3';
|
|
28
28
|
import { t } from 'i18next';
|
|
29
|
-
import { BehaviorSubject, interval as rxjsInterval } from 'rxjs';
|
|
29
|
+
import { BehaviorSubject, interval as rxjsInterval, map as rxjsMap } from 'rxjs';
|
|
30
30
|
import { hexToU8a, isHex } from '@polkadot/util';
|
|
31
31
|
export default class TransactionService {
|
|
32
|
-
transactionSubject = new BehaviorSubject({});
|
|
33
32
|
watchTransactionSubscribes = {};
|
|
33
|
+
aliveProcessMap = new Map();
|
|
34
|
+
transactionSubject = new BehaviorSubject({});
|
|
35
|
+
aliveProcessSubject = new BehaviorSubject(this.aliveProcessMap);
|
|
34
36
|
get transactions() {
|
|
35
37
|
return this.transactionSubject.getValue();
|
|
36
38
|
}
|
|
@@ -59,11 +61,13 @@ export default class TransactionService {
|
|
|
59
61
|
return [];
|
|
60
62
|
}
|
|
61
63
|
async validateTransaction(transactionInput) {
|
|
64
|
+
var _transactionInput$ste;
|
|
62
65
|
const validationResponse = {
|
|
63
66
|
...transactionInput,
|
|
64
67
|
status: undefined,
|
|
65
68
|
errors: transactionInput.errors || [],
|
|
66
|
-
warnings: transactionInput.warnings || []
|
|
69
|
+
warnings: transactionInput.warnings || [],
|
|
70
|
+
processId: (_transactionInput$ste = transactionInput.step) === null || _transactionInput$ste === void 0 ? void 0 : _transactionInput$ste.processId
|
|
67
71
|
};
|
|
68
72
|
const {
|
|
69
73
|
additionalValidator,
|
|
@@ -130,6 +134,44 @@ export default class TransactionService {
|
|
|
130
134
|
getTransactionSubject() {
|
|
131
135
|
return this.transactionSubject;
|
|
132
136
|
}
|
|
137
|
+
get observables() {
|
|
138
|
+
const transactionSubject = this.transactionSubject;
|
|
139
|
+
const aliveProcessSubject = this.aliveProcessSubject;
|
|
140
|
+
return {
|
|
141
|
+
get transaction() {
|
|
142
|
+
return transactionSubject.asObservable();
|
|
143
|
+
},
|
|
144
|
+
get aliveProcess() {
|
|
145
|
+
return aliveProcessSubject.asObservable().pipe(rxjsMap(aliveProcessMap => {
|
|
146
|
+
const aliveProcessRecord = {};
|
|
147
|
+
aliveProcessMap.forEach((value, key) => {
|
|
148
|
+
aliveProcessRecord[key] = value;
|
|
149
|
+
});
|
|
150
|
+
return aliveProcessRecord;
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
get values() {
|
|
156
|
+
const transactionSubject = this.transactionSubject;
|
|
157
|
+
const aliveProcessSubject = this.aliveProcessSubject;
|
|
158
|
+
return {
|
|
159
|
+
get transaction() {
|
|
160
|
+
return transactionSubject.value;
|
|
161
|
+
},
|
|
162
|
+
get aliveProcess() {
|
|
163
|
+
const aliveProcessMap = aliveProcessSubject.value;
|
|
164
|
+
const aliveProcessRecord = {};
|
|
165
|
+
aliveProcessMap.forEach((value, key) => {
|
|
166
|
+
aliveProcessRecord[key] = value;
|
|
167
|
+
});
|
|
168
|
+
return aliveProcessRecord;
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
updateAliveProcess() {
|
|
173
|
+
this.aliveProcessSubject.next(this.aliveProcessMap);
|
|
174
|
+
}
|
|
133
175
|
fillTransactionDefaultInfo(transaction) {
|
|
134
176
|
const isInternal = !transaction.url;
|
|
135
177
|
const transactionId = getTransactionId(transaction.chainType, transaction.chain, isInternal, isWalletConnectRequest(transaction.id));
|
|
@@ -207,6 +249,12 @@ export default class TransactionService {
|
|
|
207
249
|
resolve();
|
|
208
250
|
}
|
|
209
251
|
});
|
|
252
|
+
emitter.on('timeout', data => {
|
|
253
|
+
if (transaction.errorOnTimeOut && data.errors.length > 0) {
|
|
254
|
+
validatedTransaction.errors.push(...data.errors);
|
|
255
|
+
resolve();
|
|
256
|
+
}
|
|
257
|
+
});
|
|
210
258
|
});
|
|
211
259
|
|
|
212
260
|
// @ts-ignore
|
|
@@ -219,20 +267,39 @@ export default class TransactionService {
|
|
|
219
267
|
// Send Transaction
|
|
220
268
|
const emitter = await (transaction.chainType === 'substrate' ? this.signAndSendSubstrateTransaction(transaction) : transaction.chainType === 'evm' ? this.signAndSendEvmTransaction(transaction) : this.signAndSendTonTransaction(transaction));
|
|
221
269
|
const {
|
|
222
|
-
eventsHandler
|
|
270
|
+
eventsHandler,
|
|
271
|
+
step
|
|
223
272
|
} = transaction;
|
|
224
273
|
emitter.on('signed', data => {
|
|
225
274
|
this.onSigned(data);
|
|
226
275
|
});
|
|
227
276
|
emitter.on('send', data => {
|
|
228
277
|
this.onSend(data);
|
|
278
|
+
if (step) {
|
|
279
|
+
this.updateProcessStepStatus(step, {
|
|
280
|
+
transactionId: transaction.id,
|
|
281
|
+
status: StepStatus.SUBMITTING,
|
|
282
|
+
chain: transaction.chain
|
|
283
|
+
});
|
|
284
|
+
}
|
|
229
285
|
});
|
|
230
286
|
emitter.on('extrinsicHash', data => {
|
|
231
287
|
this.onHasTransactionHash(data);
|
|
288
|
+
if (step) {
|
|
289
|
+
this.updateProcessStepStatus(step, {
|
|
290
|
+
extrinsicHash: data.extrinsicHash,
|
|
291
|
+
status: StepStatus.PROCESSING
|
|
292
|
+
});
|
|
293
|
+
}
|
|
232
294
|
});
|
|
233
295
|
emitter.on('success', data => {
|
|
234
296
|
this.handlePostProcessing(data.id);
|
|
235
297
|
this.onSuccess(data);
|
|
298
|
+
if (step) {
|
|
299
|
+
this.updateProcessStepStatus(step, {
|
|
300
|
+
status: StepStatus.COMPLETE
|
|
301
|
+
});
|
|
302
|
+
}
|
|
236
303
|
});
|
|
237
304
|
emitter.on('error', data => {
|
|
238
305
|
// this.handlePostProcessing(data.id); // might enable this later
|
|
@@ -240,12 +307,33 @@ export default class TransactionService {
|
|
|
240
307
|
...data,
|
|
241
308
|
errors: [...data.errors, new TransactionError(BasicTxErrorType.INTERNAL_ERROR)]
|
|
242
309
|
});
|
|
310
|
+
if (step) {
|
|
311
|
+
const rejectError = data.errors.find(error => {
|
|
312
|
+
// TODO: REFACTOR ERROR CODE
|
|
313
|
+
if ([BasicTxErrorType.UNABLE_TO_SIGN, BasicTxErrorType.USER_REJECT_REQUEST].includes(error.errorType)) {
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
return false;
|
|
317
|
+
});
|
|
318
|
+
if (rejectError) {
|
|
319
|
+
this.deleteProcess(step);
|
|
320
|
+
} else {
|
|
321
|
+
this.updateProcessStepStatus(step, {
|
|
322
|
+
status: StepStatus.FAILED
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
243
326
|
});
|
|
244
327
|
emitter.on('timeout', data => {
|
|
245
328
|
this.onTimeOut({
|
|
246
329
|
...data,
|
|
247
330
|
errors: [...data.errors, new TransactionError(BasicTxErrorType.TIMEOUT)]
|
|
248
331
|
});
|
|
332
|
+
if (step) {
|
|
333
|
+
this.updateProcessStepStatus(step, {
|
|
334
|
+
status: StepStatus.TIMEOUT
|
|
335
|
+
});
|
|
336
|
+
}
|
|
249
337
|
});
|
|
250
338
|
|
|
251
339
|
// Todo: handle any event with transaction.eventsHandler
|
|
@@ -276,6 +364,7 @@ export default class TransactionService {
|
|
|
276
364
|
return getExplorerLink(chainInfo, transaction.extrinsicHash, 'tx');
|
|
277
365
|
}
|
|
278
366
|
transactionToHistories(id, startBlock, nonce, eventLogs) {
|
|
367
|
+
var _transaction$step;
|
|
279
368
|
const transaction = this.getTransaction(id);
|
|
280
369
|
const extrinsicType = transaction.extrinsicType;
|
|
281
370
|
const chainInfo = this.state.chainService.getChainInfoByKey(transaction.chain);
|
|
@@ -299,7 +388,8 @@ export default class TransactionService {
|
|
|
299
388
|
blockHash: '',
|
|
300
389
|
// Will be added in next step
|
|
301
390
|
nonce: nonce !== null && nonce !== void 0 ? nonce : 0,
|
|
302
|
-
startBlock: startBlock || 0
|
|
391
|
+
startBlock: startBlock || 0,
|
|
392
|
+
processId: (_transaction$step = transaction.step) === null || _transaction$step === void 0 ? void 0 : _transaction$step.processId
|
|
303
393
|
};
|
|
304
394
|
const nativeAsset = _getChainNativeTokenBasicInfo(chainInfo);
|
|
305
395
|
const baseNativeAmount = {
|
|
@@ -650,6 +740,7 @@ export default class TransactionService {
|
|
|
650
740
|
|
|
651
741
|
// Create Input History Transaction History
|
|
652
742
|
this.state.historyService.insertHistories(this.transactionToHistories(id, startBlock, nonce)).catch(console.error);
|
|
743
|
+
this.createProcessNotification(id).catch(console.error);
|
|
653
744
|
console.debug(`Transaction "${id}" is sent`);
|
|
654
745
|
}
|
|
655
746
|
onHasTransactionHash({
|
|
@@ -856,6 +947,8 @@ export default class TransactionService {
|
|
|
856
947
|
address,
|
|
857
948
|
chain,
|
|
858
949
|
id,
|
|
950
|
+
isPassConfirmation,
|
|
951
|
+
step,
|
|
859
952
|
transaction,
|
|
860
953
|
url
|
|
861
954
|
}) {
|
|
@@ -934,7 +1027,8 @@ export default class TransactionService {
|
|
|
934
1027
|
id,
|
|
935
1028
|
errors: [],
|
|
936
1029
|
warnings: [],
|
|
937
|
-
extrinsicHash: id
|
|
1030
|
+
extrinsicHash: id,
|
|
1031
|
+
processId: step === null || step === void 0 ? void 0 : step.processId
|
|
938
1032
|
};
|
|
939
1033
|
if (isInjected) {
|
|
940
1034
|
this.state.requestService.addConfirmation(id, url || EXTENSION_REQUEST_URL, 'evmWatchTransactionRequest', payload, {}).then(async ({
|
|
@@ -1001,7 +1095,9 @@ export default class TransactionService {
|
|
|
1001
1095
|
emitter.emit('error', eventData);
|
|
1002
1096
|
});
|
|
1003
1097
|
} else {
|
|
1004
|
-
this.state.requestService.addConfirmation(id, url || EXTENSION_REQUEST_URL, 'evmSendTransactionRequest', payload, {
|
|
1098
|
+
this.state.requestService.addConfirmation(id, url || EXTENSION_REQUEST_URL, 'evmSendTransactionRequest', payload, {
|
|
1099
|
+
isPassConfirmation
|
|
1100
|
+
}).then(async ({
|
|
1005
1101
|
isApproved,
|
|
1006
1102
|
payload
|
|
1007
1103
|
}) => {
|
|
@@ -1066,6 +1162,8 @@ export default class TransactionService {
|
|
|
1066
1162
|
feeCustom,
|
|
1067
1163
|
id,
|
|
1068
1164
|
nonNativeTokenPayFeeSlug,
|
|
1165
|
+
signAfterCreate,
|
|
1166
|
+
step,
|
|
1069
1167
|
transaction,
|
|
1070
1168
|
url
|
|
1071
1169
|
}) {
|
|
@@ -1077,7 +1175,8 @@ export default class TransactionService {
|
|
|
1077
1175
|
id,
|
|
1078
1176
|
errors: [],
|
|
1079
1177
|
warnings: [],
|
|
1080
|
-
extrinsicHash: id
|
|
1178
|
+
extrinsicHash: id,
|
|
1179
|
+
processId: step === null || step === void 0 ? void 0 : step.processId
|
|
1081
1180
|
};
|
|
1082
1181
|
const extrinsic = transaction;
|
|
1083
1182
|
// const registry = extrinsic.registry;
|
|
@@ -1089,7 +1188,7 @@ export default class TransactionService {
|
|
|
1089
1188
|
const {
|
|
1090
1189
|
signature,
|
|
1091
1190
|
signedTransaction
|
|
1092
|
-
} = await this.state.requestService.signInternalTransaction(id, address, url || EXTENSION_REQUEST_URL, payload);
|
|
1191
|
+
} = await this.state.requestService.signInternalTransaction(id, address, url || EXTENSION_REQUEST_URL, payload, signAfterCreate);
|
|
1093
1192
|
return {
|
|
1094
1193
|
id: new Date().getTime(),
|
|
1095
1194
|
signature,
|
|
@@ -1173,6 +1272,7 @@ export default class TransactionService {
|
|
|
1173
1272
|
chain,
|
|
1174
1273
|
extrinsicType,
|
|
1175
1274
|
id,
|
|
1275
|
+
step,
|
|
1176
1276
|
transaction,
|
|
1177
1277
|
url
|
|
1178
1278
|
}) {
|
|
@@ -1182,7 +1282,8 @@ export default class TransactionService {
|
|
|
1182
1282
|
id,
|
|
1183
1283
|
errors: [],
|
|
1184
1284
|
warnings: [],
|
|
1185
|
-
extrinsicHash: id
|
|
1285
|
+
extrinsicHash: id,
|
|
1286
|
+
processId: step === null || step === void 0 ? void 0 : step.processId
|
|
1186
1287
|
};
|
|
1187
1288
|
const payload = transaction;
|
|
1188
1289
|
const signer = message => {
|
|
@@ -1301,6 +1402,114 @@ export default class TransactionService {
|
|
|
1301
1402
|
extrinsicHash: transaction.extrinsicHash
|
|
1302
1403
|
}).catch(console.error);
|
|
1303
1404
|
}
|
|
1405
|
+
async createProcessIfNeed(process) {
|
|
1406
|
+
if (!this.aliveProcessMap.has(process.id)) {
|
|
1407
|
+
this.aliveProcessMap.set(process.id, process);
|
|
1408
|
+
this.updateAliveProcess();
|
|
1409
|
+
await this.state.dbService.upsertProcessTransaction(process);
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
checkProcessExist(processId) {
|
|
1413
|
+
return this.aliveProcessMap.has(processId);
|
|
1414
|
+
}
|
|
1415
|
+
deleteProcess(step) {
|
|
1416
|
+
const {
|
|
1417
|
+
processId
|
|
1418
|
+
} = step;
|
|
1419
|
+
this.aliveProcessMap.delete(processId);
|
|
1420
|
+
this.state.dbService.deleteProcessTransactionById(processId).catch(console.error);
|
|
1421
|
+
this.updateAliveProcess();
|
|
1422
|
+
}
|
|
1423
|
+
updateProcessStepStatus(step, data) {
|
|
1424
|
+
const {
|
|
1425
|
+
processId,
|
|
1426
|
+
stepId
|
|
1427
|
+
} = step;
|
|
1428
|
+
const process = this.aliveProcessMap.get(processId);
|
|
1429
|
+
if (process) {
|
|
1430
|
+
const step = process.steps.find(item => item.id === stepId);
|
|
1431
|
+
if (step) {
|
|
1432
|
+
Object.assign(step, data);
|
|
1433
|
+
if ([StepStatus.PREPARE || StepStatus.PROCESSING].includes(step.status)) {
|
|
1434
|
+
process.currentStepId = step.id;
|
|
1435
|
+
}
|
|
1436
|
+
if (step.status === StepStatus.COMPLETE) {
|
|
1437
|
+
const nextStep = process.steps.find(item => item.id === stepId + 1);
|
|
1438
|
+
if (nextStep) {
|
|
1439
|
+
nextStep.status = StepStatus.PREPARE;
|
|
1440
|
+
process.currentStepId = nextStep.id;
|
|
1441
|
+
}
|
|
1442
|
+
} else if ([StepStatus.FAILED, StepStatus.TIMEOUT].includes(step.status)) {
|
|
1443
|
+
const nextSteps = process.steps.filter(item => item.id > stepId);
|
|
1444
|
+
nextSteps.forEach(item => {
|
|
1445
|
+
item.status = StepStatus.CANCELLED;
|
|
1446
|
+
});
|
|
1447
|
+
}
|
|
1448
|
+
}
|
|
1449
|
+
if (process.steps.some(item => [StepStatus.PROCESSING, StepStatus.SUBMITTING].includes(item.status))) {
|
|
1450
|
+
process.status = StepStatus.PROCESSING;
|
|
1451
|
+
}
|
|
1452
|
+
if (process.steps.some(item => item.status === StepStatus.TIMEOUT)) {
|
|
1453
|
+
process.status = StepStatus.TIMEOUT;
|
|
1454
|
+
}
|
|
1455
|
+
if (process.steps.every(item => item.status === StepStatus.COMPLETE)) {
|
|
1456
|
+
const lastStep = process.steps[process.steps.length - 1];
|
|
1457
|
+
process.lastTransactionChain = lastStep.chain;
|
|
1458
|
+
process.lastTransactionId = lastStep.transactionId;
|
|
1459
|
+
process.status = StepStatus.COMPLETE;
|
|
1460
|
+
}
|
|
1461
|
+
if (process.steps.some(item => item.status === StepStatus.FAILED)) {
|
|
1462
|
+
process.status = StepStatus.FAILED;
|
|
1463
|
+
}
|
|
1464
|
+
this.aliveProcessMap.set(processId, process);
|
|
1465
|
+
this.state.dbService.upsertProcessTransaction(process).catch(console.error);
|
|
1466
|
+
if ([StepStatus.COMPLETE, StepStatus.FAILED, StepStatus.TIMEOUT].includes(process.status)) {
|
|
1467
|
+
this.aliveProcessMap.delete(processId);
|
|
1468
|
+
}
|
|
1469
|
+
this.updateAliveProcess();
|
|
1470
|
+
} else {
|
|
1471
|
+
this.state.dbService.getProcessTransactionById(processId).then(process => {
|
|
1472
|
+
if (process) {
|
|
1473
|
+
const step = process.steps.find(item => item.id === stepId);
|
|
1474
|
+
if (step && step.status === StepStatus.TIMEOUT && [StepStatus.COMPLETE, StepStatus.FAILED].includes(data.status)) {
|
|
1475
|
+
Object.assign(step, data);
|
|
1476
|
+
const isLastStep = process.steps[process.steps.length - 1].id = stepId;
|
|
1477
|
+
if (isLastStep) {
|
|
1478
|
+
process.status = data.status;
|
|
1479
|
+
}
|
|
1480
|
+
this.state.dbService.upsertProcessTransaction(process).catch(console.error);
|
|
1481
|
+
}
|
|
1482
|
+
}
|
|
1483
|
+
}).catch(console.error);
|
|
1484
|
+
}
|
|
1485
|
+
}
|
|
1486
|
+
async updateProcessInfo(id, combineInfo, step) {
|
|
1487
|
+
const process = this.aliveProcessMap.get(id);
|
|
1488
|
+
if (process) {
|
|
1489
|
+
if (step) {
|
|
1490
|
+
const index = process.steps.findIndex(item => item.id === (step === null || step === void 0 ? void 0 : step.id));
|
|
1491
|
+
if (index !== -1) {
|
|
1492
|
+
process.steps[index] = step;
|
|
1493
|
+
}
|
|
1494
|
+
}
|
|
1495
|
+
if (combineInfo) {
|
|
1496
|
+
process.combineInfo = combineInfo;
|
|
1497
|
+
}
|
|
1498
|
+
this.aliveProcessMap.set(process.id, process);
|
|
1499
|
+
this.updateAliveProcess();
|
|
1500
|
+
await this.state.dbService.upsertProcessTransaction(process);
|
|
1501
|
+
}
|
|
1502
|
+
}
|
|
1503
|
+
async createProcessNotification(transactionId) {
|
|
1504
|
+
var _transaction$step2;
|
|
1505
|
+
const transaction = this.getTransaction(transactionId);
|
|
1506
|
+
if (transaction && (_transaction$step2 = transaction.step) !== null && _transaction$step2 !== void 0 && _transaction$step2.processId) {
|
|
1507
|
+
const process = this.aliveProcessMap.get(transaction.step.processId);
|
|
1508
|
+
if (process) {
|
|
1509
|
+
await this.state.inappNotificationService.createProcessNotification(process);
|
|
1510
|
+
}
|
|
1511
|
+
}
|
|
1512
|
+
}
|
|
1304
1513
|
resetWallet() {
|
|
1305
1514
|
this.transactionSubject.next({});
|
|
1306
1515
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ChainType, ExtrinsicDataTypeMap, ExtrinsicStatus, ExtrinsicType, FeeData, ValidateTransactionResponse } from '@subwallet/extension-base/background/KoniTypes';
|
|
2
2
|
import { TonTransactionConfig } from '@subwallet/extension-base/services/balance-service/transfer/ton-transfer';
|
|
3
|
-
import { BaseRequestSign, TransactionFee } from '@subwallet/extension-base/types';
|
|
3
|
+
import { BaseRequestSign, BriefProcessStep, ProcessTransactionData, TransactionFee } from '@subwallet/extension-base/types';
|
|
4
4
|
import EventEmitter from 'eventemitter3';
|
|
5
5
|
import { TransactionConfig } from 'web3-core';
|
|
6
6
|
import { SubmittableExtrinsic } from '@polkadot/api/promise/types';
|
|
@@ -22,10 +22,16 @@ export interface SWTransaction extends ValidateTransactionResponse, Partial<Pick
|
|
|
22
22
|
transaction: SubmittableExtrinsic | TransactionConfig | TonTransactionConfig;
|
|
23
23
|
additionalValidator?: (inputTransaction: SWTransactionResponse) => Promise<void>;
|
|
24
24
|
eventsHandler?: (eventEmitter: TransactionEmitter) => void;
|
|
25
|
+
isPassConfirmation?: boolean;
|
|
26
|
+
errorOnTimeOut?: boolean;
|
|
27
|
+
signAfterCreate?: (id: string) => void;
|
|
28
|
+
step?: BriefProcessStep;
|
|
29
|
+
}
|
|
30
|
+
export interface SWTransactionResult extends Omit<SWTransaction, 'transaction' | 'additionalValidator' | 'eventsHandler' | 'process'> {
|
|
31
|
+
process?: ProcessTransactionData;
|
|
25
32
|
}
|
|
26
|
-
export declare type SWTransactionResult = Omit<SWTransaction, 'transaction' | 'additionalValidator' | 'eventsHandler'>;
|
|
27
33
|
declare type SwInputBase = Pick<SWTransaction, 'address' | 'url' | 'data' | 'extrinsicType' | 'chain' | 'chainType' | 'ignoreWarnings' | 'transferNativeAmount'> & Partial<Pick<SWTransaction, 'additionalValidator' | 'eventsHandler'>>;
|
|
28
|
-
export interface SWTransactionInput extends SwInputBase, Partial<Pick<SWTransaction, 'estimateFee'>>, TransactionFee {
|
|
34
|
+
export interface SWTransactionInput extends SwInputBase, Partial<Pick<SWTransaction, 'estimateFee' | 'signAfterCreate' | 'isPassConfirmation' | 'step' | 'errorOnTimeOut'>>, TransactionFee {
|
|
29
35
|
id?: string;
|
|
30
36
|
transaction?: SWTransaction['transaction'] | null;
|
|
31
37
|
warnings?: SWTransaction['warnings'];
|
|
@@ -36,11 +42,14 @@ export interface SWTransactionInput extends SwInputBase, Partial<Pick<SWTransact
|
|
|
36
42
|
resolveOnDone?: boolean;
|
|
37
43
|
skipFeeValidation?: boolean;
|
|
38
44
|
}
|
|
39
|
-
export declare type SWTransactionResponse = SwInputBase & Pick<SWTransaction, 'warnings' | 'errors'> & Partial<Pick<SWTransaction, 'id' | 'extrinsicHash' | 'status' | 'estimateFee'>> & TransactionFee
|
|
45
|
+
export declare type SWTransactionResponse = SwInputBase & Pick<SWTransaction, 'warnings' | 'errors'> & Partial<Pick<SWTransaction, 'id' | 'extrinsicHash' | 'status' | 'estimateFee'>> & TransactionFee & {
|
|
46
|
+
processId?: string;
|
|
47
|
+
};
|
|
40
48
|
export declare type ValidateTransactionResponseInput = SWTransactionInput;
|
|
41
49
|
export declare type TransactionEmitter = EventEmitter<TransactionEventMap>;
|
|
42
50
|
export interface TransactionEventResponse extends ValidateTransactionResponse {
|
|
43
51
|
id: string;
|
|
52
|
+
processId?: string;
|
|
44
53
|
extrinsicHash?: string;
|
|
45
54
|
blockHash?: string;
|
|
46
55
|
blockNumber?: number;
|
package/types/index.d.ts
CHANGED
package/types/index.js
CHANGED
package/types/setting.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/types/swap/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { _ChainInfo } from '@subwallet/chain-list/types';
|
|
2
2
|
import { SwapError } from '@subwallet/extension-base/background/errors/SwapError';
|
|
3
3
|
import { AmountData, ChainType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
4
|
-
import { TransactionData } from '@subwallet/extension-base/types';
|
|
5
4
|
import { BaseStepDetail, CommonOptimalPath, CommonStepFeeInfo } from '@subwallet/extension-base/types/service-base';
|
|
6
5
|
import BigN from 'bignumber.js';
|
|
6
|
+
import { BaseProcessRequestSign, TransactionData } from '../transaction';
|
|
7
7
|
export declare type SwapRate = number;
|
|
8
8
|
export interface SwapPair {
|
|
9
9
|
slug: string;
|
|
@@ -54,6 +54,7 @@ export declare enum SwapProviderId {
|
|
|
54
54
|
POLKADOT_ASSET_HUB = "POLKADOT_ASSET_HUB",
|
|
55
55
|
KUSAMA_ASSET_HUB = "KUSAMA_ASSET_HUB",
|
|
56
56
|
ROCOCO_ASSET_HUB = "ROCOCO_ASSET_HUB",
|
|
57
|
+
WESTEND_ASSET_HUB = "WESTEND_ASSET_HUB",
|
|
57
58
|
SIMPLE_SWAP = "SIMPLE_SWAP"
|
|
58
59
|
}
|
|
59
60
|
export declare const _SUPPORTED_SWAP_PROVIDERS: SwapProviderId[];
|
|
@@ -131,7 +132,7 @@ export interface SwapQuoteResponse {
|
|
|
131
132
|
aliveUntil: number;
|
|
132
133
|
error?: SwapError;
|
|
133
134
|
}
|
|
134
|
-
export interface SwapSubmitParams {
|
|
135
|
+
export interface SwapSubmitParams extends BaseProcessRequestSign {
|
|
135
136
|
process: CommonOptimalPath;
|
|
136
137
|
currentStep: number;
|
|
137
138
|
quote: SwapQuote;
|
package/types/swap/index.js
CHANGED
|
@@ -31,9 +31,12 @@ export let SwapProviderId;
|
|
|
31
31
|
SwapProviderId["POLKADOT_ASSET_HUB"] = "POLKADOT_ASSET_HUB";
|
|
32
32
|
SwapProviderId["KUSAMA_ASSET_HUB"] = "KUSAMA_ASSET_HUB";
|
|
33
33
|
SwapProviderId["ROCOCO_ASSET_HUB"] = "ROCOCO_ASSET_HUB";
|
|
34
|
+
SwapProviderId["WESTEND_ASSET_HUB"] = "WESTEND_ASSET_HUB";
|
|
34
35
|
SwapProviderId["SIMPLE_SWAP"] = "SIMPLE_SWAP";
|
|
35
36
|
})(SwapProviderId || (SwapProviderId = {}));
|
|
36
|
-
export const _SUPPORTED_SWAP_PROVIDERS = [SwapProviderId.CHAIN_FLIP_TESTNET, SwapProviderId.CHAIN_FLIP_MAINNET, SwapProviderId.HYDRADX_MAINNET, SwapProviderId.HYDRADX_TESTNET, SwapProviderId.POLKADOT_ASSET_HUB, SwapProviderId.KUSAMA_ASSET_HUB, SwapProviderId.ROCOCO_ASSET_HUB,
|
|
37
|
+
export const _SUPPORTED_SWAP_PROVIDERS = [SwapProviderId.CHAIN_FLIP_TESTNET, SwapProviderId.CHAIN_FLIP_MAINNET, SwapProviderId.HYDRADX_MAINNET, SwapProviderId.HYDRADX_TESTNET, SwapProviderId.POLKADOT_ASSET_HUB, SwapProviderId.KUSAMA_ASSET_HUB, SwapProviderId.ROCOCO_ASSET_HUB,
|
|
38
|
+
// SwapProviderId.WESTEND_ASSET_HUB,
|
|
39
|
+
SwapProviderId.SIMPLE_SWAP];
|
|
37
40
|
// process handling
|
|
38
41
|
export let SwapFeeType;
|
|
39
42
|
(function (SwapFeeType) {
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { _ChainAsset } from '@subwallet/chain-list/types';
|
|
2
|
+
import { TransactionEventResponse } from '@subwallet/extension-base/services/transaction-service/types';
|
|
3
|
+
import { CommonStepDetail, CommonStepFeeInfo } from '../service-base';
|
|
4
|
+
import { SwapPair, SwapProvider, SwapRate, SwapRoute, SwapSubmitParams } from '../swap';
|
|
5
|
+
import { RequestYieldStepSubmit } from '../yield';
|
|
6
|
+
export interface BaseProcessRequestSign {
|
|
7
|
+
isPassConfirmation?: boolean;
|
|
8
|
+
onSend?: (rs: TransactionEventResponse) => void;
|
|
9
|
+
errorOnTimeOut?: boolean;
|
|
10
|
+
processId?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare enum ProcessType {
|
|
13
|
+
SWAP = "swap",
|
|
14
|
+
EARNING = "earning"
|
|
15
|
+
}
|
|
16
|
+
export interface RequestSubmitProcessTransaction {
|
|
17
|
+
address: string;
|
|
18
|
+
type: ProcessType;
|
|
19
|
+
request: SwapSubmitParams | RequestYieldStepSubmit;
|
|
20
|
+
id: string;
|
|
21
|
+
}
|
|
22
|
+
export declare enum StepStatus {
|
|
23
|
+
QUEUED = "QUEUED",
|
|
24
|
+
PREPARE = "PREPARE",
|
|
25
|
+
SUBMITTING = "SUBMITTING",
|
|
26
|
+
PROCESSING = "PROCESSING",
|
|
27
|
+
COMPLETE = "COMPLETE",
|
|
28
|
+
FAILED = "FAILED",
|
|
29
|
+
CANCELLED = "CANCELLED",
|
|
30
|
+
TIMEOUT = "TIMEOUT"
|
|
31
|
+
}
|
|
32
|
+
export declare const PROCESSING_STEP_STATUS: StepStatus[];
|
|
33
|
+
export interface ProcessStep extends CommonStepDetail {
|
|
34
|
+
fee: CommonStepFeeInfo;
|
|
35
|
+
status: StepStatus;
|
|
36
|
+
chain?: string;
|
|
37
|
+
transactionId?: string;
|
|
38
|
+
extrinsicHash?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface ProcessTransactionData {
|
|
41
|
+
id: string;
|
|
42
|
+
type: ProcessType;
|
|
43
|
+
address: string;
|
|
44
|
+
status: StepStatus;
|
|
45
|
+
steps: ProcessStep[];
|
|
46
|
+
combineInfo: unknown;
|
|
47
|
+
currentStepId: number;
|
|
48
|
+
lastTransactionId?: string;
|
|
49
|
+
lastTransactionChain?: string;
|
|
50
|
+
}
|
|
51
|
+
export interface BriefProcessStep {
|
|
52
|
+
processId: string;
|
|
53
|
+
stepId: number;
|
|
54
|
+
}
|
|
55
|
+
export interface BriefXCMStep {
|
|
56
|
+
sendingValue: string;
|
|
57
|
+
originTokenInfo: _ChainAsset;
|
|
58
|
+
destinationTokenInfo: _ChainAsset;
|
|
59
|
+
}
|
|
60
|
+
export interface BriefSwapStep {
|
|
61
|
+
pair: SwapPair;
|
|
62
|
+
fromAmount: string;
|
|
63
|
+
toAmount: string;
|
|
64
|
+
rate: SwapRate;
|
|
65
|
+
provider: SwapProvider;
|
|
66
|
+
aliveUntil: number;
|
|
67
|
+
route: SwapRoute;
|
|
68
|
+
}
|
|
69
|
+
export interface ApproveStepMetadata {
|
|
70
|
+
tokenApprove: string;
|
|
71
|
+
contractAddress: string;
|
|
72
|
+
spenderAddress: string;
|
|
73
|
+
amount?: string;
|
|
74
|
+
}
|
|
75
|
+
export interface RequestSubscribeProcessById {
|
|
76
|
+
processId: string;
|
|
77
|
+
}
|
|
78
|
+
export interface ResponseSubscribeProcessById {
|
|
79
|
+
process: ProcessTransactionData | undefined;
|
|
80
|
+
id: string;
|
|
81
|
+
}
|
|
82
|
+
export interface ResponseSubscribeProcessAlive {
|
|
83
|
+
processes: Record<string, ProcessTransactionData>;
|
|
84
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
export let ProcessType;
|
|
5
|
+
(function (ProcessType) {
|
|
6
|
+
ProcessType["SWAP"] = "swap";
|
|
7
|
+
ProcessType["EARNING"] = "earning";
|
|
8
|
+
})(ProcessType || (ProcessType = {}));
|
|
9
|
+
export let StepStatus;
|
|
10
|
+
(function (StepStatus) {
|
|
11
|
+
StepStatus["QUEUED"] = "QUEUED";
|
|
12
|
+
StepStatus["PREPARE"] = "PREPARE";
|
|
13
|
+
StepStatus["SUBMITTING"] = "SUBMITTING";
|
|
14
|
+
StepStatus["PROCESSING"] = "PROCESSING";
|
|
15
|
+
StepStatus["COMPLETE"] = "COMPLETE";
|
|
16
|
+
StepStatus["FAILED"] = "FAILED";
|
|
17
|
+
StepStatus["CANCELLED"] = "CANCELLED";
|
|
18
|
+
StepStatus["TIMEOUT"] = "TIMEOUT";
|
|
19
|
+
})(StepStatus || (StepStatus = {}));
|
|
20
|
+
export const PROCESSING_STEP_STATUS = [StepStatus.PREPARE, StepStatus.SUBMITTING, StepStatus.PROCESSING];
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { TransactionFee
|
|
1
|
+
import { TransactionFee } from '../fee';
|
|
2
|
+
import { TransactionWarningType } from './warning';
|
|
2
3
|
export declare type BaseRequestSign = {
|
|
3
4
|
ignoreWarnings?: TransactionWarningType[];
|
|
4
5
|
};
|
|
@@ -10,6 +11,7 @@ export interface RequestBaseTransfer {
|
|
|
10
11
|
value?: string;
|
|
11
12
|
transferAll?: boolean;
|
|
12
13
|
transferBounceable?: boolean;
|
|
14
|
+
isPassConfirmation?: boolean;
|
|
13
15
|
}
|
|
14
16
|
export interface RequestCheckTransfer extends RequestBaseTransfer, TransactionFee {
|
|
15
17
|
networkKey: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { _Address, ChainType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
2
|
-
import { BaseRequestSign, InternalRequestSign, TransactionData } from '../../../transaction';
|
|
3
|
-
import { NominationPoolInfo, ValidatorInfo, YieldPositionInfo } from '../../info';
|
|
2
|
+
import { BaseProcessRequestSign, BaseRequestSign, InternalRequestSign, TransactionData } from '../../../transaction';
|
|
3
|
+
import { NominationPoolInfo, ValidatorInfo, YieldPoolType, YieldPositionInfo } from '../../info';
|
|
4
4
|
import { OptimalYieldPath } from './step';
|
|
5
5
|
export interface HandleYieldStepData {
|
|
6
6
|
txChain: string;
|
|
@@ -29,7 +29,22 @@ export interface SubmitYieldStepData extends AbstractSubmitYieldJoinData {
|
|
|
29
29
|
feeTokenSlug: string;
|
|
30
30
|
}
|
|
31
31
|
export declare type SubmitYieldJoinData = SubmitYieldStepData | SubmitJoinNativeStaking | SubmitJoinNominationPool;
|
|
32
|
-
export
|
|
32
|
+
export declare enum EarningProcessType {
|
|
33
|
+
NOMINATION_POOL = "NOMINATION_POOL",
|
|
34
|
+
NATIVE_STAKING = "NATIVE_STAKING",
|
|
35
|
+
YIELD = "YIELD"
|
|
36
|
+
}
|
|
37
|
+
export interface SummaryEarningProcessData {
|
|
38
|
+
data: SubmitYieldJoinData;
|
|
39
|
+
type: EarningProcessType;
|
|
40
|
+
brief: {
|
|
41
|
+
token: string;
|
|
42
|
+
amount: string;
|
|
43
|
+
chain: string;
|
|
44
|
+
method: YieldPoolType;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export interface HandleYieldStepParams extends BaseRequestSign, BaseProcessRequestSign {
|
|
33
48
|
path: OptimalYieldPath;
|
|
34
49
|
data: SubmitYieldJoinData;
|
|
35
50
|
currentStep: number;
|
|
@@ -1 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// Result after create extrinsic
|
|
5
|
+
|
|
6
|
+
export let EarningProcessType;
|
|
7
|
+
(function (EarningProcessType) {
|
|
8
|
+
EarningProcessType["NOMINATION_POOL"] = "NOMINATION_POOL";
|
|
9
|
+
EarningProcessType["NATIVE_STAKING"] = "NATIVE_STAKING";
|
|
10
|
+
EarningProcessType["YIELD"] = "YIELD";
|
|
11
|
+
})(EarningProcessType || (EarningProcessType = {}));
|