Skip to content

Commit d323601

Browse files
authored
refactor!: Replace getBearerToken constructor parameter with direct AuthenticationController:getBearerToken call (#578)
* Replace `getBearerToken` constructor parameter with direct `AuthenticationController:getBearerToken` call * Update changelog
1 parent 35ac83a commit d323601

5 files changed

Lines changed: 195 additions & 127 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3636

3737
- **BREAKING:** Upgrade TypeScript from `~4.8.4` to `~5.3.3` ([#574](https://github.com/MetaMask/smart-transactions-controller/pull/574))
3838
- Consumers on TypeScript 4.x may experience type errors and should upgrade to TypeScript 5.x.
39+
- **BREAKING:** Replace `getBearerToken` constructor parameter with direct `AuthenticationController:getBearerToken` call ([#578](https://github.com/MetaMask/smart-transactions-controller/pull/578))
40+
- Consumers must add `AuthenticationController:getBearerToken` to the allowed actions in the controller messenger, and remove any usage of the `getBearerToken` constructor parameter.
3941

4042
## [23.0.0]
4143

package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,10 @@
5050
"@metamask/controller-utils": "^11.0.0",
5151
"@metamask/eth-json-rpc-provider": "^4.1.6",
5252
"@metamask/eth-query": "^4.0.0",
53-
"@metamask/messenger": "^0.3.0",
53+
"@metamask/messenger": "^1.1.0",
5454
"@metamask/network-controller": "^30.0.0",
5555
"@metamask/polling-controller": "^16.0.0",
56+
"@metamask/profile-sync-controller": "^28.0.2",
5657
"@metamask/remote-feature-flag-controller": "^4.1.0",
5758
"@metamask/superstruct": "^3.1.0",
5859
"@metamask/transaction-controller": "^63.0.0",
@@ -130,7 +131,9 @@
130131
"@metamask/controller-utils>babel-runtime>core-js": false,
131132
"@metamask/transaction-controller>@metamask/core-backend>@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography>keccak": false,
132133
"@metamask/transaction-controller>@metamask/core-backend>@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography>secp256k1": false,
133-
"tsx>esbuild": false
134+
"tsx>esbuild": false,
135+
"@metamask/profile-sync-controller>@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography>keccak": false,
136+
"@metamask/profile-sync-controller>@metamask/keyring-controller>ethereumjs-wallet>ethereum-cryptography>secp256k1": false
134137
}
135138
}
136139
}

src/SmartTransactionsController.test.ts

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -865,10 +865,10 @@ describe('SmartTransactionsController', () => {
865865

866866
describe('onNetworkChange', () => {
867867
it('calls poll', async () => {
868-
await withController(({ controller, triggerNetworStateChange }) => {
868+
await withController(({ controller, triggerNetworkStateChange }) => {
869869
const checkPollSpy = jest.spyOn(controller, 'checkPoll');
870870

871-
triggerNetworStateChange({
871+
triggerNetworkStateChange({
872872
selectedNetworkClientId: NetworkType.sepolia,
873873
networkConfigurationsByChainId: {},
874874
networksMetadata: {},
@@ -930,15 +930,15 @@ describe('SmartTransactionsController', () => {
930930
supportedChainIds: [ChainId.mainnet],
931931
},
932932
},
933-
({ controller, triggerNetworStateChange }) => {
933+
({ controller, triggerNetworkStateChange }) => {
934934
const updateSmartTransactionsSpy = jest.spyOn(
935935
controller,
936936
'updateSmartTransactions',
937937
);
938938

939939
expect(updateSmartTransactionsSpy).not.toHaveBeenCalled();
940940

941-
triggerNetworStateChange({
941+
triggerNetworkStateChange({
942942
selectedNetworkClientId: NetworkType.sepolia,
943943
networkConfigurationsByChainId: {},
944944
networksMetadata: {},
@@ -2179,9 +2179,7 @@ describe('SmartTransactionsController', () => {
21792179
const bearerToken = 'test-bearer-token-123';
21802180
await withController(
21812181
{
2182-
options: {
2183-
getBearerToken: async () => Promise.resolve(bearerToken),
2184-
},
2182+
bearerToken,
21852183
},
21862184
async ({ controller }) => {
21872185
const apiCall = nock(API_BASE_URL)
@@ -2200,9 +2198,7 @@ describe('SmartTransactionsController', () => {
22002198
const bearerToken = 'test-bearer-token-456';
22012199
await withController(
22022200
{
2203-
options: {
2204-
getBearerToken: async () => Promise.resolve(bearerToken),
2205-
},
2201+
bearerToken,
22062202
},
22072203
async ({ controller }) => {
22082204
const apiCall = nock(SENTINEL_API_BASE_URL_MAP[ethereumChainIdDec])
@@ -3191,10 +3187,10 @@ describe('SmartTransactionsController', () => {
31913187

31923188
type WithControllerCallback<ReturnValue> = ({
31933189
controller,
3194-
triggerNetworStateChange,
3190+
triggerNetworkStateChange,
31953191
}: {
31963192
controller: SmartTransactionsController;
3197-
triggerNetworStateChange: (state: NetworkState) => void;
3193+
triggerNetworkStateChange: (state: NetworkState) => void;
31983194
}) => Promise<ReturnValue> | ReturnValue;
31993195

32003196
type WithControllerOptions = {
@@ -3207,6 +3203,7 @@ type WithControllerOptions = {
32073203
remoteFeatureFlags?: {
32083204
smartTransactionsNetworks?: Record<string, unknown>;
32093205
};
3206+
bearerToken?: string;
32103207
};
32113208

32123209
type WithControllerArgs<ReturnValue> =
@@ -3235,6 +3232,7 @@ async function withController<ReturnValue>(
32353232
getTransactions = jest.fn(),
32363233
updateTransaction = jest.fn(),
32373234
remoteFeatureFlags = {},
3235+
bearerToken,
32383236
} = rest;
32393237

32403238
const rootMessenger: RootMessenger = new Messenger({
@@ -3321,6 +3319,11 @@ async function withController<ReturnValue>(
33213319
}),
33223320
);
33233321

3322+
rootMessenger.registerActionHandler(
3323+
'AuthenticationController:getBearerToken',
3324+
jest.fn().mockResolvedValue(bearerToken),
3325+
);
3326+
33243327
const messenger = new Messenger<
33253328
'SmartTransactionsController',
33263329
AllActions,
@@ -3333,6 +3336,7 @@ async function withController<ReturnValue>(
33333336
rootMessenger.delegate({
33343337
messenger,
33353338
actions: [
3339+
'AuthenticationController:getBearerToken',
33363340
'NetworkController:getNetworkClientById',
33373341
'NetworkController:getState',
33383342
'RemoteFeatureFlagController:getState',
@@ -3360,11 +3364,11 @@ async function withController<ReturnValue>(
33603364
...options,
33613365
});
33623366

3363-
function triggerNetworStateChange(state: NetworkState) {
3367+
function triggerNetworkStateChange(state: NetworkState) {
33643368
rootMessenger.publish('NetworkController:stateChange', state, []);
33653369
}
33663370

3367-
triggerNetworStateChange({
3371+
triggerNetworkStateChange({
33683372
selectedNetworkClientId: NetworkType.mainnet,
33693373
networkConfigurationsByChainId: {
33703374
[ChainId.mainnet]: {
@@ -3395,7 +3399,7 @@ async function withController<ReturnValue>(
33953399
try {
33963400
return await fn({
33973401
controller,
3398-
triggerNetworStateChange,
3402+
triggerNetworkStateChange,
33993403
});
34003404
} finally {
34013405
// eslint-disable-next-line @typescript-eslint/no-floating-promises

src/SmartTransactionsController.ts

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import type {
2020
NetworkControllerStateChangeEvent,
2121
} from '@metamask/network-controller';
2222
import { StaticIntervalPollingController } from '@metamask/polling-controller';
23+
import type { AuthenticationControllerGetBearerTokenAction } from '@metamask/profile-sync-controller/auth';
2324
import type {
2425
RemoteFeatureFlagControllerGetStateAction,
2526
RemoteFeatureFlagControllerStateChangeEvent,
@@ -187,6 +188,7 @@ export type SmartTransactionsControllerActions =
187188
| SmartTransactionsControllerMethodActions;
188189

189190
type AllowedActions =
191+
| AuthenticationControllerGetBearerTokenAction
190192
| NetworkControllerGetNetworkClientByIdAction
191193
| NetworkControllerGetStateAction
192194
| RemoteFeatureFlagControllerGetStateAction
@@ -256,14 +258,6 @@ type SmartTransactionsControllerOptions = {
256258
* removed in a future version.
257259
*/
258260
getFeatureFlags?: () => FeatureFlags;
259-
/**
260-
* Optional callback to obtain a bearer token for authenticating requests to
261-
* the Transaction API. When provided, the token is sent in the
262-
* Authorization header for all Transaction API calls. Can be used with
263-
* the authentication flow from @metamask/core-backend (e.g. from
264-
* AuthenticationController.getBearerToken).
265-
*/
266-
getBearerToken?: () => Promise<string | undefined> | string | undefined;
267261
trace?: TraceCallback;
268262
};
269263

@@ -292,11 +286,6 @@ export class SmartTransactionsController extends StaticIntervalPollingController
292286

293287
readonly #getMetaMetricsProps: () => Promise<MetaMetricsProps>;
294288

295-
readonly #getBearerToken?: () =>
296-
| Promise<string | undefined>
297-
| string
298-
| undefined;
299-
300289
#trace: TraceCallback;
301290

302291
/**
@@ -340,8 +329,12 @@ export class SmartTransactionsController extends StaticIntervalPollingController
340329
Object.values(SENTINEL_API_BASE_URL_MAP).some((baseUrl) =>
341330
request.startsWith(baseUrl),
342331
);
343-
if (this.#getBearerToken && urlMatches) {
344-
const token = await Promise.resolve(this.#getBearerToken());
332+
333+
if (urlMatches) {
334+
const token = await this.messenger.call(
335+
'AuthenticationController:getBearerToken',
336+
);
337+
345338
if (token) {
346339
headers.Authorization = `Bearer ${token}`;
347340
}
@@ -367,7 +360,6 @@ export class SmartTransactionsController extends StaticIntervalPollingController
367360
state = {},
368361
messenger,
369362
getMetaMetricsProps,
370-
getBearerToken,
371363
trace,
372364
}: SmartTransactionsControllerOptions) {
373365
super({
@@ -388,7 +380,6 @@ export class SmartTransactionsController extends StaticIntervalPollingController
388380
this.#ethQuery = undefined;
389381
this.#trackMetaMetricsEvent = trackMetaMetricsEvent;
390382
this.#getMetaMetricsProps = getMetaMetricsProps;
391-
this.#getBearerToken = getBearerToken;
392383
this.#trace = trace ?? (((_request, fn) => fn?.()) as TraceCallback);
393384

394385
this.initializeSmartTransactionsForChainId();

0 commit comments

Comments
 (0)