@toruslabs/ethereum-controllers 4.2.0 → 4.3.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.
@@ -26,7 +26,7 @@ export default abstract class AbstractMessageController<M extends AbstractMessag
26
26
  [key: string]: M;
27
27
  };
28
28
  addMessage(message: M): Promise<void>;
29
- approveMessage(messageParams: P): Promise<P>;
29
+ approveMessage(messageId: string, messageParams: P): Promise<P>;
30
30
  setMessageStatus(messageId: string, status: MessageStatusType): void;
31
31
  waitForFinishStatus(msgParams: P, messageName: string): Promise<string>;
32
32
  protected updateMessage(message: M): void;
@@ -1,6 +1,5 @@
1
1
  import { BaseController, PreferencesState } from "@toruslabs/base-controllers";
2
2
  import { SafeEventEmitterProvider } from "@toruslabs/openlogin-jrpc";
3
- import NetworkController from "../Network/NetworkController";
4
3
  import PreferencesController from "../Preferences/PreferencesController";
5
4
  import { CustomNftInfo, EthereumNetworkState, ExtendedAddressPreferences } from "../utils/interfaces";
6
5
  import { NftsControllerConfig, NftsControllerState } from "./INftsController";
@@ -8,7 +7,6 @@ export interface INftsControllerOptions {
8
7
  config?: Partial<NftsControllerConfig>;
9
8
  state?: Partial<NftsControllerState>;
10
9
  provider: SafeEventEmitterProvider;
11
- getNetworkIdentifier: NetworkController["getNetworkIdentifier"];
12
10
  getCustomNfts?: PreferencesController["getCustomNfts"];
13
11
  getSimpleHashNfts: PreferencesController["getSimpleHashNfts"];
14
12
  onPreferencesStateChange: (listener: (preferencesState: PreferencesState<ExtendedAddressPreferences>) => void) => void;
@@ -19,10 +17,9 @@ export declare class NftsController extends BaseController<NftsControllerConfig,
19
17
  private provider;
20
18
  private ethersProvider;
21
19
  private _timer;
22
- private getNetworkIdentifier;
23
20
  private getCustomNfts;
24
21
  private getSimpleHashNfts;
25
- constructor({ config, state, provider, getNetworkIdentifier, getCustomNfts, getSimpleHashNfts, onPreferencesStateChange, onNetworkStateChange, }: INftsControllerOptions);
22
+ constructor({ config, state, provider, getCustomNfts, getSimpleHashNfts, onPreferencesStateChange, onNetworkStateChange }: INftsControllerOptions);
26
23
  get userSelectedAddress(): string;
27
24
  get userNfts(): CustomNftInfo[];
28
25
  get interval(): number;
@@ -27,7 +27,7 @@ export default class PreferencesController extends BasePreferencesController<Ext
27
27
  userInfo?: UserInfo;
28
28
  rehydrate?: boolean;
29
29
  locale?: string;
30
- type: string;
30
+ type?: string;
31
31
  }): Promise<void>;
32
32
  getSelectedAddress(): string;
33
33
  sync(address: string): Promise<boolean>;
@@ -8,7 +8,6 @@ export interface ITokensControllerOptions {
8
8
  config?: Partial<TokensControllerConfig>;
9
9
  state?: Partial<TokensControllerState>;
10
10
  provider: SafeEventEmitterProvider;
11
- getNetworkIdentifier: NetworkController["getNetworkIdentifier"];
12
11
  getCustomTokens?: PreferencesController["getCustomTokens"];
13
12
  getEtherScanTokens: PreferencesController["getEtherScanTokens"];
14
13
  getProviderConfig: NetworkController["getProviderConfig"];
@@ -20,11 +19,10 @@ export declare class TokensController extends BaseController<TokensControllerCon
20
19
  private provider;
21
20
  private ethersProvider;
22
21
  private _timer;
23
- private getNetworkIdentifier;
24
22
  private getProviderConfig;
25
23
  private getCustomTokens;
26
24
  private getEtherScanTokens;
27
- constructor({ config, state, provider, getNetworkIdentifier, getCustomTokens, getEtherScanTokens, getProviderConfig, onPreferencesStateChange, onNetworkStateChange, }: ITokensControllerOptions);
25
+ constructor({ config, state, provider, getCustomTokens, getEtherScanTokens, getProviderConfig, onPreferencesStateChange, onNetworkStateChange, }: ITokensControllerOptions);
28
26
  get userSelectedAddress(): string;
29
27
  get userTokens(): CustomTokenInfo[];
30
28
  get interval(): number;
@@ -79,3 +79,6 @@ export declare const MessageStatus: {
79
79
  readonly REJECTED: "rejected";
80
80
  readonly FAILED: "failed";
81
81
  };
82
+ export declare const MESSAGE_EVENTS: {
83
+ UNAPPROVED_MESSAGE: string;
84
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toruslabs/ethereum-controllers",
3
- "version": "4.2.0",
3
+ "version": "4.3.0",
4
4
  "homepage": "https://github.com/torusresearch/controllers#readme",
5
5
  "license": "ISC",
6
6
  "main": "dist/ethereumControllers.cjs.js",
@@ -24,7 +24,7 @@
24
24
  "@ethereumjs/util": "^9.0.0",
25
25
  "@metamask/eth-sig-util": "^7.0.0",
26
26
  "@metamask/rpc-errors": "^6.0.0",
27
- "@toruslabs/base-controllers": "^4.2.0",
27
+ "@toruslabs/base-controllers": "^4.3.0",
28
28
  "@toruslabs/http-helpers": "^5.0.0",
29
29
  "@toruslabs/openlogin-jrpc": "^5.1.0",
30
30
  "async-mutex": "^0.4.0",
@@ -64,7 +64,7 @@
64
64
  "publishConfig": {
65
65
  "access": "public"
66
66
  },
67
- "gitHead": "bb9d5f2612ba55375a94815e328954fc8976e07b",
67
+ "gitHead": "42139c8f59f8f4be3e8c03bdfc3987e1df9dc1b7",
68
68
  "devDependencies": {
69
69
  "ganache": "^7.9.1"
70
70
  }
@@ -75,8 +75,8 @@ export default abstract class AbstractMessageController<M extends AbstractMessag
75
75
  this.saveMessageList();
76
76
  }
77
77
 
78
- approveMessage(messageParams: P): Promise<P> {
79
- this.setMessageStatus(messageParams.id, MessageStatus.APPROVED);
78
+ approveMessage(messageId: string, messageParams: P): Promise<P> {
79
+ this.setMessageStatus(messageId, MessageStatus.APPROVED);
80
80
  return this.prepMessageForSigning(messageParams);
81
81
  }
82
82
 
@@ -5,7 +5,7 @@ import log from "loglevel";
5
5
 
6
6
  import KeyringController from "../Keyring/KeyringController";
7
7
  import NetworkController from "../Network/NetworkController";
8
- import { MessageStatus, METHOD_TYPES } from "../utils/constants";
8
+ import { MESSAGE_EVENTS, MessageStatus, METHOD_TYPES } from "../utils/constants";
9
9
  import { DecryptMessage, DecryptMessageParams, Message, UserRequestApprovalParams } from "../utils/interfaces";
10
10
  import AbstractMessageController, { MessageControllerState } from "./AbstractMessageController";
11
11
  import { normalizeMessageData, parseDecryptMessageData, validateDecryptedMessageData } from "./utils";
@@ -34,7 +34,7 @@ export class DecryptMessageController extends AbstractMessageController<DecryptM
34
34
  async processDecryptMessage(messageId: string): Promise<string> {
35
35
  try {
36
36
  const msgObject = this.getMessage(messageId);
37
- const cleanMsgParams = await this.approveMessage(msgObject.messageParams);
37
+ const cleanMsgParams = await this.approveMessage(messageId, msgObject.messageParams);
38
38
  const parsedData = parseDecryptMessageData(cleanMsgParams.data);
39
39
  const rawSig = this.decryptMessage(parsedData, cleanMsgParams.from);
40
40
  this.updateMessage({ ...msgObject, rawSig });
@@ -69,9 +69,7 @@ export class DecryptMessageController extends AbstractMessageController<DecryptM
69
69
  type: METHOD_TYPES.ETH_DECRYPT,
70
70
  };
71
71
  await this.addMessage(messageData);
72
- this.emit(`unapprovedMessage`, {
73
- ...messageParams,
74
- });
72
+ this.emit(MESSAGE_EVENTS.UNAPPROVED_MESSAGE, messageData);
75
73
  return messageId;
76
74
  }
77
75
 
@@ -5,7 +5,7 @@ import log from "loglevel";
5
5
 
6
6
  import KeyringController from "../Keyring/KeyringController";
7
7
  import NetworkController from "../Network/NetworkController";
8
- import { MessageStatus, METHOD_TYPES } from "../utils/constants";
8
+ import { MESSAGE_EVENTS, MessageStatus, METHOD_TYPES } from "../utils/constants";
9
9
  import { EncryptionPublicKey, EncryptionPublicKeyParams, UserRequestApprovalParams } from "../utils/interfaces";
10
10
  import AbstractMessageController, { MessageControllerState } from "./AbstractMessageController";
11
11
  import { validateEncryptionPublicKeyMessageData } from "./utils";
@@ -34,7 +34,7 @@ export class EncryptionPublicKeyController extends AbstractMessageController<Enc
34
34
  async processGetEncryptionPublicKey(messageId: string): Promise<string> {
35
35
  try {
36
36
  const msgObject = this.getMessage(messageId);
37
- const cleanMsgParams = await this.approveMessage(msgObject.messageParams);
37
+ const cleanMsgParams = await this.approveMessage(messageId, msgObject.messageParams);
38
38
  const publicKey = this.signEncryptionPublicKey(cleanMsgParams.from);
39
39
  this.updateMessage({ ...msgObject, rawSig: publicKey });
40
40
  this.setMessageStatus(messageId, MessageStatus.SIGNED);
@@ -70,9 +70,7 @@ export class EncryptionPublicKeyController extends AbstractMessageController<Enc
70
70
  type: METHOD_TYPES.ETH_GET_ENCRYPTION_PUBLIC_KEY,
71
71
  };
72
72
  await this.addMessage(messageData);
73
- this.emit(`unapprovedMessage`, {
74
- ...messageParams,
75
- });
73
+ this.emit(MESSAGE_EVENTS.UNAPPROVED_MESSAGE, messageData);
76
74
  return messageId;
77
75
  }
78
76
 
@@ -4,7 +4,7 @@ import log from "loglevel";
4
4
 
5
5
  import KeyringController from "../Keyring/KeyringController";
6
6
  import NetworkController from "../Network/NetworkController";
7
- import { MessageStatus, METHOD_TYPES } from "../utils/constants";
7
+ import { MESSAGE_EVENTS, MessageStatus, METHOD_TYPES } from "../utils/constants";
8
8
  import { Message, MessageParams, UserRequestApprovalParams } from "../utils/interfaces";
9
9
  import AbstractMessageController, { MessageControllerState } from "./AbstractMessageController";
10
10
  import { normalizeMessageData, validateSignMessageData } from "./utils";
@@ -33,7 +33,7 @@ export class MessageController extends AbstractMessageController<Message, Messag
33
33
  async processSignMessage(messageId: string): Promise<string> {
34
34
  try {
35
35
  const msgObject = this.getMessage(messageId);
36
- const cleanMsgParams = await this.approveMessage(msgObject.messageParams);
36
+ const cleanMsgParams = await this.approveMessage(messageId, msgObject.messageParams);
37
37
  const rawSig = this.signMessage(cleanMsgParams.data, cleanMsgParams.from);
38
38
  this.updateMessage({ ...msgObject, rawSig });
39
39
  this.setMessageStatus(messageId, MessageStatus.SIGNED);
@@ -64,7 +64,7 @@ export class MessageController extends AbstractMessageController<Message, Messag
64
64
  type: METHOD_TYPES.ETH_SIGN,
65
65
  };
66
66
  await this.addMessage(messageData);
67
- this.emit(`unapprovedMessage`, messageParams);
67
+ this.emit(MESSAGE_EVENTS.UNAPPROVED_MESSAGE, messageData);
68
68
  return messageId;
69
69
  }
70
70
 
@@ -4,7 +4,7 @@ import log from "loglevel";
4
4
 
5
5
  import KeyringController from "../Keyring/KeyringController";
6
6
  import NetworkController from "../Network/NetworkController";
7
- import { MessageStatus, METHOD_TYPES } from "../utils/constants";
7
+ import { MESSAGE_EVENTS, MessageStatus, METHOD_TYPES } from "../utils/constants";
8
8
  import { Message, MessageParams, UserRequestApprovalParams } from "../utils/interfaces";
9
9
  import AbstractMessageController, { MessageControllerState } from "./AbstractMessageController";
10
10
  import { normalizeMessageData, validateSignMessageData } from "./utils";
@@ -33,7 +33,7 @@ export class PersonalMessageController extends AbstractMessageController<Message
33
33
  async processPersonalSignMessage(messageId: string): Promise<string> {
34
34
  try {
35
35
  const msgObject = this.getMessage(messageId);
36
- const cleanMsgParams = await this.approveMessage(msgObject.messageParams);
36
+ const cleanMsgParams = await this.approveMessage(messageId, msgObject.messageParams);
37
37
  const rawSig = await this.signPersonalMessage(cleanMsgParams.data, cleanMsgParams.from);
38
38
  this.updateMessage({ ...msgObject, rawSig });
39
39
  this.setMessageStatus(messageId, MessageStatus.SIGNED);
@@ -55,7 +55,7 @@ export class PersonalMessageController extends AbstractMessageController<Message
55
55
  messageParams.origin = req.origin;
56
56
  }
57
57
  messageParams.data = normalizeMessageData(messageParams.data);
58
- const messageId = randomId();
58
+ const messageId = messageParams.id || randomId();
59
59
  const messageData: Message = {
60
60
  id: messageId,
61
61
  messageParams,
@@ -64,7 +64,7 @@ export class PersonalMessageController extends AbstractMessageController<Message
64
64
  type: METHOD_TYPES.PERSONAL_SIGN,
65
65
  };
66
66
  await this.addMessage(messageData);
67
- this.emit(`unapprovedMessage`, messageParams);
67
+ this.emit(MESSAGE_EVENTS.UNAPPROVED_MESSAGE, messageData);
68
68
  return messageId;
69
69
  }
70
70
 
@@ -5,7 +5,7 @@ import log from "loglevel";
5
5
 
6
6
  import KeyringController from "../Keyring/KeyringController";
7
7
  import NetworkController from "../Network/NetworkController";
8
- import { MessageStatus, METHOD_TYPES } from "../utils/constants";
8
+ import { MESSAGE_EVENTS, MessageStatus, METHOD_TYPES } from "../utils/constants";
9
9
  import { METHOD_TYPES_TYPE, TypedMessage, TypedMessageParams, UserRequestApprovalParams } from "../utils/interfaces";
10
10
  import AbstractMessageController, { MessageControllerState } from "./AbstractMessageController";
11
11
  import { validateTypedSignMessageDataV1, validateTypedSignMessageDataV3V4 } from "./utils";
@@ -47,7 +47,7 @@ export class TypedMessageController extends AbstractMessageController<TypedMessa
47
47
  async processPersonalSignMessage(messageId: string): Promise<string> {
48
48
  try {
49
49
  const msgObject = this.getMessage(messageId);
50
- const cleanMsgParams = await this.approveMessage(msgObject.messageParams);
50
+ const cleanMsgParams = await this.approveMessage(messageId, msgObject.messageParams);
51
51
  const rawSig = await this.signTypedData(
52
52
  cleanMsgParams.data as TypedDataV1 | EthSigTypedMessage<MessageTypes>,
53
53
  cleanMsgParams.from,
@@ -102,7 +102,7 @@ export class TypedMessageController extends AbstractMessageController<TypedMessa
102
102
  type: getMessageType(version),
103
103
  };
104
104
  await this.addMessage(messageData);
105
- this.emit(`unapprovedMessage`, messageParams);
105
+ this.emit(MESSAGE_EVENTS.UNAPPROVED_MESSAGE, messageData);
106
106
  return messageId;
107
107
  }
108
108
 
@@ -4,7 +4,6 @@ import { BrowserProvider } from "ethers";
4
4
  import { merge } from "lodash";
5
5
  import log from "loglevel";
6
6
 
7
- import NetworkController from "../Network/NetworkController";
8
7
  import PreferencesController from "../Preferences/PreferencesController";
9
8
  import { SIMPLEHASH_SUPPORTED_CHAINS } from "../utils/constants";
10
9
  import { idleTimeTracker } from "../utils/helpers";
@@ -16,7 +15,6 @@ export interface INftsControllerOptions {
16
15
  config?: Partial<NftsControllerConfig>;
17
16
  state?: Partial<NftsControllerState>;
18
17
  provider: SafeEventEmitterProvider;
19
- getNetworkIdentifier: NetworkController["getNetworkIdentifier"];
20
18
  getCustomNfts?: PreferencesController["getCustomNfts"];
21
19
  getSimpleHashNfts: PreferencesController["getSimpleHashNfts"];
22
20
  onPreferencesStateChange: (listener: (preferencesState: PreferencesState<ExtendedAddressPreferences>) => void) => void;
@@ -34,27 +32,15 @@ export class NftsController extends BaseController<NftsControllerConfig, NftsCon
34
32
 
35
33
  private _timer: number;
36
34
 
37
- private getNetworkIdentifier: NetworkController["getNetworkIdentifier"];
38
-
39
35
  private getCustomNfts: PreferencesController["getCustomNfts"];
40
36
 
41
37
  private getSimpleHashNfts: PreferencesController["getSimpleHashNfts"];
42
38
 
43
- constructor({
44
- config,
45
- state,
46
- provider,
47
- getNetworkIdentifier,
48
- getCustomNfts,
49
- getSimpleHashNfts,
50
- onPreferencesStateChange,
51
- onNetworkStateChange,
52
- }: INftsControllerOptions) {
39
+ constructor({ config, state, provider, getCustomNfts, getSimpleHashNfts, onPreferencesStateChange, onNetworkStateChange }: INftsControllerOptions) {
53
40
  super({ config, state });
54
41
 
55
42
  this.provider = provider;
56
43
  this.ethersProvider = new BrowserProvider(this.provider, "any");
57
- this.getNetworkIdentifier = getNetworkIdentifier;
58
44
 
59
45
  this.getCustomNfts = getCustomNfts;
60
46
  this.getSimpleHashNfts = getSimpleHashNfts;
@@ -133,7 +119,7 @@ export class NftsController extends BaseController<NftsControllerConfig, NftsCon
133
119
  public detectNewNfts() {
134
120
  const userAddress = this.userSelectedAddress;
135
121
  if (!userAddress) return;
136
- const currentChainId = this.getNetworkIdentifier();
122
+ const currentChainId = this.config.chainId;
137
123
  const nftsToDetect: CustomNftInfo[] = []; // object[]
138
124
  if (!currentChainId) {
139
125
  this.update({ nfts: { [userAddress]: [...nftsToDetect] } });
@@ -186,7 +172,7 @@ export class NftsController extends BaseController<NftsControllerConfig, NftsCon
186
172
  const oldNfts = [...this.userNfts];
187
173
  const nonZeroNfts: CustomNftInfo[] = [];
188
174
  try {
189
- const currentChainId = this.getNetworkIdentifier();
175
+ const currentChainId = this.config.chainId;
190
176
  if (SIMPLEHASH_SUPPORTED_CHAINS.includes(currentChainId)) {
191
177
  const simpleHashBalances = await this.getSimpleHashNfts(userAddress, currentChainId);
192
178
  nonZeroNfts.push(...simpleHashBalances);
@@ -89,7 +89,7 @@ export default class PreferencesController
89
89
  userInfo?: UserInfo;
90
90
  rehydrate?: boolean;
91
91
  locale?: string;
92
- type: string;
92
+ type?: string;
93
93
  }): Promise<void> {
94
94
  const { address, jwtToken, calledFromEmbed, userInfo, rehydrate, locale = "en-US", type } = params;
95
95
  await super.init(address, userInfo, jwtToken, { type, email: userInfo.email });
@@ -17,7 +17,6 @@ export interface ITokensControllerOptions {
17
17
  config?: Partial<TokensControllerConfig>;
18
18
  state?: Partial<TokensControllerState>;
19
19
  provider: SafeEventEmitterProvider;
20
- getNetworkIdentifier: NetworkController["getNetworkIdentifier"];
21
20
  getCustomTokens?: PreferencesController["getCustomTokens"];
22
21
  getEtherScanTokens: PreferencesController["getEtherScanTokens"];
23
22
  getProviderConfig: NetworkController["getProviderConfig"];
@@ -55,8 +54,6 @@ export class TokensController extends BaseController<TokensControllerConfig, Tok
55
54
 
56
55
  private _timer: number;
57
56
 
58
- private getNetworkIdentifier: NetworkController["getNetworkIdentifier"];
59
-
60
57
  private getProviderConfig: NetworkController["getProviderConfig"];
61
58
 
62
59
  private getCustomTokens: PreferencesController["getCustomTokens"];
@@ -67,7 +64,6 @@ export class TokensController extends BaseController<TokensControllerConfig, Tok
67
64
  config,
68
65
  state,
69
66
  provider,
70
- getNetworkIdentifier,
71
67
  getCustomTokens,
72
68
  getEtherScanTokens,
73
69
  getProviderConfig,
@@ -78,7 +74,6 @@ export class TokensController extends BaseController<TokensControllerConfig, Tok
78
74
 
79
75
  this.provider = provider;
80
76
  this.ethersProvider = new BrowserProvider(this.provider, "any");
81
- this.getNetworkIdentifier = getNetworkIdentifier;
82
77
 
83
78
  this.getCustomTokens = getCustomTokens;
84
79
  this.getEtherScanTokens = getEtherScanTokens;
@@ -159,7 +154,7 @@ export class TokensController extends BaseController<TokensControllerConfig, Tok
159
154
  public detectNewTokens() {
160
155
  const userAddress = this.userSelectedAddress;
161
156
  if (!userAddress) return;
162
- const currentChainId = this.getNetworkIdentifier();
157
+ const currentChainId = this.config.chainId;
163
158
  const tokens: CustomTokenInfo[] = []; // object[]
164
159
  if (!currentChainId) {
165
160
  this.update({ tokens: { [userAddress]: [...tokens] } });
@@ -209,7 +204,7 @@ export class TokensController extends BaseController<TokensControllerConfig, Tok
209
204
  const tokenAddresses = oldTokens.map((x) => x.tokenAddress);
210
205
  const nonZeroTokens: CustomTokenInfo[] = [];
211
206
  try {
212
- const currentChainId = this.getNetworkIdentifier();
207
+ const currentChainId = this.config.chainId;
213
208
  if (ETHERSCAN_SUPPORTED_CHAINS.includes(currentChainId)) {
214
209
  const etherscanBalances = await this.getEtherScanTokens(userAddress, currentChainId);
215
210
  nonZeroTokens.push(...etherscanBalances);
@@ -61,7 +61,7 @@ export default class TransactionStateManager
61
61
  }
62
62
 
63
63
  return {
64
- id: randomId(),
64
+ id: opts.transaction.id || randomId(),
65
65
  time: Date.now(),
66
66
  status: TransactionStatus.unapproved,
67
67
  loadingDefaults: true,
@@ -377,3 +377,7 @@ export const MessageStatus = {
377
377
  REJECTED: "rejected",
378
378
  FAILED: "failed",
379
379
  } as const;
380
+
381
+ export const MESSAGE_EVENTS = {
382
+ UNAPPROVED_MESSAGE: "unapprovedMessage",
383
+ };