@metamask-previews/assets-controllers 11.0.1-preview.3dbf14f

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 (80) hide show
  1. package/CHANGELOG.md +235 -0
  2. package/LICENSE +20 -0
  3. package/README.md +30 -0
  4. package/dist/AccountTrackerController.d.ts +106 -0
  5. package/dist/AccountTrackerController.d.ts.map +1 -0
  6. package/dist/AccountTrackerController.js +163 -0
  7. package/dist/AccountTrackerController.js.map +1 -0
  8. package/dist/AssetsContractController.d.ts +188 -0
  9. package/dist/AssetsContractController.d.ts.map +1 -0
  10. package/dist/AssetsContractController.js +330 -0
  11. package/dist/AssetsContractController.js.map +1 -0
  12. package/dist/CurrencyRateController.d.ts +101 -0
  13. package/dist/CurrencyRateController.d.ts.map +1 -0
  14. package/dist/CurrencyRateController.js +219 -0
  15. package/dist/CurrencyRateController.js.map +1 -0
  16. package/dist/NftController.d.ts +466 -0
  17. package/dist/NftController.d.ts.map +1 -0
  18. package/dist/NftController.js +943 -0
  19. package/dist/NftController.js.map +1 -0
  20. package/dist/NftDetectionController.d.ts +182 -0
  21. package/dist/NftDetectionController.d.ts.map +1 -0
  22. package/dist/NftDetectionController.js +188 -0
  23. package/dist/NftDetectionController.js.map +1 -0
  24. package/dist/Standards/ERC20Standard.d.ts +50 -0
  25. package/dist/Standards/ERC20Standard.d.ts.map +1 -0
  26. package/dist/Standards/ERC20Standard.js +144 -0
  27. package/dist/Standards/ERC20Standard.js.map +1 -0
  28. package/dist/Standards/NftStandards/ERC1155/ERC1155Standard.d.ts +79 -0
  29. package/dist/Standards/NftStandards/ERC1155/ERC1155Standard.d.ts.map +1 -0
  30. package/dist/Standards/NftStandards/ERC1155/ERC1155Standard.js +148 -0
  31. package/dist/Standards/NftStandards/ERC1155/ERC1155Standard.js.map +1 -0
  32. package/dist/Standards/NftStandards/ERC721/ERC721Standard.d.ts +89 -0
  33. package/dist/Standards/NftStandards/ERC721/ERC721Standard.d.ts.map +1 -0
  34. package/dist/Standards/NftStandards/ERC721/ERC721Standard.js +182 -0
  35. package/dist/Standards/NftStandards/ERC721/ERC721Standard.js.map +1 -0
  36. package/dist/Standards/standards-types.d.ts +15 -0
  37. package/dist/Standards/standards-types.d.ts.map +1 -0
  38. package/dist/Standards/standards-types.js +3 -0
  39. package/dist/Standards/standards-types.js.map +1 -0
  40. package/dist/TokenBalancesController.d.ts +71 -0
  41. package/dist/TokenBalancesController.d.ts.map +1 -0
  42. package/dist/TokenBalancesController.js +94 -0
  43. package/dist/TokenBalancesController.js.map +1 -0
  44. package/dist/TokenDetectionController.d.ts +87 -0
  45. package/dist/TokenDetectionController.d.ts.map +1 -0
  46. package/dist/TokenDetectionController.js +189 -0
  47. package/dist/TokenDetectionController.js.map +1 -0
  48. package/dist/TokenListController.d.ts +117 -0
  49. package/dist/TokenListController.d.ts.map +1 -0
  50. package/dist/TokenListController.js +248 -0
  51. package/dist/TokenListController.js.map +1 -0
  52. package/dist/TokenRatesController.d.ts +172 -0
  53. package/dist/TokenRatesController.d.ts.map +1 -0
  54. package/dist/TokenRatesController.js +327 -0
  55. package/dist/TokenRatesController.js.map +1 -0
  56. package/dist/TokensController.d.ts +250 -0
  57. package/dist/TokensController.d.ts.map +1 -0
  58. package/dist/TokensController.js +550 -0
  59. package/dist/TokensController.js.map +1 -0
  60. package/dist/assetsUtil.d.ts +109 -0
  61. package/dist/assetsUtil.d.ts.map +1 -0
  62. package/dist/assetsUtil.js +227 -0
  63. package/dist/assetsUtil.js.map +1 -0
  64. package/dist/constants.d.ts +6 -0
  65. package/dist/constants.d.ts.map +1 -0
  66. package/dist/constants.js +10 -0
  67. package/dist/constants.js.map +1 -0
  68. package/dist/crypto-compare.d.ts +13 -0
  69. package/dist/crypto-compare.d.ts.map +1 -0
  70. package/dist/crypto-compare.js +67 -0
  71. package/dist/crypto-compare.js.map +1 -0
  72. package/dist/index.d.ts +12 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +32 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/token-service.d.ts +31 -0
  77. package/dist/token-service.d.ts.map +1 -0
  78. package/dist/token-service.js +134 -0
  79. package/dist/token-service.js.map +1 -0
  80. package/package.json +82 -0
@@ -0,0 +1,250 @@
1
+ /// <reference types="node" />
2
+ import { Contract } from '@ethersproject/contracts';
3
+ import type { AddApprovalRequest } from '@metamask/approval-controller';
4
+ import type { BaseConfig, BaseState, RestrictedControllerMessenger } from '@metamask/base-controller';
5
+ import { BaseController } from '@metamask/base-controller';
6
+ import type { NetworkState } from '@metamask/network-controller';
7
+ import type { PreferencesState } from '@metamask/preferences-controller';
8
+ import type { Hex } from '@metamask/utils';
9
+ import { EventEmitter } from 'events';
10
+ import type { AssetsContractController } from './AssetsContractController';
11
+ import type { TokenListState } from './TokenListController';
12
+ import type { Token } from './TokenRatesController';
13
+ /**
14
+ * @type TokensConfig
15
+ *
16
+ * Tokens controller configuration
17
+ * @property selectedAddress - Vault selected address
18
+ */
19
+ export interface TokensConfig extends BaseConfig {
20
+ selectedAddress: string;
21
+ chainId: Hex;
22
+ provider: any;
23
+ }
24
+ /**
25
+ * @type SuggestedAssetMeta
26
+ *
27
+ * Suggested asset by EIP747 meta data
28
+ * @property id - Generated UUID associated with this suggested asset
29
+ * @property time - Timestamp associated with this this suggested asset
30
+ * @property type - Type type this suggested asset
31
+ * @property asset - Asset suggested object
32
+ * @property interactingAddress - Account address that requested watch asset
33
+ */
34
+ declare type SuggestedAssetMeta = {
35
+ id: string;
36
+ time: number;
37
+ type: string;
38
+ asset: Token;
39
+ interactingAddress: string;
40
+ };
41
+ /**
42
+ * @type TokensState
43
+ *
44
+ * Assets controller state
45
+ * @property tokens - List of tokens associated with the active network and address pair
46
+ * @property ignoredTokens - List of ignoredTokens associated with the active network and address pair
47
+ * @property detectedTokens - List of detected tokens associated with the active network and address pair
48
+ * @property allTokens - Object containing tokens by network and account
49
+ * @property allIgnoredTokens - Object containing hidden/ignored tokens by network and account
50
+ * @property allDetectedTokens - Object containing tokens detected with non-zero balances
51
+ */
52
+ export interface TokensState extends BaseState {
53
+ tokens: Token[];
54
+ ignoredTokens: string[];
55
+ detectedTokens: Token[];
56
+ allTokens: {
57
+ [chainId: Hex]: {
58
+ [key: string]: Token[];
59
+ };
60
+ };
61
+ allIgnoredTokens: {
62
+ [chainId: Hex]: {
63
+ [key: string]: string[];
64
+ };
65
+ };
66
+ allDetectedTokens: {
67
+ [chainId: Hex]: {
68
+ [key: string]: Token[];
69
+ };
70
+ };
71
+ }
72
+ /**
73
+ * The name of the {@link TokensController}.
74
+ */
75
+ declare const controllerName = "TokensController";
76
+ /**
77
+ * The external actions available to the {@link TokensController}.
78
+ */
79
+ declare type AllowedActions = AddApprovalRequest;
80
+ /**
81
+ * The messenger of the {@link TokensController}.
82
+ */
83
+ export declare type TokensControllerMessenger = RestrictedControllerMessenger<typeof controllerName, AllowedActions, never, AllowedActions['type'], never>;
84
+ /**
85
+ * Controller that stores assets and exposes convenience methods
86
+ */
87
+ export declare class TokensController extends BaseController<TokensConfig, TokensState> {
88
+ private readonly mutex;
89
+ private ethersProvider;
90
+ private abortController;
91
+ private readonly messagingSystem;
92
+ /**
93
+ * Fetch metadata for a token.
94
+ *
95
+ * @param tokenAddress - The address of the token.
96
+ * @returns The token metadata.
97
+ */
98
+ private fetchTokenMetadata;
99
+ /**
100
+ * EventEmitter instance used to listen to specific EIP747 events
101
+ */
102
+ hub: EventEmitter;
103
+ /**
104
+ * Name of this controller used during composition
105
+ */
106
+ name: string;
107
+ private readonly getERC20TokenName;
108
+ /**
109
+ * Creates a TokensController instance.
110
+ *
111
+ * @param options - The controller options.
112
+ * @param options.chainId - The chain ID of the current network.
113
+ * @param options.onPreferencesStateChange - Allows subscribing to preference controller state changes.
114
+ * @param options.onNetworkStateChange - Allows subscribing to network controller state changes.
115
+ * @param options.onTokenListStateChange - Allows subscribing to token list controller state changes.
116
+ * @param options.getERC20TokenName - Gets the ERC-20 token name.
117
+ * @param options.config - Initial options used to configure this controller.
118
+ * @param options.state - Initial state to set on this controller.
119
+ * @param options.messenger - The controller messenger.
120
+ */
121
+ constructor({ chainId: initialChainId, onPreferencesStateChange, onNetworkStateChange, onTokenListStateChange, getERC20TokenName, config, state, messenger, }: {
122
+ chainId: Hex;
123
+ onPreferencesStateChange: (listener: (preferencesState: PreferencesState) => void) => void;
124
+ onNetworkStateChange: (listener: (networkState: NetworkState) => void) => void;
125
+ onTokenListStateChange: (listener: (tokenListState: TokenListState) => void) => void;
126
+ getERC20TokenName: AssetsContractController['getERC20TokenName'];
127
+ config?: Partial<TokensConfig>;
128
+ state?: Partial<TokensState>;
129
+ messenger: TokensControllerMessenger;
130
+ });
131
+ _instantiateNewEthersProvider(): any;
132
+ /**
133
+ * Adds a token to the stored token list.
134
+ *
135
+ * @param address - Hex address of the token contract.
136
+ * @param symbol - Symbol of the token.
137
+ * @param decimals - Number of decimals the token uses.
138
+ * @param options - Object containing name and image of the token
139
+ * @param options.name - Name of the token
140
+ * @param options.image - Image of the token
141
+ * @param options.interactingAddress - The address of the account to add a token to.
142
+ * @returns Current token list.
143
+ */
144
+ addToken(address: string, symbol: string, decimals: number, { name, image, interactingAddress, }?: {
145
+ name?: string;
146
+ image?: string;
147
+ interactingAddress?: string;
148
+ }): Promise<Token[]>;
149
+ /**
150
+ * Add a batch of tokens.
151
+ *
152
+ * @param tokensToImport - Array of tokens to import.
153
+ */
154
+ addTokens(tokensToImport: Token[]): Promise<void>;
155
+ /**
156
+ * Ignore a batch of tokens.
157
+ *
158
+ * @param tokenAddressesToIgnore - Array of token addresses to ignore.
159
+ */
160
+ ignoreTokens(tokenAddressesToIgnore: string[]): void;
161
+ /**
162
+ * Adds a batch of detected tokens to the stored token list.
163
+ *
164
+ * @param incomingDetectedTokens - Array of detected tokens to be added or updated.
165
+ * @param detectionDetails - An object containing the chain ID and address of the currently selected network on which the incomingDetectedTokens were detected.
166
+ * @param detectionDetails.selectedAddress - the account address on which the incomingDetectedTokens were detected.
167
+ * @param detectionDetails.chainId - the chainId on which the incomingDetectedTokens were detected.
168
+ */
169
+ addDetectedTokens(incomingDetectedTokens: Token[], detectionDetails?: {
170
+ selectedAddress: string;
171
+ chainId: Hex;
172
+ }): Promise<void>;
173
+ /**
174
+ * Adds isERC721 field to token object. This is called when a user attempts to add tokens that
175
+ * were previously added which do not yet had isERC721 field.
176
+ *
177
+ * @param tokenAddress - The contract address of the token requiring the isERC721 field added.
178
+ * @returns The new token object with the added isERC721 field.
179
+ */
180
+ updateTokenType(tokenAddress: string): Promise<Token>;
181
+ /**
182
+ * This is a function that updates the tokens name for the tokens name if it is not defined.
183
+ *
184
+ * @param tokenList - Represents the fetched token list from service API
185
+ * @param tokenAttribute - Represents the token attribute that we want to update on the token list
186
+ */
187
+ private updateTokensAttribute;
188
+ /**
189
+ * Detects whether or not a token is ERC-721 compatible.
190
+ *
191
+ * @param tokenAddress - The token contract address.
192
+ * @returns A boolean indicating whether the token address passed in supports the EIP-721
193
+ * interface.
194
+ */
195
+ _detectIsERC721(tokenAddress: string): Promise<any>;
196
+ _createEthersContract(tokenAddress: string, abi: string, ethersProvider: any): Contract;
197
+ _generateRandomId(): string;
198
+ /**
199
+ * Adds a new suggestedAsset to the list of watched assets.
200
+ * Parameters will be validated according to the asset type being watched.
201
+ *
202
+ * @param asset - The asset to be watched. For now only ERC20 tokens are accepted.
203
+ * @param type - The asset type.
204
+ * @param interactingAddress - The address of the account that is requesting to watch the asset.
205
+ * @returns Object containing a Promise resolving to the suggestedAsset address if accepted.
206
+ */
207
+ watchAsset(asset: Token, type: string, interactingAddress?: string): Promise<void>;
208
+ /**
209
+ * Takes a new tokens and ignoredTokens array for the current network/account combination
210
+ * and returns new allTokens and allIgnoredTokens state to update to.
211
+ *
212
+ * @param params - Object that holds token params.
213
+ * @param params.newTokens - The new tokens to set for the current network and selected account.
214
+ * @param params.newIgnoredTokens - The new ignored tokens to set for the current network and selected account.
215
+ * @param params.newDetectedTokens - The new detected tokens to set for the current network and selected account.
216
+ * @param params.interactingAddress - The account address to use to store the tokens.
217
+ * @param params.interactingChainId - The chainId to use to store the tokens.
218
+ * @returns The updated `allTokens` and `allIgnoredTokens` state.
219
+ */
220
+ _getNewAllTokensState(params: {
221
+ newTokens?: Token[];
222
+ newIgnoredTokens?: string[];
223
+ newDetectedTokens?: Token[];
224
+ interactingAddress?: string;
225
+ interactingChainId?: Hex;
226
+ }): {
227
+ newAllTokens: {
228
+ [chainId: `0x${string}`]: {
229
+ [key: string]: Token[];
230
+ };
231
+ };
232
+ newAllIgnoredTokens: {
233
+ [chainId: `0x${string}`]: {
234
+ [key: string]: string[];
235
+ };
236
+ };
237
+ newAllDetectedTokens: {
238
+ [chainId: `0x${string}`]: {
239
+ [key: string]: Token[];
240
+ };
241
+ };
242
+ };
243
+ /**
244
+ * Removes all tokens from the ignored list.
245
+ */
246
+ clearIgnoredTokens(): void;
247
+ _requestApproval(suggestedAssetMeta: SuggestedAssetMeta): Promise<unknown>;
248
+ }
249
+ export default TokensController;
250
+ //# sourceMappingURL=TokensController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokensController.d.ts","sourceRoot":"","sources":["../src/TokensController.ts"],"names":[],"mappings":"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"}