@subwallet/extension-base 1.3.72-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.
Files changed (113) hide show
  1. package/background/KoniTypes.d.ts +42 -5
  2. package/background/KoniTypes.js +14 -1
  3. package/cjs/background/KoniTypes.js +16 -2
  4. package/cjs/core/logic-validation/transfer.js +35 -57
  5. package/cjs/koni/background/handlers/Extension.js +599 -146
  6. package/cjs/koni/background/handlers/State.js +5 -6
  7. package/cjs/koni/background/handlers/Tabs.js +3 -2
  8. package/cjs/koni/background/subscription.js +2 -22
  9. package/cjs/packageInfo.js +1 -1
  10. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +0 -2
  11. package/cjs/services/chain-service/handler/SubstrateApi.js +6 -1
  12. package/cjs/services/chain-service/index.js +1 -0
  13. package/cjs/services/chain-service/utils/index.js +4 -0
  14. package/cjs/services/earning-service/handlers/native-staking/para-chain.js +17 -2
  15. package/cjs/services/event-service/index.js +1 -0
  16. package/cjs/services/fee-service/utils/index.js +4 -4
  17. package/cjs/services/inapp-notification-service/consts.js +4 -2
  18. package/cjs/services/inapp-notification-service/index.js +51 -6
  19. package/cjs/services/inapp-notification-service/interfaces.js +2 -0
  20. package/cjs/services/inapp-notification-service/utils/common.js +4 -0
  21. package/cjs/services/keyring-service/context/account-context.js +44 -0
  22. package/cjs/services/keyring-service/context/handlers/Multisig.js +186 -0
  23. package/cjs/services/keyring-service/context/state.js +12 -0
  24. package/cjs/services/multisig-service/index.js +627 -0
  25. package/cjs/services/multisig-service/utils.js +242 -0
  26. package/cjs/services/request-service/handler/SubstrateRequestHandler.js +25 -0
  27. package/cjs/services/request-service/index.js +5 -1
  28. package/cjs/services/storage-service/DatabaseService.js +5 -2
  29. package/cjs/services/storage-service/db-stores/InappNotification.js +20 -2
  30. package/cjs/services/substrate-proxy-service/index.js +22 -7
  31. package/cjs/services/transaction-service/helpers/index.js +8 -0
  32. package/cjs/services/transaction-service/index.js +348 -147
  33. package/cjs/services/transaction-service/types.js +18 -1
  34. package/cjs/types/account/info/keyring.js +5 -0
  35. package/cjs/types/account/info/proxy.js +1 -0
  36. package/cjs/types/multisig/index.js +14 -0
  37. package/cjs/types/transaction/error.js +9 -2
  38. package/cjs/utils/account/transform.js +28 -4
  39. package/cjs/utils/logger/Logger.js +294 -0
  40. package/cjs/utils/logger/index.js +42 -0
  41. package/cjs/utils/logger/types.js +1 -0
  42. package/core/logic-validation/transfer.d.ts +2 -2
  43. package/core/logic-validation/transfer.js +10 -32
  44. package/koni/background/handlers/Extension.d.ts +7 -0
  45. package/koni/background/handlers/Extension.js +498 -45
  46. package/koni/background/handlers/State.d.ts +2 -1
  47. package/koni/background/handlers/State.js +5 -6
  48. package/koni/background/handlers/Tabs.js +3 -2
  49. package/koni/background/subscription.js +2 -22
  50. package/package.json +43 -7
  51. package/packageInfo.js +1 -1
  52. package/services/balance-service/helpers/subscribe/substrate/index.js +0 -2
  53. package/services/chain-service/handler/SubstrateApi.js +7 -2
  54. package/services/chain-service/index.js +1 -0
  55. package/services/chain-service/types.d.ts +1 -1
  56. package/services/chain-service/utils/index.js +4 -0
  57. package/services/earning-service/handlers/native-staking/para-chain.js +17 -2
  58. package/services/event-service/index.d.ts +1 -0
  59. package/services/event-service/index.js +1 -0
  60. package/services/event-service/types.d.ts +1 -0
  61. package/services/fee-service/utils/index.js +4 -4
  62. package/services/inapp-notification-service/consts.d.ts +3 -1
  63. package/services/inapp-notification-service/consts.js +5 -3
  64. package/services/inapp-notification-service/index.d.ts +3 -2
  65. package/services/inapp-notification-service/index.js +51 -6
  66. package/services/inapp-notification-service/interfaces.d.ts +18 -2
  67. package/services/inapp-notification-service/interfaces.js +2 -0
  68. package/services/inapp-notification-service/utils/common.d.ts +1 -0
  69. package/services/inapp-notification-service/utils/common.js +3 -0
  70. package/services/keyring-service/context/account-context.d.ts +9 -1
  71. package/services/keyring-service/context/account-context.js +44 -0
  72. package/services/keyring-service/context/handlers/Multisig.d.ts +18 -0
  73. package/services/keyring-service/context/handlers/Multisig.js +180 -0
  74. package/services/keyring-service/context/state.d.ts +2 -0
  75. package/services/keyring-service/context/state.js +12 -0
  76. package/services/multisig-service/index.d.ts +245 -0
  77. package/services/multisig-service/index.js +620 -0
  78. package/services/multisig-service/utils.d.ts +95 -0
  79. package/services/multisig-service/utils.js +227 -0
  80. package/services/request-service/handler/SubstrateRequestHandler.d.ts +1 -0
  81. package/services/request-service/handler/SubstrateRequestHandler.js +25 -0
  82. package/services/request-service/index.d.ts +2 -1
  83. package/services/request-service/index.js +5 -1
  84. package/services/storage-service/DatabaseService.d.ts +3 -2
  85. package/services/storage-service/DatabaseService.js +5 -2
  86. package/services/storage-service/db-stores/InappNotification.d.ts +3 -2
  87. package/services/storage-service/db-stores/InappNotification.js +20 -2
  88. package/services/substrate-proxy-service/index.d.ts +4 -1
  89. package/services/substrate-proxy-service/index.js +22 -8
  90. package/services/transaction-service/helpers/index.js +8 -0
  91. package/services/transaction-service/index.d.ts +31 -0
  92. package/services/transaction-service/index.js +270 -69
  93. package/services/transaction-service/types.d.ts +28 -3
  94. package/services/transaction-service/types.js +12 -1
  95. package/types/account/info/keyring.d.ts +14 -1
  96. package/types/account/info/keyring.js +6 -0
  97. package/types/account/info/proxy.d.ts +1 -0
  98. package/types/account/info/proxy.js +1 -0
  99. package/types/multisig/index.d.ts +76 -0
  100. package/types/multisig/index.js +8 -0
  101. package/types/notification/index.d.ts +8 -0
  102. package/types/substrateProxyAccount/index.d.ts +26 -1
  103. package/types/transaction/error.d.ts +6 -1
  104. package/types/transaction/error.js +7 -1
  105. package/types/transaction/request.d.ts +0 -1
  106. package/types/yield/info/pallet.d.ts +1 -1
  107. package/utils/account/transform.js +28 -4
  108. package/utils/logger/Logger.d.ts +31 -0
  109. package/utils/logger/Logger.js +267 -0
  110. package/utils/logger/index.d.ts +15 -0
  111. package/utils/logger/index.js +29 -0
  112. package/utils/logger/types.d.ts +23 -0
  113. 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";
@@ -30,6 +30,7 @@ export declare enum AccountProxyType {
30
30
  SOLO = "solo",
31
31
  UNIFIED = "unified",
32
32
  QR = "qr",
33
+ MULTISIG = "multisig",
33
34
  LEDGER = "ledger",
34
35
  READ_ONLY = "readonly",
35
36
  INJECTED = "injected",
@@ -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
- address: string;
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 type TransactionErrorType = BasicTxErrorType | TransferTxErrorType | StakingTxErrorType | YieldValidationStatus | SwapErrorType;
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 {
@@ -54,7 +54,7 @@ export declare enum PalletParachainStakingRequestType {
54
54
  BOND_LESS = "bondLess"
55
55
  }
56
56
  export interface PalletParachainStakingDelegationRequestsScheduledRequest {
57
- delegator: string;
57
+ delegator?: string;
58
58
  whenExecutable: number;
59
59
  action: Record<PalletParachainStakingRequestType, number>;
60
60
  }
@@ -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 SUBSTRATE_PROXY_ACTION = [ExtrinsicType.ADD_SUBSTRATE_PROXY_ACCOUNT, ExtrinsicType.REMOVE_SUBSTRATE_PROXY_ACCOUNT];
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 {};