Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions app/scripts/controller-init/claims/claims-controller-init.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import {
ClaimsController,
ClaimsControllerMessenger,
} from '@metamask/claims-controller';
import { ControllerInitRequest } from '../types';
import {
ClaimsControllerInitMessenger,
getClaimsControllerInitMessenger,
getClaimsControllerMessenger,
} from '../messengers/claims/claims-controller-messenger';
import { getRootMessenger } from '../../lib/messenger';
import { buildControllerInitRequestMock } from '../test/utils';
import { ClaimsControllerInit } from './claims-controller-init';

jest.mock('@metamask/claims-controller');

function buildInitRequestMock(): jest.Mocked<
ControllerInitRequest<
ClaimsControllerMessenger,
ClaimsControllerInitMessenger
>
> {
const baseControllerMessenger = getRootMessenger<never, never>();

return {
...buildControllerInitRequestMock(),
controllerMessenger: getClaimsControllerMessenger(baseControllerMessenger),
initMessenger: getClaimsControllerInitMessenger(baseControllerMessenger),
};
}

describe('ClaimsControllerInit', () => {
it('should initialize the controller', () => {
const request = buildInitRequestMock();
const controllerInitResult = ClaimsControllerInit(request);
expect(controllerInitResult).toBeDefined();
expect(controllerInitResult.controller).toBeInstanceOf(ClaimsController);
});

it('should initialize with correct messenger and state', () => {
const ClaimsControllerClassMock = jest.mocked(ClaimsController);

const requestMock = buildInitRequestMock();
ClaimsControllerInit(requestMock);

expect(ClaimsControllerClassMock).toHaveBeenCalledWith({
messenger: requestMock.controllerMessenger,
state: requestMock.persistedState.ClaimsController,
});
});
});
21 changes: 21 additions & 0 deletions app/scripts/controller-init/claims/claims-controller-init.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import {
ClaimsController,
ClaimsControllerMessenger,
} from '@metamask/claims-controller';
import { ControllerInitFunction } from '../types';
import { ClaimsControllerInitMessenger } from '../messengers/claims/claims-controller-messenger';

export const ClaimsControllerInit: ControllerInitFunction<
ClaimsController,
ClaimsControllerMessenger,
ClaimsControllerInitMessenger
> = (request) => {
const { controllerMessenger, persistedState } = request;
const controller = new ClaimsController({
messenger: controllerMessenger,
state: persistedState.ClaimsController,
});
return {
controller,
};
};
34 changes: 34 additions & 0 deletions app/scripts/controller-init/claims/claims-service-init.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import {
ClaimsService,
ClaimsServiceMessenger,
} from '@metamask/claims-controller';
import { getRootMessenger } from '../../lib/messenger';
import { getClaimsServiceMessenger } from '../messengers/claims/claims-service-messenger';
import { buildControllerInitRequestMock } from '../test/utils';
import { ControllerInitRequest } from '../types';
import { ClaimsServiceInit } from './claims-service-init';

jest.mock('@metamask/claims-controller');

function buildInitRequestMock() {
const baseControllerMessenger = getRootMessenger<never, never>();

return {
...buildControllerInitRequestMock(),
controllerMessenger: getClaimsServiceMessenger(baseControllerMessenger),
initMessenger: undefined,
} as unknown as jest.Mocked<ControllerInitRequest<ClaimsServiceMessenger>>;
}

describe('ClaimsServiceInit', () => {
beforeEach(() => {
jest.resetAllMocks();
});

it('should return Service instance', () => {
const requestMock = buildInitRequestMock();
expect(ClaimsServiceInit(requestMock).controller).toBeInstanceOf(
ClaimsService,
);
});
});
25 changes: 25 additions & 0 deletions app/scripts/controller-init/claims/claims-service-init.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { ClaimsService } from '@metamask/claims-controller';
import { ControllerInitFunction } from '../types';
import { ClaimsServiceMessengerType } from '../messengers/claims/claims-service-messenger';
import { loadShieldConfig } from '../../../../shared/modules/shield/config';

export const ClaimsServiceInit: ControllerInitFunction<
ClaimsService,
ClaimsServiceMessengerType
> = (request) => {
const { controllerMessenger } = request;

const { claimsEnv } = loadShieldConfig();

const service = new ClaimsService({
messenger: controllerMessenger,
env: claimsEnv,
fetchFunction: fetch.bind(globalThis),
});

return {
controller: service,
memStateKey: null,
persistedStateKey: null,
};
};
2 changes: 2 additions & 0 deletions app/scripts/controller-init/claims/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export { ClaimsControllerInit } from './claims-controller-init';
export { ClaimsServiceInit } from './claims-service-init';
6 changes: 5 additions & 1 deletion app/scripts/controller-init/controller-list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ import {
AccountActivityService,
BackendWebSocketService,
} from '@metamask/core-backend';
import { ClaimsController, ClaimsService } from '@metamask/claims-controller';
import OnboardingController from '../controllers/onboarding';
import { PreferencesController } from '../controllers/preferences-controller';
import SwapsController from '../controllers/swaps';
Expand Down Expand Up @@ -117,6 +118,7 @@ export type Controller =
| AuthenticationController
| BridgeController
| BridgeStatusController
| ClaimsController
| CronjobController
| CurrencyRateController
| DecryptMessageController
Expand Down Expand Up @@ -192,7 +194,8 @@ export type Controller =
| BackendWebSocketService
| AccountActivityService
| MultichainAccountService
| NetworkEnablementController;
| NetworkEnablementController
| ClaimsService;

/**
* Flat state object for all controllers supporting or required by modular initialization.
Expand All @@ -210,6 +213,7 @@ export type ControllerFlatState = AccountOrderController['state'] &
AuthenticationController['state'] &
BridgeController['state'] &
BridgeStatusController['state'] &
ClaimsController['state'] &
CronjobController['state'] &
CurrencyRateController['state'] &
DeFiPositionsController['state'] &
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import {
Messenger,
MessengerActions,
MessengerEvents,
} from '@metamask/messenger';
import {
ClaimsControllerMessenger,
ClaimsServiceGenerateMessageForClaimSignatureAction,
ClaimsServiceGetClaimsAction,
ClaimsServiceGetClaimsApiUrlAction,
ClaimsServiceGetRequestHeadersAction,
} from '@metamask/claims-controller';
import { KeyringControllerSignPersonalMessageAction } from '@metamask/keyring-controller';
import { RootMessenger } from '../../../lib/messenger';

type AllowedActions =
| MessengerActions<ClaimsControllerMessenger>
| ClaimsServiceGetRequestHeadersAction
| ClaimsServiceGetClaimsApiUrlAction
| ClaimsServiceGenerateMessageForClaimSignatureAction
| ClaimsServiceGetClaimsAction
| KeyringControllerSignPersonalMessageAction;
type AllowedEvents = MessengerEvents<ClaimsControllerMessenger>;

export type ClaimsControllerMessengerType = ReturnType<
typeof getClaimsControllerMessenger
>;

export function getClaimsControllerMessenger(
messenger: RootMessenger<AllowedActions, AllowedEvents>,
): ClaimsControllerMessenger {
const controllerMessenger = new Messenger<
'ClaimsController',
AllowedActions,
AllowedEvents,
typeof messenger
>({
namespace: 'ClaimsController',
parent: messenger,
});
messenger.delegate({
messenger: controllerMessenger,
actions: [
'ClaimsService:getClaimsApiUrl',
'ClaimsService:getRequestHeaders',
'ClaimsService:generateMessageForClaimSignature',
'ClaimsService:getClaims',
'KeyringController:signPersonalMessage',
],
events: [],
});
return controllerMessenger;
}

type InitActions = never;
type InitEvents = never;

export type ClaimsControllerInitMessenger = ReturnType<
typeof getClaimsControllerInitMessenger
>;

export function getClaimsControllerInitMessenger(
messenger: RootMessenger<InitActions, InitEvents>,
) {
const controllerInitMessenger = new Messenger<
'ClaimsControllerInit',
InitActions,
InitEvents,
typeof messenger
>({
namespace: 'ClaimsControllerInit',
parent: messenger,
});
messenger.delegate({
messenger: controllerInitMessenger,
events: [],
actions: [],
});
return controllerInitMessenger;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { Messenger, MessengerActions } from '@metamask/messenger';
import { ClaimsServiceMessenger } from '@metamask/claims-controller';
import { AuthenticationControllerGetBearerToken } from '@metamask/profile-sync-controller/auth';
import { RootMessenger } from '../../../lib/messenger';

type AllowedActions =
| MessengerActions<ClaimsServiceMessenger>
| AuthenticationControllerGetBearerToken;

export type ClaimsServiceMessengerType = ReturnType<
typeof getClaimsServiceMessenger
>;

export function getClaimsServiceMessenger(
messenger: RootMessenger<AllowedActions>,
) {
const serviceMessenger = new Messenger<
'ClaimsService',
AllowedActions,
never,
typeof messenger
>({
namespace: 'ClaimsService',
parent: messenger,
});
messenger.delegate({
messenger: serviceMessenger,
actions: ['AuthenticationController:getBearerToken'],
events: [],
});
return serviceMessenger;
}

type InitActions = never;
type InitEvents = never;

export type ClaimsServiceInitMessenger = ReturnType<
typeof getClaimsServiceInitMessenger
>;

export function getClaimsServiceInitMessenger(
messenger: RootMessenger<InitActions, InitEvents>,
) {
return new Messenger<
'ClaimsServiceInit',
InitActions,
InitEvents,
typeof messenger
>({
namespace: 'ClaimsServiceInit',
parent: messenger,
});
}
13 changes: 13 additions & 0 deletions app/scripts/controller-init/messengers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,11 @@ import {
getUserOperationControllerMessenger,
} from './user-operation-controller-messenger';
import { getRewardsDataServiceMessenger } from './reward-data-service-messenger';
import {
getClaimsControllerInitMessenger,
getClaimsControllerMessenger,
} from './claims/claims-controller-messenger';
import { getClaimsServiceMessenger } from './claims/claims-service-messenger';

export type { AccountOrderControllerMessenger } from './account-order-controller-messenger';
export { getAccountOrderControllerMessenger } from './account-order-controller-messenger';
Expand Down Expand Up @@ -445,6 +450,14 @@ export const CONTROLLER_MESSENGERS = {
getMessenger: getBridgeStatusControllerMessenger,
getInitMessenger: noop,
},
ClaimsController: {
getMessenger: getClaimsControllerMessenger,
getInitMessenger: getClaimsControllerInitMessenger,
},
ClaimsService: {
getMessenger: getClaimsServiceMessenger,
getInitMessenger: noop,
},
CronjobController: {
getMessenger: getCronjobControllerMessenger,
getInitMessenger: noop,
Expand Down
23 changes: 19 additions & 4 deletions app/scripts/metamask-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,10 @@ import { UserOperationControllerInit } from './controller-init/confirmations/use
import { RewardsDataServiceInit } from './controller-init/rewards-data-service-init';
import { RewardsControllerInit } from './controller-init/rewards-controller-init';
import { getRootMessenger } from './lib/messenger';
import {
ClaimsControllerInit,
ClaimsServiceInit,
} from './controller-init/claims';

export const METAMASK_CONTROLLER_EVENTS = {
// Fired after state changes that impact the extension badge (unapproved msg count)
Expand Down Expand Up @@ -634,6 +638,8 @@ export default class MetamaskController extends EventEmitter {
SubscriptionService: SubscriptionServiceInit,
NetworkOrderController: NetworkOrderControllerInit,
ShieldController: ShieldControllerInit,
ClaimsController: ClaimsControllerInit,
ClaimsService: ClaimsServiceInit,
GatorPermissionsController: GatorPermissionsControllerInit,
SnapsNameProvider: SnapsNameProviderInit,
EnsController: EnsControllerInit,
Expand Down Expand Up @@ -753,7 +759,8 @@ export default class MetamaskController extends EventEmitter {
this.announcementController = controllersByName.AnnouncementController;
this.accountOrderController = controllersByName.AccountOrderController;
this.rewardsController = controllersByName.RewardsController;

this.claimsController = controllersByName.ClaimsController;
this.claimsService = controllersByName.ClaimsService;
this.backup = new Backup({
preferencesController: this.preferencesController,
addressBookController: this.addressBookController,
Expand Down Expand Up @@ -1210,6 +1217,8 @@ export default class MetamaskController extends EventEmitter {
DeFiPositionsController: this.deFiPositionsController,
PhishingController: this.phishingController,
ShieldController: this.shieldController,
ClaimsController: this.claimsController,
ClaimsService: this.claimsService,
...resetOnRestartStore,
...controllerMemState,
},
Expand Down Expand Up @@ -2547,9 +2556,6 @@ export default class MetamaskController extends EventEmitter {
getRewardsSeasonMetadata: this.rewardsController.getSeasonMetadata.bind(
this.rewardsController,
),
getRewardsSeasonStatus: this.rewardsController.getSeasonStatus.bind(
this.rewardsController,
),
getRewardsHasAccountOptedIn:
this.rewardsController.getHasAccountOptedIn.bind(
this.rewardsController,
Expand All @@ -2558,6 +2564,15 @@ export default class MetamaskController extends EventEmitter {
this.rewardsController,
),

// claims
getSubmitClaimConfig: this.claimsController.getSubmitClaimConfig.bind(
this.claimsController,
),
generateClaimSignature: this.claimsController.generateClaimSignature.bind(
this.claimsController,
),
getClaims: this.claimsController.getClaims.bind(this.claimsController),

// hardware wallets
connectHardware: this.connectHardware.bind(this),
forgetDevice: this.forgetDevice.bind(this),
Expand Down
Loading
Loading