@metamask/assets-controllers 48.0.0 → 50.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 +33 -1
- package/dist/AccountTrackerController.cjs +2 -25
- package/dist/AccountTrackerController.cjs.map +1 -1
- package/dist/AccountTrackerController.d.cts +0 -6
- package/dist/AccountTrackerController.d.cts.map +1 -1
- package/dist/AccountTrackerController.d.mts +0 -6
- package/dist/AccountTrackerController.d.mts.map +1 -1
- package/dist/AccountTrackerController.mjs +2 -25
- package/dist/AccountTrackerController.mjs.map +1 -1
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.cjs +205 -0
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.cjs.map +1 -0
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.cts +124 -0
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.cts.map +1 -0
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.mts +124 -0
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.mts.map +1 -0
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.mjs +200 -0
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.mjs.map +1 -0
- package/dist/MultichainAssetsRatesController/constant.cjs +83 -0
- package/dist/MultichainAssetsRatesController/constant.cjs.map +1 -0
- package/dist/MultichainAssetsRatesController/constant.d.cts +9 -0
- package/dist/MultichainAssetsRatesController/constant.d.cts.map +1 -0
- package/dist/MultichainAssetsRatesController/constant.d.mts +9 -0
- package/dist/MultichainAssetsRatesController/constant.d.mts.map +1 -0
- package/dist/MultichainAssetsRatesController/constant.mjs +80 -0
- package/dist/MultichainAssetsRatesController/constant.mjs.map +1 -0
- package/dist/MultichainAssetsRatesController/index.cjs +7 -0
- package/dist/MultichainAssetsRatesController/index.cjs.map +1 -0
- package/dist/MultichainAssetsRatesController/index.d.cts +3 -0
- package/dist/MultichainAssetsRatesController/index.d.cts.map +1 -0
- package/dist/MultichainAssetsRatesController/index.d.mts +3 -0
- package/dist/MultichainAssetsRatesController/index.d.mts.map +1 -0
- package/dist/MultichainAssetsRatesController/index.mjs +2 -0
- package/dist/MultichainAssetsRatesController/index.mjs.map +1 -0
- package/dist/MultichainBalancesController/MultichainBalancesController.cjs +42 -33
- package/dist/MultichainBalancesController/MultichainBalancesController.cjs.map +1 -1
- package/dist/MultichainBalancesController/MultichainBalancesController.d.cts +3 -2
- package/dist/MultichainBalancesController/MultichainBalancesController.d.cts.map +1 -1
- package/dist/MultichainBalancesController/MultichainBalancesController.d.mts +3 -2
- package/dist/MultichainBalancesController/MultichainBalancesController.d.mts.map +1 -1
- package/dist/MultichainBalancesController/MultichainBalancesController.mjs +42 -33
- package/dist/MultichainBalancesController/MultichainBalancesController.mjs.map +1 -1
- package/dist/MultichainBalancesController/index.cjs +1 -5
- package/dist/MultichainBalancesController/index.cjs.map +1 -1
- package/dist/MultichainBalancesController/index.d.cts +0 -1
- package/dist/MultichainBalancesController/index.d.cts.map +1 -1
- package/dist/MultichainBalancesController/index.d.mts +0 -1
- package/dist/MultichainBalancesController/index.d.mts.map +1 -1
- package/dist/MultichainBalancesController/index.mjs +0 -1
- package/dist/MultichainBalancesController/index.mjs.map +1 -1
- package/dist/index.cjs +4 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -10
- package/dist/MultichainBalancesController/constants.cjs +0 -36
- package/dist/MultichainBalancesController/constants.cjs.map +0 -1
- package/dist/MultichainBalancesController/constants.d.cts +0 -25
- package/dist/MultichainBalancesController/constants.d.cts.map +0 -1
- package/dist/MultichainBalancesController/constants.d.mts +0 -25
- package/dist/MultichainBalancesController/constants.d.mts.map +0 -1
- package/dist/MultichainBalancesController/constants.mjs +0 -33
- package/dist/MultichainBalancesController/constants.mjs.map +0 -1
- package/dist/MultichainBalancesController/error.cjs +0 -18
- package/dist/MultichainBalancesController/error.cjs.map +0 -1
- package/dist/MultichainBalancesController/error.d.cts +0 -7
- package/dist/MultichainBalancesController/error.d.cts.map +0 -1
- package/dist/MultichainBalancesController/error.d.mts +0 -7
- package/dist/MultichainBalancesController/error.d.mts.map +0 -1
- package/dist/MultichainBalancesController/error.mjs +0 -13
- package/dist/MultichainBalancesController/error.mjs.map +0 -1
- package/dist/MultichainBalancesController/utils.cjs +0 -60
- package/dist/MultichainBalancesController/utils.cjs.map +0 -1
- package/dist/MultichainBalancesController/utils.d.cts +0 -29
- package/dist/MultichainBalancesController/utils.d.cts.map +0 -1
- package/dist/MultichainBalancesController/utils.d.mts +0 -29
- package/dist/MultichainBalancesController/utils.d.mts.map +0 -1
- package/dist/MultichainBalancesController/utils.mjs +0 -54
- package/dist/MultichainBalancesController/utils.mjs.map +0 -1
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
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");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _MultiChainAssetsRatesController_instances, _MultiChainAssetsRatesController_mutex, _MultiChainAssetsRatesController_currentCurrency, _MultiChainAssetsRatesController_accountsAssets, _MultiChainAssetsRatesController_isUnlocked, _MultiChainAssetsRatesController_isNonEvmAccount, _MultiChainAssetsRatesController_listMultichainAccounts, _MultiChainAssetsRatesController_listAccounts, _MultiChainAssetsRatesController_getAssetsForAccount, _MultiChainAssetsRatesController_buildConversions, _MultiChainAssetsRatesController_flattenRates, _MultiChainAssetsRatesController_buildUpdatedRates, _MultiChainAssetsRatesController_applyUpdatedRates, _MultiChainAssetsRatesController_handleSnapRequest;
|
|
13
|
+
import { isEvmAccountType } from "@metamask/keyring-api";
|
|
14
|
+
import { StaticIntervalPollingController } from "@metamask/polling-controller";
|
|
15
|
+
import { HandlerType } from "@metamask/snaps-utils";
|
|
16
|
+
import { Mutex } from "async-mutex";
|
|
17
|
+
import { MAP_CAIP_CURRENCIES } from "./constant.mjs";
|
|
18
|
+
/**
|
|
19
|
+
* The name of the MultiChainAssetsRatesController.
|
|
20
|
+
*/
|
|
21
|
+
const controllerName = 'MultiChainAssetsRatesController';
|
|
22
|
+
/**
|
|
23
|
+
* Constructs the default {@link MultichainAssetsRatesController} state. This allows
|
|
24
|
+
* consumers to provide a partial state object when initializing the controller
|
|
25
|
+
* and also helps in constructing complete state objects for this controller in
|
|
26
|
+
* tests.
|
|
27
|
+
*
|
|
28
|
+
* @returns The default {@link MultichainAssetsRatesController} state.
|
|
29
|
+
*/
|
|
30
|
+
export function getDefaultMultichainAssetsRatesControllerState() {
|
|
31
|
+
return { conversionRates: {} };
|
|
32
|
+
}
|
|
33
|
+
const metadata = {
|
|
34
|
+
conversionRates: { persist: true, anonymous: true },
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Controller that manages multichain token conversion rates.
|
|
38
|
+
*
|
|
39
|
+
* This controller polls for token conversion rates and updates its state.
|
|
40
|
+
*/
|
|
41
|
+
export class MultiChainAssetsRatesController extends StaticIntervalPollingController() {
|
|
42
|
+
/**
|
|
43
|
+
* Creates an instance of MultiChainAssetsRatesController.
|
|
44
|
+
*
|
|
45
|
+
* @param options - Constructor options.
|
|
46
|
+
* @param options.interval - The polling interval in milliseconds.
|
|
47
|
+
* @param options.state - The initial state.
|
|
48
|
+
* @param options.messenger - A reference to the messaging system.
|
|
49
|
+
*/
|
|
50
|
+
constructor({ interval = 18000, state = {}, messenger, }) {
|
|
51
|
+
var _a, _b;
|
|
52
|
+
super({
|
|
53
|
+
name: controllerName,
|
|
54
|
+
messenger,
|
|
55
|
+
state: {
|
|
56
|
+
...getDefaultMultichainAssetsRatesControllerState(),
|
|
57
|
+
...state,
|
|
58
|
+
},
|
|
59
|
+
metadata,
|
|
60
|
+
});
|
|
61
|
+
_MultiChainAssetsRatesController_instances.add(this);
|
|
62
|
+
_MultiChainAssetsRatesController_mutex.set(this, new Mutex());
|
|
63
|
+
_MultiChainAssetsRatesController_currentCurrency.set(this, void 0);
|
|
64
|
+
_MultiChainAssetsRatesController_accountsAssets.set(this, void 0);
|
|
65
|
+
_MultiChainAssetsRatesController_isUnlocked.set(this, true);
|
|
66
|
+
this.setIntervalLength(interval);
|
|
67
|
+
// Subscribe to keyring lock/unlock events.
|
|
68
|
+
this.messagingSystem.subscribe('KeyringController:lock', () => {
|
|
69
|
+
__classPrivateFieldSet(this, _MultiChainAssetsRatesController_isUnlocked, false, "f");
|
|
70
|
+
});
|
|
71
|
+
this.messagingSystem.subscribe('KeyringController:unlock', () => {
|
|
72
|
+
__classPrivateFieldSet(this, _MultiChainAssetsRatesController_isUnlocked, true, "f");
|
|
73
|
+
});
|
|
74
|
+
(_a = this, { accountsAssets: ({ set value(_c) { __classPrivateFieldSet(_a, _MultiChainAssetsRatesController_accountsAssets, _c, "f"); } }).value } = this.messagingSystem.call('MultichainAssetsController:getState'));
|
|
75
|
+
(_b = this, { currentCurrency: ({ set value(_c) { __classPrivateFieldSet(_b, _MultiChainAssetsRatesController_currentCurrency, _c, "f"); } }).value } = this.messagingSystem.call('CurrencyRateController:getState'));
|
|
76
|
+
this.messagingSystem.subscribe('CurrencyRateController:stateChange', async (currencyRatesState) => {
|
|
77
|
+
__classPrivateFieldSet(this, _MultiChainAssetsRatesController_currentCurrency, currencyRatesState.currentCurrency, "f");
|
|
78
|
+
await this.updateAssetsRates();
|
|
79
|
+
});
|
|
80
|
+
this.messagingSystem.subscribe('MultichainAssetsController:stateChange', async (multiChainAssetsState) => {
|
|
81
|
+
__classPrivateFieldSet(this, _MultiChainAssetsRatesController_accountsAssets, multiChainAssetsState.accountsAssets, "f");
|
|
82
|
+
await this.updateAssetsRates();
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Executes a poll by updating token conversion rates for the current account.
|
|
87
|
+
*
|
|
88
|
+
* @returns A promise that resolves when the polling completes.
|
|
89
|
+
*/
|
|
90
|
+
async _executePoll() {
|
|
91
|
+
await this.updateAssetsRates();
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Determines whether the controller is active.
|
|
95
|
+
*
|
|
96
|
+
* @returns True if the keyring is unlocked; otherwise, false.
|
|
97
|
+
*/
|
|
98
|
+
get isActive() {
|
|
99
|
+
return __classPrivateFieldGet(this, _MultiChainAssetsRatesController_isUnlocked, "f");
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Updates token conversion rates for each non-EVM account.
|
|
103
|
+
*
|
|
104
|
+
* @returns A promise that resolves when the rates are updated.
|
|
105
|
+
*/
|
|
106
|
+
async updateAssetsRates() {
|
|
107
|
+
const releaseLock = await __classPrivateFieldGet(this, _MultiChainAssetsRatesController_mutex, "f").acquire();
|
|
108
|
+
return (async () => {
|
|
109
|
+
if (!this.isActive) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const accounts = __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_listAccounts).call(this);
|
|
113
|
+
for (const account of accounts) {
|
|
114
|
+
const assets = __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_getAssetsForAccount).call(this, account.id);
|
|
115
|
+
// Build the conversions array
|
|
116
|
+
const conversions = __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_buildConversions).call(this, assets);
|
|
117
|
+
// Retrieve rates from Snap
|
|
118
|
+
const accountRates = await __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_handleSnapRequest).call(this, {
|
|
119
|
+
snapId: account?.metadata.snap?.id,
|
|
120
|
+
handler: HandlerType.OnAssetsConversion,
|
|
121
|
+
params: conversions,
|
|
122
|
+
});
|
|
123
|
+
// Flatten nested rates if needed
|
|
124
|
+
const flattenedRates = __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_flattenRates).call(this, accountRates);
|
|
125
|
+
// Build the updatedRates object for these assets
|
|
126
|
+
const updatedRates = __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_buildUpdatedRates).call(this, assets, flattenedRates);
|
|
127
|
+
// Apply these updated rates to controller state
|
|
128
|
+
__classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_applyUpdatedRates).call(this, updatedRates);
|
|
129
|
+
}
|
|
130
|
+
})().finally(() => {
|
|
131
|
+
releaseLock();
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
_MultiChainAssetsRatesController_mutex = new WeakMap(), _MultiChainAssetsRatesController_currentCurrency = new WeakMap(), _MultiChainAssetsRatesController_accountsAssets = new WeakMap(), _MultiChainAssetsRatesController_isUnlocked = new WeakMap(), _MultiChainAssetsRatesController_instances = new WeakSet(), _MultiChainAssetsRatesController_isNonEvmAccount = function _MultiChainAssetsRatesController_isNonEvmAccount(account) {
|
|
136
|
+
return (!isEvmAccountType(account.type) && account.metadata.snap !== undefined);
|
|
137
|
+
}, _MultiChainAssetsRatesController_listMultichainAccounts = function _MultiChainAssetsRatesController_listMultichainAccounts() {
|
|
138
|
+
return this.messagingSystem.call('AccountsController:listMultichainAccounts');
|
|
139
|
+
}, _MultiChainAssetsRatesController_listAccounts = function _MultiChainAssetsRatesController_listAccounts() {
|
|
140
|
+
const accounts = __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_listMultichainAccounts).call(this);
|
|
141
|
+
return accounts.filter((account) => __classPrivateFieldGet(this, _MultiChainAssetsRatesController_instances, "m", _MultiChainAssetsRatesController_isNonEvmAccount).call(this, account));
|
|
142
|
+
}, _MultiChainAssetsRatesController_getAssetsForAccount = function _MultiChainAssetsRatesController_getAssetsForAccount(accountId) {
|
|
143
|
+
return __classPrivateFieldGet(this, _MultiChainAssetsRatesController_accountsAssets, "f")?.[accountId] ?? [];
|
|
144
|
+
}, _MultiChainAssetsRatesController_buildConversions = function _MultiChainAssetsRatesController_buildConversions(assets) {
|
|
145
|
+
const currency = MAP_CAIP_CURRENCIES[__classPrivateFieldGet(this, _MultiChainAssetsRatesController_currentCurrency, "f")] ?? MAP_CAIP_CURRENCIES.usd;
|
|
146
|
+
return {
|
|
147
|
+
conversions: assets.map((asset) => ({
|
|
148
|
+
from: asset,
|
|
149
|
+
to: currency,
|
|
150
|
+
})),
|
|
151
|
+
};
|
|
152
|
+
}, _MultiChainAssetsRatesController_flattenRates = function _MultiChainAssetsRatesController_flattenRates(assetsConversionResponse) {
|
|
153
|
+
const { conversionRates } = assetsConversionResponse;
|
|
154
|
+
return Object.fromEntries(Object.entries(conversionRates).map(([asset, nestedObj]) => {
|
|
155
|
+
// e.g., nestedObj might look like: { "swift:0/iso4217:EUR": { rate, conversionTime } }
|
|
156
|
+
const singleValue = Object.values(nestedObj)[0];
|
|
157
|
+
return [asset, singleValue];
|
|
158
|
+
}));
|
|
159
|
+
}, _MultiChainAssetsRatesController_buildUpdatedRates = function _MultiChainAssetsRatesController_buildUpdatedRates(assets, flattenedRates) {
|
|
160
|
+
const updatedRates = {};
|
|
161
|
+
for (const asset of assets) {
|
|
162
|
+
if (flattenedRates[asset]) {
|
|
163
|
+
updatedRates[asset] = {
|
|
164
|
+
...flattenedRates[asset],
|
|
165
|
+
currency: MAP_CAIP_CURRENCIES[__classPrivateFieldGet(this, _MultiChainAssetsRatesController_currentCurrency, "f")] ??
|
|
166
|
+
MAP_CAIP_CURRENCIES.usd,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return updatedRates;
|
|
171
|
+
}, _MultiChainAssetsRatesController_applyUpdatedRates = function _MultiChainAssetsRatesController_applyUpdatedRates(updatedRates) {
|
|
172
|
+
this.update((state) => {
|
|
173
|
+
state.conversionRates = {
|
|
174
|
+
...state.conversionRates,
|
|
175
|
+
...updatedRates,
|
|
176
|
+
};
|
|
177
|
+
});
|
|
178
|
+
}, _MultiChainAssetsRatesController_handleSnapRequest =
|
|
179
|
+
/**
|
|
180
|
+
* Forwards a Snap request to the SnapController.
|
|
181
|
+
*
|
|
182
|
+
* @param args - The request parameters.
|
|
183
|
+
* @param args.snapId - The ID of the Snap.
|
|
184
|
+
* @param args.handler - The handler type.
|
|
185
|
+
* @param args.params - The asset conversions.
|
|
186
|
+
* @returns A promise that resolves with the account rates.
|
|
187
|
+
*/
|
|
188
|
+
async function _MultiChainAssetsRatesController_handleSnapRequest({ snapId, handler, params, }) {
|
|
189
|
+
return this.messagingSystem.call('SnapController:handleRequest', {
|
|
190
|
+
snapId,
|
|
191
|
+
origin: 'metamask',
|
|
192
|
+
handler,
|
|
193
|
+
request: {
|
|
194
|
+
jsonrpc: '2.0',
|
|
195
|
+
method: handler,
|
|
196
|
+
params,
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
//# sourceMappingURL=MultichainAssetsRatesController.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultichainAssetsRatesController.mjs","sourceRoot":"","sources":["../../src/MultichainAssetsRatesController/MultichainAssetsRatesController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerListMultichainAccountsAction,\n AccountsControllerAccountAddedEvent,\n} from '@metamask/accounts-controller';\nimport type {\n RestrictedMessenger,\n ControllerStateChangeEvent,\n ControllerGetStateAction,\n} from '@metamask/base-controller';\nimport { type CaipAssetType, isEvmAccountType } from '@metamask/keyring-api';\nimport type {\n KeyringControllerLockEvent,\n KeyringControllerUnlockEvent,\n} from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { HandleSnapRequest } from '@metamask/snaps-controllers';\nimport type {\n SnapId,\n AssetConversion,\n OnAssetsConversionArguments,\n OnAssetsConversionResponse,\n} from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\nimport { Mutex } from 'async-mutex';\nimport type { Draft } from 'immer';\n\nimport { MAP_CAIP_CURRENCIES } from './constant';\nimport type {\n CurrencyRateState,\n CurrencyRateStateChange,\n GetCurrencyRateState,\n} from '../CurrencyRateController';\nimport type {\n MultichainAssetsControllerGetStateAction,\n MultichainAssetsControllerState,\n MultichainAssetsControllerStateChangeEvent,\n} from '../MultichainAssetsController';\n\n/**\n * The name of the MultiChainAssetsRatesController.\n */\nconst controllerName = 'MultiChainAssetsRatesController';\n\n/**\n * State used by the MultiChainAssetsRatesController to cache token conversion rates.\n */\nexport type MultichainAssetsRatesControllerState = {\n conversionRates: Record<CaipAssetType, AssetConversion>;\n};\n\n/**\n * Returns the state of the MultiChainAssetsRatesController.\n */\nexport type MultichainAssetsRatesControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n MultichainAssetsRatesControllerState\n >;\n\n/**\n * Action to update the rates of all supported tokens.\n */\nexport type MultichainAssetsRatesControllerUpdateRatesAction = {\n type: `${typeof controllerName}:updateAssetsRates`;\n handler: MultiChainAssetsRatesController['updateAssetsRates'];\n};\n\n/**\n * Constructs the default {@link MultichainAssetsRatesController} state. This allows\n * consumers to provide a partial state object when initializing the controller\n * and also helps in constructing complete state objects for this controller in\n * tests.\n *\n * @returns The default {@link MultichainAssetsRatesController} state.\n */\nexport function getDefaultMultichainAssetsRatesControllerState(): MultichainAssetsRatesControllerState {\n return { conversionRates: {} };\n}\n\n/**\n * Event emitted when the state of the MultiChainAssetsRatesController changes.\n */\nexport type MultichainAssetsRatesControllerStateChange =\n ControllerStateChangeEvent<\n typeof controllerName,\n MultichainAssetsRatesControllerState\n >;\n\n/**\n * Actions exposed by the MultiChainAssetsRatesController.\n */\nexport type MultichainAssetsRatesControllerActions =\n | MultichainAssetsRatesControllerGetStateAction\n | MultichainAssetsRatesControllerUpdateRatesAction;\n\n/**\n * Events emitted by MultiChainAssetsRatesController.\n */\nexport type MultichainAssetsRatesControllerEvents =\n MultichainAssetsRatesControllerStateChange;\n\n/**\n * Actions that this controller is allowed to call.\n */\nexport type AllowedActions =\n | HandleSnapRequest\n | AccountsControllerListMultichainAccountsAction\n | GetCurrencyRateState\n | MultichainAssetsControllerGetStateAction;\n/**\n * Events that this controller is allowed to subscribe to.\n */\nexport type AllowedEvents =\n | KeyringControllerLockEvent\n | KeyringControllerUnlockEvent\n | AccountsControllerAccountAddedEvent\n | CurrencyRateStateChange\n | MultichainAssetsControllerStateChangeEvent;\n\n/**\n * Messenger type for the MultiChainAssetsRatesController.\n */\nexport type MultichainAssetsRatesControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n MultichainAssetsRatesControllerActions | AllowedActions,\n MultichainAssetsRatesControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n/**\n * The input for starting polling in MultiChainAssetsRatesController.\n */\nexport type MultiChainAssetsRatesPollingInput = {\n accountId: string;\n};\n\nconst metadata = {\n conversionRates: { persist: true, anonymous: true },\n};\n\n/**\n * Controller that manages multichain token conversion rates.\n *\n * This controller polls for token conversion rates and updates its state.\n */\nexport class MultiChainAssetsRatesController extends StaticIntervalPollingController<MultiChainAssetsRatesPollingInput>()<\n typeof controllerName,\n MultichainAssetsRatesControllerState,\n MultichainAssetsRatesControllerMessenger\n> {\n readonly #mutex = new Mutex();\n\n #currentCurrency: CurrencyRateState['currentCurrency'];\n\n #accountsAssets: MultichainAssetsControllerState['accountsAssets'];\n\n #isUnlocked = true;\n\n /**\n * Creates an instance of MultiChainAssetsRatesController.\n *\n * @param options - Constructor options.\n * @param options.interval - The polling interval in milliseconds.\n * @param options.state - The initial state.\n * @param options.messenger - A reference to the messaging system.\n */\n constructor({\n interval = 18000,\n state = {},\n messenger,\n }: {\n interval?: number;\n state?: Partial<MultichainAssetsRatesControllerState>;\n messenger: MultichainAssetsRatesControllerMessenger;\n }) {\n super({\n name: controllerName,\n messenger,\n state: {\n ...getDefaultMultichainAssetsRatesControllerState(),\n ...state,\n },\n metadata,\n });\n\n this.setIntervalLength(interval);\n\n // Subscribe to keyring lock/unlock events.\n this.messagingSystem.subscribe('KeyringController:lock', () => {\n this.#isUnlocked = false;\n });\n this.messagingSystem.subscribe('KeyringController:unlock', () => {\n this.#isUnlocked = true;\n });\n\n ({ accountsAssets: this.#accountsAssets } = this.messagingSystem.call(\n 'MultichainAssetsController:getState',\n ));\n\n ({ currentCurrency: this.#currentCurrency } = this.messagingSystem.call(\n 'CurrencyRateController:getState',\n ));\n\n this.messagingSystem.subscribe(\n 'CurrencyRateController:stateChange',\n async (currencyRatesState: CurrencyRateState) => {\n this.#currentCurrency = currencyRatesState.currentCurrency;\n await this.updateAssetsRates();\n },\n );\n\n this.messagingSystem.subscribe(\n 'MultichainAssetsController:stateChange',\n async (multiChainAssetsState: MultichainAssetsControllerState) => {\n this.#accountsAssets = multiChainAssetsState.accountsAssets;\n await this.updateAssetsRates();\n },\n );\n }\n\n /**\n * Executes a poll by updating token conversion rates for the current account.\n *\n * @returns A promise that resolves when the polling completes.\n */\n async _executePoll(): Promise<void> {\n await this.updateAssetsRates();\n }\n\n /**\n * Determines whether the controller is active.\n *\n * @returns True if the keyring is unlocked; otherwise, false.\n */\n get isActive(): boolean {\n return this.#isUnlocked;\n }\n\n /**\n * Checks if an account is a non-EVM account with a Snap.\n *\n * @param account - The account to check.\n * @returns True if the account is non-EVM and has Snap metadata; otherwise, false.\n */\n #isNonEvmAccount(account: InternalAccount): boolean {\n return (\n !isEvmAccountType(account.type) && account.metadata.snap !== undefined\n );\n }\n\n /**\n * Retrieves all multichain accounts from the AccountsController.\n *\n * @returns An array of internal accounts.\n */\n #listMultichainAccounts(): InternalAccount[] {\n return this.messagingSystem.call(\n 'AccountsController:listMultichainAccounts',\n );\n }\n\n /**\n * Filters and returns non-EVM accounts that should have balances.\n *\n * @returns An array of non-EVM internal accounts.\n */\n #listAccounts(): InternalAccount[] {\n const accounts = this.#listMultichainAccounts();\n return accounts.filter((account) => this.#isNonEvmAccount(account));\n }\n\n /**\n * Updates token conversion rates for each non-EVM account.\n *\n * @returns A promise that resolves when the rates are updated.\n */\n async updateAssetsRates(): Promise<void> {\n const releaseLock = await this.#mutex.acquire();\n\n return (async () => {\n if (!this.isActive) {\n return;\n }\n const accounts = this.#listAccounts();\n\n for (const account of accounts) {\n const assets = this.#getAssetsForAccount(account.id);\n\n // Build the conversions array\n const conversions = this.#buildConversions(assets);\n\n // Retrieve rates from Snap\n const accountRates = await this.#handleSnapRequest({\n snapId: account?.metadata.snap?.id as SnapId,\n handler: HandlerType.OnAssetsConversion,\n params: conversions,\n });\n\n // Flatten nested rates if needed\n const flattenedRates = this.#flattenRates(accountRates);\n\n // Build the updatedRates object for these assets\n const updatedRates = this.#buildUpdatedRates(assets, flattenedRates);\n // Apply these updated rates to controller state\n this.#applyUpdatedRates(updatedRates);\n }\n })().finally(() => {\n releaseLock();\n });\n }\n\n /**\n * Returns the array of CAIP-19 assets for the given account ID.\n * If none are found, returns an empty array.\n *\n * @param accountId - The account ID to get the assets for.\n * @returns An array of CAIP-19 assets.\n */\n #getAssetsForAccount(accountId: string): CaipAssetType[] {\n return this.#accountsAssets?.[accountId] ?? [];\n }\n\n /**\n * Builds a conversions array (from each asset → the current currency).\n *\n * @param assets - The assets to build the conversions for.\n * @returns A conversions array.\n */\n #buildConversions(assets: CaipAssetType[]): OnAssetsConversionArguments {\n const currency =\n MAP_CAIP_CURRENCIES[this.#currentCurrency] ?? MAP_CAIP_CURRENCIES.usd;\n return {\n conversions: assets.map((asset) => ({\n from: asset,\n to: currency,\n })),\n };\n }\n\n /**\n * Flattens any nested structure in the conversion rates returned by Snap.\n *\n * @param assetsConversionResponse - The conversion rates to flatten.\n * @returns A flattened rates object.\n */\n #flattenRates(\n assetsConversionResponse: OnAssetsConversionResponse,\n ): Record<CaipAssetType, AssetConversion | null> {\n const { conversionRates } = assetsConversionResponse;\n\n return Object.fromEntries(\n Object.entries(conversionRates).map(([asset, nestedObj]) => {\n // e.g., nestedObj might look like: { \"swift:0/iso4217:EUR\": { rate, conversionTime } }\n const singleValue = Object.values(nestedObj)[0];\n return [asset, singleValue];\n }),\n );\n }\n\n /**\n * Builds a rates object that covers all given assets, ensuring that\n * any asset not returned by Snap is set to null for both `rate` and `conversionTime`.\n *\n * @param assets - The assets to build the rates for.\n * @param flattenedRates - The rates to merge.\n * @returns A rates object that covers all given assets.\n */\n #buildUpdatedRates(\n assets: CaipAssetType[],\n flattenedRates: Record<CaipAssetType, AssetConversion | null>,\n ): Record<string, AssetConversion & { currency: CaipAssetType }> {\n const updatedRates: Record<\n CaipAssetType,\n AssetConversion & { currency: CaipAssetType }\n > = {};\n\n for (const asset of assets) {\n if (flattenedRates[asset]) {\n updatedRates[asset] = {\n ...(flattenedRates[asset] as AssetConversion),\n currency:\n MAP_CAIP_CURRENCIES[this.#currentCurrency] ??\n MAP_CAIP_CURRENCIES.usd,\n };\n }\n }\n return updatedRates;\n }\n\n /**\n * Merges the new rates into the controller’s state.\n *\n * @param updatedRates - The new rates to merge.\n */\n #applyUpdatedRates(\n updatedRates: Record<\n string,\n { rate: string | null; conversionTime: number | null }\n >,\n ): void {\n this.update((state: Draft<MultichainAssetsRatesControllerState>) => {\n state.conversionRates = {\n ...state.conversionRates,\n ...updatedRates,\n };\n });\n }\n\n /**\n * Forwards a Snap request to the SnapController.\n *\n * @param args - The request parameters.\n * @param args.snapId - The ID of the Snap.\n * @param args.handler - The handler type.\n * @param args.params - The asset conversions.\n * @returns A promise that resolves with the account rates.\n */\n async #handleSnapRequest({\n snapId,\n handler,\n params,\n }: {\n snapId: SnapId;\n handler: HandlerType;\n params: OnAssetsConversionArguments;\n }): Promise<OnAssetsConversionResponse> {\n return this.messagingSystem.call('SnapController:handleRequest', {\n snapId,\n origin: 'metamask',\n handler,\n request: {\n jsonrpc: '2.0',\n method: handler,\n params,\n },\n }) as Promise<OnAssetsConversionResponse>;\n }\n}\n"]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAP_CAIP_CURRENCIES = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Maps each SUPPORTED_CURRENCIES entry to its CAIP-19 (or CAIP-like) identifier.
|
|
6
|
+
* For fiat, we mimic the old “swift:0/iso4217:XYZ” style.
|
|
7
|
+
*/
|
|
8
|
+
exports.MAP_CAIP_CURRENCIES = {
|
|
9
|
+
// ========================
|
|
10
|
+
// Native crypto assets
|
|
11
|
+
// ========================
|
|
12
|
+
btc: 'bip122:000000000019d6689c085ae165831e93/slip44:0',
|
|
13
|
+
eth: 'eip155:1/slip44:60',
|
|
14
|
+
ltc: 'bip122:12a765e31ffd4059bada1e25190f6e98/slip44:2',
|
|
15
|
+
// Bitcoin Cash
|
|
16
|
+
bch: 'bip122:000000000000000000651ef99cb9fcbe/slip44:145',
|
|
17
|
+
// Binance Coin
|
|
18
|
+
bnb: 'cosmos:Binance-Chain-Tigris/slip44:714',
|
|
19
|
+
// EOS mainnet (chainId = aca376f2...)
|
|
20
|
+
eos: 'eos:aca376f2/slip44:194',
|
|
21
|
+
// XRP mainnet
|
|
22
|
+
xrp: 'xrpl:mainnet/slip44:144',
|
|
23
|
+
// Stellar Lumens mainnet
|
|
24
|
+
xlm: 'stellar:pubnet/slip44:148',
|
|
25
|
+
// Chainlink (ERC20 on Ethereum mainnet)
|
|
26
|
+
link: 'eip155:1/erc20:0x514910771af9Ca656af840dff83E8264EcF986CA',
|
|
27
|
+
// Polkadot (chainId = 91b171bb158e2d3848fa23a9f1c25182)
|
|
28
|
+
dot: 'polkadot:91b171bb158e2d3848fa23a9f1c25182/slip44:354',
|
|
29
|
+
// Yearn.finance (ERC20 on Ethereum mainnet)
|
|
30
|
+
yfi: 'eip155:1/erc20:0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e',
|
|
31
|
+
// ========================
|
|
32
|
+
// Fiat currencies
|
|
33
|
+
// ========================
|
|
34
|
+
usd: 'swift:0/iso4217:USD',
|
|
35
|
+
aed: 'swift:0/iso4217:AED',
|
|
36
|
+
ars: 'swift:0/iso4217:ARS',
|
|
37
|
+
aud: 'swift:0/iso4217:AUD',
|
|
38
|
+
bdt: 'swift:0/iso4217:BDT',
|
|
39
|
+
bhd: 'swift:0/iso4217:BHD',
|
|
40
|
+
bmd: 'swift:0/iso4217:BMD',
|
|
41
|
+
brl: 'swift:0/iso4217:BRL',
|
|
42
|
+
cad: 'swift:0/iso4217:CAD',
|
|
43
|
+
chf: 'swift:0/iso4217:CHF',
|
|
44
|
+
clp: 'swift:0/iso4217:CLP',
|
|
45
|
+
cny: 'swift:0/iso4217:CNY',
|
|
46
|
+
czk: 'swift:0/iso4217:CZK',
|
|
47
|
+
dkk: 'swift:0/iso4217:DKK',
|
|
48
|
+
eur: 'swift:0/iso4217:EUR',
|
|
49
|
+
gbp: 'swift:0/iso4217:GBP',
|
|
50
|
+
hkd: 'swift:0/iso4217:HKD',
|
|
51
|
+
huf: 'swift:0/iso4217:HUF',
|
|
52
|
+
idr: 'swift:0/iso4217:IDR',
|
|
53
|
+
ils: 'swift:0/iso4217:ILS',
|
|
54
|
+
inr: 'swift:0/iso4217:INR',
|
|
55
|
+
jpy: 'swift:0/iso4217:JPY',
|
|
56
|
+
krw: 'swift:0/iso4217:KRW',
|
|
57
|
+
kwd: 'swift:0/iso4217:KWD',
|
|
58
|
+
lkr: 'swift:0/iso4217:LKR',
|
|
59
|
+
mmk: 'swift:0/iso4217:MMK',
|
|
60
|
+
mxn: 'swift:0/iso4217:MXN',
|
|
61
|
+
myr: 'swift:0/iso4217:MYR',
|
|
62
|
+
ngn: 'swift:0/iso4217:NGN',
|
|
63
|
+
nok: 'swift:0/iso4217:NOK',
|
|
64
|
+
nzd: 'swift:0/iso4217:NZD',
|
|
65
|
+
php: 'swift:0/iso4217:PHP',
|
|
66
|
+
pkr: 'swift:0/iso4217:PKR',
|
|
67
|
+
pln: 'swift:0/iso4217:PLN',
|
|
68
|
+
rub: 'swift:0/iso4217:RUB',
|
|
69
|
+
sar: 'swift:0/iso4217:SAR',
|
|
70
|
+
sek: 'swift:0/iso4217:SEK',
|
|
71
|
+
sgd: 'swift:0/iso4217:SGD',
|
|
72
|
+
thb: 'swift:0/iso4217:THB',
|
|
73
|
+
try: 'swift:0/iso4217:TRY',
|
|
74
|
+
twd: 'swift:0/iso4217:TWD',
|
|
75
|
+
uah: 'swift:0/iso4217:UAH',
|
|
76
|
+
vef: 'swift:0/iso4217:VEF',
|
|
77
|
+
vnd: 'swift:0/iso4217:VND',
|
|
78
|
+
zar: 'swift:0/iso4217:ZAR',
|
|
79
|
+
xdr: 'swift:0/iso4217:XDR',
|
|
80
|
+
xag: 'swift:0/iso4217:XAG',
|
|
81
|
+
xau: 'swift:0/iso4217:XAU',
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=constant.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constant.cjs","sourceRoot":"","sources":["../../src/MultichainAssetsRatesController/constant.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACU,QAAA,mBAAmB,GAE5B;IACF,2BAA2B;IAC3B,uBAAuB;IACvB,2BAA2B;IAC3B,GAAG,EAAE,kDAAkD;IACvD,GAAG,EAAE,oBAAoB;IACzB,GAAG,EAAE,kDAAkD;IAEvD,eAAe;IACf,GAAG,EAAE,oDAAoD;IAEzD,eAAe;IACf,GAAG,EAAE,wCAAwC;IAE7C,sCAAsC;IACtC,GAAG,EAAE,yBAAyB;IAE9B,cAAc;IACd,GAAG,EAAE,yBAAyB;IAE9B,yBAAyB;IACzB,GAAG,EAAE,2BAA2B;IAEhC,wCAAwC;IACxC,IAAI,EAAE,2DAA2D;IAEjE,wDAAwD;IACxD,GAAG,EAAE,sDAAsD;IAE3D,4CAA4C;IAC5C,GAAG,EAAE,2DAA2D;IAEhE,2BAA2B;IAC3B,kBAAkB;IAClB,2BAA2B;IAC3B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;CAC3B,CAAC","sourcesContent":["import type { CaipAssetType } from '@metamask/utils';\n\n/**\n * Maps each SUPPORTED_CURRENCIES entry to its CAIP-19 (or CAIP-like) identifier.\n * For fiat, we mimic the old “swift:0/iso4217:XYZ” style.\n */\nexport const MAP_CAIP_CURRENCIES: {\n [key: string]: CaipAssetType;\n} = {\n // ========================\n // Native crypto assets\n // ========================\n btc: 'bip122:000000000019d6689c085ae165831e93/slip44:0',\n eth: 'eip155:1/slip44:60',\n ltc: 'bip122:12a765e31ffd4059bada1e25190f6e98/slip44:2',\n\n // Bitcoin Cash\n bch: 'bip122:000000000000000000651ef99cb9fcbe/slip44:145',\n\n // Binance Coin\n bnb: 'cosmos:Binance-Chain-Tigris/slip44:714',\n\n // EOS mainnet (chainId = aca376f2...)\n eos: 'eos:aca376f2/slip44:194',\n\n // XRP mainnet\n xrp: 'xrpl:mainnet/slip44:144',\n\n // Stellar Lumens mainnet\n xlm: 'stellar:pubnet/slip44:148',\n\n // Chainlink (ERC20 on Ethereum mainnet)\n link: 'eip155:1/erc20:0x514910771af9Ca656af840dff83E8264EcF986CA',\n\n // Polkadot (chainId = 91b171bb158e2d3848fa23a9f1c25182)\n dot: 'polkadot:91b171bb158e2d3848fa23a9f1c25182/slip44:354',\n\n // Yearn.finance (ERC20 on Ethereum mainnet)\n yfi: 'eip155:1/erc20:0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e',\n\n // ========================\n // Fiat currencies\n // ========================\n usd: 'swift:0/iso4217:USD',\n aed: 'swift:0/iso4217:AED',\n ars: 'swift:0/iso4217:ARS',\n aud: 'swift:0/iso4217:AUD',\n bdt: 'swift:0/iso4217:BDT',\n bhd: 'swift:0/iso4217:BHD',\n bmd: 'swift:0/iso4217:BMD',\n brl: 'swift:0/iso4217:BRL',\n cad: 'swift:0/iso4217:CAD',\n chf: 'swift:0/iso4217:CHF',\n clp: 'swift:0/iso4217:CLP',\n cny: 'swift:0/iso4217:CNY',\n czk: 'swift:0/iso4217:CZK',\n dkk: 'swift:0/iso4217:DKK',\n eur: 'swift:0/iso4217:EUR',\n gbp: 'swift:0/iso4217:GBP',\n hkd: 'swift:0/iso4217:HKD',\n huf: 'swift:0/iso4217:HUF',\n idr: 'swift:0/iso4217:IDR',\n ils: 'swift:0/iso4217:ILS',\n inr: 'swift:0/iso4217:INR',\n jpy: 'swift:0/iso4217:JPY',\n krw: 'swift:0/iso4217:KRW',\n kwd: 'swift:0/iso4217:KWD',\n lkr: 'swift:0/iso4217:LKR',\n mmk: 'swift:0/iso4217:MMK',\n mxn: 'swift:0/iso4217:MXN',\n myr: 'swift:0/iso4217:MYR',\n ngn: 'swift:0/iso4217:NGN',\n nok: 'swift:0/iso4217:NOK',\n nzd: 'swift:0/iso4217:NZD',\n php: 'swift:0/iso4217:PHP',\n pkr: 'swift:0/iso4217:PKR',\n pln: 'swift:0/iso4217:PLN',\n rub: 'swift:0/iso4217:RUB',\n sar: 'swift:0/iso4217:SAR',\n sek: 'swift:0/iso4217:SEK',\n sgd: 'swift:0/iso4217:SGD',\n thb: 'swift:0/iso4217:THB',\n try: 'swift:0/iso4217:TRY',\n twd: 'swift:0/iso4217:TWD',\n uah: 'swift:0/iso4217:UAH',\n vef: 'swift:0/iso4217:VEF',\n vnd: 'swift:0/iso4217:VND',\n zar: 'swift:0/iso4217:ZAR',\n xdr: 'swift:0/iso4217:XDR',\n xag: 'swift:0/iso4217:XAG',\n xau: 'swift:0/iso4217:XAU',\n};\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CaipAssetType } from "@metamask/utils";
|
|
2
|
+
/**
|
|
3
|
+
* Maps each SUPPORTED_CURRENCIES entry to its CAIP-19 (or CAIP-like) identifier.
|
|
4
|
+
* For fiat, we mimic the old “swift:0/iso4217:XYZ” style.
|
|
5
|
+
*/
|
|
6
|
+
export declare const MAP_CAIP_CURRENCIES: {
|
|
7
|
+
[key: string]: CaipAssetType;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=constant.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constant.d.cts","sourceRoot":"","sources":["../../src/MultichainAssetsRatesController/constant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB;AAErD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAC;CAoF9B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CaipAssetType } from "@metamask/utils";
|
|
2
|
+
/**
|
|
3
|
+
* Maps each SUPPORTED_CURRENCIES entry to its CAIP-19 (or CAIP-like) identifier.
|
|
4
|
+
* For fiat, we mimic the old “swift:0/iso4217:XYZ” style.
|
|
5
|
+
*/
|
|
6
|
+
export declare const MAP_CAIP_CURRENCIES: {
|
|
7
|
+
[key: string]: CaipAssetType;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=constant.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constant.d.mts","sourceRoot":"","sources":["../../src/MultichainAssetsRatesController/constant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB;AAErD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAC;CAoF9B,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps each SUPPORTED_CURRENCIES entry to its CAIP-19 (or CAIP-like) identifier.
|
|
3
|
+
* For fiat, we mimic the old “swift:0/iso4217:XYZ” style.
|
|
4
|
+
*/
|
|
5
|
+
export const MAP_CAIP_CURRENCIES = {
|
|
6
|
+
// ========================
|
|
7
|
+
// Native crypto assets
|
|
8
|
+
// ========================
|
|
9
|
+
btc: 'bip122:000000000019d6689c085ae165831e93/slip44:0',
|
|
10
|
+
eth: 'eip155:1/slip44:60',
|
|
11
|
+
ltc: 'bip122:12a765e31ffd4059bada1e25190f6e98/slip44:2',
|
|
12
|
+
// Bitcoin Cash
|
|
13
|
+
bch: 'bip122:000000000000000000651ef99cb9fcbe/slip44:145',
|
|
14
|
+
// Binance Coin
|
|
15
|
+
bnb: 'cosmos:Binance-Chain-Tigris/slip44:714',
|
|
16
|
+
// EOS mainnet (chainId = aca376f2...)
|
|
17
|
+
eos: 'eos:aca376f2/slip44:194',
|
|
18
|
+
// XRP mainnet
|
|
19
|
+
xrp: 'xrpl:mainnet/slip44:144',
|
|
20
|
+
// Stellar Lumens mainnet
|
|
21
|
+
xlm: 'stellar:pubnet/slip44:148',
|
|
22
|
+
// Chainlink (ERC20 on Ethereum mainnet)
|
|
23
|
+
link: 'eip155:1/erc20:0x514910771af9Ca656af840dff83E8264EcF986CA',
|
|
24
|
+
// Polkadot (chainId = 91b171bb158e2d3848fa23a9f1c25182)
|
|
25
|
+
dot: 'polkadot:91b171bb158e2d3848fa23a9f1c25182/slip44:354',
|
|
26
|
+
// Yearn.finance (ERC20 on Ethereum mainnet)
|
|
27
|
+
yfi: 'eip155:1/erc20:0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e',
|
|
28
|
+
// ========================
|
|
29
|
+
// Fiat currencies
|
|
30
|
+
// ========================
|
|
31
|
+
usd: 'swift:0/iso4217:USD',
|
|
32
|
+
aed: 'swift:0/iso4217:AED',
|
|
33
|
+
ars: 'swift:0/iso4217:ARS',
|
|
34
|
+
aud: 'swift:0/iso4217:AUD',
|
|
35
|
+
bdt: 'swift:0/iso4217:BDT',
|
|
36
|
+
bhd: 'swift:0/iso4217:BHD',
|
|
37
|
+
bmd: 'swift:0/iso4217:BMD',
|
|
38
|
+
brl: 'swift:0/iso4217:BRL',
|
|
39
|
+
cad: 'swift:0/iso4217:CAD',
|
|
40
|
+
chf: 'swift:0/iso4217:CHF',
|
|
41
|
+
clp: 'swift:0/iso4217:CLP',
|
|
42
|
+
cny: 'swift:0/iso4217:CNY',
|
|
43
|
+
czk: 'swift:0/iso4217:CZK',
|
|
44
|
+
dkk: 'swift:0/iso4217:DKK',
|
|
45
|
+
eur: 'swift:0/iso4217:EUR',
|
|
46
|
+
gbp: 'swift:0/iso4217:GBP',
|
|
47
|
+
hkd: 'swift:0/iso4217:HKD',
|
|
48
|
+
huf: 'swift:0/iso4217:HUF',
|
|
49
|
+
idr: 'swift:0/iso4217:IDR',
|
|
50
|
+
ils: 'swift:0/iso4217:ILS',
|
|
51
|
+
inr: 'swift:0/iso4217:INR',
|
|
52
|
+
jpy: 'swift:0/iso4217:JPY',
|
|
53
|
+
krw: 'swift:0/iso4217:KRW',
|
|
54
|
+
kwd: 'swift:0/iso4217:KWD',
|
|
55
|
+
lkr: 'swift:0/iso4217:LKR',
|
|
56
|
+
mmk: 'swift:0/iso4217:MMK',
|
|
57
|
+
mxn: 'swift:0/iso4217:MXN',
|
|
58
|
+
myr: 'swift:0/iso4217:MYR',
|
|
59
|
+
ngn: 'swift:0/iso4217:NGN',
|
|
60
|
+
nok: 'swift:0/iso4217:NOK',
|
|
61
|
+
nzd: 'swift:0/iso4217:NZD',
|
|
62
|
+
php: 'swift:0/iso4217:PHP',
|
|
63
|
+
pkr: 'swift:0/iso4217:PKR',
|
|
64
|
+
pln: 'swift:0/iso4217:PLN',
|
|
65
|
+
rub: 'swift:0/iso4217:RUB',
|
|
66
|
+
sar: 'swift:0/iso4217:SAR',
|
|
67
|
+
sek: 'swift:0/iso4217:SEK',
|
|
68
|
+
sgd: 'swift:0/iso4217:SGD',
|
|
69
|
+
thb: 'swift:0/iso4217:THB',
|
|
70
|
+
try: 'swift:0/iso4217:TRY',
|
|
71
|
+
twd: 'swift:0/iso4217:TWD',
|
|
72
|
+
uah: 'swift:0/iso4217:UAH',
|
|
73
|
+
vef: 'swift:0/iso4217:VEF',
|
|
74
|
+
vnd: 'swift:0/iso4217:VND',
|
|
75
|
+
zar: 'swift:0/iso4217:ZAR',
|
|
76
|
+
xdr: 'swift:0/iso4217:XDR',
|
|
77
|
+
xag: 'swift:0/iso4217:XAG',
|
|
78
|
+
xau: 'swift:0/iso4217:XAU',
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=constant.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constant.mjs","sourceRoot":"","sources":["../../src/MultichainAssetsRatesController/constant.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAE5B;IACF,2BAA2B;IAC3B,uBAAuB;IACvB,2BAA2B;IAC3B,GAAG,EAAE,kDAAkD;IACvD,GAAG,EAAE,oBAAoB;IACzB,GAAG,EAAE,kDAAkD;IAEvD,eAAe;IACf,GAAG,EAAE,oDAAoD;IAEzD,eAAe;IACf,GAAG,EAAE,wCAAwC;IAE7C,sCAAsC;IACtC,GAAG,EAAE,yBAAyB;IAE9B,cAAc;IACd,GAAG,EAAE,yBAAyB;IAE9B,yBAAyB;IACzB,GAAG,EAAE,2BAA2B;IAEhC,wCAAwC;IACxC,IAAI,EAAE,2DAA2D;IAEjE,wDAAwD;IACxD,GAAG,EAAE,sDAAsD;IAE3D,4CAA4C;IAC5C,GAAG,EAAE,2DAA2D;IAEhE,2BAA2B;IAC3B,kBAAkB;IAClB,2BAA2B;IAC3B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,qBAAqB;CAC3B,CAAC","sourcesContent":["import type { CaipAssetType } from '@metamask/utils';\n\n/**\n * Maps each SUPPORTED_CURRENCIES entry to its CAIP-19 (or CAIP-like) identifier.\n * For fiat, we mimic the old “swift:0/iso4217:XYZ” style.\n */\nexport const MAP_CAIP_CURRENCIES: {\n [key: string]: CaipAssetType;\n} = {\n // ========================\n // Native crypto assets\n // ========================\n btc: 'bip122:000000000019d6689c085ae165831e93/slip44:0',\n eth: 'eip155:1/slip44:60',\n ltc: 'bip122:12a765e31ffd4059bada1e25190f6e98/slip44:2',\n\n // Bitcoin Cash\n bch: 'bip122:000000000000000000651ef99cb9fcbe/slip44:145',\n\n // Binance Coin\n bnb: 'cosmos:Binance-Chain-Tigris/slip44:714',\n\n // EOS mainnet (chainId = aca376f2...)\n eos: 'eos:aca376f2/slip44:194',\n\n // XRP mainnet\n xrp: 'xrpl:mainnet/slip44:144',\n\n // Stellar Lumens mainnet\n xlm: 'stellar:pubnet/slip44:148',\n\n // Chainlink (ERC20 on Ethereum mainnet)\n link: 'eip155:1/erc20:0x514910771af9Ca656af840dff83E8264EcF986CA',\n\n // Polkadot (chainId = 91b171bb158e2d3848fa23a9f1c25182)\n dot: 'polkadot:91b171bb158e2d3848fa23a9f1c25182/slip44:354',\n\n // Yearn.finance (ERC20 on Ethereum mainnet)\n yfi: 'eip155:1/erc20:0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e',\n\n // ========================\n // Fiat currencies\n // ========================\n usd: 'swift:0/iso4217:USD',\n aed: 'swift:0/iso4217:AED',\n ars: 'swift:0/iso4217:ARS',\n aud: 'swift:0/iso4217:AUD',\n bdt: 'swift:0/iso4217:BDT',\n bhd: 'swift:0/iso4217:BHD',\n bmd: 'swift:0/iso4217:BMD',\n brl: 'swift:0/iso4217:BRL',\n cad: 'swift:0/iso4217:CAD',\n chf: 'swift:0/iso4217:CHF',\n clp: 'swift:0/iso4217:CLP',\n cny: 'swift:0/iso4217:CNY',\n czk: 'swift:0/iso4217:CZK',\n dkk: 'swift:0/iso4217:DKK',\n eur: 'swift:0/iso4217:EUR',\n gbp: 'swift:0/iso4217:GBP',\n hkd: 'swift:0/iso4217:HKD',\n huf: 'swift:0/iso4217:HUF',\n idr: 'swift:0/iso4217:IDR',\n ils: 'swift:0/iso4217:ILS',\n inr: 'swift:0/iso4217:INR',\n jpy: 'swift:0/iso4217:JPY',\n krw: 'swift:0/iso4217:KRW',\n kwd: 'swift:0/iso4217:KWD',\n lkr: 'swift:0/iso4217:LKR',\n mmk: 'swift:0/iso4217:MMK',\n mxn: 'swift:0/iso4217:MXN',\n myr: 'swift:0/iso4217:MYR',\n ngn: 'swift:0/iso4217:NGN',\n nok: 'swift:0/iso4217:NOK',\n nzd: 'swift:0/iso4217:NZD',\n php: 'swift:0/iso4217:PHP',\n pkr: 'swift:0/iso4217:PKR',\n pln: 'swift:0/iso4217:PLN',\n rub: 'swift:0/iso4217:RUB',\n sar: 'swift:0/iso4217:SAR',\n sek: 'swift:0/iso4217:SEK',\n sgd: 'swift:0/iso4217:SGD',\n thb: 'swift:0/iso4217:THB',\n try: 'swift:0/iso4217:TRY',\n twd: 'swift:0/iso4217:TWD',\n uah: 'swift:0/iso4217:UAH',\n vef: 'swift:0/iso4217:VEF',\n vnd: 'swift:0/iso4217:VND',\n zar: 'swift:0/iso4217:ZAR',\n xdr: 'swift:0/iso4217:XDR',\n xag: 'swift:0/iso4217:XAG',\n xau: 'swift:0/iso4217:XAU',\n};\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDefaultMultichainAssetsRatesControllerState = exports.MultiChainAssetsRatesController = void 0;
|
|
4
|
+
var MultichainAssetsRatesController_1 = require("./MultichainAssetsRatesController.cjs");
|
|
5
|
+
Object.defineProperty(exports, "MultiChainAssetsRatesController", { enumerable: true, get: function () { return MultichainAssetsRatesController_1.MultiChainAssetsRatesController; } });
|
|
6
|
+
Object.defineProperty(exports, "getDefaultMultichainAssetsRatesControllerState", { enumerable: true, get: function () { return MultichainAssetsRatesController_1.getDefaultMultichainAssetsRatesControllerState; } });
|
|
7
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/MultichainAssetsRatesController/index.ts"],"names":[],"mappings":";;;AASA,yFAG2C;AAFzC,kJAAA,+BAA+B,OAAA;AAC/B,iKAAA,8CAA8C,OAAA","sourcesContent":["export type {\n MultichainAssetsRatesControllerState,\n MultichainAssetsRatesControllerActions,\n MultichainAssetsRatesControllerEvents,\n MultichainAssetsRatesControllerGetStateAction,\n MultichainAssetsRatesControllerStateChange,\n MultichainAssetsRatesControllerMessenger,\n} from './MultichainAssetsRatesController';\n\nexport {\n MultiChainAssetsRatesController,\n getDefaultMultichainAssetsRatesControllerState,\n} from './MultichainAssetsRatesController';\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { MultichainAssetsRatesControllerState, MultichainAssetsRatesControllerActions, MultichainAssetsRatesControllerEvents, MultichainAssetsRatesControllerGetStateAction, MultichainAssetsRatesControllerStateChange, MultichainAssetsRatesControllerMessenger, } from "./MultichainAssetsRatesController.cjs";
|
|
2
|
+
export { MultiChainAssetsRatesController, getDefaultMultichainAssetsRatesControllerState, } from "./MultichainAssetsRatesController.cjs";
|
|
3
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/MultichainAssetsRatesController/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,oCAAoC,EACpC,sCAAsC,EACtC,qCAAqC,EACrC,6CAA6C,EAC7C,0CAA0C,EAC1C,wCAAwC,GACzC,8CAA0C;AAE3C,OAAO,EACL,+BAA+B,EAC/B,8CAA8C,GAC/C,8CAA0C"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { MultichainAssetsRatesControllerState, MultichainAssetsRatesControllerActions, MultichainAssetsRatesControllerEvents, MultichainAssetsRatesControllerGetStateAction, MultichainAssetsRatesControllerStateChange, MultichainAssetsRatesControllerMessenger, } from "./MultichainAssetsRatesController.mjs";
|
|
2
|
+
export { MultiChainAssetsRatesController, getDefaultMultichainAssetsRatesControllerState, } from "./MultichainAssetsRatesController.mjs";
|
|
3
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/MultichainAssetsRatesController/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,oCAAoC,EACpC,sCAAsC,EACtC,qCAAqC,EACrC,6CAA6C,EAC7C,0CAA0C,EAC1C,wCAAwC,GACzC,8CAA0C;AAE3C,OAAO,EACL,+BAA+B,EAC/B,8CAA8C,GAC/C,8CAA0C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/MultichainAssetsRatesController/index.ts"],"names":[],"mappings":"AASA,OAAO,EACL,+BAA+B,EAC/B,8CAA8C,EAC/C,8CAA0C","sourcesContent":["export type {\n MultichainAssetsRatesControllerState,\n MultichainAssetsRatesControllerActions,\n MultichainAssetsRatesControllerEvents,\n MultichainAssetsRatesControllerGetStateAction,\n MultichainAssetsRatesControllerStateChange,\n MultichainAssetsRatesControllerMessenger,\n} from './MultichainAssetsRatesController';\n\nexport {\n MultiChainAssetsRatesController,\n getDefaultMultichainAssetsRatesControllerState,\n} from './MultichainAssetsRatesController';\n"]}
|
|
@@ -4,15 +4,13 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
4
4
|
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");
|
|
5
5
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
6
|
};
|
|
7
|
-
var _MultichainBalancesController_instances, _MultichainBalancesController_listMultichainAccounts, _MultichainBalancesController_listAccounts, _MultichainBalancesController_getAccount, _MultichainBalancesController_isNonEvmAccount,
|
|
7
|
+
var _MultichainBalancesController_instances, _MultichainBalancesController_updateBalance, _MultichainBalancesController_listMultichainAccounts, _MultichainBalancesController_listAccounts, _MultichainBalancesController_listAccountAssets, _MultichainBalancesController_getAccount, _MultichainBalancesController_isNonEvmAccount, _MultichainBalancesController_handleOnAccountBalancesUpdated, _MultichainBalancesController_handleOnAccountRemoved, _MultichainBalancesController_getBalances, _MultichainBalancesController_getClient;
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.MultichainBalancesController = exports.getDefaultMultichainBalancesControllerState = void 0;
|
|
10
10
|
const base_controller_1 = require("@metamask/base-controller");
|
|
11
11
|
const keyring_api_1 = require("@metamask/keyring-api");
|
|
12
12
|
const keyring_snap_client_1 = require("@metamask/keyring-snap-client");
|
|
13
13
|
const snaps_utils_1 = require("@metamask/snaps-utils");
|
|
14
|
-
const _1 = require("./index.cjs");
|
|
15
|
-
const utils_1 = require("./utils.cjs");
|
|
16
14
|
const controllerName = 'MultichainBalancesController';
|
|
17
15
|
/**
|
|
18
16
|
* Constructs the default {@link MultichainBalancesController} state. This allows
|
|
@@ -57,13 +55,20 @@ class MultichainBalancesController extends base_controller_1.BaseController {
|
|
|
57
55
|
_MultichainBalancesController_instances.add(this);
|
|
58
56
|
// Fetch initial balances for all non-EVM accounts
|
|
59
57
|
for (const account of __classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_listAccounts).call(this)) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
58
|
+
// Fetching the balance is asynchronous and we cannot use `await` here.
|
|
59
|
+
// eslint-disable-next-line no-void
|
|
60
|
+
void this.updateBalance(account.id);
|
|
63
61
|
}
|
|
64
|
-
this.messagingSystem.subscribe('AccountsController:accountAdded', (account) => __classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_handleOnAccountAdded).call(this, account));
|
|
65
62
|
this.messagingSystem.subscribe('AccountsController:accountRemoved', (account) => __classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_handleOnAccountRemoved).call(this, account));
|
|
66
63
|
this.messagingSystem.subscribe('AccountsController:accountBalancesUpdated', (balanceUpdate) => __classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_handleOnAccountBalancesUpdated).call(this, balanceUpdate));
|
|
64
|
+
// TODO: Maybe add a MultichainAssetsController:accountAssetListUpdated event instead of using the entire state.
|
|
65
|
+
// Since MultichainAssetsController already listens for the AccountsController:accountAdded, we can rely in it for that event
|
|
66
|
+
// and not listen for it also here, in this controller, since it would be redundant
|
|
67
|
+
this.messagingSystem.subscribe('MultichainAssetsController:stateChange', async (assetsState) => {
|
|
68
|
+
for (const accountId of Object.keys(assetsState.accountsAssets)) {
|
|
69
|
+
await __classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_updateBalance).call(this, accountId, assetsState.accountsAssets[accountId]);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
67
72
|
}
|
|
68
73
|
/**
|
|
69
74
|
* Updates the balances of one account. This method doesn't return
|
|
@@ -72,28 +77,43 @@ class MultichainBalancesController extends base_controller_1.BaseController {
|
|
|
72
77
|
* @param accountId - The account ID.
|
|
73
78
|
*/
|
|
74
79
|
async updateBalance(accountId) {
|
|
75
|
-
|
|
76
|
-
const account = __classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_getAccount).call(this, accountId);
|
|
77
|
-
if (account.metadata.snap) {
|
|
78
|
-
const scope = (0, utils_1.getScopeForAccount)(account);
|
|
79
|
-
const assetTypes = _1.NETWORK_ASSETS_MAP[scope];
|
|
80
|
-
const accountBalance = await __classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_getBalances).call(this, account.id, account.metadata.snap.id, assetTypes);
|
|
81
|
-
this.update((state) => {
|
|
82
|
-
state.balances[accountId] = accountBalance;
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
console.error(`Failed to fetch balances for account ${accountId}:`, error);
|
|
88
|
-
}
|
|
80
|
+
await __classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_updateBalance).call(this, accountId, __classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_listAccountAssets).call(this, accountId));
|
|
89
81
|
}
|
|
90
82
|
}
|
|
91
83
|
exports.MultichainBalancesController = MultichainBalancesController;
|
|
92
|
-
_MultichainBalancesController_instances = new WeakSet(),
|
|
84
|
+
_MultichainBalancesController_instances = new WeakSet(), _MultichainBalancesController_updateBalance =
|
|
85
|
+
/**
|
|
86
|
+
* Updates the balances of one account. This method doesn't return
|
|
87
|
+
* anything, but it updates the state of the controller.
|
|
88
|
+
*
|
|
89
|
+
* @param accountId - The account ID.
|
|
90
|
+
* @param assets - The list of asset types for this account to upadte.
|
|
91
|
+
*/
|
|
92
|
+
async function _MultichainBalancesController_updateBalance(accountId, assets) {
|
|
93
|
+
try {
|
|
94
|
+
const account = __classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_getAccount).call(this, accountId);
|
|
95
|
+
if (account.metadata.snap) {
|
|
96
|
+
const accountBalance = await __classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_getBalances).call(this, account.id, account.metadata.snap.id, assets);
|
|
97
|
+
this.update((state) => {
|
|
98
|
+
state.balances[accountId] = accountBalance;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
// FIXME: Maybe we shouldn't catch all errors here since this method is also being
|
|
104
|
+
// used in the public methods. This means if something else uses `updateBalance` it
|
|
105
|
+
// won't be able to catch and gets the error itself...
|
|
106
|
+
console.error(`Failed to fetch balances for account ${accountId}:`, error);
|
|
107
|
+
}
|
|
108
|
+
}, _MultichainBalancesController_listMultichainAccounts = function _MultichainBalancesController_listMultichainAccounts() {
|
|
93
109
|
return this.messagingSystem.call('AccountsController:listMultichainAccounts');
|
|
94
110
|
}, _MultichainBalancesController_listAccounts = function _MultichainBalancesController_listAccounts() {
|
|
95
111
|
const accounts = __classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_listMultichainAccounts).call(this);
|
|
96
112
|
return accounts.filter((account) => __classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_isNonEvmAccount).call(this, account));
|
|
113
|
+
}, _MultichainBalancesController_listAccountAssets = function _MultichainBalancesController_listAccountAssets(accountId) {
|
|
114
|
+
// TODO: Add an action `MultichainAssetsController:getAccountAssets` maybe?
|
|
115
|
+
const assetsState = this.messagingSystem.call('MultichainAssetsController:getState');
|
|
116
|
+
return assetsState.accountsAssets[accountId] ?? [];
|
|
97
117
|
}, _MultichainBalancesController_getAccount = function _MultichainBalancesController_getAccount(accountId) {
|
|
98
118
|
const account = __classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_listAccounts).call(this).find((multichainAccount) => multichainAccount.id === accountId);
|
|
99
119
|
if (!account) {
|
|
@@ -104,17 +124,6 @@ _MultichainBalancesController_instances = new WeakSet(), _MultichainBalancesCont
|
|
|
104
124
|
return (!(0, keyring_api_1.isEvmAccountType)(account.type) &&
|
|
105
125
|
// Non-EVM accounts are backed by a Snap for now
|
|
106
126
|
account.metadata.snap !== undefined);
|
|
107
|
-
}, _MultichainBalancesController_handleOnAccountAdded =
|
|
108
|
-
/**
|
|
109
|
-
* Handles changes when a new account has been added.
|
|
110
|
-
*
|
|
111
|
-
* @param account - The new account being added.
|
|
112
|
-
*/
|
|
113
|
-
async function _MultichainBalancesController_handleOnAccountAdded(account) {
|
|
114
|
-
if (!__classPrivateFieldGet(this, _MultichainBalancesController_instances, "m", _MultichainBalancesController_isNonEvmAccount).call(this, account)) {
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
await this.updateBalance(account.id);
|
|
118
127
|
}, _MultichainBalancesController_handleOnAccountBalancesUpdated = function _MultichainBalancesController_handleOnAccountBalancesUpdated(balanceUpdate) {
|
|
119
128
|
this.update((state) => {
|
|
120
129
|
Object.entries(balanceUpdate.balances).forEach(([accountId, assetBalances]) => {
|