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
2 changes: 1 addition & 1 deletion packages/wallet/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
"@metamask/remote-feature-flag-controller": "^4.2.0",
"@metamask/scure-bip39": "^2.1.1",
"@metamask/transaction-controller": "^64.0.0",
"@metamask/utils": "^11.11.0"
"@metamask/utils": "^11.9.0"
},
"devDependencies": {
"@metamask/auto-changelog": "^3.4.4",
Expand Down
20 changes: 15 additions & 5 deletions packages/wallet/src/Wallet.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,26 @@
import { Messenger } from '@metamask/messenger';
import type { Json } from '@metamask/utils';

import type {
DefaultActions,
DefaultEvents,
DefaultInstances,
DefaultState,
RootMessenger,
} from './initialization';
import { initialize } from './initialization';
import { RootMessenger, WalletOptions } from './types';
import type { WalletOptions } from './types';

export type WalletConstructorArgs = {
state?: Record<string, Json>;
options: WalletOptions;
};

export class Wallet {
public messenger: RootMessenger;
// TODO: Expand types when passing additionalConfigurations.
public readonly messenger: RootMessenger<DefaultActions, DefaultEvents>;

readonly #instances: Record<string, Record<string, unknown>>;
readonly #instances: DefaultInstances;

constructor({ state = {}, options }: WalletConstructorArgs) {
this.messenger = new Messenger({
Expand All @@ -22,20 +30,22 @@ export class Wallet {
this.#instances = initialize({ state, messenger: this.messenger, options });
}

get state(): Record<string, unknown> {
get state(): DefaultState {
return Object.entries(this.#instances).reduce<Record<string, unknown>>(
(totalState, [name, instance]) => {
totalState[name] = instance.state ?? null;
return totalState;
},
{},
);
) as DefaultState;
}

async destroy(): Promise<void> {
await Promise.all(
Object.values(this.#instances).map((instance) => {
// @ts-expect-error Accessing protected property.
if (typeof instance.destroy === 'function') {
// @ts-expect-error Accessing protected property.
return instance.destroy();
}
return undefined;
Expand Down
50 changes: 50 additions & 0 deletions packages/wallet/src/initialization/defaults.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import type {
ActionConstraint,
EventConstraint,
Messenger,
MessengerActions,
MessengerEvents,
} from '@metamask/messenger';

import * as defaultConfigurations from './instances';
import type { InitializationConfiguration, InstanceState } from './types';

export { defaultConfigurations };

type ExtractInstance<Config> =
Config extends InitializationConfiguration<infer Instance, infer _>
? Instance
: never;

type ExtractInstanceMessenger<Config> =
Config extends InitializationConfiguration<infer _, infer InferredMessenger>
? InferredMessenger
: never;

type ExtractName<Config> =
ExtractInstance<Config> extends { name: infer Name extends string }
? Name
: never;

type Configs = typeof defaultConfigurations;

type AllMessengers = ExtractInstanceMessenger<Configs[keyof Configs]>;

export type DefaultInstances = {
[Key in keyof Configs as ExtractName<Configs[Key]>]: ExtractInstance<
Configs[Key]
>;
};

export type DefaultActions = MessengerActions<AllMessengers>;

export type DefaultEvents = MessengerEvents<AllMessengers>;

export type RootMessenger<
AllowedActions extends ActionConstraint = ActionConstraint,
AllowedEvents extends EventConstraint = EventConstraint,
> = Messenger<'Root', AllowedActions, AllowedEvents>;

export type DefaultState = {
[Key in keyof DefaultInstances]: InstanceState<DefaultInstances[Key]>;
};
7 changes: 7 additions & 0 deletions packages/wallet/src/initialization/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,8 @@
export type {
DefaultActions,
DefaultEvents,
DefaultInstances,
DefaultState,
RootMessenger,
} from './defaults';
export { initialize } from './initialization';
11 changes: 6 additions & 5 deletions packages/wallet/src/initialization/initialization.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Json } from '@metamask/utils';

import * as defaultConfigurations from './instances';
import type { DefaultInstances } from './defaults';
import { defaultConfigurations, RootMessenger } from './defaults';
import { InitializationConfiguration } from './types';
import { RootMessenger, WalletOptions } from '../types';
import { WalletOptions } from '../types';

export type InitializeArgs = {
state: Record<string, Json>;
Expand All @@ -19,7 +20,7 @@ export function initialize({
messenger,
initializationConfigurations = [],
options,
}: InitializeArgs): Record<string, Record<string, unknown>> {
}: InitializeArgs): DefaultInstances {
const overriddenConfiguration = initializationConfigurations.map(
(config) => config.name,
);
Expand All @@ -30,7 +31,7 @@ export function initialize({
),
);

const instances: Record<string, Record<string, unknown>> = {};
const instances: Record<string, unknown> = {};

for (const config of configurationEntries) {
const { name } = config;
Expand All @@ -48,5 +49,5 @@ export function initialize({
instances[name] = instance as Record<string, unknown>;
}

return instances;
return instances as DefaultInstances;
}
3 changes: 2 additions & 1 deletion packages/wallet/src/initialization/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import type {
MessengerActions,
} from '@metamask/messenger';

import { RootMessenger, WalletOptions } from '../types';
import type { RootMessenger } from './defaults';
import type { WalletOptions } from '../types';

export type InstanceState<Instance> = Instance extends { state: unknown }
? Instance['state']
Expand Down
12 changes: 0 additions & 12 deletions packages/wallet/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,5 @@
import {
ActionConstraint,
EventConstraint,
Messenger,
} from '@metamask/messenger';
import type { ClientConfigApiService } from '@metamask/remote-feature-flag-controller';

export type RootMessenger<
// eslint-disable-next-line @typescript-eslint/no-explicit-any
AllowedActions extends ActionConstraint = any,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
AllowedEvents extends EventConstraint = any,
> = Messenger<'Root', AllowedActions, AllowedEvents>;

export type WalletOptions = {
infuraProjectId: string;
clientVersion: string;
Expand Down
4 changes: 2 additions & 2 deletions packages/wallet/src/utilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,11 @@ export async function sendTransaction(
transaction: TransactionParams,
options: AddTransactionOptions,
): Promise<{ transactionMeta: TransactionMeta; result: Promise<string> }> {
const { transactionMeta, result } = (await wallet.messenger.call(
const { transactionMeta, result } = await wallet.messenger.call(
'TransactionController:addTransaction',
transaction,
options,
)) as { transactionMeta: TransactionMeta; result: Promise<string> };
);

const approvalId = transactionMeta.id;

Expand Down
21 changes: 1 addition & 20 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5660,25 +5660,6 @@ __metadata:
languageName: node
linkType: hard

"@metamask/utils@npm:^11.11.0":
version: 11.11.0
resolution: "@metamask/utils@npm:11.11.0"
dependencies:
"@ethereumjs/tx": "npm:^4.2.0"
"@metamask/superstruct": "npm:^3.1.0"
"@noble/hashes": "npm:^1.3.1"
"@scure/base": "npm:^1.1.3"
"@types/debug": "npm:^4.1.7"
"@types/lodash": "npm:^4.17.20"
debug: "npm:^4.3.4"
lodash: "npm:^4.17.21"
pony-cause: "npm:^2.1.10"
semver: "npm:^7.5.4"
uuid: "npm:^9.0.1"
checksum: 10/c4381b9e451a9616bde84ac659bc0d1848ef06b6e605f877bfa065b78c8ed5015706683ea88a3387de5eaeb3a50d1af9af0994f04f9e06258d992598fe2be3bf
languageName: node
linkType: hard

"@metamask/utils@npm:^9.0.0":
version: 9.3.0
resolution: "@metamask/utils@npm:9.3.0"
Expand Down Expand Up @@ -5712,7 +5693,7 @@ __metadata:
"@metamask/remote-feature-flag-controller": "npm:^4.2.0"
"@metamask/scure-bip39": "npm:^2.1.1"
"@metamask/transaction-controller": "npm:^64.0.0"
"@metamask/utils": "npm:^11.11.0"
"@metamask/utils": "npm:^11.9.0"
"@ts-bridge/cli": "npm:^0.6.4"
"@types/jest": "npm:^29.5.14"
deepmerge: "npm:^4.2.2"
Expand Down
Loading