@metamask-previews/multichain-transactions-controller 0.0.1-preview-9df90b5
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 +17 -0
- package/LICENSE +20 -0
- package/README.md +15 -0
- package/dist/MultichainTransactionsController.cjs +195 -0
- package/dist/MultichainTransactionsController.cjs.map +1 -0
- package/dist/MultichainTransactionsController.d.cts +105 -0
- package/dist/MultichainTransactionsController.d.cts.map +1 -0
- package/dist/MultichainTransactionsController.d.mts +105 -0
- package/dist/MultichainTransactionsController.d.mts.map +1 -0
- package/dist/MultichainTransactionsController.mjs +190 -0
- package/dist/MultichainTransactionsController.mjs.map +1 -0
- package/dist/MultichainTransactionsTracker.cjs +124 -0
- package/dist/MultichainTransactionsTracker.cjs.map +1 -0
- package/dist/MultichainTransactionsTracker.d.cts +62 -0
- package/dist/MultichainTransactionsTracker.d.cts.map +1 -0
- package/dist/MultichainTransactionsTracker.d.mts +62 -0
- package/dist/MultichainTransactionsTracker.d.mts.map +1 -0
- package/dist/MultichainTransactionsTracker.mjs +120 -0
- package/dist/MultichainTransactionsTracker.mjs.map +1 -0
- package/dist/Poller.cjs +40 -0
- package/dist/Poller.cjs.map +1 -0
- package/dist/Poller.d.cts +7 -0
- package/dist/Poller.d.cts.map +1 -0
- package/dist/Poller.d.mts +7 -0
- package/dist/Poller.d.mts.map +1 -0
- package/dist/Poller.mjs +36 -0
- package/dist/Poller.mjs.map +1 -0
- package/dist/constants.cjs +46 -0
- package/dist/constants.cjs.map +1 -0
- package/dist/constants.d.cts +29 -0
- package/dist/constants.d.cts.map +1 -0
- package/dist/constants.d.mts +29 -0
- package/dist/constants.d.mts.map +1 -0
- package/dist/constants.mjs +43 -0
- package/dist/constants.mjs.map +1 -0
- package/dist/index.cjs +11 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +86 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.0.1]
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Initial release ([#5133](https://github.com/MetaMask/core/pull/5133)), ([#5177](https://github.com/MetaMask/core/pull/5177))
|
|
15
|
+
|
|
16
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/multichain-transactions-controller@0.0.1...HEAD
|
|
17
|
+
[0.0.1]: https://github.com/MetaMask/core/releases/tag/@metamask/multichain-transactions-controller@0.0.1
|
package/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 MetaMask
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
package/README.md
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# `@metamask/multichain-transactions-controller`
|
|
2
|
+
|
|
3
|
+
This package is responsible for getting transactions from our Bitcoin and Solana snaps.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
`yarn add @metamask/multichain-transactions-controller`
|
|
8
|
+
|
|
9
|
+
or
|
|
10
|
+
|
|
11
|
+
`npm install @metamask/multichain-transactions-controller`
|
|
12
|
+
|
|
13
|
+
## Contributing
|
|
14
|
+
|
|
15
|
+
This package is part of a monorepo. Instructions for contributing can be found in the [monorepo README](https://github.com/MetaMask/core#readme).
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
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
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
8
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
10
|
+
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");
|
|
11
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
|
+
};
|
|
13
|
+
var _MultichainTransactionsController_instances, _MultichainTransactionsController_tracker, _MultichainTransactionsController_listMultichainAccounts, _MultichainTransactionsController_listAccounts, _MultichainTransactionsController_updateTransactions, _MultichainTransactionsController_getTransactions, _MultichainTransactionsController_getBlockTimeFor, _MultichainTransactionsController_isNonEvmAccount, _MultichainTransactionsController_handleOnAccountAdded, _MultichainTransactionsController_handleOnAccountRemoved, _MultichainTransactionsController_getClient;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.MultichainTransactionsController = exports.getDefaultMultichainTransactionsControllerState = void 0;
|
|
16
|
+
const base_controller_1 = require("@metamask/base-controller");
|
|
17
|
+
const keyring_api_1 = require("@metamask/keyring-api");
|
|
18
|
+
const keyring_snap_client_1 = require("@metamask/keyring-snap-client");
|
|
19
|
+
const snaps_utils_1 = require("@metamask/snaps-utils");
|
|
20
|
+
const constants_1 = require("./constants.cjs");
|
|
21
|
+
const MultichainTransactionsTracker_1 = require("./MultichainTransactionsTracker.cjs");
|
|
22
|
+
const controllerName = 'MultichainTransactionsController';
|
|
23
|
+
/**
|
|
24
|
+
* Constructs the default {@link MultichainTransactionsController} state.
|
|
25
|
+
*
|
|
26
|
+
* @returns The default {@link MultichainTransactionsController} state.
|
|
27
|
+
*/
|
|
28
|
+
function getDefaultMultichainTransactionsControllerState() {
|
|
29
|
+
return {
|
|
30
|
+
nonEvmTransactions: {},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
exports.getDefaultMultichainTransactionsControllerState = getDefaultMultichainTransactionsControllerState;
|
|
34
|
+
/**
|
|
35
|
+
* {@link MultichainTransactionsController}'s metadata.
|
|
36
|
+
*
|
|
37
|
+
* This allows us to choose if fields of the state should be persisted or not
|
|
38
|
+
* using the `persist` flag; and if they can be sent to Sentry or not, using
|
|
39
|
+
* the `anonymous` flag.
|
|
40
|
+
*/
|
|
41
|
+
const multichainTransactionsControllerMetadata = {
|
|
42
|
+
nonEvmTransactions: {
|
|
43
|
+
persist: true,
|
|
44
|
+
anonymous: false,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* The MultichainTransactionsController is responsible for fetching and caching account
|
|
49
|
+
* transactions for non-EVM accounts.
|
|
50
|
+
*/
|
|
51
|
+
class MultichainTransactionsController extends base_controller_1.BaseController {
|
|
52
|
+
constructor({ messenger, state, }) {
|
|
53
|
+
super({
|
|
54
|
+
messenger,
|
|
55
|
+
name: controllerName,
|
|
56
|
+
metadata: multichainTransactionsControllerMetadata,
|
|
57
|
+
state: {
|
|
58
|
+
...getDefaultMultichainTransactionsControllerState(),
|
|
59
|
+
...state,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
_MultichainTransactionsController_instances.add(this);
|
|
63
|
+
_MultichainTransactionsController_tracker.set(this, void 0);
|
|
64
|
+
__classPrivateFieldSet(this, _MultichainTransactionsController_tracker, new MultichainTransactionsTracker_1.MultichainTransactionsTracker(async (accountId, pagination) => await __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_updateTransactions).call(this, accountId, pagination)), "f");
|
|
65
|
+
// Register all non-EVM accounts into the tracker
|
|
66
|
+
for (const account of __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_listAccounts).call(this)) {
|
|
67
|
+
if (__classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_isNonEvmAccount).call(this, account)) {
|
|
68
|
+
__classPrivateFieldGet(this, _MultichainTransactionsController_tracker, "f").track(account.id, __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_getBlockTimeFor).call(this, account));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
this.messagingSystem.subscribe('AccountsController:accountAdded', (account) => __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_handleOnAccountAdded).call(this, account));
|
|
72
|
+
this.messagingSystem.subscribe('AccountsController:accountRemoved', (accountId) => __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_handleOnAccountRemoved).call(this, accountId));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Updates transactions for a specific account
|
|
76
|
+
*
|
|
77
|
+
* @param accountId - The ID of the account to get transactions for.
|
|
78
|
+
*/
|
|
79
|
+
async updateTransactionsForAccount(accountId) {
|
|
80
|
+
await __classPrivateFieldGet(this, _MultichainTransactionsController_tracker, "f").updateTransactionsForAccount(accountId);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Updates the transactions of all supported accounts. This method doesn't return
|
|
84
|
+
* anything, but it updates the state of the controller.
|
|
85
|
+
*/
|
|
86
|
+
async updateTransactions() {
|
|
87
|
+
await __classPrivateFieldGet(this, _MultichainTransactionsController_tracker, "f").updateTransactions();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Starts the polling process.
|
|
91
|
+
*/
|
|
92
|
+
start() {
|
|
93
|
+
__classPrivateFieldGet(this, _MultichainTransactionsController_tracker, "f").start();
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Stops the polling process.
|
|
97
|
+
*/
|
|
98
|
+
stop() {
|
|
99
|
+
__classPrivateFieldGet(this, _MultichainTransactionsController_tracker, "f").stop();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.MultichainTransactionsController = MultichainTransactionsController;
|
|
103
|
+
_MultichainTransactionsController_tracker = new WeakMap(), _MultichainTransactionsController_instances = new WeakSet(), _MultichainTransactionsController_listMultichainAccounts = function _MultichainTransactionsController_listMultichainAccounts() {
|
|
104
|
+
return this.messagingSystem.call('AccountsController:listMultichainAccounts');
|
|
105
|
+
}, _MultichainTransactionsController_listAccounts = function _MultichainTransactionsController_listAccounts() {
|
|
106
|
+
const accounts = __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_listMultichainAccounts).call(this);
|
|
107
|
+
return accounts.filter((account) => __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_isNonEvmAccount).call(this, account));
|
|
108
|
+
}, _MultichainTransactionsController_updateTransactions =
|
|
109
|
+
/**
|
|
110
|
+
* Updates the transactions for one account.
|
|
111
|
+
*
|
|
112
|
+
* @param accountId - The ID of the account to update transactions for.
|
|
113
|
+
* @param pagination - Options for paginating transaction results.
|
|
114
|
+
*/
|
|
115
|
+
async function _MultichainTransactionsController_updateTransactions(accountId, pagination) {
|
|
116
|
+
const account = __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_listAccounts).call(this).find((accountItem) => accountItem.id === accountId);
|
|
117
|
+
if (account?.metadata.snap) {
|
|
118
|
+
const response = await __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_getTransactions).call(this, account.id, account.metadata.snap.id, pagination);
|
|
119
|
+
/**
|
|
120
|
+
* Filter only Solana transactions to ensure they're mainnet
|
|
121
|
+
* All other chain transactions are included as-is
|
|
122
|
+
*/
|
|
123
|
+
const transactions = response.data.filter((tx) => {
|
|
124
|
+
const chain = tx.chain;
|
|
125
|
+
if (chain.startsWith(constants_1.MultichainNetwork.Solana)) {
|
|
126
|
+
return chain === constants_1.MultichainNetwork.Solana;
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
});
|
|
130
|
+
this.update((state) => {
|
|
131
|
+
const entry = {
|
|
132
|
+
transactions,
|
|
133
|
+
next: response.next,
|
|
134
|
+
lastUpdated: Date.now(),
|
|
135
|
+
};
|
|
136
|
+
Object.assign(state.nonEvmTransactions, { [account.id]: entry });
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}, _MultichainTransactionsController_getTransactions =
|
|
140
|
+
/**
|
|
141
|
+
* Gets transactions for an account.
|
|
142
|
+
*
|
|
143
|
+
* @param accountId - The ID of the account to get transactions for.
|
|
144
|
+
* @param snapId - The ID of the snap that manages the account.
|
|
145
|
+
* @param pagination - Options for paginating transaction results.
|
|
146
|
+
* @returns A promise that resolves to the transaction data and pagination info.
|
|
147
|
+
*/
|
|
148
|
+
async function _MultichainTransactionsController_getTransactions(accountId, snapId, pagination) {
|
|
149
|
+
return await __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_getClient).call(this, snapId).listAccountTransactions(accountId, pagination);
|
|
150
|
+
}, _MultichainTransactionsController_getBlockTimeFor = function _MultichainTransactionsController_getBlockTimeFor(account) {
|
|
151
|
+
if (account.type in constants_1.TRANSACTIONS_CHECK_INTERVALS) {
|
|
152
|
+
return constants_1.TRANSACTIONS_CHECK_INTERVALS[account.type];
|
|
153
|
+
}
|
|
154
|
+
throw new Error(`Unsupported account type for transactions tracking: ${account.type}`);
|
|
155
|
+
}, _MultichainTransactionsController_isNonEvmAccount = function _MultichainTransactionsController_isNonEvmAccount(account) {
|
|
156
|
+
return (!(0, keyring_api_1.isEvmAccountType)(account.type) &&
|
|
157
|
+
// Non-EVM accounts are backed by a Snap for now
|
|
158
|
+
account.metadata.snap !== undefined);
|
|
159
|
+
}, _MultichainTransactionsController_handleOnAccountAdded =
|
|
160
|
+
/**
|
|
161
|
+
* Handles changes when a new account has been added.
|
|
162
|
+
*
|
|
163
|
+
* @param account - The new account being added.
|
|
164
|
+
*/
|
|
165
|
+
async function _MultichainTransactionsController_handleOnAccountAdded(account) {
|
|
166
|
+
if (!__classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_isNonEvmAccount).call(this, account)) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
__classPrivateFieldGet(this, _MultichainTransactionsController_tracker, "f").track(account.id, __classPrivateFieldGet(this, _MultichainTransactionsController_instances, "m", _MultichainTransactionsController_getBlockTimeFor).call(this, account));
|
|
170
|
+
}, _MultichainTransactionsController_handleOnAccountRemoved =
|
|
171
|
+
/**
|
|
172
|
+
* Handles changes when a new account has been removed.
|
|
173
|
+
*
|
|
174
|
+
* @param accountId - The account ID being removed.
|
|
175
|
+
*/
|
|
176
|
+
async function _MultichainTransactionsController_handleOnAccountRemoved(accountId) {
|
|
177
|
+
if (__classPrivateFieldGet(this, _MultichainTransactionsController_tracker, "f").isTracked(accountId)) {
|
|
178
|
+
__classPrivateFieldGet(this, _MultichainTransactionsController_tracker, "f").untrack(accountId);
|
|
179
|
+
}
|
|
180
|
+
if (accountId in this.state.nonEvmTransactions) {
|
|
181
|
+
this.update((state) => {
|
|
182
|
+
delete state.nonEvmTransactions[accountId];
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}, _MultichainTransactionsController_getClient = function _MultichainTransactionsController_getClient(snapId) {
|
|
186
|
+
return new keyring_snap_client_1.KeyringClient({
|
|
187
|
+
send: async (request) => (await this.messagingSystem.call('SnapController:handleRequest', {
|
|
188
|
+
snapId: snapId,
|
|
189
|
+
origin: 'metamask',
|
|
190
|
+
handler: snaps_utils_1.HandlerType.OnKeyringRequest,
|
|
191
|
+
request,
|
|
192
|
+
})),
|
|
193
|
+
});
|
|
194
|
+
};
|
|
195
|
+
//# sourceMappingURL=MultichainTransactionsController.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultichainTransactionsController.cjs","sourceRoot":"","sources":["../src/MultichainTransactionsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport {\n BaseController,\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { isEvmAccountType, type Transaction } from '@metamask/keyring-api';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { KeyringClient } from '@metamask/keyring-snap-client';\nimport type { HandleSnapRequest } from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\nimport type { Json, JsonRpcRequest } from '@metamask/utils';\nimport type { Draft } from 'immer';\n\nimport { MultichainNetwork, TRANSACTIONS_CHECK_INTERVALS } from './constants';\nimport { MultichainTransactionsTracker } from './MultichainTransactionsTracker';\n\nconst controllerName = 'MultichainTransactionsController';\n\n/**\n * PaginationOptions\n *\n * Represents options for paginating transaction results\n * limit - The maximum number of transactions to return\n * next - The cursor for the next page of transactions, or null if there is no next page\n */\nexport type PaginationOptions = {\n limit: number;\n next?: string | null;\n};\n\n/**\n * State used by the {@link MultichainTransactionsController} to cache account transactions.\n */\nexport type MultichainTransactionsControllerState = {\n nonEvmTransactions: {\n [accountId: string]: TransactionStateEntry;\n };\n};\n\n/**\n * Constructs the default {@link MultichainTransactionsController} state.\n *\n * @returns The default {@link MultichainTransactionsController} state.\n */\nexport function getDefaultMultichainTransactionsControllerState(): MultichainTransactionsControllerState {\n return {\n nonEvmTransactions: {},\n };\n}\n\n/**\n * Returns the state of the {@link MultichainTransactionsController}.\n */\nexport type MultichainTransactionsControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n MultichainTransactionsControllerState\n >;\n\n/**\n * Updates the transactions of all supported accounts.\n */\nexport type MultichainTransactionsControllerListTransactionsAction = {\n type: `${typeof controllerName}:updateTransactions`;\n handler: MultichainTransactionsController['updateTransactions'];\n};\n\n/**\n * Event emitted when the state of the {@link MultichainTransactionsController} changes.\n */\nexport type MultichainTransactionsControllerStateChange =\n ControllerStateChangeEvent<\n typeof controllerName,\n MultichainTransactionsControllerState\n >;\n\n/**\n * Actions exposed by the {@link MultichainTransactionsController}.\n */\nexport type MultichainTransactionsControllerActions =\n | MultichainTransactionsControllerGetStateAction\n | MultichainTransactionsControllerListTransactionsAction;\n\n/**\n * Events emitted by {@link MultichainTransactionsController}.\n */\nexport type MultichainTransactionsControllerEvents =\n MultichainTransactionsControllerStateChange;\n\n/**\n * Messenger type for the MultichainTransactionsController.\n */\nexport type MultichainTransactionsControllerMessenger =\n RestrictedControllerMessenger<\n typeof controllerName,\n MultichainTransactionsControllerActions | AllowedActions,\n MultichainTransactionsControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n >;\n\n/**\n * Actions that this controller is allowed to call.\n */\nexport type AllowedActions =\n | HandleSnapRequest\n | AccountsControllerListMultichainAccountsAction;\n\n/**\n * Events that this controller is allowed to subscribe.\n */\nexport type AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent;\n\n/**\n * {@link MultichainTransactionsController}'s metadata.\n *\n * This allows us to choose if fields of the state should be persisted or not\n * using the `persist` flag; and if they can be sent to Sentry or not, using\n * the `anonymous` flag.\n */\nconst multichainTransactionsControllerMetadata = {\n nonEvmTransactions: {\n persist: true,\n anonymous: false,\n },\n};\n\n/**\n * The state of transactions for a specific account.\n */\nexport type TransactionStateEntry = {\n transactions: Transaction[];\n next: string | null;\n lastUpdated: number;\n};\n\n/**\n * The MultichainTransactionsController is responsible for fetching and caching account\n * transactions for non-EVM accounts.\n */\nexport class MultichainTransactionsController extends BaseController<\n typeof controllerName,\n MultichainTransactionsControllerState,\n MultichainTransactionsControllerMessenger\n> {\n readonly #tracker: MultichainTransactionsTracker;\n\n constructor({\n messenger,\n state,\n }: {\n messenger: MultichainTransactionsControllerMessenger;\n state?: Partial<MultichainTransactionsControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: multichainTransactionsControllerMetadata,\n state: {\n ...getDefaultMultichainTransactionsControllerState(),\n ...state,\n },\n });\n\n this.#tracker = new MultichainTransactionsTracker(\n async (accountId: string, pagination: PaginationOptions) =>\n await this.#updateTransactions(accountId, pagination),\n );\n\n // Register all non-EVM accounts into the tracker\n for (const account of this.#listAccounts()) {\n if (this.#isNonEvmAccount(account)) {\n this.#tracker.track(account.id, this.#getBlockTimeFor(account));\n }\n }\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n (account) => this.#handleOnAccountAdded(account),\n );\n this.messagingSystem.subscribe(\n 'AccountsController:accountRemoved',\n (accountId: string) => this.#handleOnAccountRemoved(accountId),\n );\n }\n\n /**\n * Lists the multichain accounts coming from the `AccountsController`.\n *\n * @returns A list of multichain accounts.\n */\n #listMultichainAccounts(): InternalAccount[] {\n return this.messagingSystem.call(\n 'AccountsController:listMultichainAccounts',\n );\n }\n\n /**\n * Lists the accounts that we should get transactions for.\n *\n * @returns A list of accounts that we should get transactions for.\n */\n #listAccounts(): InternalAccount[] {\n const accounts = this.#listMultichainAccounts();\n return accounts.filter((account) => this.#isNonEvmAccount(account));\n }\n\n /**\n * Updates the transactions for one account.\n *\n * @param accountId - The ID of the account to update transactions for.\n * @param pagination - Options for paginating transaction results.\n */\n async #updateTransactions(accountId: string, pagination: PaginationOptions) {\n const account = this.#listAccounts().find(\n (accountItem) => accountItem.id === accountId,\n );\n\n if (account?.metadata.snap) {\n const response = await this.#getTransactions(\n account.id,\n account.metadata.snap.id,\n pagination,\n );\n\n /**\n * Filter only Solana transactions to ensure they're mainnet\n * All other chain transactions are included as-is\n */\n const transactions = response.data.filter((tx) => {\n const chain = tx.chain as MultichainNetwork;\n if (chain.startsWith(MultichainNetwork.Solana)) {\n return chain === MultichainNetwork.Solana;\n }\n return true;\n });\n\n this.update((state: Draft<MultichainTransactionsControllerState>) => {\n const entry: TransactionStateEntry = {\n transactions,\n next: response.next,\n lastUpdated: Date.now(),\n };\n\n Object.assign(state.nonEvmTransactions, { [account.id]: entry });\n });\n }\n }\n\n /**\n * Gets transactions for an account.\n *\n * @param accountId - The ID of the account to get transactions for.\n * @param snapId - The ID of the snap that manages the account.\n * @param pagination - Options for paginating transaction results.\n * @returns A promise that resolves to the transaction data and pagination info.\n */\n async #getTransactions(\n accountId: string,\n snapId: string,\n pagination: PaginationOptions,\n ): Promise<{\n data: Transaction[];\n next: string | null;\n }> {\n return await this.#getClient(snapId).listAccountTransactions(\n accountId,\n pagination,\n );\n }\n\n /**\n * Updates transactions for a specific account\n *\n * @param accountId - The ID of the account to get transactions for.\n */\n async updateTransactionsForAccount(accountId: string) {\n await this.#tracker.updateTransactionsForAccount(accountId);\n }\n\n /**\n * Updates the transactions of all supported accounts. This method doesn't return\n * anything, but it updates the state of the controller.\n */\n async updateTransactions() {\n await this.#tracker.updateTransactions();\n }\n\n /**\n * Starts the polling process.\n */\n start(): void {\n this.#tracker.start();\n }\n\n /**\n * Stops the polling process.\n */\n stop(): void {\n this.#tracker.stop();\n }\n\n /**\n * Gets the block time for a given account.\n *\n * @param account - The account to get the block time for.\n * @returns The block time for the account.\n */\n #getBlockTimeFor(account: InternalAccount): number {\n if (account.type in TRANSACTIONS_CHECK_INTERVALS) {\n return TRANSACTIONS_CHECK_INTERVALS[\n account.type as keyof typeof TRANSACTIONS_CHECK_INTERVALS\n ];\n }\n throw new Error(\n `Unsupported account type for transactions tracking: ${account.type}`,\n );\n }\n\n /**\n * Checks for non-EVM accounts.\n *\n * @param account - The new account to be checked.\n * @returns True if the account is a non-EVM account, false otherwise.\n */\n #isNonEvmAccount(account: InternalAccount): boolean {\n return (\n !isEvmAccountType(account.type) &&\n // Non-EVM accounts are backed by a Snap for now\n account.metadata.snap !== undefined\n );\n }\n\n /**\n * Handles changes when a new account has been added.\n *\n * @param account - The new account being added.\n */\n async #handleOnAccountAdded(account: InternalAccount) {\n if (!this.#isNonEvmAccount(account)) {\n return;\n }\n\n this.#tracker.track(account.id, this.#getBlockTimeFor(account));\n }\n\n /**\n * Handles changes when a new account has been removed.\n *\n * @param accountId - The account ID being removed.\n */\n async #handleOnAccountRemoved(accountId: string) {\n if (this.#tracker.isTracked(accountId)) {\n this.#tracker.untrack(accountId);\n }\n\n if (accountId in this.state.nonEvmTransactions) {\n this.update((state: Draft<MultichainTransactionsControllerState>) => {\n delete state.nonEvmTransactions[accountId];\n });\n }\n }\n\n /**\n * Gets a `KeyringClient` for a Snap.\n *\n * @param snapId - ID of the Snap to get the client for.\n * @returns A `KeyringClient` for the Snap.\n */\n #getClient(snapId: string): KeyringClient {\n return new KeyringClient({\n send: async (request: JsonRpcRequest) =>\n (await this.messagingSystem.call('SnapController:handleRequest', {\n snapId: snapId as SnapId,\n origin: 'metamask',\n handler: HandlerType.OnKeyringRequest,\n request,\n })) as Promise<Json>,\n });\n }\n}\n"]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { AccountsControllerAccountAddedEvent, AccountsControllerAccountRemovedEvent, AccountsControllerListMultichainAccountsAction } from "@metamask/accounts-controller";
|
|
2
|
+
import { BaseController, type ControllerGetStateAction, type ControllerStateChangeEvent, type RestrictedControllerMessenger } from "@metamask/base-controller";
|
|
3
|
+
import { type Transaction } from "@metamask/keyring-api";
|
|
4
|
+
import type { HandleSnapRequest } from "@metamask/snaps-controllers";
|
|
5
|
+
declare const controllerName = "MultichainTransactionsController";
|
|
6
|
+
/**
|
|
7
|
+
* PaginationOptions
|
|
8
|
+
*
|
|
9
|
+
* Represents options for paginating transaction results
|
|
10
|
+
* limit - The maximum number of transactions to return
|
|
11
|
+
* next - The cursor for the next page of transactions, or null if there is no next page
|
|
12
|
+
*/
|
|
13
|
+
export type PaginationOptions = {
|
|
14
|
+
limit: number;
|
|
15
|
+
next?: string | null;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* State used by the {@link MultichainTransactionsController} to cache account transactions.
|
|
19
|
+
*/
|
|
20
|
+
export type MultichainTransactionsControllerState = {
|
|
21
|
+
nonEvmTransactions: {
|
|
22
|
+
[accountId: string]: TransactionStateEntry;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Constructs the default {@link MultichainTransactionsController} state.
|
|
27
|
+
*
|
|
28
|
+
* @returns The default {@link MultichainTransactionsController} state.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getDefaultMultichainTransactionsControllerState(): MultichainTransactionsControllerState;
|
|
31
|
+
/**
|
|
32
|
+
* Returns the state of the {@link MultichainTransactionsController}.
|
|
33
|
+
*/
|
|
34
|
+
export type MultichainTransactionsControllerGetStateAction = ControllerGetStateAction<typeof controllerName, MultichainTransactionsControllerState>;
|
|
35
|
+
/**
|
|
36
|
+
* Updates the transactions of all supported accounts.
|
|
37
|
+
*/
|
|
38
|
+
export type MultichainTransactionsControllerListTransactionsAction = {
|
|
39
|
+
type: `${typeof controllerName}:updateTransactions`;
|
|
40
|
+
handler: MultichainTransactionsController['updateTransactions'];
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Event emitted when the state of the {@link MultichainTransactionsController} changes.
|
|
44
|
+
*/
|
|
45
|
+
export type MultichainTransactionsControllerStateChange = ControllerStateChangeEvent<typeof controllerName, MultichainTransactionsControllerState>;
|
|
46
|
+
/**
|
|
47
|
+
* Actions exposed by the {@link MultichainTransactionsController}.
|
|
48
|
+
*/
|
|
49
|
+
export type MultichainTransactionsControllerActions = MultichainTransactionsControllerGetStateAction | MultichainTransactionsControllerListTransactionsAction;
|
|
50
|
+
/**
|
|
51
|
+
* Events emitted by {@link MultichainTransactionsController}.
|
|
52
|
+
*/
|
|
53
|
+
export type MultichainTransactionsControllerEvents = MultichainTransactionsControllerStateChange;
|
|
54
|
+
/**
|
|
55
|
+
* Messenger type for the MultichainTransactionsController.
|
|
56
|
+
*/
|
|
57
|
+
export type MultichainTransactionsControllerMessenger = RestrictedControllerMessenger<typeof controllerName, MultichainTransactionsControllerActions | AllowedActions, MultichainTransactionsControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
|
|
58
|
+
/**
|
|
59
|
+
* Actions that this controller is allowed to call.
|
|
60
|
+
*/
|
|
61
|
+
export type AllowedActions = HandleSnapRequest | AccountsControllerListMultichainAccountsAction;
|
|
62
|
+
/**
|
|
63
|
+
* Events that this controller is allowed to subscribe.
|
|
64
|
+
*/
|
|
65
|
+
export type AllowedEvents = AccountsControllerAccountAddedEvent | AccountsControllerAccountRemovedEvent;
|
|
66
|
+
/**
|
|
67
|
+
* The state of transactions for a specific account.
|
|
68
|
+
*/
|
|
69
|
+
export type TransactionStateEntry = {
|
|
70
|
+
transactions: Transaction[];
|
|
71
|
+
next: string | null;
|
|
72
|
+
lastUpdated: number;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* The MultichainTransactionsController is responsible for fetching and caching account
|
|
76
|
+
* transactions for non-EVM accounts.
|
|
77
|
+
*/
|
|
78
|
+
export declare class MultichainTransactionsController extends BaseController<typeof controllerName, MultichainTransactionsControllerState, MultichainTransactionsControllerMessenger> {
|
|
79
|
+
#private;
|
|
80
|
+
constructor({ messenger, state, }: {
|
|
81
|
+
messenger: MultichainTransactionsControllerMessenger;
|
|
82
|
+
state?: Partial<MultichainTransactionsControllerState>;
|
|
83
|
+
});
|
|
84
|
+
/**
|
|
85
|
+
* Updates transactions for a specific account
|
|
86
|
+
*
|
|
87
|
+
* @param accountId - The ID of the account to get transactions for.
|
|
88
|
+
*/
|
|
89
|
+
updateTransactionsForAccount(accountId: string): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Updates the transactions of all supported accounts. This method doesn't return
|
|
92
|
+
* anything, but it updates the state of the controller.
|
|
93
|
+
*/
|
|
94
|
+
updateTransactions(): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Starts the polling process.
|
|
97
|
+
*/
|
|
98
|
+
start(): void;
|
|
99
|
+
/**
|
|
100
|
+
* Stops the polling process.
|
|
101
|
+
*/
|
|
102
|
+
stop(): void;
|
|
103
|
+
}
|
|
104
|
+
export {};
|
|
105
|
+
//# sourceMappingURL=MultichainTransactionsController.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultichainTransactionsController.d.cts","sourceRoot":"","sources":["../src/MultichainTransactionsController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mCAAmC,EACnC,qCAAqC,EACrC,8CAA8C,EAC/C,sCAAsC;AACvC,OAAO,EACL,cAAc,EACd,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EACnC,kCAAkC;AACnC,OAAO,EAAoB,KAAK,WAAW,EAAE,8BAA8B;AAG3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,oCAAoC;AASrE,QAAA,MAAM,cAAc,qCAAqC,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAAG;IAClD,kBAAkB,EAAE;QAClB,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,CAAC;KAC5C,CAAC;CACH,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,+CAA+C,IAAI,qCAAqC,CAIvG;AAED;;GAEG;AACH,MAAM,MAAM,8CAA8C,GACxD,wBAAwB,CACtB,OAAO,cAAc,EACrB,qCAAqC,CACtC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,sDAAsD,GAAG;IACnE,IAAI,EAAE,GAAG,OAAO,cAAc,qBAAqB,CAAC;IACpD,OAAO,EAAE,gCAAgC,CAAC,oBAAoB,CAAC,CAAC;CACjE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,2CAA2C,GACrD,0BAA0B,CACxB,OAAO,cAAc,EACrB,qCAAqC,CACtC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,uCAAuC,GAC/C,8CAA8C,GAC9C,sDAAsD,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAChD,2CAA2C,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,yCAAyC,GACnD,6BAA6B,CAC3B,OAAO,cAAc,EACrB,uCAAuC,GAAG,cAAc,EACxD,sCAAsC,GAAG,aAAa,EACtD,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,8CAA8C,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,mCAAmC,GACnC,qCAAqC,CAAC;AAgB1C;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,qBAAa,gCAAiC,SAAQ,cAAc,CAClE,OAAO,cAAc,EACrB,qCAAqC,EACrC,yCAAyC,CAC1C;;gBAGa,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,yCAAyC,CAAC;QACrD,KAAK,CAAC,EAAE,OAAO,CAAC,qCAAqC,CAAC,CAAC;KACxD;IAsHD;;;;OAIG;IACG,4BAA4B,CAAC,SAAS,EAAE,MAAM;IAIpD;;;OAGG;IACG,kBAAkB;IAIxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,IAAI;CAkFb"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { AccountsControllerAccountAddedEvent, AccountsControllerAccountRemovedEvent, AccountsControllerListMultichainAccountsAction } from "@metamask/accounts-controller";
|
|
2
|
+
import { BaseController, type ControllerGetStateAction, type ControllerStateChangeEvent, type RestrictedControllerMessenger } from "@metamask/base-controller";
|
|
3
|
+
import { type Transaction } from "@metamask/keyring-api";
|
|
4
|
+
import type { HandleSnapRequest } from "@metamask/snaps-controllers";
|
|
5
|
+
declare const controllerName = "MultichainTransactionsController";
|
|
6
|
+
/**
|
|
7
|
+
* PaginationOptions
|
|
8
|
+
*
|
|
9
|
+
* Represents options for paginating transaction results
|
|
10
|
+
* limit - The maximum number of transactions to return
|
|
11
|
+
* next - The cursor for the next page of transactions, or null if there is no next page
|
|
12
|
+
*/
|
|
13
|
+
export type PaginationOptions = {
|
|
14
|
+
limit: number;
|
|
15
|
+
next?: string | null;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* State used by the {@link MultichainTransactionsController} to cache account transactions.
|
|
19
|
+
*/
|
|
20
|
+
export type MultichainTransactionsControllerState = {
|
|
21
|
+
nonEvmTransactions: {
|
|
22
|
+
[accountId: string]: TransactionStateEntry;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Constructs the default {@link MultichainTransactionsController} state.
|
|
27
|
+
*
|
|
28
|
+
* @returns The default {@link MultichainTransactionsController} state.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getDefaultMultichainTransactionsControllerState(): MultichainTransactionsControllerState;
|
|
31
|
+
/**
|
|
32
|
+
* Returns the state of the {@link MultichainTransactionsController}.
|
|
33
|
+
*/
|
|
34
|
+
export type MultichainTransactionsControllerGetStateAction = ControllerGetStateAction<typeof controllerName, MultichainTransactionsControllerState>;
|
|
35
|
+
/**
|
|
36
|
+
* Updates the transactions of all supported accounts.
|
|
37
|
+
*/
|
|
38
|
+
export type MultichainTransactionsControllerListTransactionsAction = {
|
|
39
|
+
type: `${typeof controllerName}:updateTransactions`;
|
|
40
|
+
handler: MultichainTransactionsController['updateTransactions'];
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Event emitted when the state of the {@link MultichainTransactionsController} changes.
|
|
44
|
+
*/
|
|
45
|
+
export type MultichainTransactionsControllerStateChange = ControllerStateChangeEvent<typeof controllerName, MultichainTransactionsControllerState>;
|
|
46
|
+
/**
|
|
47
|
+
* Actions exposed by the {@link MultichainTransactionsController}.
|
|
48
|
+
*/
|
|
49
|
+
export type MultichainTransactionsControllerActions = MultichainTransactionsControllerGetStateAction | MultichainTransactionsControllerListTransactionsAction;
|
|
50
|
+
/**
|
|
51
|
+
* Events emitted by {@link MultichainTransactionsController}.
|
|
52
|
+
*/
|
|
53
|
+
export type MultichainTransactionsControllerEvents = MultichainTransactionsControllerStateChange;
|
|
54
|
+
/**
|
|
55
|
+
* Messenger type for the MultichainTransactionsController.
|
|
56
|
+
*/
|
|
57
|
+
export type MultichainTransactionsControllerMessenger = RestrictedControllerMessenger<typeof controllerName, MultichainTransactionsControllerActions | AllowedActions, MultichainTransactionsControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
|
|
58
|
+
/**
|
|
59
|
+
* Actions that this controller is allowed to call.
|
|
60
|
+
*/
|
|
61
|
+
export type AllowedActions = HandleSnapRequest | AccountsControllerListMultichainAccountsAction;
|
|
62
|
+
/**
|
|
63
|
+
* Events that this controller is allowed to subscribe.
|
|
64
|
+
*/
|
|
65
|
+
export type AllowedEvents = AccountsControllerAccountAddedEvent | AccountsControllerAccountRemovedEvent;
|
|
66
|
+
/**
|
|
67
|
+
* The state of transactions for a specific account.
|
|
68
|
+
*/
|
|
69
|
+
export type TransactionStateEntry = {
|
|
70
|
+
transactions: Transaction[];
|
|
71
|
+
next: string | null;
|
|
72
|
+
lastUpdated: number;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* The MultichainTransactionsController is responsible for fetching and caching account
|
|
76
|
+
* transactions for non-EVM accounts.
|
|
77
|
+
*/
|
|
78
|
+
export declare class MultichainTransactionsController extends BaseController<typeof controllerName, MultichainTransactionsControllerState, MultichainTransactionsControllerMessenger> {
|
|
79
|
+
#private;
|
|
80
|
+
constructor({ messenger, state, }: {
|
|
81
|
+
messenger: MultichainTransactionsControllerMessenger;
|
|
82
|
+
state?: Partial<MultichainTransactionsControllerState>;
|
|
83
|
+
});
|
|
84
|
+
/**
|
|
85
|
+
* Updates transactions for a specific account
|
|
86
|
+
*
|
|
87
|
+
* @param accountId - The ID of the account to get transactions for.
|
|
88
|
+
*/
|
|
89
|
+
updateTransactionsForAccount(accountId: string): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Updates the transactions of all supported accounts. This method doesn't return
|
|
92
|
+
* anything, but it updates the state of the controller.
|
|
93
|
+
*/
|
|
94
|
+
updateTransactions(): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Starts the polling process.
|
|
97
|
+
*/
|
|
98
|
+
start(): void;
|
|
99
|
+
/**
|
|
100
|
+
* Stops the polling process.
|
|
101
|
+
*/
|
|
102
|
+
stop(): void;
|
|
103
|
+
}
|
|
104
|
+
export {};
|
|
105
|
+
//# sourceMappingURL=MultichainTransactionsController.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultichainTransactionsController.d.mts","sourceRoot":"","sources":["../src/MultichainTransactionsController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mCAAmC,EACnC,qCAAqC,EACrC,8CAA8C,EAC/C,sCAAsC;AACvC,OAAO,EACL,cAAc,EACd,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EACnC,kCAAkC;AACnC,OAAO,EAAoB,KAAK,WAAW,EAAE,8BAA8B;AAG3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,oCAAoC;AASrE,QAAA,MAAM,cAAc,qCAAqC,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAAG;IAClD,kBAAkB,EAAE;QAClB,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,CAAC;KAC5C,CAAC;CACH,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,+CAA+C,IAAI,qCAAqC,CAIvG;AAED;;GAEG;AACH,MAAM,MAAM,8CAA8C,GACxD,wBAAwB,CACtB,OAAO,cAAc,EACrB,qCAAqC,CACtC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,sDAAsD,GAAG;IACnE,IAAI,EAAE,GAAG,OAAO,cAAc,qBAAqB,CAAC;IACpD,OAAO,EAAE,gCAAgC,CAAC,oBAAoB,CAAC,CAAC;CACjE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,2CAA2C,GACrD,0BAA0B,CACxB,OAAO,cAAc,EACrB,qCAAqC,CACtC,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,uCAAuC,GAC/C,8CAA8C,GAC9C,sDAAsD,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAChD,2CAA2C,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,yCAAyC,GACnD,6BAA6B,CAC3B,OAAO,cAAc,EACrB,uCAAuC,GAAG,cAAc,EACxD,sCAAsC,GAAG,aAAa,EACtD,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,8CAA8C,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,mCAAmC,GACnC,qCAAqC,CAAC;AAgB1C;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,qBAAa,gCAAiC,SAAQ,cAAc,CAClE,OAAO,cAAc,EACrB,qCAAqC,EACrC,yCAAyC,CAC1C;;gBAGa,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,yCAAyC,CAAC;QACrD,KAAK,CAAC,EAAE,OAAO,CAAC,qCAAqC,CAAC,CAAC;KACxD;IAsHD;;;;OAIG;IACG,4BAA4B,CAAC,SAAS,EAAE,MAAM;IAIpD;;;OAGG;IACG,kBAAkB;IAIxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,IAAI;CAkFb"}
|