@subwallet/extension-base 1.3.73-0 → 1.3.74-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 +42 -5
- package/background/KoniTypes.js +14 -1
- package/cjs/background/KoniTypes.js +16 -2
- package/cjs/core/logic-validation/transfer.js +35 -57
- package/cjs/koni/background/handlers/Extension.js +599 -144
- package/cjs/koni/background/handlers/State.js +5 -2
- package/cjs/koni/background/handlers/Tabs.js +3 -2
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +0 -2
- package/cjs/services/chain-service/handler/SubstrateApi.js +6 -1
- package/cjs/services/chain-service/index.js +1 -0
- package/cjs/services/chain-service/utils/index.js +4 -0
- package/cjs/services/event-service/index.js +1 -0
- package/cjs/services/fee-service/utils/index.js +4 -4
- package/cjs/services/inapp-notification-service/consts.js +4 -2
- package/cjs/services/inapp-notification-service/index.js +51 -6
- package/cjs/services/inapp-notification-service/interfaces.js +2 -0
- package/cjs/services/inapp-notification-service/utils/common.js +4 -0
- package/cjs/services/keyring-service/context/account-context.js +44 -0
- package/cjs/services/keyring-service/context/handlers/Multisig.js +186 -0
- package/cjs/services/keyring-service/context/state.js +12 -0
- package/cjs/services/multisig-service/index.js +627 -0
- package/cjs/services/multisig-service/utils.js +242 -0
- package/cjs/services/request-service/handler/SubstrateRequestHandler.js +25 -0
- package/cjs/services/request-service/index.js +5 -1
- package/cjs/services/storage-service/DatabaseService.js +5 -2
- package/cjs/services/storage-service/db-stores/InappNotification.js +20 -2
- package/cjs/services/substrate-proxy-service/index.js +22 -7
- package/cjs/services/transaction-service/helpers/index.js +8 -0
- package/cjs/services/transaction-service/index.js +348 -147
- package/cjs/services/transaction-service/types.js +18 -1
- package/cjs/types/account/info/keyring.js +5 -0
- package/cjs/types/account/info/proxy.js +1 -0
- package/cjs/types/multisig/index.js +14 -0
- package/cjs/types/transaction/error.js +9 -2
- package/cjs/utils/account/transform.js +28 -4
- package/cjs/utils/logger/Logger.js +294 -0
- package/cjs/utils/logger/index.js +42 -0
- package/cjs/utils/logger/types.js +1 -0
- package/core/logic-validation/transfer.d.ts +2 -2
- package/core/logic-validation/transfer.js +10 -32
- package/koni/background/handlers/Extension.d.ts +7 -0
- package/koni/background/handlers/Extension.js +498 -43
- package/koni/background/handlers/State.d.ts +2 -0
- package/koni/background/handlers/State.js +5 -2
- package/koni/background/handlers/Tabs.js +3 -2
- package/package.json +42 -6
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/subscribe/substrate/index.js +0 -2
- package/services/chain-service/handler/SubstrateApi.js +7 -2
- package/services/chain-service/index.js +1 -0
- package/services/chain-service/types.d.ts +1 -1
- package/services/chain-service/utils/index.js +4 -0
- 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/fee-service/utils/index.js +4 -4
- package/services/inapp-notification-service/consts.d.ts +3 -1
- package/services/inapp-notification-service/consts.js +5 -3
- package/services/inapp-notification-service/index.d.ts +3 -2
- package/services/inapp-notification-service/index.js +51 -6
- package/services/inapp-notification-service/interfaces.d.ts +18 -2
- package/services/inapp-notification-service/interfaces.js +2 -0
- package/services/inapp-notification-service/utils/common.d.ts +1 -0
- package/services/inapp-notification-service/utils/common.js +3 -0
- package/services/keyring-service/context/account-context.d.ts +9 -1
- package/services/keyring-service/context/account-context.js +44 -0
- package/services/keyring-service/context/handlers/Multisig.d.ts +18 -0
- package/services/keyring-service/context/handlers/Multisig.js +180 -0
- package/services/keyring-service/context/state.d.ts +2 -0
- package/services/keyring-service/context/state.js +12 -0
- package/services/multisig-service/index.d.ts +245 -0
- package/services/multisig-service/index.js +620 -0
- package/services/multisig-service/utils.d.ts +95 -0
- package/services/multisig-service/utils.js +227 -0
- package/services/request-service/handler/SubstrateRequestHandler.d.ts +1 -0
- package/services/request-service/handler/SubstrateRequestHandler.js +25 -0
- package/services/request-service/index.d.ts +2 -1
- package/services/request-service/index.js +5 -1
- package/services/storage-service/DatabaseService.d.ts +3 -2
- package/services/storage-service/DatabaseService.js +5 -2
- package/services/storage-service/db-stores/InappNotification.d.ts +3 -2
- package/services/storage-service/db-stores/InappNotification.js +20 -2
- package/services/substrate-proxy-service/index.d.ts +4 -1
- package/services/substrate-proxy-service/index.js +22 -8
- package/services/transaction-service/helpers/index.js +8 -0
- package/services/transaction-service/index.d.ts +31 -0
- package/services/transaction-service/index.js +270 -69
- package/services/transaction-service/types.d.ts +28 -3
- package/services/transaction-service/types.js +12 -1
- package/types/account/info/keyring.d.ts +14 -1
- package/types/account/info/keyring.js +6 -0
- package/types/account/info/proxy.d.ts +1 -0
- package/types/account/info/proxy.js +1 -0
- package/types/multisig/index.d.ts +76 -0
- package/types/multisig/index.js +8 -0
- package/types/notification/index.d.ts +8 -0
- package/types/substrateProxyAccount/index.d.ts +26 -1
- package/types/transaction/error.d.ts +6 -1
- package/types/transaction/error.js +7 -1
- package/types/transaction/request.d.ts +0 -1
- package/utils/account/transform.js +28 -4
- package/utils/logger/Logger.d.ts +31 -0
- package/utils/logger/Logger.js +267 -0
- package/utils/logger/index.d.ts +15 -0
- package/utils/logger/index.js +29 -0
- package/utils/logger/types.d.ts +23 -0
- package/utils/logger/types.js +1 -0
|
@@ -34,6 +34,11 @@
|
|
|
34
34
|
* @prop {string} [derivationPath] - Derivation path
|
|
35
35
|
* */
|
|
36
36
|
|
|
37
|
+
/**
|
|
38
|
+
* @interface AccountMultisigData
|
|
39
|
+
* @prop {boolean} [isMultisig] - Is multisig account
|
|
40
|
+
* */
|
|
41
|
+
|
|
37
42
|
/**
|
|
38
43
|
* Represents the comprehensive metadata associated with an account, combining various aspects of account data.
|
|
39
44
|
* This interface extends from multiple specific metadata interfaces to provide a unified view of an account's metadata.
|
|
@@ -56,6 +61,7 @@ export let AccountSignMode;
|
|
|
56
61
|
AccountSignMode["GENERIC_LEDGER"] = "generic-ledger";
|
|
57
62
|
AccountSignMode["ECDSA_SUBSTRATE_LEDGER"] = "ecdsa-substrate-ledger";
|
|
58
63
|
AccountSignMode["READ_ONLY"] = "readonly";
|
|
64
|
+
AccountSignMode["MULTISIG"] = "multisig";
|
|
59
65
|
AccountSignMode["ALL_ACCOUNT"] = "all";
|
|
60
66
|
AccountSignMode["INJECTED"] = "injected";
|
|
61
67
|
AccountSignMode["UNKNOWN"] = "unknown";
|
|
@@ -39,6 +39,7 @@ export let AccountProxyType;
|
|
|
39
39
|
AccountProxyType["SOLO"] = "solo";
|
|
40
40
|
AccountProxyType["UNIFIED"] = "unified";
|
|
41
41
|
AccountProxyType["QR"] = "qr";
|
|
42
|
+
AccountProxyType["MULTISIG"] = "multisig";
|
|
42
43
|
AccountProxyType["LEDGER"] = "ledger";
|
|
43
44
|
AccountProxyType["READ_ONLY"] = "readonly";
|
|
44
45
|
AccountProxyType["INJECTED"] = "injected";
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
2
|
+
import { MultisigTxType } from '@subwallet/extension-base/services/multisig-service';
|
|
3
|
+
import { DecodeCallDataResponse } from '@subwallet/extension-base/services/multisig-service/utils';
|
|
4
|
+
import { BaseRequestSign } from '@subwallet/extension-base/types';
|
|
5
|
+
import { HexString } from '@polkadot/util/types';
|
|
6
|
+
export interface PendingMultisigTxRequest extends BaseRequestSign {
|
|
7
|
+
address: string;
|
|
8
|
+
chain: string;
|
|
9
|
+
multisigMetadata: MultisigRawMetadata;
|
|
10
|
+
callHash: string;
|
|
11
|
+
decodedCallData?: DecodeCallDataResponse;
|
|
12
|
+
type: MultisigTxType;
|
|
13
|
+
call: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ApprovePendingTxRequest extends PendingMultisigTxRequest {
|
|
16
|
+
timepoint?: {
|
|
17
|
+
height: number;
|
|
18
|
+
index: number;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface ExecutePendingTxRequest extends PendingMultisigTxRequest {
|
|
22
|
+
timepoint?: {
|
|
23
|
+
height: number;
|
|
24
|
+
index: number;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export interface CancelPendingTxRequest extends PendingMultisigTxRequest {
|
|
28
|
+
timepoint: {
|
|
29
|
+
height: number;
|
|
30
|
+
index: number;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export interface InitMultisigTxRequest {
|
|
34
|
+
transactionId: string;
|
|
35
|
+
signer: string;
|
|
36
|
+
chain: string;
|
|
37
|
+
multisigMetadata: MultisigRawMetadata;
|
|
38
|
+
}
|
|
39
|
+
export interface InitMultisigTxResponse {
|
|
40
|
+
submittedCallData: HexString;
|
|
41
|
+
callData: HexString;
|
|
42
|
+
decodedCallData: DecodeCallDataResponse | undefined;
|
|
43
|
+
depositAmount: string;
|
|
44
|
+
networkFee: string;
|
|
45
|
+
error?: SelectSignatoryError;
|
|
46
|
+
}
|
|
47
|
+
export interface RequestGetSignableAccountInfos {
|
|
48
|
+
multisigProxyId: string;
|
|
49
|
+
chain: string;
|
|
50
|
+
extrinsicType: ExtrinsicType;
|
|
51
|
+
}
|
|
52
|
+
export interface SignableAccountInfo {
|
|
53
|
+
proxyId: string;
|
|
54
|
+
address: string;
|
|
55
|
+
}
|
|
56
|
+
export interface ResponseGetSignableAccountInfos {
|
|
57
|
+
signableProxies: SignableAccountInfo[];
|
|
58
|
+
}
|
|
59
|
+
export interface MultisigRawMetadata {
|
|
60
|
+
signers: string[];
|
|
61
|
+
threshold: number;
|
|
62
|
+
multisigAddress: string;
|
|
63
|
+
}
|
|
64
|
+
export interface MultisigAccountInfo {
|
|
65
|
+
multisigAddress: string;
|
|
66
|
+
signers: string[];
|
|
67
|
+
threshold: number;
|
|
68
|
+
}
|
|
69
|
+
export declare enum SelectSignatoryErrorType {
|
|
70
|
+
NOT_ENOUGH_BALANCE = "NOT_ENOUGH_BALANCE",
|
|
71
|
+
NOT_ENOUGH_DEPOSIT = "NOT_ENOUGH_DEPOSIT"
|
|
72
|
+
}
|
|
73
|
+
export interface SelectSignatoryError {
|
|
74
|
+
errorType: SelectSignatoryErrorType;
|
|
75
|
+
message: string;
|
|
76
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
export let SelectSignatoryErrorType;
|
|
5
|
+
(function (SelectSignatoryErrorType) {
|
|
6
|
+
SelectSignatoryErrorType["NOT_ENOUGH_BALANCE"] = "NOT_ENOUGH_BALANCE";
|
|
7
|
+
SelectSignatoryErrorType["NOT_ENOUGH_DEPOSIT"] = "NOT_ENOUGH_DEPOSIT";
|
|
8
|
+
})(SelectSignatoryErrorType || (SelectSignatoryErrorType = {}));
|
|
@@ -2,6 +2,10 @@ import { NotificationTab } from '@subwallet/extension-base/services/inapp-notifi
|
|
|
2
2
|
export interface GetNotificationParams {
|
|
3
3
|
proxyId: string;
|
|
4
4
|
notificationTab: NotificationTab;
|
|
5
|
+
metadata?: {
|
|
6
|
+
multisigAddress?: string;
|
|
7
|
+
chain?: string;
|
|
8
|
+
};
|
|
5
9
|
}
|
|
6
10
|
export interface RequestSwitchStatusParams {
|
|
7
11
|
id: string;
|
|
@@ -12,3 +16,7 @@ export interface RequestIsClaimedPolygonBridge {
|
|
|
12
16
|
counter: number;
|
|
13
17
|
sourceNetwork: number;
|
|
14
18
|
}
|
|
19
|
+
export interface MarkAllReadParams {
|
|
20
|
+
proxyId: string;
|
|
21
|
+
excludeNotificationIds?: string[];
|
|
22
|
+
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
2
|
+
import { AnyJson } from '@polkadot/types/types';
|
|
3
|
+
import { HexString } from '@polkadot/util/types';
|
|
2
4
|
export interface ExcludedSubstrateProxyAccounts {
|
|
3
|
-
|
|
5
|
+
substrateProxyAddress: string;
|
|
4
6
|
substrateProxyType: SubstrateProxyType;
|
|
5
7
|
}
|
|
6
8
|
export interface RequestGetSubstrateProxyAccountGroup {
|
|
@@ -20,4 +22,27 @@ export interface SubstrateProxyAccountGroup {
|
|
|
20
22
|
substrateProxyAccounts: SubstrateProxyAccountItem[];
|
|
21
23
|
substrateProxyDeposit: string;
|
|
22
24
|
}
|
|
25
|
+
interface ProxyRawMetadata {
|
|
26
|
+
proxiedAddress: string;
|
|
27
|
+
}
|
|
28
|
+
export interface HandleSubstrateProxyWrappedTxRequest {
|
|
29
|
+
transactionId: string;
|
|
30
|
+
signer: string;
|
|
31
|
+
chain: string;
|
|
32
|
+
proxyMetadata: ProxyRawMetadata;
|
|
33
|
+
previousWrappedTxId?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface DecodeCallDataResponse {
|
|
36
|
+
/** Method name of the call */
|
|
37
|
+
method: string;
|
|
38
|
+
/** Section/pallet name of the call */
|
|
39
|
+
section: string;
|
|
40
|
+
/** Decoded arguments of the call */
|
|
41
|
+
args: AnyJson;
|
|
42
|
+
}
|
|
43
|
+
export interface HandleSubstrateProxyWrappedTxResponse {
|
|
44
|
+
submittedCallData: HexString;
|
|
45
|
+
networkFee: string;
|
|
46
|
+
decodedCallData: DecodeCallDataResponse | undefined;
|
|
47
|
+
}
|
|
23
48
|
export * from './actions';
|
|
@@ -38,4 +38,9 @@ export declare enum TransferTxErrorType {
|
|
|
38
38
|
RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT = "RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT",
|
|
39
39
|
RECEIVER_ACCOUNT_INACTIVE = "RECEIVER_ACCOUNT_INACTIVE"
|
|
40
40
|
}
|
|
41
|
-
export declare
|
|
41
|
+
export declare enum MultisigTxErrorType {
|
|
42
|
+
INVALID_PARAMS = "INVALID_PARAMS",
|
|
43
|
+
LACK_MULTISIG_PALLET = "LACK_MULTISIG_PALLET",
|
|
44
|
+
UNABLE_TO_CONSTRUCT_TX = "UNABLE_TO_CONSTRUCT_TX"
|
|
45
|
+
}
|
|
46
|
+
export declare type TransactionErrorType = BasicTxErrorType | TransferTxErrorType | StakingTxErrorType | YieldValidationStatus | SwapErrorType | MultisigTxErrorType;
|
|
@@ -43,4 +43,10 @@ export let TransferTxErrorType;
|
|
|
43
43
|
TransferTxErrorType["TRANSFER_ERROR"] = "TRANSFER_ERROR";
|
|
44
44
|
TransferTxErrorType["RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT"] = "RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT";
|
|
45
45
|
TransferTxErrorType["RECEIVER_ACCOUNT_INACTIVE"] = "RECEIVER_ACCOUNT_INACTIVE";
|
|
46
|
-
})(TransferTxErrorType || (TransferTxErrorType = {}));
|
|
46
|
+
})(TransferTxErrorType || (TransferTxErrorType = {}));
|
|
47
|
+
export let MultisigTxErrorType;
|
|
48
|
+
(function (MultisigTxErrorType) {
|
|
49
|
+
MultisigTxErrorType["INVALID_PARAMS"] = "INVALID_PARAMS";
|
|
50
|
+
MultisigTxErrorType["LACK_MULTISIG_PALLET"] = "LACK_MULTISIG_PALLET";
|
|
51
|
+
MultisigTxErrorType["UNABLE_TO_CONSTRUCT_TX"] = "UNABLE_TO_CONSTRUCT_TX";
|
|
52
|
+
})(MultisigTxErrorType || (MultisigTxErrorType = {}));
|
|
@@ -2,7 +2,6 @@ import { TransactionFee } from '../fee';
|
|
|
2
2
|
import { TransactionWarningType } from './warning';
|
|
3
3
|
export declare type BaseRequestSign = {
|
|
4
4
|
ignoreWarnings?: TransactionWarningType[];
|
|
5
|
-
signerSubstrateProxyAddress?: string;
|
|
6
5
|
};
|
|
7
6
|
export declare type InternalRequestSign<T> = T & BaseRequestSign;
|
|
8
7
|
export interface RequestBaseTransfer {
|
|
@@ -71,6 +71,8 @@ export const getAccountSignMode = (address, _meta) => {
|
|
|
71
71
|
}
|
|
72
72
|
} else if (meta.isReadOnly) {
|
|
73
73
|
return AccountSignMode.READ_ONLY;
|
|
74
|
+
} else if (meta.isMultisig) {
|
|
75
|
+
return AccountSignMode.MULTISIG;
|
|
74
76
|
} else {
|
|
75
77
|
return AccountSignMode.QR;
|
|
76
78
|
}
|
|
@@ -157,13 +159,14 @@ const EARN_VMANTA_ACTIONS = [ExtrinsicType.MINT_VMANTA, ExtrinsicType.REDEEM_VMA
|
|
|
157
159
|
const EVM_ACTIONS = [ExtrinsicType.TOKEN_SPENDING_APPROVAL, ExtrinsicType.EVM_EXECUTE];
|
|
158
160
|
const CLAIM_AVAIL_BRIDGE = [ExtrinsicType.CLAIM_BRIDGE];
|
|
159
161
|
const OPEN_GOV_ACTIONS = [ExtrinsicType.GOV_VOTE, ExtrinsicType.GOV_UNVOTE, ExtrinsicType.GOV_UNLOCK_VOTE];
|
|
160
|
-
const
|
|
162
|
+
const MULTISIG_ACTIONS = [ExtrinsicType.MULTISIG_APPROVE_TX, ExtrinsicType.MULTISIG_EXECUTE_TX, ExtrinsicType.MULTISIG_CANCEL_TX, ExtrinsicType.MULTISIG_INIT_TX];
|
|
163
|
+
const SUBSTRATE_PROXY_ACTION = [ExtrinsicType.ADD_SUBSTRATE_PROXY_ACCOUNT, ExtrinsicType.REMOVE_SUBSTRATE_PROXY_ACCOUNT, ExtrinsicType.SUBSTRATE_PROXY_INIT_TX];
|
|
161
164
|
const OTHER_ACTIONS = [ExtrinsicType.TRANSFER_XCM, ExtrinsicType.SEND_NFT, ExtrinsicType.SWAP, ExtrinsicType.CROWDLOAN];
|
|
162
165
|
export const getAccountTransactionActions = (signMode, networkType, type, _meta, _specialNetwork) => {
|
|
163
166
|
if ([AccountSignMode.PASSWORD, AccountSignMode.INJECTED].includes(signMode)) {
|
|
164
167
|
switch (networkType) {
|
|
165
168
|
case AccountChainType.SUBSTRATE:
|
|
166
|
-
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, ...SUBSTRATE_PROXY_ACTION, ...OTHER_ACTIONS];
|
|
169
|
+
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, ...MULTISIG_ACTIONS, ...SUBSTRATE_PROXY_ACTION, ...OTHER_ACTIONS];
|
|
167
170
|
case AccountChainType.ETHEREUM:
|
|
168
171
|
return [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...EARN_STDOT_ACTIONS, ...OTHER_ACTIONS, ...CLAIM_AVAIL_BRIDGE, ...SUBSTRATE_PROXY_ACTION, ...EVM_ACTIONS];
|
|
169
172
|
case AccountChainType.TON:
|
|
@@ -176,7 +179,7 @@ export const getAccountTransactionActions = (signMode, networkType, type, _meta,
|
|
|
176
179
|
} else if (signMode === AccountSignMode.QR) {
|
|
177
180
|
switch (networkType) {
|
|
178
181
|
case AccountChainType.SUBSTRATE:
|
|
179
|
-
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, ...SUBSTRATE_PROXY_ACTION, ...OTHER_ACTIONS];
|
|
182
|
+
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, ...MULTISIG_ACTIONS, ...SUBSTRATE_PROXY_ACTION, ...OTHER_ACTIONS];
|
|
180
183
|
case AccountChainType.ETHEREUM:
|
|
181
184
|
return [...(isProductionMode ? [] : [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...EARN_STDOT_ACTIONS, ...CLAIM_AVAIL_BRIDGE, ...OTHER_ACTIONS, ...EVM_ACTIONS])];
|
|
182
185
|
case AccountChainType.TON:
|
|
@@ -186,12 +189,31 @@ export const getAccountTransactionActions = (signMode, networkType, type, _meta,
|
|
|
186
189
|
case AccountChainType.BITCOIN:
|
|
187
190
|
return [];
|
|
188
191
|
}
|
|
192
|
+
} else if (signMode === AccountSignMode.MULTISIG) {
|
|
193
|
+
switch (networkType) {
|
|
194
|
+
case AccountChainType.SUBSTRATE:
|
|
195
|
+
return [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS,
|
|
196
|
+
// ...EARN_VDOT_ACTIONS, // todo: consider support this
|
|
197
|
+
// ...EARN_LDOT_ACTIONS,
|
|
198
|
+
// ...EARN_SDOT_ACTIONS,
|
|
199
|
+
// ...EARN_QDOT_ACTIONS,
|
|
200
|
+
// ...EARN_VMANTA_ACTIONS,
|
|
201
|
+
...OPEN_GOV_ACTIONS, ...SUBSTRATE_PROXY_ACTION, ExtrinsicType.SEND_NFT];
|
|
202
|
+
case AccountChainType.ETHEREUM:
|
|
203
|
+
return [];
|
|
204
|
+
case AccountChainType.TON:
|
|
205
|
+
return [];
|
|
206
|
+
case AccountChainType.CARDANO:
|
|
207
|
+
return [];
|
|
208
|
+
case AccountChainType.BITCOIN:
|
|
209
|
+
return [];
|
|
210
|
+
}
|
|
189
211
|
} else if (signMode === AccountSignMode.GENERIC_LEDGER) {
|
|
190
212
|
switch (networkType) {
|
|
191
213
|
case AccountChainType.SUBSTRATE:
|
|
192
214
|
return [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...EARN_VDOT_ACTIONS, ...EARN_VMANTA_ACTIONS, ...EARN_LDOT_ACTIONS, ...EARN_SDOT_ACTIONS,
|
|
193
215
|
// ...EARN_QDOT_ACTIONS,
|
|
194
|
-
...OPEN_GOV_ACTIONS, ...SUBSTRATE_PROXY_ACTION, ...OTHER_ACTIONS];
|
|
216
|
+
...OPEN_GOV_ACTIONS, ...MULTISIG_ACTIONS, ...SUBSTRATE_PROXY_ACTION, ...OTHER_ACTIONS];
|
|
195
217
|
case AccountChainType.ETHEREUM:
|
|
196
218
|
return [...BASE_TRANSFER_ACTIONS, ...EARN_STDOT_ACTIONS, ...EVM_ACTIONS, ...CLAIM_AVAIL_BRIDGE, ExtrinsicType.STAKING_WITHDRAW,
|
|
197
219
|
// For liquid staking
|
|
@@ -366,6 +388,8 @@ export const convertAccountProxyType = accountSignMode => {
|
|
|
366
388
|
return AccountProxyType.LEDGER;
|
|
367
389
|
case AccountSignMode.QR:
|
|
368
390
|
return AccountProxyType.QR;
|
|
391
|
+
case AccountSignMode.MULTISIG:
|
|
392
|
+
return AccountProxyType.MULTISIG;
|
|
369
393
|
case AccountSignMode.READ_ONLY:
|
|
370
394
|
return AccountProxyType.READ_ONLY;
|
|
371
395
|
case AccountSignMode.INJECTED:
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { LoggerConfig, LogLevel, StructuredLogData } from './types';
|
|
2
|
+
export declare class Logger {
|
|
3
|
+
private logInstance;
|
|
4
|
+
private name;
|
|
5
|
+
private config;
|
|
6
|
+
private groupStack;
|
|
7
|
+
constructor(config: LoggerConfig);
|
|
8
|
+
private getLogLevelNumber;
|
|
9
|
+
private shouldLog;
|
|
10
|
+
private formatMessage;
|
|
11
|
+
error(message: string, ...args: unknown[]): void;
|
|
12
|
+
warn(message: string, ...args: unknown[]): void;
|
|
13
|
+
info(message: string, ...args: unknown[]): void;
|
|
14
|
+
log(message: string, ...args: unknown[]): void;
|
|
15
|
+
debug(message: string, ...args: unknown[]): void;
|
|
16
|
+
trace(message: string, ...args: unknown[]): void;
|
|
17
|
+
group(label?: string): void;
|
|
18
|
+
groupEnd(): void;
|
|
19
|
+
setLevel(level: LogLevel): void;
|
|
20
|
+
getLevel(): LogLevel;
|
|
21
|
+
getName(): string;
|
|
22
|
+
private createLogContext;
|
|
23
|
+
private logStructured;
|
|
24
|
+
errorStructured(data: StructuredLogData): void;
|
|
25
|
+
warnStructured(data: StructuredLogData): void;
|
|
26
|
+
infoStructured(data: StructuredLogData): void;
|
|
27
|
+
debugStructured(data: StructuredLogData): void;
|
|
28
|
+
traceStructured(data: StructuredLogData): void;
|
|
29
|
+
logStructuredPublic(data: StructuredLogData): void;
|
|
30
|
+
noop(...values: unknown[]): void;
|
|
31
|
+
}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import log from 'loglevel';
|
|
5
|
+
const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev'];
|
|
6
|
+
const branchName = process.env.BRANCH_NAME || 'koni-dev';
|
|
7
|
+
const isProduction = PRODUCTION_BRANCHES.indexOf(branchName) > -1;
|
|
8
|
+
const LOG_LEVELS = {
|
|
9
|
+
trace: 0,
|
|
10
|
+
debug: 1,
|
|
11
|
+
info: 2,
|
|
12
|
+
warn: 3,
|
|
13
|
+
error: 4
|
|
14
|
+
};
|
|
15
|
+
export class Logger {
|
|
16
|
+
groupStack = [];
|
|
17
|
+
constructor(config) {
|
|
18
|
+
var _config$enableStructu;
|
|
19
|
+
this.name = config.name;
|
|
20
|
+
this.config = {
|
|
21
|
+
name: config.name,
|
|
22
|
+
level: config.level || (isProduction ? 'info' : 'debug'),
|
|
23
|
+
enableStructuredLogging: (_config$enableStructu = config.enableStructuredLogging) !== null && _config$enableStructu !== void 0 ? _config$enableStructu : false,
|
|
24
|
+
enableContextCapture: config.enableContextCapture || !isProduction
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// Create a named logger instance
|
|
28
|
+
this.logInstance = log.getLogger(this.name);
|
|
29
|
+
this.logInstance.setLevel(this.getLogLevelNumber(this.config.level));
|
|
30
|
+
}
|
|
31
|
+
getLogLevelNumber(level) {
|
|
32
|
+
return LOG_LEVELS[level];
|
|
33
|
+
}
|
|
34
|
+
shouldLog(level) {
|
|
35
|
+
return LOG_LEVELS[level] >= this.getLogLevelNumber(this.config.level);
|
|
36
|
+
}
|
|
37
|
+
formatMessage(level, message, ...args) {
|
|
38
|
+
const prefix = `[${this.name}] [${level.toUpperCase()}]`;
|
|
39
|
+
return `${prefix} ${message}`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Simple logging methods (drop-in console replacement)
|
|
43
|
+
error(message, ...args) {
|
|
44
|
+
if (!this.shouldLog('error')) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const formatted = this.formatMessage('error', message);
|
|
48
|
+
this.logInstance.error(formatted, ...args);
|
|
49
|
+
|
|
50
|
+
// Add breadcrumb for errors
|
|
51
|
+
if (args.length > 0 && args[0] instanceof Error) {
|
|
52
|
+
// sentryAdapter.captureException(args[0] as Error, {
|
|
53
|
+
// message,
|
|
54
|
+
// logger: this.name
|
|
55
|
+
// });
|
|
56
|
+
} else {
|
|
57
|
+
// sentryAdapter.addBreadcrumb(message, 'error', {
|
|
58
|
+
// logger: this.name,
|
|
59
|
+
// args: args.length > 0 ? args : undefined
|
|
60
|
+
// });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
warn(message, ...args) {
|
|
64
|
+
if (!this.shouldLog('warn')) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const formatted = this.formatMessage('warn', message);
|
|
68
|
+
this.logInstance.warn(formatted, ...args);
|
|
69
|
+
// sentryAdapter.addBreadcrumb(message, 'warn', {
|
|
70
|
+
// logger: this.name,
|
|
71
|
+
// args: args.length > 0 ? args : undefined
|
|
72
|
+
// });
|
|
73
|
+
}
|
|
74
|
+
info(message, ...args) {
|
|
75
|
+
if (!this.shouldLog('info')) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const formatted = this.formatMessage('info', message);
|
|
79
|
+
this.logInstance.info(formatted, ...args);
|
|
80
|
+
// sentryAdapter.addBreadcrumb(message, 'info', {
|
|
81
|
+
// logger: this.name,
|
|
82
|
+
// args: args.length > 0 ? args : undefined
|
|
83
|
+
// });
|
|
84
|
+
}
|
|
85
|
+
log(message, ...args) {
|
|
86
|
+
this.info(message, ...args);
|
|
87
|
+
}
|
|
88
|
+
debug(message, ...args) {
|
|
89
|
+
if (!this.shouldLog('debug')) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const formatted = this.formatMessage('debug', message);
|
|
93
|
+
this.logInstance.debug(formatted, ...args);
|
|
94
|
+
// sentryAdapter.addBreadcrumb(message, 'debug', {
|
|
95
|
+
// logger: this.name,
|
|
96
|
+
// args: args.length > 0 ? args : undefined
|
|
97
|
+
// });
|
|
98
|
+
}
|
|
99
|
+
trace(message, ...args) {
|
|
100
|
+
if (!this.shouldLog('trace')) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const formatted = this.formatMessage('trace', message);
|
|
104
|
+
this.logInstance.trace(formatted, ...args);
|
|
105
|
+
// sentryAdapter.addBreadcrumb(message, 'trace', {
|
|
106
|
+
// logger: this.name,
|
|
107
|
+
// args: args.length > 0 ? args : undefined
|
|
108
|
+
// });
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Group methods
|
|
112
|
+
group(label) {
|
|
113
|
+
const groupLabel = label || `Group ${this.groupStack.length + 1}`;
|
|
114
|
+
this.groupStack.push(groupLabel);
|
|
115
|
+
if (this.shouldLog('debug')) {
|
|
116
|
+
const indent = ' '.repeat(this.groupStack.length - 1);
|
|
117
|
+
const formatted = this.formatMessage('debug', `${indent}▼ ${groupLabel}`);
|
|
118
|
+
this.logInstance.debug(formatted);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
groupEnd() {
|
|
122
|
+
if (this.groupStack.length === 0) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const groupLabel = this.groupStack.pop();
|
|
126
|
+
if (!groupLabel) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (this.shouldLog('debug')) {
|
|
130
|
+
const indent = ' '.repeat(this.groupStack.length);
|
|
131
|
+
const formatted = this.formatMessage('debug', `${indent}▲ ${groupLabel}`);
|
|
132
|
+
this.logInstance.debug(formatted);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Utility methods
|
|
137
|
+
setLevel(level) {
|
|
138
|
+
this.config.level = level;
|
|
139
|
+
this.logInstance.setLevel(this.getLogLevelNumber(level));
|
|
140
|
+
}
|
|
141
|
+
getLevel() {
|
|
142
|
+
return this.config.level;
|
|
143
|
+
}
|
|
144
|
+
getName() {
|
|
145
|
+
return this.name;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Structured logging methods
|
|
149
|
+
// Noted: Capturing context is expensive due to Error creation and stack parsing; it should only be used when necessary.
|
|
150
|
+
createLogContext(level) {
|
|
151
|
+
const baseContext = {
|
|
152
|
+
timestamp: new Date().toISOString(),
|
|
153
|
+
level,
|
|
154
|
+
loggerName: this.name
|
|
155
|
+
};
|
|
156
|
+
if (this.config.enableContextCapture) {
|
|
157
|
+
const extracted = extractContext(3);
|
|
158
|
+
if (extracted) {
|
|
159
|
+
return {
|
|
160
|
+
...baseContext,
|
|
161
|
+
...extracted
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return baseContext;
|
|
166
|
+
}
|
|
167
|
+
logStructured(level, data) {
|
|
168
|
+
if (!this.shouldLog(level)) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const context = this.createLogContext(level);
|
|
172
|
+
const logEntry = {
|
|
173
|
+
...context,
|
|
174
|
+
message: data.message,
|
|
175
|
+
context: data.context,
|
|
176
|
+
error: data.error instanceof Error ? {
|
|
177
|
+
name: data.error.name,
|
|
178
|
+
message: data.error.message,
|
|
179
|
+
stack: data.error.stack
|
|
180
|
+
} : data.error,
|
|
181
|
+
tags: data.tags,
|
|
182
|
+
extra: data.extra
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
// Output structured JSON
|
|
186
|
+
const jsonOutput = JSON.stringify(logEntry, null, 2);
|
|
187
|
+
this.logInstance[level](jsonOutput);
|
|
188
|
+
|
|
189
|
+
// Add breadcrumb to Sentry
|
|
190
|
+
if (data.error instanceof Error) {
|
|
191
|
+
// sentryAdapter.captureException(data.error, {
|
|
192
|
+
// ...data.context,
|
|
193
|
+
// logger: this.name,
|
|
194
|
+
// tags: data.tags
|
|
195
|
+
// });
|
|
196
|
+
} else {
|
|
197
|
+
// sentryAdapter.addBreadcrumb(data.message, level, {
|
|
198
|
+
// ...data.context,
|
|
199
|
+
// logger: this.name,
|
|
200
|
+
// tags: data.tags
|
|
201
|
+
// });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
errorStructured(data) {
|
|
205
|
+
this.logStructured('error', data);
|
|
206
|
+
}
|
|
207
|
+
warnStructured(data) {
|
|
208
|
+
this.logStructured('warn', data);
|
|
209
|
+
}
|
|
210
|
+
infoStructured(data) {
|
|
211
|
+
this.logStructured('info', data);
|
|
212
|
+
}
|
|
213
|
+
debugStructured(data) {
|
|
214
|
+
this.logStructured('debug', data);
|
|
215
|
+
}
|
|
216
|
+
traceStructured(data) {
|
|
217
|
+
this.logStructured('trace', data);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Public alias for backward compatibility (calls infoStructured)
|
|
221
|
+
logStructuredPublic(data) {
|
|
222
|
+
this.infoStructured(data);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Polkadot compatibility - noop method
|
|
226
|
+
noop(...values) {
|
|
227
|
+
// No operation - required by Polkadot Logger interface
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Extract context from Error stack trace
|
|
233
|
+
* @Todo: Use for structured log, re-test before using
|
|
234
|
+
*/
|
|
235
|
+
function extractContext(skipFrames = 2) {
|
|
236
|
+
try {
|
|
237
|
+
const stack = new Error().stack;
|
|
238
|
+
if (!stack) {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
const lines = stack.split('\n');
|
|
242
|
+
// Skip Error constructor and extractContext call
|
|
243
|
+
const frame = lines[skipFrames + 1];
|
|
244
|
+
if (!frame) {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Match patterns like: "at functionName (file://path/to/file.ts:123:45)"
|
|
249
|
+
const match = frame.match(/at\s+(?:async\s+)?(.+?)\s+\((.+?):(\d+):(\d+)\)/);
|
|
250
|
+
if (match) {
|
|
251
|
+
const [, functionName, filePath, line, column] = match;
|
|
252
|
+
const fileName = filePath.split('/').pop() || filePath;
|
|
253
|
+
return {
|
|
254
|
+
file: fileName,
|
|
255
|
+
function: functionName,
|
|
256
|
+
line: parseInt(line, 10),
|
|
257
|
+
column: parseInt(column, 10),
|
|
258
|
+
timestamp: new Date().toISOString(),
|
|
259
|
+
level: 'info',
|
|
260
|
+
loggerName: ''
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
} catch {
|
|
264
|
+
// Ignore errors in context extraction
|
|
265
|
+
}
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Logger } from './Logger';
|
|
2
|
+
import { LoggerConfig } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Create a named logger instance
|
|
5
|
+
* @param name - Logger name (typically the class or module name)
|
|
6
|
+
* @param config - Optional logger configuration
|
|
7
|
+
* @returns Logger instance
|
|
8
|
+
*/
|
|
9
|
+
export declare function createLogger(name: string, config?: Partial<LoggerConfig>): Logger;
|
|
10
|
+
/**
|
|
11
|
+
* Default logger instance
|
|
12
|
+
*/
|
|
13
|
+
export declare const defaultLogger: Logger;
|
|
14
|
+
export type { LogLevel, LoggerConfig, LogContext, StructuredLogData } from './types';
|
|
15
|
+
export { Logger } from './Logger';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { Logger } from "./Logger.js";
|
|
5
|
+
/**
|
|
6
|
+
* Create a named logger instance
|
|
7
|
+
* @param name - Logger name (typically the class or module name)
|
|
8
|
+
* @param config - Optional logger configuration
|
|
9
|
+
* @returns Logger instance
|
|
10
|
+
*/
|
|
11
|
+
export function createLogger(name, config) {
|
|
12
|
+
return new Logger({
|
|
13
|
+
name,
|
|
14
|
+
...config
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Default logger instance
|
|
20
|
+
*/
|
|
21
|
+
export const defaultLogger = createLogger('SubWallet');
|
|
22
|
+
|
|
23
|
+
// Export types
|
|
24
|
+
|
|
25
|
+
// Export Logger class for advanced usage
|
|
26
|
+
export { Logger } from "./Logger.js";
|
|
27
|
+
|
|
28
|
+
// Export Sentry adapter for future integration
|
|
29
|
+
// export { sentryAdapter } from './sentry-adapter';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';
|
|
2
|
+
export interface LoggerConfig {
|
|
3
|
+
name: string;
|
|
4
|
+
level?: LogLevel;
|
|
5
|
+
enableStructuredLogging?: boolean;
|
|
6
|
+
enableContextCapture?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface LogContext {
|
|
9
|
+
file?: string;
|
|
10
|
+
function?: string;
|
|
11
|
+
line?: number;
|
|
12
|
+
column?: number;
|
|
13
|
+
timestamp: string;
|
|
14
|
+
level: LogLevel;
|
|
15
|
+
loggerName: string;
|
|
16
|
+
}
|
|
17
|
+
export interface StructuredLogData {
|
|
18
|
+
message: string;
|
|
19
|
+
context?: Record<string, unknown>;
|
|
20
|
+
error?: Error | unknown;
|
|
21
|
+
tags?: string[];
|
|
22
|
+
extra?: Record<string, unknown>;
|
|
23
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|