@metamask/assets-controllers 20.0.0 → 21.0.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/CHANGELOG.md +73 -1
- package/dist/AccountTrackerController.d.ts +28 -7
- package/dist/AccountTrackerController.d.ts.map +1 -1
- package/dist/AccountTrackerController.js +104 -30
- package/dist/AccountTrackerController.js.map +1 -1
- package/dist/AssetsContractController.d.ts +3 -3
- package/dist/AssetsContractController.d.ts.map +1 -1
- package/dist/AssetsContractController.js +9 -3
- package/dist/AssetsContractController.js.map +1 -1
- package/dist/CurrencyRateController.d.ts +2 -2
- package/dist/CurrencyRateController.d.ts.map +1 -1
- package/dist/CurrencyRateController.js +1 -1
- package/dist/CurrencyRateController.js.map +1 -1
- package/dist/NftController.d.ts.map +1 -1
- package/dist/NftController.js +6 -2
- package/dist/NftController.js.map +1 -1
- package/dist/NftDetectionController.d.ts +2 -2
- package/dist/NftDetectionController.d.ts.map +1 -1
- package/dist/NftDetectionController.js +1 -1
- package/dist/NftDetectionController.js.map +1 -1
- package/dist/Standards/ERC20Standard.d.ts.map +1 -1
- package/dist/Standards/ERC20Standard.js +4 -0
- package/dist/Standards/ERC20Standard.js.map +1 -1
- package/dist/Standards/NftStandards/ERC1155/ERC1155Standard.d.ts +11 -10
- package/dist/Standards/NftStandards/ERC1155/ERC1155Standard.d.ts.map +1 -1
- package/dist/Standards/NftStandards/ERC1155/ERC1155Standard.js +106 -85
- package/dist/Standards/NftStandards/ERC1155/ERC1155Standard.js.map +1 -1
- package/dist/Standards/NftStandards/ERC721/ERC721Standard.d.ts.map +1 -1
- package/dist/Standards/NftStandards/ERC721/ERC721Standard.js +2 -0
- package/dist/Standards/NftStandards/ERC721/ERC721Standard.js.map +1 -1
- package/dist/Standards/standards-types.d.ts.map +1 -1
- package/dist/Standards/standards-types.js.map +1 -1
- package/dist/TokenDetectionController.d.ts +2 -2
- package/dist/TokenDetectionController.d.ts.map +1 -1
- package/dist/TokenDetectionController.js +1 -1
- package/dist/TokenDetectionController.js.map +1 -1
- package/dist/TokenListController.d.ts +2 -2
- package/dist/TokenListController.d.ts.map +1 -1
- package/dist/TokenListController.js +3 -15
- package/dist/TokenListController.js.map +1 -1
- package/dist/TokenRatesController.d.ts +9 -75
- package/dist/TokenRatesController.d.ts.map +1 -1
- package/dist/TokenRatesController.js +180 -203
- package/dist/TokenRatesController.js.map +1 -1
- package/dist/TokensController.d.ts +6 -8
- package/dist/TokensController.d.ts.map +1 -1
- package/dist/TokensController.js +70 -21
- package/dist/TokensController.js.map +1 -1
- package/dist/assetsUtil.d.ts +38 -8
- package/dist/assetsUtil.d.ts.map +1 -1
- package/dist/assetsUtil.js +60 -27
- package/dist/assetsUtil.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/token-prices-service/abstract-token-prices-service.d.ts +62 -0
- package/dist/token-prices-service/abstract-token-prices-service.d.ts.map +1 -0
- package/dist/token-prices-service/abstract-token-prices-service.js +3 -0
- package/dist/token-prices-service/abstract-token-prices-service.js.map +1 -0
- package/dist/token-prices-service/codefi-v2.d.ts +80 -0
- package/dist/token-prices-service/codefi-v2.d.ts.map +1 -0
- package/dist/token-prices-service/codefi-v2.js +327 -0
- package/dist/token-prices-service/codefi-v2.js.map +1 -0
- package/dist/token-prices-service/index.d.ts +3 -0
- package/dist/token-prices-service/index.d.ts.map +1 -0
- package/dist/token-prices-service/index.js +6 -0
- package/dist/token-prices-service/index.js.map +1 -0
- package/dist/token-service.d.ts.map +1 -1
- package/dist/token-service.js +1 -1
- package/dist/token-service.js.map +1 -1
- package/package.json +6 -3
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,77 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [21.0.0]
|
|
10
|
+
### Added
|
|
11
|
+
- Add `CodefiTokenPricesServiceV2` ([#3600](https://github.com/MetaMask/core/pull/3600), [#3655](https://github.com/MetaMask/core/pull/3655), [#3655](https://github.com/MetaMask/core/pull/3655))
|
|
12
|
+
- This class can be used for the new `tokenPricesService` argument for TokenRatesController. It uses a MetaMask API to fetch prices for tokens instead of CoinGecko.
|
|
13
|
+
- The `CodefiTokenPricesServiceV2` will retry if the token price update fails
|
|
14
|
+
- We retry each request up to 3 times using a randomized exponential backoff strategy
|
|
15
|
+
- If the token price update still fails 12 times consecutively (3 update attempts, each of which has 4 calls due to retries), we stop trying for 30 minutes before we try again.
|
|
16
|
+
- Add polling by `networkClientId` to `AccountTrackerController` ([#3586](https://github.com/MetaMask/core/pull/3586))
|
|
17
|
+
- A new state property, `accountByChainId` has been added for keeping track of account balances across chains
|
|
18
|
+
- `AccountTrackerController` implements `PollingController` and can now poll by `networkClientId` via the new methods `startPollingByNetworkClientId`, `stopPollingByPollingToken`, and `stopPollingByPollingToken`.
|
|
19
|
+
- `AccountTrackerController` accepts an optional `networkClientId` value on the `refresh` method
|
|
20
|
+
- `AccountTrackerController` accepts an optional `networkClientId` value as the last parameter of the `syncBalanceWithAddresses` method
|
|
21
|
+
- Support token detection on Base and zkSync ([#3584](https://github.com/MetaMask/core/pull/3584))
|
|
22
|
+
- Support token detection on Arbitrum and Optimism ([#2035](https://github.com/MetaMask/core/pull/2035))
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
- **BREAKING:** `TokenRatesController` now takes a required argument `tokenPricesService` ([#3600](https://github.com/MetaMask/core/pull/3600))
|
|
26
|
+
- This object is responsible for fetching the prices for tokens held by this controller.
|
|
27
|
+
- **BREAKING:** Update signature of `TokenRatesController.updateExchangeRatesByChainId` ([#3600](https://github.com/MetaMask/core/pull/3600), [#3653](https://github.com/MetaMask/core/pull/3653))
|
|
28
|
+
- Change the type of `tokenAddresses` from `string[]` to `Hex[]`
|
|
29
|
+
- **BREAKING:** `AccountTrackerController` constructor params object requires `getCurrentChainId` and `getNetworkClientById` hooks ([#3586](https://github.com/MetaMask/core/pull/3586))
|
|
30
|
+
- These are needed for the new "polling by `networkClientId`" feature
|
|
31
|
+
- **BREAKING:** `AccountTrackerController` has a new required state property, `accountByChainId`([#3586](https://github.com/MetaMask/core/pull/3586))
|
|
32
|
+
- This is needed to track balances accross chains. It was introduced for the "polling by `networkClientId`" feature, but is useful on its own as well.
|
|
33
|
+
- **BREAKING**: `AccountTrackerController` adds a mutex to `refresh` making it only possible for one call to be executed at time ([#3586](https://github.com/MetaMask/core/pull/3586))
|
|
34
|
+
- **BREAKING**: `TokensController.watchAsset` now performs on-chain validation of the asset's symbol and decimals, if they're defined in the contract ([#1745](https://github.com/MetaMask/core/pull/1745))
|
|
35
|
+
- The `TokensController` constructor no longer accepts a `getERC20TokenName` option. It was no longer needed due to this change.
|
|
36
|
+
- Add new method `_getProvider`, though this is intended for internal use and should not be called externally.
|
|
37
|
+
- Additionally, if the symbol and decimals are defined in the contract, they are no longer required to be passed to `watchAsset`
|
|
38
|
+
- **BREAKING:** Update controllers that rely on provider to listen to `NetworkController:networkDidChange` instead of `NetworkController:stateChange` ([#3610](https://github.com/MetaMask/core/pull/3610))
|
|
39
|
+
- The `networkDidChange` event is safer in cases where the provider is used because the provider is guaranteed to have been updated by the time that event is emitted. The same is not true of the `stateChange` event.
|
|
40
|
+
- The following controllers now accept a `onNetworkDidChange` constructor option instead of a `onNetworkStateChange` option:
|
|
41
|
+
- `TokensController`
|
|
42
|
+
- `AssetsContractController`
|
|
43
|
+
- Update `@metamask/polling-controller` to v3 ([#3636](https://github.com/MetaMask/core/pull/3636))
|
|
44
|
+
- This update adds two new methods to each polling controller: `_startPollingByNetworkClientId` and `_stopPollingByPollingTokenSetId`. These methods are intended for internal use, and should not be called directly.
|
|
45
|
+
- The affected controllers are:
|
|
46
|
+
- `AccountTrackerController`
|
|
47
|
+
- `CurrencyRateController`
|
|
48
|
+
- `NftDetectionController`
|
|
49
|
+
- `TokenDetectionController`
|
|
50
|
+
- `TokenListController`
|
|
51
|
+
- `TokenRatesController`
|
|
52
|
+
- Update `@metamask/controller-utils` to v7 ([#3636](https://github.com/MetaMask/core/pull/3636))
|
|
53
|
+
- Update `TokenListController` to fetch prefiltered set of tokens from the API, reducing response data and removing the need for filtering logic ([#2054](https://github.com/MetaMask/core/pull/2054))
|
|
54
|
+
- Update `TokenRatesController` to request token rates from the Price API in batches of 100 ([#3650](https://github.com/MetaMask/core/pull/3650))
|
|
55
|
+
- Add dependencies `cockatiel` and `lodash` ([#3586](https://github.com/MetaMask/core/pull/3586), [#3655](https://github.com/MetaMask/core/pull/3655))
|
|
56
|
+
|
|
57
|
+
### Removed
|
|
58
|
+
- **BREAKING:** Remove `fetchExchangeRate` method from TokenRatesController ([#3600](https://github.com/MetaMask/core/pull/3600))
|
|
59
|
+
- This method (not to be confused with `updateExchangeRate`, which is still present) was only ever intended to be used internally and should not be accessed directly.
|
|
60
|
+
- **BREAKING:** Remove `getChainSlug` method from TokenRatesController ([#3600](https://github.com/MetaMask/core/pull/3600))
|
|
61
|
+
- This method was previously used in TokenRatesController to access the CoinGecko API. There is no equivalent.
|
|
62
|
+
- **BREAKING:** Remove `CoinGeckoResponse` and `CoinGeckoPlatform` types ([#3600](https://github.com/MetaMask/core/pull/3600))
|
|
63
|
+
- These types were previously used in TokenRatesController to represent data returned from the CoinGecko API. There is no equivalent.
|
|
64
|
+
- **BREAKING**: The TokenRatesController now only supports updating and polling rates for tokens tracked by the TokensController ([#3639](https://github.com/MetaMask/core/pull/3639))
|
|
65
|
+
- The `tokenAddresses` option has been removed from `startPollingByNetworkClientId`
|
|
66
|
+
- The `tokenContractAddresses` option has been removed from `updateExchangeRatesByChainId`
|
|
67
|
+
- **BREAKING**: `TokenRatesController.fetchAndMapExchangeRates` is no longer exposed publicly ([#3621](https://github.com/MetaMask/core/pull/3621))
|
|
68
|
+
|
|
69
|
+
### Fixed
|
|
70
|
+
- Prevent `TokenRatesController` from making redundant token rate updates when tokens change ([#3647](https://github.com/MetaMask/core/pull/3647), [#3663](https://github.com/MetaMask/core/pull/3663))
|
|
71
|
+
- Previously, token rates would be re-fetched for the globally selected network on all TokensController state changes, but now token rates are always performed for a deduplicated and normalized set of addresses, and changes to this set determine whether rates should be re-fetched.
|
|
72
|
+
- Prevent redundant overlapping token rate updates in `TokenRatesController` ([#3635](https://github.com/MetaMask/core/pull/3635))
|
|
73
|
+
- Fix `TokenRatesController` bug where the `contractExchangeRates` state would sometimes be stale after calling `updateExchangeRatesByChainId` ([#3624](https://github.com/MetaMask/core/pull/3624))
|
|
74
|
+
- Make `TokenRatesController.updateExchangeRatesByChainId` respect `disabled` state ([#3596](https://github.com/MetaMask/core/pull/3596))
|
|
75
|
+
- Fix error in `NftController` when attempt to get NFT information from on-chain fails, and ensure metadata always contains contract address and blank `name` field ([#3629](https://github.com/MetaMask/core/pull/3629))
|
|
76
|
+
- When fetching on-chain NFT information fails, we now proceed with whatever we have (either the OpenSea metadata, or a blank metadata object)
|
|
77
|
+
- Previously, if we were unable to retrieve NFT metadata from on-chain or OpenSea, the returned NFT metadata would be missing a `name` field and the contract address. Now the returned metadata always has those entries, though the `name` is set to `null`.
|
|
78
|
+
- This affects `watchNft` and `addNft` methods
|
|
79
|
+
|
|
9
80
|
## [20.0.0]
|
|
10
81
|
### Added
|
|
11
82
|
- **BREAKING**: `TokenRatesControllerState` now has required `contractExchangeRatesByChainId` property which an object keyed by `chainId` and `nativeCurrency` ([#2015](https://github.com/MetaMask/core/pull/2015))
|
|
@@ -409,7 +480,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
409
480
|
### Changed
|
|
410
481
|
- Use Ethers for AssetsContractController ([#845](https://github.com/MetaMask/core/pull/845))
|
|
411
482
|
|
|
412
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@
|
|
483
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@21.0.0...HEAD
|
|
484
|
+
[21.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@20.0.0...@metamask/assets-controllers@21.0.0
|
|
413
485
|
[20.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@19.0.0...@metamask/assets-controllers@20.0.0
|
|
414
486
|
[19.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@18.0.0...@metamask/assets-controllers@19.0.0
|
|
415
487
|
[18.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controllers@17.0.0...@metamask/assets-controllers@18.0.0
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { BaseConfig, BaseState } from '@metamask/base-controller';
|
|
2
|
-
import { BaseControllerV1 } from '@metamask/base-controller';
|
|
3
2
|
import type { Provider } from '@metamask/eth-query';
|
|
3
|
+
import type { NetworkClientId, NetworkController, NetworkState } from '@metamask/network-controller';
|
|
4
|
+
import { StaticIntervalPollingControllerV1 } from '@metamask/polling-controller';
|
|
4
5
|
import type { PreferencesState } from '@metamask/preferences-controller';
|
|
5
6
|
/**
|
|
6
7
|
* @type AccountInformation
|
|
@@ -31,13 +32,17 @@ export interface AccountTrackerState extends BaseState {
|
|
|
31
32
|
accounts: {
|
|
32
33
|
[address: string]: AccountInformation;
|
|
33
34
|
};
|
|
35
|
+
accountsByChainId: Record<string, {
|
|
36
|
+
[address: string]: AccountInformation;
|
|
37
|
+
}>;
|
|
34
38
|
}
|
|
35
39
|
/**
|
|
36
40
|
* Controller that tracks the network balances for all user accounts.
|
|
37
41
|
*/
|
|
38
|
-
export declare class AccountTrackerController extends
|
|
39
|
-
private
|
|
40
|
-
private
|
|
42
|
+
export declare class AccountTrackerController extends StaticIntervalPollingControllerV1<AccountTrackerConfig, AccountTrackerState> {
|
|
43
|
+
#private;
|
|
44
|
+
private _provider?;
|
|
45
|
+
private readonly refreshMutex;
|
|
41
46
|
private handle?;
|
|
42
47
|
private syncAccounts;
|
|
43
48
|
/**
|
|
@@ -47,6 +52,8 @@ export declare class AccountTrackerController extends BaseControllerV1<AccountTr
|
|
|
47
52
|
private readonly getIdentities;
|
|
48
53
|
private readonly getSelectedAddress;
|
|
49
54
|
private readonly getMultiAccountBalancesEnabled;
|
|
55
|
+
private readonly getCurrentChainId;
|
|
56
|
+
private readonly getNetworkClientById;
|
|
50
57
|
/**
|
|
51
58
|
* Creates an AccountTracker instance.
|
|
52
59
|
*
|
|
@@ -55,14 +62,18 @@ export declare class AccountTrackerController extends BaseControllerV1<AccountTr
|
|
|
55
62
|
* @param options.getIdentities - Gets the identities from the Preferences store.
|
|
56
63
|
* @param options.getSelectedAddress - Gets the selected address from the Preferences store.
|
|
57
64
|
* @param options.getMultiAccountBalancesEnabled - Gets the multi account balances enabled flag from the Preferences store.
|
|
65
|
+
* @param options.getCurrentChainId - Gets the chain ID for the current network from the Network store.
|
|
66
|
+
* @param options.getNetworkClientById - Gets the network client with the given id from the NetworkController.
|
|
58
67
|
* @param config - Initial options used to configure this controller.
|
|
59
68
|
* @param state - Initial state to set on this controller.
|
|
60
69
|
*/
|
|
61
|
-
constructor({ onPreferencesStateChange, getIdentities, getSelectedAddress, getMultiAccountBalancesEnabled, }: {
|
|
70
|
+
constructor({ onPreferencesStateChange, getIdentities, getSelectedAddress, getMultiAccountBalancesEnabled, getCurrentChainId, getNetworkClientById, }: {
|
|
62
71
|
onPreferencesStateChange: (listener: (preferencesState: PreferencesState) => void) => void;
|
|
63
72
|
getIdentities: () => PreferencesState['identities'];
|
|
64
73
|
getSelectedAddress: () => PreferencesState['selectedAddress'];
|
|
65
74
|
getMultiAccountBalancesEnabled: () => PreferencesState['isMultiAccountBalancesEnabled'];
|
|
75
|
+
getCurrentChainId: () => NetworkState['providerConfig']['chainId'];
|
|
76
|
+
getNetworkClientById: NetworkController['getNetworkClientById'];
|
|
66
77
|
}, config?: Partial<AccountTrackerConfig>, state?: Partial<AccountTrackerState>);
|
|
67
78
|
/**
|
|
68
79
|
* Sets a new provider.
|
|
@@ -79,16 +90,25 @@ export declare class AccountTrackerController extends BaseControllerV1<AccountTr
|
|
|
79
90
|
* @param interval - Polling interval trigger a 'refresh'.
|
|
80
91
|
*/
|
|
81
92
|
poll(interval?: number): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Refreshes the balances of the accounts using the networkClientId
|
|
95
|
+
*
|
|
96
|
+
* @param networkClientId - The network client ID used to get balances.
|
|
97
|
+
*/
|
|
98
|
+
_executePoll(networkClientId: string): Promise<void>;
|
|
82
99
|
/**
|
|
83
100
|
* Refreshes the balances of the accounts depending on the multi-account setting.
|
|
84
101
|
* If multi-account is disabled, only updates the selected account balance.
|
|
85
102
|
* If multi-account is enabled, updates balances for all accounts.
|
|
103
|
+
*
|
|
104
|
+
* @param networkClientId - Optional networkClientId to fetch a network client with
|
|
86
105
|
*/
|
|
87
|
-
refresh: () => Promise<void>;
|
|
106
|
+
refresh: (networkClientId?: NetworkClientId) => Promise<void>;
|
|
88
107
|
/**
|
|
89
108
|
* Fetches the balance of a given address from the blockchain.
|
|
90
109
|
*
|
|
91
110
|
* @param address - The account address to fetch the balance for.
|
|
111
|
+
* @param ethQuery - The EthQuery instance to query getBalnce with.
|
|
92
112
|
* @returns A promise that resolves to the balance in a hex string format.
|
|
93
113
|
*/
|
|
94
114
|
private getBalanceFromChain;
|
|
@@ -96,9 +116,10 @@ export declare class AccountTrackerController extends BaseControllerV1<AccountTr
|
|
|
96
116
|
* Sync accounts balances with some additional addresses.
|
|
97
117
|
*
|
|
98
118
|
* @param addresses - the additional addresses, may be hardware wallet addresses.
|
|
119
|
+
* @param networkClientId - Optional networkClientId to fetch a network client with.
|
|
99
120
|
* @returns accounts - addresses with synced balance
|
|
100
121
|
*/
|
|
101
|
-
syncBalanceWithAddresses(addresses: string[]): Promise<Record<string, {
|
|
122
|
+
syncBalanceWithAddresses(addresses: string[], networkClientId?: NetworkClientId): Promise<Record<string, {
|
|
102
123
|
balance: string;
|
|
103
124
|
}>>;
|
|
104
125
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccountTrackerController.d.ts","sourceRoot":"","sources":["../src/AccountTrackerController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"AccountTrackerController.d.ts","sourceRoot":"","sources":["../src/AccountTrackerController.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,20 +8,27 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
12
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
13
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
14
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
15
|
+
};
|
|
11
16
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
18
|
};
|
|
19
|
+
var _AccountTrackerController_instances, _AccountTrackerController_getCorrectNetworkClient;
|
|
14
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
21
|
exports.AccountTrackerController = void 0;
|
|
16
|
-
const base_controller_1 = require("@metamask/base-controller");
|
|
17
22
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
18
23
|
const eth_query_1 = __importDefault(require("@metamask/eth-query"));
|
|
24
|
+
const polling_controller_1 = require("@metamask/polling-controller");
|
|
19
25
|
const utils_1 = require("@metamask/utils");
|
|
20
26
|
const async_mutex_1 = require("async-mutex");
|
|
27
|
+
const lodash_1 = require("lodash");
|
|
21
28
|
/**
|
|
22
29
|
* Controller that tracks the network balances for all user accounts.
|
|
23
30
|
*/
|
|
24
|
-
class AccountTrackerController extends
|
|
31
|
+
class AccountTrackerController extends polling_controller_1.StaticIntervalPollingControllerV1 {
|
|
25
32
|
/**
|
|
26
33
|
* Creates an AccountTracker instance.
|
|
27
34
|
*
|
|
@@ -30,12 +37,15 @@ class AccountTrackerController extends base_controller_1.BaseControllerV1 {
|
|
|
30
37
|
* @param options.getIdentities - Gets the identities from the Preferences store.
|
|
31
38
|
* @param options.getSelectedAddress - Gets the selected address from the Preferences store.
|
|
32
39
|
* @param options.getMultiAccountBalancesEnabled - Gets the multi account balances enabled flag from the Preferences store.
|
|
40
|
+
* @param options.getCurrentChainId - Gets the chain ID for the current network from the Network store.
|
|
41
|
+
* @param options.getNetworkClientById - Gets the network client with the given id from the NetworkController.
|
|
33
42
|
* @param config - Initial options used to configure this controller.
|
|
34
43
|
* @param state - Initial state to set on this controller.
|
|
35
44
|
*/
|
|
36
|
-
constructor({ onPreferencesStateChange, getIdentities, getSelectedAddress, getMultiAccountBalancesEnabled, }, config, state) {
|
|
45
|
+
constructor({ onPreferencesStateChange, getIdentities, getSelectedAddress, getMultiAccountBalancesEnabled, getCurrentChainId, getNetworkClientById, }, config, state) {
|
|
37
46
|
super(config, state);
|
|
38
|
-
|
|
47
|
+
_AccountTrackerController_instances.add(this);
|
|
48
|
+
this.refreshMutex = new async_mutex_1.Mutex();
|
|
39
49
|
/**
|
|
40
50
|
* Name of this controller used during composition
|
|
41
51
|
*/
|
|
@@ -44,47 +54,87 @@ class AccountTrackerController extends base_controller_1.BaseControllerV1 {
|
|
|
44
54
|
* Refreshes the balances of the accounts depending on the multi-account setting.
|
|
45
55
|
* If multi-account is disabled, only updates the selected account balance.
|
|
46
56
|
* If multi-account is enabled, updates balances for all accounts.
|
|
57
|
+
*
|
|
58
|
+
* @param networkClientId - Optional networkClientId to fetch a network client with
|
|
47
59
|
*/
|
|
48
|
-
this.refresh = () => __awaiter(this, void 0, void 0, function* () {
|
|
49
|
-
this.
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
};
|
|
60
|
+
this.refresh = (networkClientId) => __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
const releaseLock = yield this.refreshMutex.acquire();
|
|
62
|
+
try {
|
|
63
|
+
const { chainId, ethQuery } = __classPrivateFieldGet(this, _AccountTrackerController_instances, "m", _AccountTrackerController_getCorrectNetworkClient).call(this, networkClientId);
|
|
64
|
+
this.syncAccounts(chainId);
|
|
65
|
+
const { accounts, accountsByChainId } = this.state;
|
|
66
|
+
const isMultiAccountBalancesEnabled = this.getMultiAccountBalancesEnabled();
|
|
67
|
+
const accountsToUpdate = isMultiAccountBalancesEnabled
|
|
68
|
+
? Object.keys(accounts)
|
|
69
|
+
: [this.getSelectedAddress()];
|
|
70
|
+
const accountsForChain = Object.assign({}, accountsByChainId[chainId]);
|
|
71
|
+
for (const address of accountsToUpdate) {
|
|
72
|
+
accountsForChain[address] = {
|
|
73
|
+
balance: (0, controller_utils_1.BNToHex)(yield this.getBalanceFromChain(address, ethQuery)),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
this.update(Object.assign(Object.assign({}, (chainId === this.getCurrentChainId() && {
|
|
77
|
+
accounts: accountsForChain,
|
|
78
|
+
})), { accountsByChainId: Object.assign(Object.assign({}, this.state.accountsByChainId), { [chainId]: accountsForChain }) }));
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
releaseLock();
|
|
82
|
+
throw err;
|
|
59
83
|
}
|
|
60
|
-
this.update({ accounts });
|
|
61
84
|
});
|
|
62
85
|
this.defaultConfig = {
|
|
63
86
|
interval: 10000,
|
|
64
87
|
};
|
|
65
|
-
this.defaultState = {
|
|
88
|
+
this.defaultState = {
|
|
89
|
+
accounts: {},
|
|
90
|
+
accountsByChainId: {
|
|
91
|
+
[getCurrentChainId()]: {},
|
|
92
|
+
},
|
|
93
|
+
};
|
|
66
94
|
this.initialize();
|
|
95
|
+
this.setIntervalLength(this.config.interval);
|
|
67
96
|
this.getIdentities = getIdentities;
|
|
68
97
|
this.getSelectedAddress = getSelectedAddress;
|
|
69
98
|
this.getMultiAccountBalancesEnabled = getMultiAccountBalancesEnabled;
|
|
99
|
+
this.getCurrentChainId = getCurrentChainId;
|
|
100
|
+
this.getNetworkClientById = getNetworkClientById;
|
|
70
101
|
onPreferencesStateChange(() => {
|
|
71
102
|
this.refresh();
|
|
72
103
|
});
|
|
73
104
|
this.poll();
|
|
74
105
|
}
|
|
75
|
-
syncAccounts() {
|
|
76
|
-
const
|
|
77
|
-
const
|
|
106
|
+
syncAccounts(newChainId) {
|
|
107
|
+
const accounts = Object.assign({}, this.state.accounts);
|
|
108
|
+
const accountsByChainId = (0, lodash_1.cloneDeep)(this.state.accountsByChainId);
|
|
78
109
|
const existing = Object.keys(accounts);
|
|
110
|
+
if (!accountsByChainId[newChainId]) {
|
|
111
|
+
accountsByChainId[newChainId] = {};
|
|
112
|
+
existing.forEach((address) => {
|
|
113
|
+
accountsByChainId[newChainId][address] = { balance: '0x0' };
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
const addresses = Object.keys(this.getIdentities());
|
|
79
117
|
const newAddresses = addresses.filter((address) => !existing.includes(address));
|
|
80
118
|
const oldAddresses = existing.filter((address) => !addresses.includes(address));
|
|
81
119
|
newAddresses.forEach((address) => {
|
|
82
120
|
accounts[address] = { balance: '0x0' };
|
|
83
121
|
});
|
|
122
|
+
Object.keys(accountsByChainId).forEach((chainId) => {
|
|
123
|
+
newAddresses.forEach((address) => {
|
|
124
|
+
accountsByChainId[chainId][address] = {
|
|
125
|
+
balance: '0x0',
|
|
126
|
+
};
|
|
127
|
+
});
|
|
128
|
+
});
|
|
84
129
|
oldAddresses.forEach((address) => {
|
|
85
130
|
delete accounts[address];
|
|
86
131
|
});
|
|
87
|
-
|
|
132
|
+
Object.keys(accountsByChainId).forEach((chainId) => {
|
|
133
|
+
oldAddresses.forEach((address) => {
|
|
134
|
+
delete accountsByChainId[chainId][address];
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
this.update({ accounts, accountsByChainId });
|
|
88
138
|
}
|
|
89
139
|
/**
|
|
90
140
|
* Sets a new provider.
|
|
@@ -94,7 +144,7 @@ class AccountTrackerController extends base_controller_1.BaseControllerV1 {
|
|
|
94
144
|
* @param provider - Provider used to create a new underlying EthQuery instance.
|
|
95
145
|
*/
|
|
96
146
|
set provider(provider) {
|
|
97
|
-
this.
|
|
147
|
+
this._provider = provider;
|
|
98
148
|
}
|
|
99
149
|
get provider() {
|
|
100
150
|
throw new Error('Property only used for setting');
|
|
@@ -106,27 +156,36 @@ class AccountTrackerController extends base_controller_1.BaseControllerV1 {
|
|
|
106
156
|
*/
|
|
107
157
|
poll(interval) {
|
|
108
158
|
return __awaiter(this, void 0, void 0, function* () {
|
|
109
|
-
const releaseLock = yield this.mutex.acquire();
|
|
110
159
|
interval && this.configure({ interval }, false, false);
|
|
111
160
|
this.handle && clearTimeout(this.handle);
|
|
112
161
|
yield this.refresh();
|
|
113
162
|
this.handle = setTimeout(() => {
|
|
114
|
-
releaseLock();
|
|
115
163
|
this.poll(this.config.interval);
|
|
116
164
|
}, this.config.interval);
|
|
117
165
|
});
|
|
118
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* Refreshes the balances of the accounts using the networkClientId
|
|
169
|
+
*
|
|
170
|
+
* @param networkClientId - The network client ID used to get balances.
|
|
171
|
+
*/
|
|
172
|
+
_executePoll(networkClientId) {
|
|
173
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
174
|
+
this.refresh(networkClientId);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
119
177
|
/**
|
|
120
178
|
* Fetches the balance of a given address from the blockchain.
|
|
121
179
|
*
|
|
122
180
|
* @param address - The account address to fetch the balance for.
|
|
181
|
+
* @param ethQuery - The EthQuery instance to query getBalnce with.
|
|
123
182
|
* @returns A promise that resolves to the balance in a hex string format.
|
|
124
183
|
*/
|
|
125
|
-
getBalanceFromChain(address) {
|
|
184
|
+
getBalanceFromChain(address, ethQuery) {
|
|
126
185
|
return __awaiter(this, void 0, void 0, function* () {
|
|
127
186
|
return yield (0, controller_utils_1.safelyExecuteWithTimeout)(() => __awaiter(this, void 0, void 0, function* () {
|
|
128
|
-
(0, utils_1.assert)(
|
|
129
|
-
return yield (0, controller_utils_1.query)(
|
|
187
|
+
(0, utils_1.assert)(ethQuery, 'Provider not set.');
|
|
188
|
+
return yield (0, controller_utils_1.query)(ethQuery, 'getBalance', [address]);
|
|
130
189
|
}));
|
|
131
190
|
});
|
|
132
191
|
}
|
|
@@ -134,14 +193,16 @@ class AccountTrackerController extends base_controller_1.BaseControllerV1 {
|
|
|
134
193
|
* Sync accounts balances with some additional addresses.
|
|
135
194
|
*
|
|
136
195
|
* @param addresses - the additional addresses, may be hardware wallet addresses.
|
|
196
|
+
* @param networkClientId - Optional networkClientId to fetch a network client with.
|
|
137
197
|
* @returns accounts - addresses with synced balance
|
|
138
198
|
*/
|
|
139
|
-
syncBalanceWithAddresses(addresses) {
|
|
199
|
+
syncBalanceWithAddresses(addresses, networkClientId) {
|
|
140
200
|
return __awaiter(this, void 0, void 0, function* () {
|
|
201
|
+
const { ethQuery } = __classPrivateFieldGet(this, _AccountTrackerController_instances, "m", _AccountTrackerController_getCorrectNetworkClient).call(this, networkClientId);
|
|
141
202
|
return yield Promise.all(addresses.map((address) => {
|
|
142
203
|
return (0, controller_utils_1.safelyExecuteWithTimeout)(() => __awaiter(this, void 0, void 0, function* () {
|
|
143
|
-
(0, utils_1.assert)(
|
|
144
|
-
const balance = yield (0, controller_utils_1.query)(
|
|
204
|
+
(0, utils_1.assert)(ethQuery, 'Provider not set.');
|
|
205
|
+
const balance = yield (0, controller_utils_1.query)(ethQuery, 'getBalance', [address]);
|
|
145
206
|
return [address, balance];
|
|
146
207
|
}));
|
|
147
208
|
})).then((value) => {
|
|
@@ -159,5 +220,18 @@ class AccountTrackerController extends base_controller_1.BaseControllerV1 {
|
|
|
159
220
|
}
|
|
160
221
|
}
|
|
161
222
|
exports.AccountTrackerController = AccountTrackerController;
|
|
223
|
+
_AccountTrackerController_instances = new WeakSet(), _AccountTrackerController_getCorrectNetworkClient = function _AccountTrackerController_getCorrectNetworkClient(networkClientId) {
|
|
224
|
+
if (networkClientId) {
|
|
225
|
+
const networkClient = this.getNetworkClientById(networkClientId);
|
|
226
|
+
return {
|
|
227
|
+
chainId: networkClient.configuration.chainId,
|
|
228
|
+
ethQuery: new eth_query_1.default(networkClient.provider),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
chainId: this.getCurrentChainId(),
|
|
233
|
+
ethQuery: this._provider ? new eth_query_1.default(this._provider) : undefined,
|
|
234
|
+
};
|
|
235
|
+
};
|
|
162
236
|
exports.default = AccountTrackerController;
|
|
163
237
|
//# sourceMappingURL=AccountTrackerController.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccountTrackerController.js","sourceRoot":"","sources":["../src/AccountTrackerController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BaseConfig, BaseState } from '@metamask/base-controller';\nimport { BaseControllerV1 } from '@metamask/base-controller';\nimport {\n BNToHex,\n query,\n safelyExecuteWithTimeout,\n} from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type { Provider } from '@metamask/eth-query';\nimport type { PreferencesState } from '@metamask/preferences-controller';\nimport { assert } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\n\n/**\n * @type AccountInformation\n *\n * Account information object\n * @property balance - Hex string of an account balancec in wei\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface AccountInformation {\n balance: string;\n}\n\n/**\n * @type AccountTrackerConfig\n *\n * Account tracker controller configuration\n * @property provider - Provider used to create a new underlying EthQuery instance\n */\n// This interface was created before this ESLint rule was added.\n// Remove in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface AccountTrackerConfig extends BaseConfig {\n interval: number;\n provider?: Provider;\n}\n\n/**\n * @type AccountTrackerState\n *\n * Account tracker controller state\n * @property accounts - Map of addresses to account information\n */\n// This interface was created before this ESLint rule was added.\n// Remove in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface AccountTrackerState extends BaseState {\n accounts: { [address: string]: AccountInformation };\n}\n\n/**\n * Controller that tracks the network balances for all user accounts.\n */\nexport class AccountTrackerController extends BaseControllerV1<\n AccountTrackerConfig,\n AccountTrackerState\n> {\n private ethQuery?: EthQuery;\n\n private readonly mutex = new Mutex();\n\n private handle?: ReturnType<typeof setTimeout>;\n\n private syncAccounts() {\n const { accounts } = this.state;\n const addresses = Object.keys(this.getIdentities());\n const existing = Object.keys(accounts);\n const newAddresses = addresses.filter(\n (address) => !existing.includes(address),\n );\n const oldAddresses = existing.filter(\n (address) => !addresses.includes(address),\n );\n newAddresses.forEach((address) => {\n accounts[address] = { balance: '0x0' };\n });\n\n oldAddresses.forEach((address) => {\n delete accounts[address];\n });\n this.update({ accounts: { ...accounts } });\n }\n\n /**\n * Name of this controller used during composition\n */\n override name = 'AccountTrackerController';\n\n private readonly getIdentities: () => PreferencesState['identities'];\n\n private readonly getSelectedAddress: () => PreferencesState['selectedAddress'];\n\n private readonly getMultiAccountBalancesEnabled: () => PreferencesState['isMultiAccountBalancesEnabled'];\n\n /**\n * Creates an AccountTracker instance.\n *\n * @param options - The controller options.\n * @param options.onPreferencesStateChange - Allows subscribing to preference controller state changes.\n * @param options.getIdentities - Gets the identities from the Preferences store.\n * @param options.getSelectedAddress - Gets the selected address from the Preferences store.\n * @param options.getMultiAccountBalancesEnabled - Gets the multi account balances enabled flag from the Preferences store.\n * @param config - Initial options used to configure this controller.\n * @param state - Initial state to set on this controller.\n */\n constructor(\n {\n onPreferencesStateChange,\n getIdentities,\n getSelectedAddress,\n getMultiAccountBalancesEnabled,\n }: {\n onPreferencesStateChange: (\n listener: (preferencesState: PreferencesState) => void,\n ) => void;\n getIdentities: () => PreferencesState['identities'];\n getSelectedAddress: () => PreferencesState['selectedAddress'];\n getMultiAccountBalancesEnabled: () => PreferencesState['isMultiAccountBalancesEnabled'];\n },\n config?: Partial<AccountTrackerConfig>,\n state?: Partial<AccountTrackerState>,\n ) {\n super(config, state);\n this.defaultConfig = {\n interval: 10000,\n };\n this.defaultState = { accounts: {} };\n this.initialize();\n this.getIdentities = getIdentities;\n this.getSelectedAddress = getSelectedAddress;\n this.getMultiAccountBalancesEnabled = getMultiAccountBalancesEnabled;\n onPreferencesStateChange(() => {\n this.refresh();\n });\n this.poll();\n }\n\n /**\n * Sets a new provider.\n *\n * TODO: Replace this wth a method.\n *\n * @param provider - Provider used to create a new underlying EthQuery instance.\n */\n set provider(provider: Provider) {\n this.ethQuery = new EthQuery(provider);\n }\n\n get provider() {\n throw new Error('Property only used for setting');\n }\n\n /**\n * Starts a new polling interval.\n *\n * @param interval - Polling interval trigger a 'refresh'.\n */\n async poll(interval?: number): Promise<void> {\n const releaseLock = await this.mutex.acquire();\n interval && this.configure({ interval }, false, false);\n this.handle && clearTimeout(this.handle);\n await this.refresh();\n this.handle = setTimeout(() => {\n releaseLock();\n this.poll(this.config.interval);\n }, this.config.interval);\n }\n\n /**\n * Refreshes the balances of the accounts depending on the multi-account setting.\n * If multi-account is disabled, only updates the selected account balance.\n * If multi-account is enabled, updates balances for all accounts.\n */\n refresh = async () => {\n this.syncAccounts();\n const accounts = { ...this.state.accounts };\n const isMultiAccountBalancesEnabled = this.getMultiAccountBalancesEnabled();\n\n const accountsToUpdate = isMultiAccountBalancesEnabled\n ? Object.keys(accounts)\n : [this.getSelectedAddress()];\n\n for (const address of accountsToUpdate) {\n accounts[address] = {\n balance: BNToHex(await this.getBalanceFromChain(address)),\n };\n }\n\n this.update({ accounts });\n };\n\n /**\n * Fetches the balance of a given address from the blockchain.\n *\n * @param address - The account address to fetch the balance for.\n * @returns A promise that resolves to the balance in a hex string format.\n */\n private async getBalanceFromChain(\n address: string,\n ): Promise<string | undefined> {\n return await safelyExecuteWithTimeout(async () => {\n assert(this.ethQuery, 'Provider not set.');\n return await query(this.ethQuery, 'getBalance', [address]);\n });\n }\n\n /**\n * Sync accounts balances with some additional addresses.\n *\n * @param addresses - the additional addresses, may be hardware wallet addresses.\n * @returns accounts - addresses with synced balance\n */\n async syncBalanceWithAddresses(\n addresses: string[],\n ): Promise<Record<string, { balance: string }>> {\n return await Promise.all(\n addresses.map((address): Promise<[string, string] | undefined> => {\n return safelyExecuteWithTimeout(async () => {\n assert(this.ethQuery, 'Provider not set.');\n const balance = await query(this.ethQuery, 'getBalance', [address]);\n return [address, balance];\n });\n }),\n ).then((value) => {\n return value.reduce((obj, item) => {\n if (!item) {\n return obj;\n }\n\n const [address, balance] = item;\n return {\n ...obj,\n [address]: {\n balance,\n },\n };\n }, {});\n });\n }\n}\n\nexport default AccountTrackerController;\n"]}
|
|
1
|
+
{"version":3,"file":"AccountTrackerController.js","sourceRoot":"","sources":["../src/AccountTrackerController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BaseConfig, BaseState } from '@metamask/base-controller';\nimport {\n BNToHex,\n query,\n safelyExecuteWithTimeout,\n} from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type { Provider } from '@metamask/eth-query';\nimport type {\n NetworkClientId,\n NetworkController,\n NetworkState,\n} from '@metamask/network-controller';\nimport { StaticIntervalPollingControllerV1 } from '@metamask/polling-controller';\nimport type { PreferencesState } from '@metamask/preferences-controller';\nimport { assert } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport { cloneDeep } from 'lodash';\n\n/**\n * @type AccountInformation\n *\n * Account information object\n * @property balance - Hex string of an account balancec in wei\n */\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface AccountInformation {\n balance: string;\n}\n\n/**\n * @type AccountTrackerConfig\n *\n * Account tracker controller configuration\n * @property provider - Provider used to create a new underlying EthQuery instance\n */\n// This interface was created before this ESLint rule was added.\n// Remove in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface AccountTrackerConfig extends BaseConfig {\n interval: number;\n provider?: Provider;\n}\n\n/**\n * @type AccountTrackerState\n *\n * Account tracker controller state\n * @property accounts - Map of addresses to account information\n */\n// This interface was created before this ESLint rule was added.\n// Remove in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface AccountTrackerState extends BaseState {\n accounts: { [address: string]: AccountInformation };\n accountsByChainId: Record<string, { [address: string]: AccountInformation }>;\n}\n\n/**\n * Controller that tracks the network balances for all user accounts.\n */\nexport class AccountTrackerController extends StaticIntervalPollingControllerV1<\n AccountTrackerConfig,\n AccountTrackerState\n> {\n private _provider?: Provider;\n\n private readonly refreshMutex = new Mutex();\n\n private handle?: ReturnType<typeof setTimeout>;\n\n private syncAccounts(newChainId: string) {\n const accounts = { ...this.state.accounts };\n const accountsByChainId = cloneDeep(this.state.accountsByChainId);\n\n const existing = Object.keys(accounts);\n if (!accountsByChainId[newChainId]) {\n accountsByChainId[newChainId] = {};\n existing.forEach((address) => {\n accountsByChainId[newChainId][address] = { balance: '0x0' };\n });\n }\n\n const addresses = Object.keys(this.getIdentities());\n const newAddresses = addresses.filter(\n (address) => !existing.includes(address),\n );\n const oldAddresses = existing.filter(\n (address) => !addresses.includes(address),\n );\n newAddresses.forEach((address) => {\n accounts[address] = { balance: '0x0' };\n });\n Object.keys(accountsByChainId).forEach((chainId) => {\n newAddresses.forEach((address) => {\n accountsByChainId[chainId][address] = {\n balance: '0x0',\n };\n });\n });\n\n oldAddresses.forEach((address) => {\n delete accounts[address];\n });\n Object.keys(accountsByChainId).forEach((chainId) => {\n oldAddresses.forEach((address) => {\n delete accountsByChainId[chainId][address];\n });\n });\n\n this.update({ accounts, accountsByChainId });\n }\n\n /**\n * Name of this controller used during composition\n */\n override name = 'AccountTrackerController';\n\n private readonly getIdentities: () => PreferencesState['identities'];\n\n private readonly getSelectedAddress: () => PreferencesState['selectedAddress'];\n\n private readonly getMultiAccountBalancesEnabled: () => PreferencesState['isMultiAccountBalancesEnabled'];\n\n private readonly getCurrentChainId: () => NetworkState['providerConfig']['chainId'];\n\n private readonly getNetworkClientById: NetworkController['getNetworkClientById'];\n\n /**\n * Creates an AccountTracker instance.\n *\n * @param options - The controller options.\n * @param options.onPreferencesStateChange - Allows subscribing to preference controller state changes.\n * @param options.getIdentities - Gets the identities from the Preferences store.\n * @param options.getSelectedAddress - Gets the selected address from the Preferences store.\n * @param options.getMultiAccountBalancesEnabled - Gets the multi account balances enabled flag from the Preferences store.\n * @param options.getCurrentChainId - Gets the chain ID for the current network from the Network store.\n * @param options.getNetworkClientById - Gets the network client with the given id from the NetworkController.\n * @param config - Initial options used to configure this controller.\n * @param state - Initial state to set on this controller.\n */\n constructor(\n {\n onPreferencesStateChange,\n getIdentities,\n getSelectedAddress,\n getMultiAccountBalancesEnabled,\n getCurrentChainId,\n getNetworkClientById,\n }: {\n onPreferencesStateChange: (\n listener: (preferencesState: PreferencesState) => void,\n ) => void;\n getIdentities: () => PreferencesState['identities'];\n getSelectedAddress: () => PreferencesState['selectedAddress'];\n getMultiAccountBalancesEnabled: () => PreferencesState['isMultiAccountBalancesEnabled'];\n getCurrentChainId: () => NetworkState['providerConfig']['chainId'];\n getNetworkClientById: NetworkController['getNetworkClientById'];\n },\n config?: Partial<AccountTrackerConfig>,\n state?: Partial<AccountTrackerState>,\n ) {\n super(config, state);\n this.defaultConfig = {\n interval: 10000,\n };\n this.defaultState = {\n accounts: {},\n accountsByChainId: {\n [getCurrentChainId()]: {},\n },\n };\n this.initialize();\n this.setIntervalLength(this.config.interval);\n this.getIdentities = getIdentities;\n this.getSelectedAddress = getSelectedAddress;\n this.getMultiAccountBalancesEnabled = getMultiAccountBalancesEnabled;\n this.getCurrentChainId = getCurrentChainId;\n this.getNetworkClientById = getNetworkClientById;\n onPreferencesStateChange(() => {\n this.refresh();\n });\n this.poll();\n }\n\n /**\n * Sets a new provider.\n *\n * TODO: Replace this wth a method.\n *\n * @param provider - Provider used to create a new underlying EthQuery instance.\n */\n set provider(provider: Provider) {\n this._provider = provider;\n }\n\n get provider() {\n throw new Error('Property only used for setting');\n }\n\n /**\n * Resolves a networkClientId to a network client config\n * or globally selected network config if not provided\n *\n * @param networkClientId - Optional networkClientId to fetch a network client with\n * @returns network client config\n */\n #getCorrectNetworkClient(networkClientId?: NetworkClientId): {\n chainId: string;\n ethQuery?: EthQuery;\n } {\n if (networkClientId) {\n const networkClient = this.getNetworkClientById(networkClientId);\n\n return {\n chainId: networkClient.configuration.chainId,\n ethQuery: new EthQuery(networkClient.provider),\n };\n }\n\n return {\n chainId: this.getCurrentChainId(),\n ethQuery: this._provider ? new EthQuery(this._provider) : undefined,\n };\n }\n\n /**\n * Starts a new polling interval.\n *\n * @param interval - Polling interval trigger a 'refresh'.\n */\n async poll(interval?: number): Promise<void> {\n interval && this.configure({ interval }, false, false);\n this.handle && clearTimeout(this.handle);\n await this.refresh();\n this.handle = setTimeout(() => {\n this.poll(this.config.interval);\n }, this.config.interval);\n }\n\n /**\n * Refreshes the balances of the accounts using the networkClientId\n *\n * @param networkClientId - The network client ID used to get balances.\n */\n async _executePoll(networkClientId: string): Promise<void> {\n this.refresh(networkClientId);\n }\n\n /**\n * Refreshes the balances of the accounts depending on the multi-account setting.\n * If multi-account is disabled, only updates the selected account balance.\n * If multi-account is enabled, updates balances for all accounts.\n *\n * @param networkClientId - Optional networkClientId to fetch a network client with\n */\n refresh = async (networkClientId?: NetworkClientId) => {\n const releaseLock = await this.refreshMutex.acquire();\n try {\n const { chainId, ethQuery } =\n this.#getCorrectNetworkClient(networkClientId);\n this.syncAccounts(chainId);\n const { accounts, accountsByChainId } = this.state;\n const isMultiAccountBalancesEnabled =\n this.getMultiAccountBalancesEnabled();\n\n const accountsToUpdate = isMultiAccountBalancesEnabled\n ? Object.keys(accounts)\n : [this.getSelectedAddress()];\n\n const accountsForChain = { ...accountsByChainId[chainId] };\n for (const address of accountsToUpdate) {\n accountsForChain[address] = {\n balance: BNToHex(await this.getBalanceFromChain(address, ethQuery)),\n };\n }\n\n this.update({\n ...(chainId === this.getCurrentChainId() && {\n accounts: accountsForChain,\n }),\n accountsByChainId: {\n ...this.state.accountsByChainId,\n [chainId]: accountsForChain,\n },\n });\n } catch (err) {\n releaseLock();\n throw err;\n }\n };\n\n /**\n * Fetches the balance of a given address from the blockchain.\n *\n * @param address - The account address to fetch the balance for.\n * @param ethQuery - The EthQuery instance to query getBalnce with.\n * @returns A promise that resolves to the balance in a hex string format.\n */\n private async getBalanceFromChain(\n address: string,\n ethQuery?: EthQuery,\n ): Promise<string | undefined> {\n return await safelyExecuteWithTimeout(async () => {\n assert(ethQuery, 'Provider not set.');\n return await query(ethQuery, 'getBalance', [address]);\n });\n }\n\n /**\n * Sync accounts balances with some additional addresses.\n *\n * @param addresses - the additional addresses, may be hardware wallet addresses.\n * @param networkClientId - Optional networkClientId to fetch a network client with.\n * @returns accounts - addresses with synced balance\n */\n async syncBalanceWithAddresses(\n addresses: string[],\n networkClientId?: NetworkClientId,\n ): Promise<Record<string, { balance: string }>> {\n const { ethQuery } = this.#getCorrectNetworkClient(networkClientId);\n\n return await Promise.all(\n addresses.map((address): Promise<[string, string] | undefined> => {\n return safelyExecuteWithTimeout(async () => {\n assert(ethQuery, 'Provider not set.');\n const balance = await query(ethQuery, 'getBalance', [address]);\n return [address, balance];\n });\n }),\n ).then((value) => {\n return value.reduce((obj, item) => {\n if (!item) {\n return obj;\n }\n\n const [address, balance] = item;\n return {\n ...obj,\n [address]: {\n balance,\n },\n };\n }, {});\n });\n }\n}\n\nexport default AccountTrackerController;\n"]}
|
|
@@ -53,15 +53,15 @@ export declare class AssetsContractController extends BaseControllerV1<AssetsCon
|
|
|
53
53
|
* @param options - The controller options.
|
|
54
54
|
* @param options.chainId - The chain ID of the current network.
|
|
55
55
|
* @param options.onPreferencesStateChange - Allows subscribing to preference controller state changes.
|
|
56
|
-
* @param options.
|
|
56
|
+
* @param options.onNetworkDidChange - Allows subscribing to network controller networkDidChange events.
|
|
57
57
|
* @param options.getNetworkClientById - Gets the network client with the given id from the NetworkController.
|
|
58
58
|
* @param config - Initial options used to configure this controller.
|
|
59
59
|
* @param state - Initial state to set on this controller.
|
|
60
60
|
*/
|
|
61
|
-
constructor({ chainId: initialChainId, onPreferencesStateChange,
|
|
61
|
+
constructor({ chainId: initialChainId, onPreferencesStateChange, onNetworkDidChange, getNetworkClientById, }: {
|
|
62
62
|
chainId: Hex;
|
|
63
63
|
onPreferencesStateChange: (listener: (preferencesState: PreferencesState) => void) => void;
|
|
64
|
-
|
|
64
|
+
onNetworkDidChange: (listener: (networkState: NetworkState) => void) => void;
|
|
65
65
|
getNetworkClientById: NetworkController['getNetworkClientById'];
|
|
66
66
|
}, config?: Partial<AssetsContractConfig>, state?: Partial<BaseState>);
|
|
67
67
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsContractController.d.ts","sourceRoot":"","sources":["../src/AssetsContractController.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAI1C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,uCAAuC,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"AssetsContractController.d.ts","sourceRoot":"","sources":["../src/AssetsContractController.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAI1C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,uCAAuC,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAuBvE,CAAC;AAEF,eAAO,MAAM,sBAAsB,0HACsF,CAAC;AAE1H;;;;;GAKG;AAIH,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IAGtD,QAAQ,EAAE,GAAG,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,GAAG,CAAC;CACd;AAED;;;;;GAKG;AAIH,MAAM,WAAW,UAAU;IACzB,CAAC,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,gBAAgB,CAC5D,oBAAoB,EACpB,SAAS,CACV;IAGC,OAAO,CAAC,SAAS,CAAC,CAAM;IAExB;;OAEG;IACM,IAAI,SAA8B;IAE3C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA4C;IAEjF;;;;;;;;;;OAUG;gBAED,EACE,OAAO,EAAE,cAAc,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,GACrB,EAAE;QACD,OAAO,EAAE,GAAG,CAAC;QACb,wBAAwB,EAAE,CACxB,QAAQ,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,IAAI,KACnD,IAAI,CAAC;QACV,kBAAkB,EAAE,CAClB,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,KAAK,IAAI,KAC3C,IAAI,CAAC;QACV,oBAAoB,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;KACjE,EACD,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,EACtC,KAAK,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC;IAwB5B;;;;;;OAMG;IAGH,IAAI,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAEzB;IAED,IAAI,QAAQ,IAJW,GAAG,CAMzB;IAED;;;;;OAKG;IACH,WAAW,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,YAAY;IAY5D;;;;;OAKG;IACH,UAAU,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,GAAG;IAMlD;;;;;OAKG;IACH,gBAAgB,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,aAAa;IAKlE;;;;;OAKG;IACH,iBAAiB,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,cAAc;IAKpE;;;;;OAKG;IACH,kBAAkB,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,eAAe;IAKtE;;;;;;;OAOG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EACvB,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,EAAE,CAAC;IAKd;;;;;;OAMG;IACG,qBAAqB,CACzB,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,MAAM,CAAC;IAKlB;;;;;;OAMG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,MAAM,CAAC;IAKlB;;;;;;;;OAQG;IACH,mBAAmB,CACjB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,MAAM,EACb,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,MAAM,CAAC;IAKlB;;;;;;;;OAQG;IACG,0BAA0B,CAC9B,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,EAChB,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC9B,OAAO,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC;KAC1B,CAAC;IA+CF;;;;;;;OAOG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,MAAM,CAAC;IAKlB;;;;;;OAMG;IACG,kBAAkB,CACtB,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,MAAM,CAAC;IAKlB;;;;;;OAMG;IACG,oBAAoB,CACxB,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,MAAM,CAAC;IAKlB;;;;;;;OAOG;IACG,gBAAgB,CACpB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,MAAM,CAAC;IAKlB;;;;;;;OAOG;IACG,kBAAkB,CACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,MAAM,CAAC;IAKlB;;;;;;;;OAQG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,EAAE,CAAC;IAKd;;;;;;;;;;OAUG;IACG,qBAAqB,CACzB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,IAAI,CAAC;IAWhB;;;;;;;;OAQG;IACG,uBAAuB,CAC3B,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EAAE,EACxB,eAAe,CAAC,EAAE,eAAe;CA6BpC;AAED,eAAe,wBAAwB,CAAC"}
|
|
@@ -36,6 +36,10 @@ exports.SINGLE_CALL_BALANCES_ADDRESS_BY_CHAINID = {
|
|
|
36
36
|
[assetsUtil_1.SupportedTokenDetectionNetworks.aurora]: '0x1286415D333855237f89Df27D388127181448538',
|
|
37
37
|
[assetsUtil_1.SupportedTokenDetectionNetworks.linea_goerli]: '0x10dAd7Ca3921471f616db788D9300DC97Db01783',
|
|
38
38
|
[assetsUtil_1.SupportedTokenDetectionNetworks.linea_mainnet]: '0xF62e6a41561b3650a69Bb03199C735e3E3328c0D',
|
|
39
|
+
[assetsUtil_1.SupportedTokenDetectionNetworks.arbitrum]: '0x151E24A486D7258dd7C33Fb67E4bB01919B7B32c',
|
|
40
|
+
[assetsUtil_1.SupportedTokenDetectionNetworks.optimism]: '0xB1c568e9C3E6bdaf755A60c7418C269eb11524FC',
|
|
41
|
+
[assetsUtil_1.SupportedTokenDetectionNetworks.base]: '0x6AA75276052D96696134252587894ef5FFA520af',
|
|
42
|
+
[assetsUtil_1.SupportedTokenDetectionNetworks.zksync]: '0x458fEd3144680a5b8bcfaa0F9594aa19B4Ea2D34',
|
|
39
43
|
};
|
|
40
44
|
exports.MISSING_PROVIDER_ERROR = 'AssetsContractController failed to set the provider correctly. A provider must be set for this method to be available';
|
|
41
45
|
/**
|
|
@@ -48,12 +52,12 @@ class AssetsContractController extends base_controller_1.BaseControllerV1 {
|
|
|
48
52
|
* @param options - The controller options.
|
|
49
53
|
* @param options.chainId - The chain ID of the current network.
|
|
50
54
|
* @param options.onPreferencesStateChange - Allows subscribing to preference controller state changes.
|
|
51
|
-
* @param options.
|
|
55
|
+
* @param options.onNetworkDidChange - Allows subscribing to network controller networkDidChange events.
|
|
52
56
|
* @param options.getNetworkClientById - Gets the network client with the given id from the NetworkController.
|
|
53
57
|
* @param config - Initial options used to configure this controller.
|
|
54
58
|
* @param state - Initial state to set on this controller.
|
|
55
59
|
*/
|
|
56
|
-
constructor({ chainId: initialChainId, onPreferencesStateChange,
|
|
60
|
+
constructor({ chainId: initialChainId, onPreferencesStateChange, onNetworkDidChange, getNetworkClientById, }, config, state) {
|
|
57
61
|
super(config, state);
|
|
58
62
|
/**
|
|
59
63
|
* Name of this controller used during composition
|
|
@@ -69,7 +73,7 @@ class AssetsContractController extends base_controller_1.BaseControllerV1 {
|
|
|
69
73
|
onPreferencesStateChange(({ ipfsGateway }) => {
|
|
70
74
|
this.configure({ ipfsGateway });
|
|
71
75
|
});
|
|
72
|
-
|
|
76
|
+
onNetworkDidChange((networkState) => {
|
|
73
77
|
if (this.config.chainId !== networkState.providerConfig.chainId) {
|
|
74
78
|
this.configure({
|
|
75
79
|
chainId: networkState.providerConfig.chainId,
|
|
@@ -84,6 +88,8 @@ class AssetsContractController extends base_controller_1.BaseControllerV1 {
|
|
|
84
88
|
*
|
|
85
89
|
* @property provider - Provider used to create a new underlying Web3 instance
|
|
86
90
|
*/
|
|
91
|
+
// TODO: Replace `any` with type
|
|
92
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
87
93
|
set provider(provider) {
|
|
88
94
|
this._provider = provider;
|
|
89
95
|
}
|